aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMario Vavti <mario@mariovavti.com>2016-12-23 10:09:46 +0100
committerMario Vavti <mario@mariovavti.com>2016-12-23 10:09:46 +0100
commit3b9b03cf86979b28e7fa249133176bed84b0105c (patch)
tree336dc8b8b9627e7f4a93e5c35fe3e98555274616
parent2e5a993f880d619aedf3693927e7b3e164fbfcc0 (diff)
parentef39c1e94b5149a3019d417d08dc7c16c8aef9c1 (diff)
downloadvolse-hubzilla-3b9b03cf86979b28e7fa249133176bed84b0105c.tar.gz
volse-hubzilla-3b9b03cf86979b28e7fa249133176bed84b0105c.tar.bz2
volse-hubzilla-3b9b03cf86979b28e7fa249133176bed84b0105c.zip
Merge branch '2.0RC'
-rwxr-xr-x.gitignore14
-rw-r--r--.travis.yml12
-rw-r--r--CHANGELOG96
-rw-r--r--Zotlabs/Access/PermissionRoles.php45
-rw-r--r--Zotlabs/Access/Permissions.php16
-rw-r--r--Zotlabs/Daemon/Master.php3
-rw-r--r--Zotlabs/Daemon/Notifier.php16
-rw-r--r--Zotlabs/Daemon/Ratenotif.php2
-rw-r--r--Zotlabs/Extend/Hook.php10
-rw-r--r--Zotlabs/Lib/AConfig.php4
-rw-r--r--Zotlabs/Lib/AbConfig.php4
-rw-r--r--Zotlabs/Lib/Apps.php6
-rw-r--r--Zotlabs/Lib/Config.php6
-rw-r--r--Zotlabs/Lib/Enotify.php92
-rw-r--r--Zotlabs/Lib/IConfig.php6
-rw-r--r--Zotlabs/Lib/PConfig.php22
-rw-r--r--Zotlabs/Lib/PermissionDescription.php54
-rw-r--r--Zotlabs/Lib/System.php28
-rw-r--r--Zotlabs/Lib/Techlevels.php21
-rw-r--r--Zotlabs/Lib/ThreadItem.php6
-rw-r--r--Zotlabs/Lib/ThreadStream.php6
-rw-r--r--Zotlabs/Lib/XConfig.php6
-rw-r--r--Zotlabs/Module/Acl.php6
-rw-r--r--Zotlabs/Module/Admin.php58
-rw-r--r--Zotlabs/Module/Admin/Account_edit.php20
-rw-r--r--Zotlabs/Module/Admin/Accounts.php7
-rw-r--r--Zotlabs/Module/Admin/Channels.php90
-rw-r--r--Zotlabs/Module/Admin/Dbsync.php2
-rw-r--r--Zotlabs/Module/Admin/Site.php112
-rw-r--r--Zotlabs/Module/Api.php30
-rw-r--r--Zotlabs/Module/Cal.php4
-rw-r--r--Zotlabs/Module/Channel.php68
-rw-r--r--Zotlabs/Module/Chanview.php76
-rw-r--r--Zotlabs/Module/Cloud.php51
-rw-r--r--Zotlabs/Module/Connect.php4
-rw-r--r--Zotlabs/Module/Connedit.php57
-rw-r--r--Zotlabs/Module/Contactgroup.php2
-rw-r--r--Zotlabs/Module/Cover_photo.php6
-rw-r--r--Zotlabs/Module/Dav.php40
-rw-r--r--Zotlabs/Module/Directory.php1
-rw-r--r--Zotlabs/Module/Dirsearch.php8
-rw-r--r--Zotlabs/Module/Display.php22
-rw-r--r--Zotlabs/Module/Dreport.php8
-rw-r--r--Zotlabs/Module/Editblock.php2
-rw-r--r--Zotlabs/Module/Editlayout.php2
-rw-r--r--Zotlabs/Module/Editpost.php3
-rw-r--r--Zotlabs/Module/Editwebpage.php2
-rw-r--r--Zotlabs/Module/Embedphotos.php220
-rw-r--r--Zotlabs/Module/Events.php43
-rw-r--r--Zotlabs/Module/Fbrowser.php12
-rw-r--r--Zotlabs/Module/File_upload.php2
-rw-r--r--Zotlabs/Module/Filestorage.php74
-rw-r--r--Zotlabs/Module/Follow.php3
-rw-r--r--Zotlabs/Module/Group.php10
-rw-r--r--Zotlabs/Module/Help.php84
-rw-r--r--Zotlabs/Module/Import.php63
-rw-r--r--Zotlabs/Module/Invite.php2
-rw-r--r--Zotlabs/Module/Item.php54
-rw-r--r--Zotlabs/Module/Like.php2
-rw-r--r--Zotlabs/Module/Linkinfo.php17
-rw-r--r--Zotlabs/Module/Lockview.php4
-rw-r--r--Zotlabs/Module/Locs.php2
-rw-r--r--Zotlabs/Module/Mail.php20
-rw-r--r--Zotlabs/Module/Manage.php6
-rw-r--r--Zotlabs/Module/Match.php2
-rw-r--r--Zotlabs/Module/Msearch.php47
-rw-r--r--Zotlabs/Module/Network.php12
-rw-r--r--Zotlabs/Module/Notifications.php113
-rw-r--r--Zotlabs/Module/Photo.php25
-rw-r--r--Zotlabs/Module/Photos.php38
-rw-r--r--Zotlabs/Module/Ping.php223
-rw-r--r--Zotlabs/Module/Post.php30
-rw-r--r--Zotlabs/Module/Profile_photo.php52
-rw-r--r--Zotlabs/Module/Profiles.php108
-rw-r--r--Zotlabs/Module/Profperm.php2
-rw-r--r--Zotlabs/Module/Pubsites.php2
-rw-r--r--Zotlabs/Module/Pubstream.php11
-rw-r--r--Zotlabs/Module/Regdir.php5
-rw-r--r--Zotlabs/Module/Search.php19
-rw-r--r--Zotlabs/Module/Settings/Account.php10
-rw-r--r--Zotlabs/Module/Settings/Channel.php13
-rw-r--r--Zotlabs/Module/Settings/Display.php7
-rw-r--r--Zotlabs/Module/Settings/Featured.php2
-rw-r--r--Zotlabs/Module/Settings/Tokens.php2
-rw-r--r--Zotlabs/Module/Setup.php294
-rw-r--r--Zotlabs/Module/Siteinfo.php80
-rw-r--r--Zotlabs/Module/Snap.php105
-rw-r--r--Zotlabs/Module/Sslify.php19
-rw-r--r--Zotlabs/Module/Tagrm.php6
-rw-r--r--Zotlabs/Module/Tasks.php2
-rw-r--r--Zotlabs/Module/Thing.php158
-rw-r--r--Zotlabs/Module/Wall_attach.php19
-rw-r--r--Zotlabs/Module/Wall_upload.php8
-rw-r--r--Zotlabs/Module/Wiki.php432
-rw-r--r--Zotlabs/Storage/BasicAuth.php32
-rw-r--r--Zotlabs/Storage/Browser.php29
-rw-r--r--Zotlabs/Storage/Directory.php48
-rw-r--r--Zotlabs/Storage/File.php48
-rw-r--r--Zotlabs/Web/Router.php116
-rw-r--r--Zotlabs/Web/SessionHandler.php10
-rw-r--r--Zotlabs/Web/SubModule.php24
-rw-r--r--Zotlabs/Zot/Auth.php6
-rw-r--r--Zotlabs/Zot/Finger.php37
-rw-r--r--app/bugreport.apd2
-rwxr-xr-xboot.php128
-rw-r--r--composer.json55
-rw-r--r--doc/Hubzilla_on_OpenShift.bb2
-rw-r--r--doc/about/about_hub.bb7
-rw-r--r--doc/about/about_hubzilla.bb218
-rw-r--r--doc/about/hubzilla_project.bb185
-rw-r--r--doc/addons.bb16
-rw-r--r--doc/admin/administrator_guide.md345
-rw-r--r--doc/admin/hub_snapshots.md127
-rw-r--r--doc/api/api_albums.md66
-rw-r--r--doc/api/api_filedata.md66
-rw-r--r--doc/api/api_files.md103
-rw-r--r--doc/api/api_functions.bb (renamed from doc/api_functions.bb)0
-rw-r--r--doc/api/api_group_members.md133
-rw-r--r--doc/api/api_item_update.md225
-rw-r--r--doc/api/api_posting.bb (renamed from doc/api_posting.bb)0
-rw-r--r--doc/api/api_xchan.md44
-rw-r--r--doc/api/group.md41
-rw-r--r--doc/api_zot.md84
-rw-r--r--doc/bbcode.html1
-rw-r--r--doc/ca/general.bb2
-rw-r--r--doc/context/en/profiles/help.html35
-rw-r--r--doc/context/en/settings/account/help.html35
-rw-r--r--doc/context/en/settings/channel/help.html35
-rw-r--r--doc/context/en/settings/tokens/help.html23
-rw-r--r--doc/context/en/webpages/help.html4
-rw-r--r--doc/context/en/wiki/help.html4
-rw-r--r--doc/context/es-es/connedit/help.html2
-rw-r--r--doc/dav_konqueror.bb2
-rw-r--r--doc/dav_mount.bb3
-rw-r--r--doc/de/general.bb2
-rw-r--r--doc/developer/api_zot.md791
-rw-r--r--doc/developer/developer_guide.md422
-rw-r--r--doc/features.bb1
-rw-r--r--doc/general.bb2
-rw-r--r--doc/hook/crypto_methods.bb5
-rw-r--r--doc/hook/get_photo.bb14
-rw-r--r--doc/hook/markdown_to_bb.bb5
-rw-r--r--doc/hook/other_encapsulate.bb7
-rw-r--r--doc/hook/other_unencapsulate.bb5
-rw-r--r--doc/hooklist.bb15
-rw-r--r--doc/member/member_faq.bb10
-rw-r--r--doc/member/member_guide.bb486
-rw-r--r--doc/permissions.bb2
-rw-r--r--doc/project/governance.bb20
-rw-r--r--doc/project/history.md74
-rw-r--r--doc/project/toc.html1
-rw-r--r--doc/sv/main.bb1
-rw-r--r--doc/toc.html100
-rw-r--r--doc/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.pngbin0 -> 249151 bytes
-rw-r--r--doc/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.pngbin0 -> 293314 bytes
-rw-r--r--doc/tutorials/assets/2243e48ccea25bd907cce3dbd6fc9f7cd832a4c91a4c5dd294b7b219e7d8.pngbin0 -> 178913 bytes
-rw-r--r--doc/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.pngbin0 -> 43797 bytes
-rw-r--r--doc/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.pngbin0 -> 46752 bytes
-rw-r--r--doc/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.pngbin0 -> 257211 bytes
-rw-r--r--doc/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.pngbin0 -> 91478 bytes
-rw-r--r--doc/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.pngbin0 -> 293611 bytes
-rw-r--r--doc/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.pngbin0 -> 318766 bytes
-rw-r--r--doc/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.pngbin0 -> 298857 bytes
-rw-r--r--doc/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.pngbin0 -> 532838 bytes
-rw-r--r--doc/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.pngbin0 -> 137827 bytes
-rw-r--r--doc/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.pngbin0 -> 466641 bytes
-rw-r--r--doc/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.pngbin0 -> 240495 bytes
-rw-r--r--doc/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.pngbin0 -> 665755 bytes
-rw-r--r--doc/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.pngbin0 -> 324092 bytes
-rw-r--r--doc/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.pngbin0 -> 466584 bytes
-rw-r--r--doc/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.pngbin0 -> 155763 bytes
-rw-r--r--doc/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.pngbin0 -> 134643 bytes
-rw-r--r--doc/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.pngbin0 -> 306069 bytes
-rw-r--r--doc/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.pngbin0 -> 57185 bytes
-rw-r--r--doc/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.pngbin0 -> 255688 bytes
-rw-r--r--doc/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.pngbin0 -> 83265 bytes
-rw-r--r--doc/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.pngbin0 -> 264916 bytes
-rw-r--r--doc/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.pngbin0 -> 68194 bytes
-rw-r--r--doc/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.pngbin0 -> 99210 bytes
-rw-r--r--doc/tutorials/personal_channel.html163
-rw-r--r--images/emoticons/beer_mug.gif (renamed from images/beer_mug.gif)bin1021 -> 1021 bytes
-rw-r--r--images/emoticons/coffee.gif (renamed from images/coffee.gif)bin231 -> 231 bytes
-rw-r--r--images/emoticons/dislike.gif (renamed from images/dislike.gif)bin119 -> 119 bytes
-rw-r--r--images/emoticons/like.gif (renamed from images/like.gif)bin119 -> 119 bytes
-rw-r--r--images/emoticons/smiley-Oo.gif (renamed from images/smiley-Oo.gif)bin1003 -> 1003 bytes
-rw-r--r--images/emoticons/smiley-bangheaddesk.gif (renamed from images/smiley-bangheaddesk.gif)bin885 -> 885 bytes
-rw-r--r--images/emoticons/smiley-beard.png (renamed from images/smiley-beard.png)bin1094 -> 1094 bytes
-rw-r--r--images/emoticons/smiley-brokenheart.gif (renamed from images/smiley-brokenheart.gif)bin598 -> 598 bytes
-rw-r--r--images/emoticons/smiley-cool.gif (renamed from images/smiley-cool.gif)bin315 -> 315 bytes
-rw-r--r--images/emoticons/smiley-cry.gif (renamed from images/smiley-cry.gif)bin303 -> 303 bytes
-rw-r--r--images/emoticons/smiley-embarassed.gif (renamed from images/smiley-embarassed.gif)bin300 -> 300 bytes
-rw-r--r--images/emoticons/smiley-facepalm.gif (renamed from images/smiley-facepalm.gif)bin582 -> 582 bytes
-rw-r--r--images/emoticons/smiley-foot-in-mouth.gif (renamed from images/smiley-foot-in-mouth.gif)bin306 -> 306 bytes
-rw-r--r--images/emoticons/smiley-frown.gif (renamed from images/smiley-frown.gif)bin301 -> 301 bytes
-rw-r--r--images/emoticons/smiley-heart.gif (renamed from images/smiley-heart.gif)bin577 -> 577 bytes
-rw-r--r--images/emoticons/smiley-innocent.gif (renamed from images/smiley-innocent.gif)bin305 -> 305 bytes
-rw-r--r--images/emoticons/smiley-kiss.gif (renamed from images/smiley-kiss.gif)bin299 -> 299 bytes
-rw-r--r--images/emoticons/smiley-laughing.gif (renamed from images/smiley-laughing.gif)bin306 -> 306 bytes
-rw-r--r--images/emoticons/smiley-money-mouth.gif (renamed from images/smiley-money-mouth.gif)bin291 -> 291 bytes
-rw-r--r--images/emoticons/smiley-sealed.gif (renamed from images/smiley-sealed.gif)bin293 -> 293 bytes
-rw-r--r--images/emoticons/smiley-shaka.gif (renamed from images/smiley-shaka.gif)bin2427 -> 2427 bytes
-rw-r--r--images/emoticons/smiley-smile.gif (renamed from images/smiley-smile.gif)bin306 -> 306 bytes
-rw-r--r--images/emoticons/smiley-surprised.gif (renamed from images/smiley-surprised.gif)bin303 -> 303 bytes
-rw-r--r--images/emoticons/smiley-thumbsup.gif (renamed from images/smiley-thumbsup.gif)bin1350 -> 1350 bytes
-rw-r--r--images/emoticons/smiley-tongue-out.gif (renamed from images/smiley-tongue-out.gif)bin290 -> 290 bytes
-rw-r--r--images/emoticons/smiley-undecided.gif (renamed from images/smiley-undecided.gif)bin299 -> 299 bytes
-rw-r--r--images/emoticons/smiley-whitebeard.png (renamed from images/smiley-whitebeard.png)bin1060 -> 1060 bytes
-rw-r--r--images/emoticons/smiley-wink.gif (renamed from images/smiley-wink.gif)bin312 -> 312 bytes
-rw-r--r--images/emoticons/smiley-yell.gif (renamed from images/smiley-yell.gif)bin298 -> 298 bytes
-rw-r--r--include/Import/Importer.php1
-rw-r--r--include/Import/import_diaspora.php2
-rw-r--r--include/account.php8
-rw-r--r--include/acl_selectors.php73
-rw-r--r--include/api.php2270
-rw-r--r--include/api_zot.php481
-rw-r--r--include/attach.php342
-rw-r--r--include/bb2diaspora.php26
-rw-r--r--include/bbcode.php110
-rw-r--r--include/channel.php302
-rw-r--r--include/config.php28
-rw-r--r--include/connections.php20
-rw-r--r--include/conversation.php104
-rw-r--r--include/crypto.php117
-rw-r--r--include/datetime.php24
-rwxr-xr-xinclude/dba/dba_driver.php119
-rwxr-xr-xinclude/dba/dba_mysql.php2
-rwxr-xr-xinclude/dba/dba_mysqli.php2
-rwxr-xr-xinclude/dba/dba_pdo.php84
-rw-r--r--include/dba/dba_postgres.php3
-rw-r--r--include/dir_fns.php10
-rw-r--r--include/event.php44
-rw-r--r--include/follow.php25
-rw-r--r--include/group.php40
-rw-r--r--include/help.php108
-rw-r--r--include/hubloc.php14
-rw-r--r--include/import.php175
-rwxr-xr-xinclude/items.php364
-rw-r--r--include/language.php58
-rw-r--r--include/menu.php2
-rw-r--r--include/message.php13
-rw-r--r--include/nav.php20
-rw-r--r--include/network.php192
-rwxr-xr-xinclude/oembed.php14
-rw-r--r--include/photo/photo_driver.php104
-rw-r--r--include/photos.php99
-rwxr-xr-xinclude/plugin.php67
-rw-r--r--include/queue_fn.php4
-rw-r--r--include/security.php86
-rw-r--r--include/selectors.php2
-rw-r--r--include/socgraph.php40
-rw-r--r--include/statistics_fns.php2
-rw-r--r--include/taxonomy.php2
-rw-r--r--include/text.php732
-rw-r--r--include/widgets.php159
-rw-r--r--include/wiki.php184
-rw-r--r--include/zid.php232
-rw-r--r--include/zot.php534
-rw-r--r--install/INSTALL.txt107
-rw-r--r--install/schema_mysql.sql4
-rw-r--r--install/schema_postgres.sql5
-rw-r--r--install/update.php32
-rw-r--r--library/oauth2/.gitignore5
-rw-r--r--library/oauth2/.travis.yml30
-rw-r--r--library/oauth2/CHANGELOG.md152
-rw-r--r--library/oauth2/LICENSE21
-rw-r--r--library/oauth2/README.md8
-rw-r--r--library/oauth2/phpunit.xml25
-rw-r--r--library/oauth2/src/OAuth2/Autoloader.php48
-rw-r--r--library/oauth2/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php15
-rw-r--r--library/oauth2/src/OAuth2/ClientAssertionType/HttpBasic.php123
-rw-r--r--library/oauth2/src/OAuth2/Controller/AuthorizeController.php388
-rw-r--r--library/oauth2/src/OAuth2/Controller/AuthorizeControllerInterface.php43
-rw-r--r--library/oauth2/src/OAuth2/Controller/ResourceController.php111
-rw-r--r--library/oauth2/src/OAuth2/Controller/ResourceControllerInterface.php26
-rw-r--r--library/oauth2/src/OAuth2/Controller/TokenController.php278
-rw-r--r--library/oauth2/src/OAuth2/Controller/TokenControllerInterface.php32
-rw-r--r--library/oauth2/src/OAuth2/Encryption/EncryptionInterface.php11
-rw-r--r--library/oauth2/src/OAuth2/Encryption/FirebaseJwt.php47
-rw-r--r--library/oauth2/src/OAuth2/Encryption/Jwt.php173
-rw-r--r--library/oauth2/src/OAuth2/GrantType/AuthorizationCode.php100
-rw-r--r--library/oauth2/src/OAuth2/GrantType/ClientCredentials.php67
-rw-r--r--library/oauth2/src/OAuth2/GrantType/GrantTypeInterface.php20
-rw-r--r--library/oauth2/src/OAuth2/GrantType/JwtBearer.php226
-rw-r--r--library/oauth2/src/OAuth2/GrantType/RefreshToken.php111
-rw-r--r--library/oauth2/src/OAuth2/GrantType/UserCredentials.php83
-rw-r--r--library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeController.php106
-rw-r--r--library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php10
-rw-r--r--library/oauth2/src/OAuth2/OpenID/Controller/UserInfoController.php58
-rw-r--r--library/oauth2/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php23
-rw-r--r--library/oauth2/src/OAuth2/OpenID/GrantType/AuthorizationCode.php33
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php60
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php27
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdToken.php24
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php9
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/IdToken.php124
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php29
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenToken.php27
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php9
-rw-r--r--library/oauth2/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php37
-rw-r--r--library/oauth2/src/OAuth2/OpenID/Storage/UserClaimsInterface.php38
-rw-r--r--library/oauth2/src/OAuth2/Request.php213
-rw-r--r--library/oauth2/src/OAuth2/RequestInterface.php16
-rw-r--r--library/oauth2/src/OAuth2/Response.php369
-rw-r--r--library/oauth2/src/OAuth2/ResponseInterface.php24
-rw-r--r--library/oauth2/src/OAuth2/ResponseType/AccessToken.php194
-rw-r--r--library/oauth2/src/OAuth2/ResponseType/AccessTokenInterface.php34
-rw-r--r--library/oauth2/src/OAuth2/ResponseType/AuthorizationCode.php100
-rw-r--r--library/oauth2/src/OAuth2/ResponseType/AuthorizationCodeInterface.php30
-rw-r--r--library/oauth2/src/OAuth2/ResponseType/JwtAccessToken.php124
-rw-r--r--library/oauth2/src/OAuth2/ResponseType/ResponseTypeInterface.php8
-rw-r--r--library/oauth2/src/OAuth2/Scope.php103
-rw-r--r--library/oauth2/src/OAuth2/ScopeInterface.php40
-rw-r--r--library/oauth2/src/OAuth2/Server.php832
-rw-r--r--library/oauth2/src/OAuth2/Storage/AccessTokenInterface.php64
-rw-r--r--library/oauth2/src/OAuth2/Storage/AuthorizationCodeInterface.php86
-rw-r--r--library/oauth2/src/OAuth2/Storage/Cassandra.php480
-rw-r--r--library/oauth2/src/OAuth2/Storage/ClientCredentialsInterface.php49
-rw-r--r--library/oauth2/src/OAuth2/Storage/ClientInterface.php66
-rwxr-xr-xlibrary/oauth2/src/OAuth2/Storage/CouchbaseDB.php331
-rw-r--r--library/oauth2/src/OAuth2/Storage/DynamoDB.php540
-rw-r--r--library/oauth2/src/OAuth2/Storage/JwtAccessToken.php88
-rw-r--r--library/oauth2/src/OAuth2/Storage/JwtAccessTokenInterface.php14
-rw-r--r--library/oauth2/src/OAuth2/Storage/JwtBearerInterface.php74
-rw-r--r--library/oauth2/src/OAuth2/Storage/Memory.php381
-rw-r--r--library/oauth2/src/OAuth2/Storage/Mongo.php339
-rw-r--r--library/oauth2/src/OAuth2/Storage/Pdo.php553
-rw-r--r--library/oauth2/src/OAuth2/Storage/PublicKeyInterface.php16
-rw-r--r--library/oauth2/src/OAuth2/Storage/Redis.php321
-rw-r--r--library/oauth2/src/OAuth2/Storage/RefreshTokenInterface.php82
-rw-r--r--library/oauth2/src/OAuth2/Storage/ScopeInterface.php46
-rw-r--r--library/oauth2/src/OAuth2/Storage/UserCredentialsInterface.php52
-rw-r--r--library/oauth2/src/OAuth2/TokenType/Bearer.php130
-rw-r--r--library/oauth2/src/OAuth2/TokenType/Mac.php22
-rw-r--r--library/oauth2/src/OAuth2/TokenType/TokenTypeInterface.php21
-rw-r--r--library/oauth2/test/OAuth2/AutoloadTest.php16
-rw-r--r--library/oauth2/test/OAuth2/Controller/AuthorizeControllerTest.php492
-rw-r--r--library/oauth2/test/OAuth2/Controller/ResourceControllerTest.php175
-rw-r--r--library/oauth2/test/OAuth2/Controller/TokenControllerTest.php289
-rw-r--r--library/oauth2/test/OAuth2/Encryption/FirebaseJwtTest.php102
-rw-r--r--library/oauth2/test/OAuth2/Encryption/JwtTest.php102
-rw-r--r--library/oauth2/test/OAuth2/GrantType/AuthorizationCodeTest.php207
-rw-r--r--library/oauth2/test/OAuth2/GrantType/ClientCredentialsTest.php159
-rw-r--r--library/oauth2/test/OAuth2/GrantType/ImplicitTest.php143
-rw-r--r--library/oauth2/test/OAuth2/GrantType/JwtBearerTest.php360
-rw-r--r--library/oauth2/test/OAuth2/GrantType/RefreshTokenTest.php204
-rw-r--r--library/oauth2/test/OAuth2/GrantType/UserCredentialsTest.php172
-rw-r--r--library/oauth2/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php182
-rw-r--r--library/oauth2/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php44
-rw-r--r--library/oauth2/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php57
-rw-r--r--library/oauth2/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php182
-rw-r--r--library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTest.php184
-rw-r--r--library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php91
-rw-r--r--library/oauth2/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php95
-rw-r--r--library/oauth2/test/OAuth2/OpenID/Storage/UserClaimsTest.php41
-rw-r--r--library/oauth2/test/OAuth2/RequestTest.php98
-rw-r--r--library/oauth2/test/OAuth2/ResponseTest.php17
-rw-r--r--library/oauth2/test/OAuth2/ResponseType/AccessTokenTest.php107
-rw-r--r--library/oauth2/test/OAuth2/ResponseType/JwtAccessTokenTest.php160
-rw-r--r--library/oauth2/test/OAuth2/ScopeTest.php42
-rw-r--r--library/oauth2/test/OAuth2/ServerTest.php684
-rw-r--r--library/oauth2/test/OAuth2/Storage/AccessTokenTest.php102
-rw-r--r--library/oauth2/test/OAuth2/Storage/AuthorizationCodeTest.php106
-rw-r--r--library/oauth2/test/OAuth2/Storage/ClientCredentialsTest.php28
-rw-r--r--library/oauth2/test/OAuth2/Storage/ClientTest.php110
-rw-r--r--library/oauth2/test/OAuth2/Storage/DynamoDBTest.php40
-rw-r--r--library/oauth2/test/OAuth2/Storage/JwtAccessTokenTest.php41
-rw-r--r--library/oauth2/test/OAuth2/Storage/JwtBearerTest.php25
-rw-r--r--library/oauth2/test/OAuth2/Storage/PdoTest.php39
-rw-r--r--library/oauth2/test/OAuth2/Storage/PublicKeyTest.php29
-rw-r--r--library/oauth2/test/OAuth2/Storage/RefreshTokenTest.php41
-rw-r--r--library/oauth2/test/OAuth2/Storage/ScopeTest.php53
-rw-r--r--library/oauth2/test/OAuth2/Storage/UserCredentialsTest.php40
-rw-r--r--library/oauth2/test/OAuth2/TokenType/BearerTest.php58
-rw-r--r--library/oauth2/test/bootstrap.php12
-rw-r--r--library/oauth2/test/cleanup.php15
-rw-r--r--library/oauth2/test/config/keys/id_rsa15
-rw-r--r--library/oauth2/test/config/keys/id_rsa.pub16
-rw-r--r--library/oauth2/test/config/storage.json181
-rw-r--r--library/oauth2/test/lib/OAuth2/Request/TestRequest.php61
-rwxr-xr-xlibrary/oauth2/test/lib/OAuth2/Storage/BaseTest.php34
-rwxr-xr-xlibrary/oauth2/test/lib/OAuth2/Storage/Bootstrap.php888
-rw-r--r--library/oauth2/test/lib/OAuth2/Storage/NullStorage.php32
-rw-r--r--library/sticky-kit/sticky-kit.js265
-rw-r--r--library/sticky-kit/sticky-kit.min.js10
-rw-r--r--tests/README.md25
-rw-r--r--tests/acceptance/behat.yml27
-rw-r--r--tests/acceptance/features/bootstrap/AdminContext.php23
-rw-r--r--tests/acceptance/features/bootstrap/ApiContext.php23
-rw-r--r--tests/acceptance/features/bootstrap/FeatureContext.php23
-rw-r--r--tests/acceptance/features/login_local.feature18
-rw-r--r--tests/unit/AntiXSSTest.php (renamed from tests/xss_filter_test.php)42
-rw-r--r--tests/unit/AutonameTest.php (renamed from tests/autoname_test.php)100
-rw-r--r--tests/unit/ContainsAttributeTest.php (renamed from tests/contains_attribute_test.php)90
-rw-r--r--tests/unit/Lib/PermissionDescriptionTest.php110
-rw-r--r--tests/unit/TextTest.php (renamed from tests/text_test.php)8
-rw-r--r--tests/unit/UnitTestCase.php38
-rw-r--r--tests/unit/UploadTest.php (renamed from tests/upload_test.php)8
-rw-r--r--tests/unit/expand_acl_test.php (renamed from tests/expand_acl_test.php)0
-rw-r--r--tests/unit/get_tags_test.php (renamed from tests/get_tags_test.php)0
-rw-r--r--tests/unit/template_test.php (renamed from tests/template_test.php)0
-rw-r--r--util/Doxyfile6
-rwxr-xr-xutil/connect64
-rw-r--r--util/hmessages.po12530
-rwxr-xr-xutil/run_xgettext.sh20
-rw-r--r--util/zotsh/README.txt4
-rw-r--r--util/zotsh/easywebdav/__init__.pycbin455 -> 457 bytes
-rw-r--r--util/zotsh/easywebdav/__version__.pycbin173 -> 174 bytes
-rw-r--r--util/zotsh/easywebdav/client.pycbin8846 -> 8871 bytes
-rw-r--r--vendor/autoload.php2
-rw-r--r--vendor/composer/ClassLoader.php12
-rw-r--r--vendor/composer/autoload_classmap.php605
-rw-r--r--vendor/composer/autoload_files.php4
-rw-r--r--vendor/composer/autoload_namespaces.php1
-rw-r--r--vendor/composer/autoload_psr4.php3
-rw-r--r--vendor/composer/autoload_real.php14
-rw-r--r--vendor/composer/autoload_static.php650
-rw-r--r--vendor/composer/installed.json233
-rw-r--r--vendor/psr/log/Psr/Log/AbstractLogger.php40
-rw-r--r--vendor/psr/log/Psr/Log/LogLevel.php16
-rw-r--r--vendor/psr/log/Psr/Log/LoggerAwareInterface.php7
-rw-r--r--vendor/psr/log/Psr/Log/LoggerAwareTrait.php8
-rw-r--r--vendor/psr/log/Psr/Log/LoggerInterface.php51
-rw-r--r--vendor/psr/log/Psr/Log/LoggerTrait.php51
-rw-r--r--vendor/psr/log/Psr/Log/NullLogger.php9
-rw-r--r--vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php116
-rw-r--r--vendor/psr/log/composer.json26
-rw-r--r--vendor/sabre/dav/composer.json68
-rw-r--r--vendor/sabre/dav/lib/DAV/Browser/Plugin.php6
-rw-r--r--vendor/sabre/event/composer.json47
-rw-r--r--vendor/sabre/http/composer.json43
-rw-r--r--vendor/sabre/uri/composer.json41
-rw-r--r--vendor/sabre/vobject/.travis.yml5
-rw-r--r--vendor/sabre/vobject/CHANGELOG.md27
-rwxr-xr-x[-rw-r--r--]vendor/sabre/vobject/bin/bench.php0
-rwxr-xr-x[-rw-r--r--]vendor/sabre/vobject/bin/fetch_windows_zones.php0
-rwxr-xr-x[-rw-r--r--]vendor/sabre/vobject/bin/generateicalendardata.php2
-rwxr-xr-x[-rw-r--r--]vendor/sabre/vobject/bin/mergeduplicates.php2
-rw-r--r--vendor/sabre/vobject/composer.json88
-rw-r--r--vendor/sabre/vobject/lib/Component/VTimeZone.php3
-rw-r--r--vendor/sabre/vobject/lib/DateTimeParser.php13
-rw-r--r--vendor/sabre/vobject/lib/Property.php6
-rw-r--r--vendor/sabre/vobject/lib/Property/ICalendar/Recur.php24
-rw-r--r--vendor/sabre/vobject/lib/Property/Text.php2
-rw-r--r--vendor/sabre/vobject/lib/Recur/EventIterator.php12
-rw-r--r--vendor/sabre/vobject/lib/Recur/RRuleIterator.php5
-rw-r--r--vendor/sabre/vobject/lib/TimeZoneUtil.php10
-rw-r--r--vendor/sabre/vobject/lib/Version.php2
-rw-r--r--vendor/sabre/xml/.travis.yml15
-rw-r--r--vendor/sabre/xml/CHANGELOG.md11
-rw-r--r--vendor/sabre/xml/composer.json53
-rw-r--r--vendor/sabre/xml/lib/Element/XmlFragment.php2
-rw-r--r--vendor/sabre/xml/lib/Reader.php122
-rw-r--r--vendor/sabre/xml/lib/Version.php2
-rw-r--r--vendor/sabre/xml/lib/Writer.php2
-rw-r--r--view/css/bootstrap-red.css3
-rw-r--r--view/css/conversation.css17
-rw-r--r--view/css/default.css2
-rw-r--r--view/css/mod_help.css29
-rw-r--r--view/css/mod_wiki.css54
-rw-r--r--view/css/widgets.css41
-rw-r--r--view/de/hmessages.po13932
-rw-r--r--view/de/hstrings.php3217
-rw-r--r--view/en-au/hstrings.php5
-rw-r--r--view/en-gb/hstrings.php31
-rw-r--r--view/en/htconfig.tpl9
-rw-r--r--view/es-es/hmessages.po14163
-rw-r--r--view/es-es/hstrings.php3221
-rw-r--r--view/js/autocomplete.js5
-rw-r--r--view/js/main.js63
-rw-r--r--view/nl/hmessages.po14001
-rw-r--r--view/nl/hstrings.php3223
-rw-r--r--view/pdl/mod_wiki.pdl2
-rw-r--r--view/php/default.php2
-rw-r--r--view/php/theme_init.php1
-rw-r--r--view/theme/redbasic/css/style.css105
-rw-r--r--view/theme/redbasic/js/redbasic.js47
-rw-r--r--view/theme/redbasic/php/style.php2
-rwxr-xr-xview/tpl/abook_edit.tpl49
-rw-r--r--view/tpl/achievements.tpl8
-rw-r--r--view/tpl/admin_account_edit.tpl9
-rwxr-xr-xview/tpl/admin_site.tpl1
-rwxr-xr-xview/tpl/build_query.tpl2
-rwxr-xr-xview/tpl/chanview.tpl3
-rwxr-xr-xview/tpl/conv_item.tpl51
-rwxr-xr-xview/tpl/cover_photo_widget.tpl2
-rwxr-xr-xview/tpl/event_form.tpl6
-rwxr-xr-xview/tpl/event_head.tpl11
-rw-r--r--view/tpl/generic_modal.tpl4
-rwxr-xr-xview/tpl/group_side.tpl6
-rw-r--r--view/tpl/help.tpl31
-rwxr-xr-xview/tpl/micropro_img.tpl2
-rwxr-xr-xview/tpl/nav.tpl10
-rw-r--r--view/tpl/notes.tpl47
-rwxr-xr-xview/tpl/photo_album.tpl2
-rwxr-xr-xview/tpl/photo_view.tpl4
-rwxr-xr-xview/tpl/profile_photo.tpl5
-rwxr-xr-xview/tpl/profile_vcard.tpl1
-rwxr-xr-xview/tpl/settings.tpl1
-rwxr-xr-xview/tpl/settings_display.tpl1
-rwxr-xr-xview/tpl/settings_nick_set.tpl6
-rwxr-xr-xview/tpl/siteinfo.tpl61
-rw-r--r--view/tpl/wiki.tpl912
-rw-r--r--view/tpl/wiki_page_history.tpl7
-rw-r--r--view/tpl/wiki_page_list.tpl67
-rw-r--r--view/tpl/wikilist.tpl96
-rw-r--r--view/tpl/wikilist_widget.tpl8
506 files changed, 67844 insertions, 32290 deletions
diff --git a/.gitignore b/.gitignore
index a5f149548..75be5b0c2 100755
--- a/.gitignore
+++ b/.gitignore
@@ -60,11 +60,13 @@ nbproject/
.idea/
-# composer files (at the moment composer is not officially supported and only used to add SabreDAV, we should add these)
-composer.*
-
-# When we include composer we should exclude vendor/
+## composer
+# locally installed composer binary
+composer.phar
+# vendor/ is managed by composer, no need to include in our repository
+# requires new deployment and needs discussion first
#vendor/
-# Exclude at least some vendor test files, examples, etc.
-vendor/sabre/*/tests/
+# Exclude at least some vendor test files, examples, etc. so far
+vendor/**/tests/
+vendor/**/Test/
vendor/sabre/*/examples/
diff --git a/.travis.yml b/.travis.yml
index 583b2a1a8..2830d1b9f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,10 +5,6 @@ language: php
php:
# using major version aliases
- # aliased to a recent 5.4.x version
- - 5.4
- # aliased to a recent 5.5.x version
- - 5.5
# aliased to a recent 5.6.x version
- 5.6
# aliased to a recent 7.x version
@@ -27,7 +23,6 @@ matrix:
# - php: hhvm
# env: DB=pgsql # PDO driver for pgsql is unsupported by HHVM (3rd party install for support)
allow_failures:
- - php: 7.0
- php: hhvm
# execute any number of scripts before the test run, custom env's are available as variables
@@ -36,11 +31,14 @@ matrix:
# - if [[ "$DB" == "pgsql" ]]; then psql -c "create database hello_world_test;" -U postgres; fi
# - if [[ "$DB" == "mysql" ]]; then mysql -e "create database IF NOT EXISTS hello_world_test;" -uroot; fi
+install:
+ - composer require phpunit/phpunit
+
# omitting "script:" will default to phpunit
# use the $DB env variable to determine the phpunit.xml to use
-script: phpunit tests/*php
+script: vendor/bin/phpunit tests/unit/
# configure notifications (email, IRC, campfire etc)
notifications:
# irc: "irc.freenode.org#yourfavouriteroomfortravis"
-# a plugin/script to post to a hubzilla channel would be neat here \ No newline at end of file
+# a plugin/script to post to a hubzilla channel would be neat here
diff --git a/CHANGELOG b/CHANGELOG
index 53d8a0f2e..642506016 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,99 @@
+Hubzilla 2.0 (2016-12-23)
+ - Deprecate bb_iframe
+ - Note widget: resize the textarea to reveal full content
+ - Implement fixed left aside
+ - Implement lockview for wikilist
+ - Simplify wikilist widget
+ - Router error reporting
+ - Setup changes to check for shell_exec and exec functions
+ - Extensible permissions upgrade handling for channels with custom permission roles
+ - Allow plugins to cancel item_store() and item_store_update()
+ - ZOT version 1.2 provides negotiation of cryptographic algorithms
+ - Provide a fresh new look and cleaner layout and more relevant information to siteinfo
+ - Introduce highlight bbcode [hl]
+ - Implement wiki mimetypes markdown or bbcode
+ - Doc pages refactoring
+ - Update webpages and wiki context help
+ - Make a git commit when a new wiki page is created
+ - Prev-next navigation for mod_connedit to ease bulk connection edits
+ - Move the remote user homebutton to the user menu
+ - Do not render maps/locations for Diaspora destinations
+ - Provide 'per-page' caching for is_matrix_url() results to reduce duplicate queries
+ - Don't send notification for posts/comments on old conversations that were refetched after having expired
+ - Numerous wiki UI improvements
+ - Move twitter api to addon
+ - Cleanup and re-organise the voting and attendance buttons
+ - Reorganise emoticons
+ - Collapse navbar-collapse-1 if avatar menu is clicked.
+ - New display setting: static page update as opposed to live update
+ - Command line administrative channel connect utility
+ - Modernise chanview
+ - Implement edit activities to share post/comment edits with protocols which do not support them (e.g. Diaspora)
+ - Wiki export
+ - Numerous postgres compatibility fixes
+ - Remove requirement that imported profile photos be in the profile photos album
+ - Change event behaviour - share by default.
+ - Use PDO database driver exclusively (deprecate drivers that are separately maintained)
+ - Zot API re-write and extended
+
+ Bugfixes
+ - Fix z_fetch_url() incorrect variable
+ - Fix SQL error with app categories
+ - Fix do not show revert buttons if we do not have write perms
+ - Fix dropdown positions
+ - Fix do not increase opacity to more than 1
+ - Fix clone sync missing for some item delete operations
+ - Fix embed-image for fullscreen mode
+ - Fix attach_list_files()
+ - Fix full screen for embedded videos
+ - Fix the forum widget for forums with custom perms
+ - Fix issue #607 parens not recognised inside urls
+ - Fix pubsites: don't list dead sites
+ - Fix issue #596 silence headers already sent warning
+ - Fix missing plugins in zot-info
+ - Fix notification issue
+ - Fix issue #594 like of thing appears as profile owner like
+ - Fix export issue
+ - Fix checklist bbcode - only turn [] and [x] into checkboxes if it is found inside a checklist
+ - Fix wiki permissions issues
+ - Fix public calendar leaks connection information (birthdays) when view_contacts is not allowed
+ - Fix attach_rename: flaw in duplicate filename detection resulted in filename(1)(1)(1).ext
+ - Fix a fatal error with incorrect DB object access
+ - Provide /locs link on settings page if there is more than one hubloc for this channnel *that isn't deleted*.
+ - Fix issue #577 if connecting to a channel that is already pending, undo the pending and set connect permissions accordingly
+ - Fix issue #575, when 'nofinish' is set on an event, invalid date was generated/stored
+ - Fix bbcode event formatting issue
+ - Fix zot_finger from navbar people search looping
+ - Fix fromStandalonePermission()
+
+ Plugins
+ - GNU Social: removed from addons for security reasons - it might be re-implemented once it is properly reviewed
+ - Diaspora: missing item author when diaspora public comment received from relay
+ - Superblock: refactoring
+ - New addon: tripleaes for pro
+ - Cdav: "if not exists" only supported starting with postgresql v. 9.5 debian stable has 9.4
+ - Rendezvous: added markers and members export tool at /rendezvous/[group_id]/export/{markers,members}
+ - Twitter: move twitter api to addon
+ - New addon: b2tbtn (back to top button)
+ - Diaspora: import public diaspora messages to sys if applicable
+ - Diaspora: try and handle singletons better and simplify the associated notifier decisions
+ - Rendezvous: add proximity alert feature to members to issue notification when member is within a specified distance.
+ - New addon: diaspora_reconnect to refriend diaspora/friendica connections from a clone or channel move
+ - Diaspora: change the logic for deciding between upstream and downstream message flow for notifier plugins
+ - Rendezvous: prompt member to share their location by activating the GPS control using a tooltip and pulsing visibility
+ - statistics_json: fix nodeinfo
+ - Rendezvous: restored the lost gps-icon.png and corrected the OpenStreetMap tile server URL to avoid insecure content warnings
+ - Rendezvous: use observer name if available
+ - std_embeds: missing backslash
+ - Diaspora: postgres fixes issue #31
+ - Rendezvous: added marker list with centering buttons and popup open.
+ - Rendezvous: added control to see list of members sharing their location, with buttons to pan the map to center them
+ - Diaspora: system level diaspora toggle
+ - Rendezvous: added control that displays members.
+ - Diaspora: rename diaspora2bb() to markdown_to_bb() in core
+ - Hubwall: remove illegal unescaped angle chars
+ - Rendezvous: Add control to delete member if not updated in over 14 minutes
+
Hubzilla 1.14 (2016-10-13)
- New hook bbcode_filter
- Unify the various mail sending instance to enotify::send() and z_mail()
diff --git a/Zotlabs/Access/PermissionRoles.php b/Zotlabs/Access/PermissionRoles.php
index 8b116adc5..94c49c44f 100644
--- a/Zotlabs/Access/PermissionRoles.php
+++ b/Zotlabs/Access/PermissionRoles.php
@@ -7,6 +7,9 @@ use Zotlabs\Lib as Zlib;
class PermissionRoles {
+ static public function version() {
+ return 1;
+ }
static function role_perms($role) {
@@ -160,6 +163,7 @@ class PermissionRoles {
$ret['limits'] = PermissionLimits::Std_Limits();
break;
+ case 'custom':
default:
break;
}
@@ -174,7 +178,48 @@ class PermissionRoles {
return $ret;
}
+ static public function new_custom_perms($uid,$perm,$abooks) {
+
+ // set permissionlimits for this permission here, for example:
+
+ // if($perm === 'mynewperm')
+ // \Zotlabs\Access\PermissionLimits::Set($uid,$perm,1);
+
+
+ // set autoperms here if applicable
+ // choices are to set to 0, 1, or the value of an existing perm
+
+ if(get_pconfig($uid,'system','autoperms')) {
+
+ $c = channelx_by_n($uid);
+ $value = 0;
+ // if($perm === 'mynewperm')
+ // $value = get_abconfig($uid,$c['channel_hash'],'autoperms','someexistingperm'));
+
+ if($c) {
+ set_abconfig($uid,$c['channel_hash'],'autoperms',$perm,$value);
+ }
+
+
+ }
+
+ // now set something for all existing connections.
+
+ if($abooks) {
+ foreach($abooks as $ab) {
+ switch($perm) {
+ // case 'mynewperm':
+ // choices are to set to 1, set to 0, or clone an existing perm
+ // set_abconfig($uid,$ab['abook_xchan'],'my_perms',$perm,
+ // get_abconfig($uid,$ab['abook_xchan'],'my_perms','someexistingperm'));
+
+ default:
+ break;
+ }
+ }
+ }
+ }
static public function roles() {
diff --git a/Zotlabs/Access/Permissions.php b/Zotlabs/Access/Permissions.php
index 61ea51a48..43baa6cf7 100644
--- a/Zotlabs/Access/Permissions.php
+++ b/Zotlabs/Access/Permissions.php
@@ -10,9 +10,20 @@ class Permissions {
/**
* Extensible permissions.
* To add new permissions, add to the list of $perms below, with a simple description.
+ *
* Also visit PermissionRoles.php and add to the $ret['perms_connect'] property for any role
* if this permission should be granted to new connections.
*
+ * Next look at PermissionRoles::new_custom_perms() and provide a handler for updating custom
+ * permission roles. You will want to set a default PermissionLimit for each channel and also
+ * provide a sane default for any existing connections. You may or may not wish to provide a
+ * default auto permission. If in doubt, leave this alone as custom permissions by definition
+ * are the responsbility of the channel owner to manage. You just don't want to create any
+ * suprises or break things so you have an opportunity to provide sane settings.
+ *
+ * Update the version here and in PermissionRoles
+ *
+ *
* Permissions with 'view' in the name are considered read permissions. Anything
* else requires authentication. Read permission limits are PERMS_PUBLIC and anything else
* is given PERMS_SPECIFIC.
@@ -23,6 +34,11 @@ class Permissions {
*
*/
+ static public function version() {
+ // This must match the version in PermissionRoles.php before permission updates can run.
+ return 1;
+ }
+
static public function Perms($filter = '') {
diff --git a/Zotlabs/Daemon/Master.php b/Zotlabs/Daemon/Master.php
index 56076f612..580df97db 100644
--- a/Zotlabs/Daemon/Master.php
+++ b/Zotlabs/Daemon/Master.php
@@ -24,8 +24,7 @@ class Master {
static public function Release($argc,$argv) {
cli_startup();
logger('Master: release: ' . print_r($argv,true), LOGGER_ALL,LOG_DEBUG);
- require_once('Zotlabs/Daemon/' . $argv[0] . '.php');
$cls = '\\Zotlabs\\Daemon\\' . $argv[0];
$cls::run($argc,$argv);
}
-} \ No newline at end of file
+}
diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php
index c0997138e..63ced4f56 100644
--- a/Zotlabs/Daemon/Notifier.php
+++ b/Zotlabs/Daemon/Notifier.php
@@ -4,6 +4,7 @@ namespace Zotlabs\Daemon;
require_once('include/queue_fn.php');
require_once('include/html2plain.php');
+require_once('include/conversation.php');
/*
* This file was at one time responsible for doing all deliveries, but this caused
@@ -120,7 +121,7 @@ class Notifier {
$normal_mode = false;
$mail = true;
$private = true;
- $message = q("SELECT * FROM `mail` WHERE `id` = %d LIMIT 1",
+ $message = q("SELECT * FROM mail WHERE id = %d LIMIT 1",
intval($item_id)
);
if(! $message) {
@@ -371,12 +372,13 @@ class Notifier {
if(! $encoded_item['flags'])
$encoded_item['flags'] = array();
$encoded_item['flags'][] = 'relay';
+ $upstream = true;
}
else {
logger('notifier: normal distribution', LOGGER_DEBUG);
if($cmd === 'relay')
logger('notifier: owner relay');
-
+ $upstream = false;
// if our parent is a tag_delivery recipient, uplink to the original author causing
// a delivery fork.
@@ -445,6 +447,7 @@ class Notifier {
$narr = array(
'channel' => $channel,
+ 'upstream' => $upstream,
'env_recips' => $env_recips,
'packet_recips' => $packet_recips,
'recipients' => $recipients,
@@ -488,7 +491,7 @@ class Notifier {
// Now we have collected recipients (except for external mentions, FIXME)
// Let's reduce this to a set of hubs.
- $r = q("select * from hubloc where hubloc_hash in (" . implode(',',$recipients) . ")
+ $r = q("select hubloc.*, site.site_crypto from hubloc left join site on site_url = hubloc_url where hubloc_hash in (" . implode(',',$recipients) . ")
and hubloc_error = 0 and hubloc_deleted = 0"
);
@@ -546,6 +549,7 @@ class Notifier {
$narr = array(
'channel' => $channel,
+ 'upstream' => $upstream,
'env_recips' => $env_recips,
'packet_recips' => $packet_recips,
'recipients' => $recipients,
@@ -599,8 +603,8 @@ class Notifier {
$packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null));
}
elseif($packet_type === 'request') {
- $packet = zot_build_packet($channel,$packet_type,$env_recips,$hub['hubloc_sitekey'],$hash,
- array('message_id' => $request_message_id)
+ $packet = zot_build_packet($channel,$packet_type,$env_recips,$hub['hubloc_sitekey'],$hub['site_crypto'],
+ $hash, array('message_id' => $request_message_id)
);
}
@@ -614,7 +618,7 @@ class Notifier {
));
}
else {
- $packet = zot_build_packet($channel,'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null),$hash);
+ $packet = zot_build_packet($channel,'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash);
queue_insert(array(
'hash' => $hash,
'account_id' => $target_item['aid'],
diff --git a/Zotlabs/Daemon/Ratenotif.php b/Zotlabs/Daemon/Ratenotif.php
index 1cba5e26d..a94b89004 100644
--- a/Zotlabs/Daemon/Ratenotif.php
+++ b/Zotlabs/Daemon/Ratenotif.php
@@ -77,7 +77,7 @@ class Ratenotif {
continue;
$hash = random_string();
- $n = zot_build_packet($channel,'notify',null,null,$hash);
+ $n = zot_build_packet($channel,'notify',null,null,'',$hash);
queue_insert(array(
'hash' => $hash,
diff --git a/Zotlabs/Extend/Hook.php b/Zotlabs/Extend/Hook.php
index fc1e95367..fef3ebe9b 100644
--- a/Zotlabs/Extend/Hook.php
+++ b/Zotlabs/Extend/Hook.php
@@ -10,7 +10,7 @@ class Hook {
$function = serialize($function);
}
- $r = q("SELECT * FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `fn` = '%s' and priority = %d and hook_version = %d LIMIT 1",
+ $r = q("SELECT * FROM hook WHERE hook = '%s' AND file = '%s' AND fn = '%s' and priority = %d and hook_version = %d LIMIT 1",
dbesc($hook),
dbesc($file),
dbesc($function),
@@ -23,13 +23,13 @@ class Hook {
// To aid in upgrade and transition, remove old settings for any registered hooks that match in all respects except
// for priority or hook_version
- $r = q("DELETE FROM `hook` where `hook` = '%s' and `file` = '%s' and `fn` = '%s'",
+ $r = q("DELETE FROM hook where hook = '%s' and file = '%s' and fn = '%s'",
dbesc($hook),
dbesc($file),
dbesc($function)
);
- $r = q("INSERT INTO `hook` (`hook`, `file`, `fn`, `priority`, `hook_version`) VALUES ( '%s', '%s', '%s', %d, %d )",
+ $r = q("INSERT INTO hook (hook, file, fn, priority, hook_version) VALUES ( '%s', '%s', '%s', %d, %d )",
dbesc($hook),
dbesc($file),
dbesc($function),
@@ -44,7 +44,7 @@ class Hook {
if(is_array($function)) {
$function = serialize($function);
}
- $r = q("DELETE FROM hook WHERE hook = '%s' AND `file` = '%s' AND `fn` = '%s' and priority = %d and hook_version = %d",
+ $r = q("DELETE FROM hook WHERE hook = '%s' AND file = '%s' AND fn = '%s' and priority = %d and hook_version = %d",
dbesc($hook),
dbesc($file),
dbesc($function),
@@ -60,7 +60,7 @@ class Hook {
static public function unregister_by_file($file) {
- $r = q("DELETE FROM hook WHERE `file` = '%s' ",
+ $r = q("DELETE FROM hook WHERE file = '%s' ",
dbesc($file)
);
diff --git a/Zotlabs/Lib/AConfig.php b/Zotlabs/Lib/AConfig.php
index ab8648a18..4e7c5483f 100644
--- a/Zotlabs/Lib/AConfig.php
+++ b/Zotlabs/Lib/AConfig.php
@@ -10,8 +10,8 @@ class AConfig {
return XConfig::Load('a_' . $account_id);
}
- static public function Get($account_id,$family,$key) {
- return XConfig::Get('a_' . $account_id,$family,$key);
+ static public function Get($account_id,$family,$key,$default = false) {
+ return XConfig::Get('a_' . $account_id,$family,$key, $default);
}
static public function Set($account_id,$family,$key,$value) {
diff --git a/Zotlabs/Lib/AbConfig.php b/Zotlabs/Lib/AbConfig.php
index cb5d96951..dfc9efc6c 100644
--- a/Zotlabs/Lib/AbConfig.php
+++ b/Zotlabs/Lib/AbConfig.php
@@ -16,7 +16,7 @@ class AbConfig {
}
- static public function Get($chan,$xhash,$family,$key) {
+ static public function Get($chan,$xhash,$family,$key, $default = false) {
$r = q("select * from abconfig where chan = %d and xchan = '%s' and cat = '%s' and k = '%s' limit 1",
intval($chan),
dbesc($xhash),
@@ -26,7 +26,7 @@ class AbConfig {
if($r) {
return ((preg_match('|^a:[0-9]+:{.*}$|s', $r[0]['v'])) ? unserialize($r[0]['v']) : $r[0]['v']);
}
- return false;
+ return $default;
}
diff --git a/Zotlabs/Lib/Apps.php b/Zotlabs/Lib/Apps.php
index a646d8a30..ac03e11e1 100644
--- a/Zotlabs/Lib/Apps.php
+++ b/Zotlabs/Lib/Apps.php
@@ -68,7 +68,7 @@ class Apps {
if($id !== true) {
// if we already installed this app, but it changed, preserve any categories we created
$s = '';
- $r = q("select * from term where otype = %d and oid = d",
+ $r = q("select * from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($id)
);
@@ -203,7 +203,7 @@ class Apps {
static public function translate_system_apps(&$arr) {
$apps = array(
'Site Admin' => t('Site Admin'),
- 'Bug Report' => t('Bug Report'),
+ 'Report Bug' => t('Report Bug'),
'View Bookmarks' => t('View Bookmarks'),
'My Chatrooms' => t('My Chatrooms'),
'Connections' => t('Connections'),
@@ -359,7 +359,7 @@ class Apps {
if($r) {
if(! $r[0]['app_system']) {
if($app['categories'] && (! $app['term'])) {
- $r[0]['term'] = q("select * from term where otype = %d and oid = d",
+ $r[0]['term'] = q("select * from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($r[0]['id'])
);
diff --git a/Zotlabs/Lib/Config.php b/Zotlabs/Lib/Config.php
index d4ee1aeda..5625a3f79 100644
--- a/Zotlabs/Lib/Config.php
+++ b/Zotlabs/Lib/Config.php
@@ -98,13 +98,13 @@ class Config {
* @return mixed Return value or false on error or if not set
*/
- static public function Get($family,$key) {
+ static public function Get($family,$key,$default = false) {
if((! array_key_exists($family, \App::$config)) || (! array_key_exists('config_loaded', \App::$config[$family])))
self::Load($family);
if(array_key_exists('config_loaded', \App::$config[$family])) {
if(! array_key_exists($key, \App::$config[$family])) {
- return false;
+ return $default;
}
return ((! is_array(\App::$config[$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', \App::$config[$family][$key]))
? unserialize(\App::$config[$family][$key])
@@ -112,7 +112,7 @@ class Config {
);
}
- return false;
+ return $default;
}
/**
diff --git a/Zotlabs/Lib/Enotify.php b/Zotlabs/Lib/Enotify.php
index 9a8628968..257687567 100644
--- a/Zotlabs/Lib/Enotify.php
+++ b/Zotlabs/Lib/Enotify.php
@@ -78,15 +78,12 @@ class Enotify {
$sender_email = get_config('system','from_email');
if(! $sender_email)
$sender_email = 'Administrator' . '@' . \App::get_hostname();
-
$sender_name = get_config('system','from_email_name');
if(! $sender_name)
$sender_name = \Zotlabs\Lib\System::get_site_name();
-
-
$additional_mail_header = "";
if(array_key_exists('item', $params)) {
@@ -105,6 +102,10 @@ class Enotify {
$title = $params['item']['title'];
$body = $params['item']['body'];
}
+ if($params['item']['created'] < datetime_convert('UTC','UTC','now - 1 month')) {
+ logger('notification invoked for an old item which may have been refetched.',LOGGER_DEBUG,LOG_INFO);
+ return;
+ }
}
else {
$title = $body = '';
@@ -216,6 +217,85 @@ class Enotify {
$hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
}
+ if ($params['type'] == NOTIFY_LIKE) {
+// logger("notification: params = " . print_r($params, true), LOGGER_DEBUG);
+
+ $itemlink = $params['link'];
+
+ // ignore like/unlike activity on posts - they probably require a separate notification preference
+
+ if (array_key_exists('item',$params) && (! activity_match($params['item']['verb'],ACTIVITY_LIKE))) {
+ logger('notification: not a like activity. Ignoring.');
+ pop_lang();
+ return;
+ }
+
+ $parent_mid = $params['parent_mid'];
+
+ // Check to see if there was already a notify for this post.
+ // If so don't create a second notification
+
+ $p = null;
+ $p = q("select id from notify where link = '%s' and uid = %d limit 1",
+ dbesc($params['link']),
+ intval($recip['channel_id'])
+ );
+ if ($p) {
+ logger('notification: like already notified');
+ pop_lang();
+ return;
+ }
+
+
+ // if it's a post figure out who's post it is.
+
+ $p = null;
+
+ if($params['otype'] === 'item' && $parent_mid) {
+ $p = q("select * from item where mid = '%s' and uid = %d limit 1",
+ dbesc($parent_mid),
+ intval($recip['channel_id'])
+ );
+ }
+
+ xchan_query($p);
+
+
+ $item_post_type = item_post_type($p[0]);
+// $private = $p[0]['item_private'];
+ $parent_id = $p[0]['id'];
+
+ $parent_item = $p[0];
+
+
+ // "your post"
+ if($p[0]['owner']['xchan_name'] == $p[0]['author']['xchan_name'] && intval($p[0]['item_wall']))
+ $dest_str = sprintf(t('%1$s, %2$s liked [zrl=%3$s]your %4$s[/zrl]'),
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $itemlink,
+ $item_post_type);
+ else {
+ pop_lang();
+ return;
+ }
+
+ // Some mail softwares relies on subject field for threading.
+ // So, we cannot have different subjects for notifications of the same thread.
+ // Before this we have the name of the replier on the subject rendering
+ // differents subjects for messages on the same thread.
+
+ $subject = sprintf( t('[$Projectname:Notify] Like received to conversation #%1$d by %2$s'), $parent_id, $sender['xchan_name']);
+ $preamble = sprintf( t('%1$s, %2$s liked an item/conversation you created.'), $recip['channel_name'], $sender['xchan_name']);
+ $epreamble = $dest_str;
+
+ $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>');
+ }
+
+
+
if($params['type'] == NOTIFY_WALL) {
$subject = sprintf( t('[$Projectname:Notify] %s posted to your profile wall') , $sender['xchan_name']);
@@ -364,7 +444,7 @@ class Enotify {
do {
$dups = false;
$hash = random_string();
- $r = q("SELECT `id` FROM `notify` WHERE `hash` = '%s' LIMIT 1",
+ $r = q("SELECT id FROM notify WHERE hash = '%s' LIMIT 1",
dbesc($hash));
if ($r)
$dups = true;
@@ -633,7 +713,7 @@ class Enotify {
call_hooks('email_send', $params);
if($params['sent']) {
- logger("notification: enotify::send (addon) returns " . $params['result'], LOGGER_DEBUG);
+ logger("notification: enotify::send (addon) returns " . (($params['result']) ? 'success' : 'failure'), LOGGER_DEBUG);
return $params['result'];
}
@@ -676,7 +756,7 @@ class Enotify {
$multipartMessageBody, // message body
$messageHeader // message headers
);
- logger("notification: enotify::send returns " . $res, LOGGER_DEBUG);
+ logger("notification: enotify::send returns " . (($res) ? 'success' : 'failure'), LOGGER_DEBUG);
return $res;
}
diff --git a/Zotlabs/Lib/IConfig.php b/Zotlabs/Lib/IConfig.php
index 28c9ab58e..33d94bd49 100644
--- a/Zotlabs/Lib/IConfig.php
+++ b/Zotlabs/Lib/IConfig.php
@@ -10,7 +10,7 @@ class IConfig {
return;
}
- static public function Get(&$item, $family, $key) {
+ static public function Get(&$item, $family, $key, $default = false) {
$is_item = false;
@@ -28,7 +28,7 @@ class IConfig {
$iid = $item;
if(! $iid)
- return false;
+ return $default;
if(is_array($item) && array_key_exists('iconfig',$item) && is_array($item['iconfig'])) {
foreach($item['iconfig'] as $c) {
@@ -48,7 +48,7 @@ class IConfig {
$item['iconfig'][] = $r[0];
return $r[0]['v'];
}
- return false;
+ return $default;
}
diff --git a/Zotlabs/Lib/PConfig.php b/Zotlabs/Lib/PConfig.php
index a481667a5..d70697fbc 100644
--- a/Zotlabs/Lib/PConfig.php
+++ b/Zotlabs/Lib/PConfig.php
@@ -67,16 +67,16 @@ class PConfig {
* @return mixed Stored value or false if it does not exist
*/
- static public function Get($uid,$family,$key,$instore = false) {
+ static public function Get($uid,$family,$key,$default = false) {
if(is_null($uid) || $uid === false)
- return false;
+ return $default;
if(! array_key_exists($uid, \App::$config))
self::Load($uid);
if((! array_key_exists($family, \App::$config[$uid])) || (! array_key_exists($key, \App::$config[$uid][$family])))
- return false;
+ return $default;
return ((! is_array(\App::$config[$uid][$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', \App::$config[$uid][$family][$key]))
? unserialize(\App::$config[$uid][$family][$key])
@@ -185,13 +185,17 @@ class PConfig {
$ret = false;
- if(array_key_exists($key, \App::$config[$uid][$family]))
+ if(array_key_exists($uid,\App::$config)
+ && is_array(\App::$config['uid'])
+ && array_key_exists($family,\App::$config['uid'])
+ && array_key_exists($key, \App::$config[$uid][$family]))
unset(\App::$config[$uid][$family][$key]);
- $ret = q("DELETE FROM pconfig WHERE uid = %d AND cat = '%s' AND k = '%s'",
- intval($uid),
- dbesc($family),
- dbesc($key)
- );
+
+ $ret = q("DELETE FROM pconfig WHERE uid = %d AND cat = '%s' AND k = '%s'",
+ intval($uid),
+ dbesc($family),
+ dbesc($key)
+ );
return $ret;
}
diff --git a/Zotlabs/Lib/PermissionDescription.php b/Zotlabs/Lib/PermissionDescription.php
index b6c6dd29d..51d5f890d 100644
--- a/Zotlabs/Lib/PermissionDescription.php
+++ b/Zotlabs/Lib/PermissionDescription.php
@@ -12,22 +12,25 @@ require_once("include/text.php");
* permission settings for an item with an empty ACL.
* i.e the caption, icon, and tooltip for the no-ACL option in the ACL dialog.
*/
-class PermissionDescription {
+class PermissionDescription {
private $global_perm;
private $channel_perm;
private $fallback_description;
-
+
/**
* Constructor is private.
- * Use static methods fromGlobalPermission(), fromStandalonePermission(), or fromDescription()
- * to create instances.
+ * Use static methods fromGlobalPermission(), fromStandalonePermission(),
+ * or fromDescription() to create instances.
+ *
+ * @internal
+ * @param int $global_perm
+ * @param int $channel_perm
+ * @param string $description (optional) default empty
*/
private function __construct($global_perm, $channel_perm, $description = '') {
-
$this->global_perm = $global_perm;
$this->channel_perm = $channel_perm;
-
$this->fallback_description = ($description == '') ? t('Visible to your default audience') : $description;
}
@@ -43,23 +46,22 @@ class PermissionDescription {
return new PermissionDescription('', 0x80000, $description);
}
-
/**
* Use this method only if the interpretation of an empty ACL doesn't fall back to a global
* default permission. You should pass one of the constants from boot.php - PERMS_PUBLIC,
* PERMS_NETWORK etc.
- *
+ *
* @param integer $perm - a single enumerated constant permission - PERMS_PUBLIC, PERMS_NETWORK etc.
* @return a new instance of PermissionDescription
*/
public static function fromStandalonePermission($perm) {
$result = new PermissionDescription('', $perm);
-
- $checkPerm = $this->get_permission_description();
- if ($checkPerm == $this->fallback_description) {
+
+ $checkPerm = $result->get_permission_description();
+ if($checkPerm == $result->fallback_description) {
$result = null;
- logger('null PermissionDescription from unknown standalone permission: ' . $perm ,LOGGER_DEBUG, LOG_ERROR);
+ logger('null PermissionDescription from unknown standalone permission: ' . $perm, LOGGER_DEBUG, LOG_ERR);
}
return $result;
@@ -67,9 +69,9 @@ class PermissionDescription {
/**
* This is the preferred way to create a PermissionDescription, as it provides the most details.
- * Use this method if you know an empty ACL will result in one of the global default permissions
+ * Use this method if you know an empty ACL will result in one of the global default permissions
* being used, such as channel_r_stream (for which you would pass 'view_stream').
- *
+ *
* @param string $permname - a key for the global perms array from get_perms() in permissions.php,
* e.g. 'view_stream', 'view_profile', etc.
* @return a new instance of PermissionDescription
@@ -80,19 +82,19 @@ class PermissionDescription {
$global_perms = \Zotlabs\Access\Permissions::Perms();
- if (array_key_exists($permname, $global_perms)) {
+ if(array_key_exists($permname, $global_perms)) {
- $channelPerm = \Zotlabs\Access\PermissionLimits::Get(\App::$channel['channel_id'],$permname);
+ $channelPerm = \Zotlabs\Access\PermissionLimits::Get(\App::$channel['channel_id'], $permname);
$result = new PermissionDescription('', $channelPerm);
} else {
// The acl dialog can handle null arguments, but it shouldn't happen
- logger('null PermissionDescription from unknown global permission: ' . $permname ,LOGGER_DEBUG, LOG_ERROR);
+ logger('null PermissionDescription from unknown global permission: ' . $permname, LOGGER_DEBUG, LOG_ERR);
}
+
return $result;
}
-
/**
* Gets a localized description of the permission, or a generic message if the permission
* is unknown.
@@ -101,8 +103,7 @@ class PermissionDescription {
*/
public function get_permission_description() {
- switch($this->channel_perm) {
-
+ switch($this->channel_perm) {
case 0: return t('Only me');
case PERMS_PUBLIC: return t('Public');
case PERMS_NETWORK: return t('Anybody in the $Projectname network');
@@ -117,19 +118,18 @@ class PermissionDescription {
/**
* Returns an icon css class name if an appropriate one is available, e.g. "fa-globe" for Public,
- * otherwise returns empty string.
+ * otherwise returns empty string.
*
* @return string icon css class name (often FontAwesome)
*/
public function get_permission_icon() {
- switch($this->channel_perm) {
-
+ switch($this->channel_perm) {
case 0:/* only me */ return 'fa-eye-slash';
case PERMS_PUBLIC: return 'fa-globe';
case PERMS_NETWORK: return 'fa-share-alt-square'; // fa-share-alt-square is very similiar to the hubzilla logo, but we should create our own logo class to use
- case PERMS_SITE: return 'fa-sitemap';
- case PERMS_CONTACTS: return 'fa-group';
+ case PERMS_SITE: return 'fa-sitemap';
+ case PERMS_CONTACTS: return 'fa-group';
case PERMS_SPECIFIC: return 'fa-list';
case PERMS_AUTHED: return '';
case PERMS_PENDING: return '';
@@ -137,7 +137,6 @@ class PermissionDescription {
}
}
-
/**
* Returns a localized description of where the permission came from, if this is known.
* If it's not know, or if the permission is standalone and didn't come from a default
@@ -147,8 +146,7 @@ class PermissionDescription {
*/
public function get_permission_origin_description() {
- switch($this->global_perm) {
-
+ switch($this->global_perm) {
case PERMS_R_STREAM: return t('This is your default setting for the audience of your normal stream, and posts.');
case PERMS_R_PROFILE: return t('This is your default setting for who can view your default channel profile');
case PERMS_R_ABOOK: return t('This is your default setting for who can view your connections');
diff --git a/Zotlabs/Lib/System.php b/Zotlabs/Lib/System.php
index 6ccfd664c..306c90f4a 100644
--- a/Zotlabs/Lib/System.php
+++ b/Zotlabs/Lib/System.php
@@ -32,16 +32,30 @@ class System {
static public function get_notify_icon() {
if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['email_notify_icon_url'])
return \App::$config['system']['email_notify_icon_url'];
- return z_root() . '/images/hz-white-32.png';
+ return z_root() . DEFAULT_NOTIFY_ICON;
}
static public function get_site_icon() {
if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['site_icon_url'])
return \App::$config['system']['site_icon_url'];
- return z_root() . '/images/hz-32.png';
+ return z_root() . DEFAULT_PLATFORM_ICON ;
}
+ static public function get_project_link() {
+ if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['project_link'])
+ return \App::$config['system']['project_link'];
+ return 'https://hubzilla.org';
+ }
+
+ static public function get_project_srclink() {
+ if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['project_srclink'])
+ return \App::$config['system']['project_srclink'];
+ return 'https://github.com/redmatrix/hubzilla';
+ }
+
+
+
static public function get_server_role() {
if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['server_role'])
return \App::$config['system']['server_role'];
@@ -54,5 +68,15 @@ class System {
return '0.0.0';
}
+ static public function compatible_project($p) {
+ if(get_directory_realm() != DIRECTORY_REALM)
+ return true;
+
+ foreach(['hubzilla','zap'] as $t) {
+ if(stristr($p,$t))
+ return true;
+ }
+ return false;
+ }
}
diff --git a/Zotlabs/Lib/Techlevels.php b/Zotlabs/Lib/Techlevels.php
new file mode 100644
index 000000000..6a8c36fb3
--- /dev/null
+++ b/Zotlabs/Lib/Techlevels.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Zotlabs\Lib;
+
+
+class Techlevels {
+
+ static public function levels() {
+ $techlevels = [
+ '0' => t('Beginner/Basic'),
+ '1' => t('Novice - not skilled but willing to learn'),
+ '2' => t('Intermediate - somewhat comfortable'),
+ '3' => t('Advanced - very comfortable'),
+ '4' => t('Expert - I can write computer code'),
+ '5' => t('Wizard - I probably know more than you do')
+ ];
+ return $techlevels;
+ }
+
+}
+
diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php
index a3e871810..a1666e148 100644
--- a/Zotlabs/Lib/ThreadItem.php
+++ b/Zotlabs/Lib/ThreadItem.php
@@ -44,7 +44,7 @@ class ThreadItem {
* Only add those that will be displayed
*/
- if((! visible_activity($item)) || array_key_exists('author_blocked',$item)) {
+ if((! visible_activity($item)) || array_key_exists('blocked',$item)) {
continue;
}
@@ -355,6 +355,10 @@ class ThreadItem {
'unverified' => $unverified,
'forged' => $forged,
'location' => $location,
+ 'attend_label' => t('Attend'),
+ 'attend_title' => t('Attendance Options'),
+ 'vote_label' => t('Vote'),
+ 'vote_title' => t('Voting Options'),
'indent' => $indent,
'owner_url' => $this->get_owner_url(),
'owner_photo' => $this->get_owner_photo(),
diff --git a/Zotlabs/Lib/ThreadStream.php b/Zotlabs/Lib/ThreadStream.php
index a6d4f8517..beb626f31 100644
--- a/Zotlabs/Lib/ThreadStream.php
+++ b/Zotlabs/Lib/ThreadStream.php
@@ -58,7 +58,7 @@ class ThreadStream {
case 'display':
// in this mode we set profile_owner after initialisation (from conversation()) and then
// pull some trickery which allows us to re-invoke this function afterward
- // it's an ugly hack so FIXME
+ // it's an ugly hack so @FIXME
$this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments');
break;
case 'page':
@@ -160,9 +160,9 @@ class ThreadStream {
}
elseif(($this->observer) && (! $item->is_commentable())) {
if((array_key_exists('owner',$item->data)) && intval($item->data['owner']['abook_self']))
- $item->set_commentable(perm_is_allowed($this->profile_owner,$this->observer['xchan_hash'],'post_comments'));
+ $item->set_commentable(perm_is_allowed($this->profile_owner,$ob_hash,'post_comments'));
else
- $item->set_commentable(can_comment_on_post($this->observer['xchan_hash'],$item->data));
+ $item->set_commentable(can_comment_on_post($ob_hash,$item->data));
}
}
require_once('include/channel.php');
diff --git a/Zotlabs/Lib/XConfig.php b/Zotlabs/Lib/XConfig.php
index 7f3d0f2cd..bf78c360f 100644
--- a/Zotlabs/Lib/XConfig.php
+++ b/Zotlabs/Lib/XConfig.php
@@ -59,16 +59,16 @@ class XConfig {
* @return mixed Stored $value or false if it does not exist
*/
- static public function Get($xchan, $family, $key) {
+ static public function Get($xchan, $family, $key, $default = false) {
if(! $xchan)
- return false;
+ return $default;
if(! array_key_exists($xchan, \App::$config))
load_xconfig($xchan);
if((! array_key_exists($family, \App::$config[$xchan])) || (! array_key_exists($key, \App::$config[$xchan][$family])))
- return false;
+ return $default;
return ((! is_array(\App::$config[$xchan][$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', \App::$config[$xchan][$family][$key]))
? unserialize(\App::$config[$xchan][$family][$key])
diff --git a/Zotlabs/Module/Acl.php b/Zotlabs/Module/Acl.php
index 1acd8e320..29c1e5280 100644
--- a/Zotlabs/Module/Acl.php
+++ b/Zotlabs/Module/Acl.php
@@ -77,7 +77,7 @@ class Acl extends \Zotlabs\Web\Controller {
if($search) {
- $sql_extra = " AND `name` LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
+ $sql_extra = " AND groups.gname LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
$sql_extra2 = "AND ( xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " OR xchan_addr LIKE " . protect_sprintf( "'%" . dbesc($search) . ((strpos($search,'@') === false) ? "%@%'" : "%'")) . ") ";
// This horrible mess is needed because position also returns 0 if nothing is found.
@@ -105,9 +105,9 @@ class Acl extends \Zotlabs\Web\Controller {
if($type == '' || $type == 'g') {
$r = q("SELECT groups.id, groups.hash, groups.gname
- FROM groups,group_member
+ FROM groups, group_member
WHERE groups.deleted = 0 AND groups.uid = %d
- AND group_member.gid=groups.id
+ AND group_member.gid = groups.id
$sql_extra
GROUP BY groups.id
ORDER BY groups.gname
diff --git a/Zotlabs/Module/Admin.php b/Zotlabs/Module/Admin.php
index e3702992f..536d85dde 100644
--- a/Zotlabs/Module/Admin.php
+++ b/Zotlabs/Module/Admin.php
@@ -1,21 +1,20 @@
<?php
-namespace Zotlabs\Module;
-
-
/**
- * @file mod/admin.php
+ * @file Zotlabs/Module/Admin.php
* @brief Hubzilla's admin controller.
*
* Controller for the /admin/ area.
*/
+namespace Zotlabs\Module;
+
require_once('include/queue_fn.php');
require_once('include/account.php');
/**
- * @param App &$a
+ * @brief Admin area.
+ *
*/
-
class Admin extends \Zotlabs\Web\Controller {
private $sm = null;
@@ -26,36 +25,35 @@ class Admin extends \Zotlabs\Web\Controller {
function post(){
logger('admin_post', LOGGER_DEBUG);
-
+
if(! is_site_admin()) {
return;
}
if (argc() > 1) {
$this->sm->call('post');
}
-
+
goaway(z_root() . '/admin' );
}
-
+
/**
* @return string
*/
function get() {
-
+
logger('admin_content', LOGGER_DEBUG);
-
+
if(! is_site_admin()) {
return login(false);
}
-
-
+
/*
* Page content
*/
$o = '';
-
+
if(argc() > 1) {
$o = $this->sm->call('get');
if($o === false) {
@@ -65,9 +63,9 @@ class Admin extends \Zotlabs\Web\Controller {
else {
$o = $this->admin_page_summary();
}
-
+
if(is_ajax()) {
- echo $o;
+ echo $o;
killme();
return '';
}
@@ -75,16 +73,15 @@ class Admin extends \Zotlabs\Web\Controller {
return $o;
}
}
-
-
+
+
/**
* @brief Returns content for Admin Summary Page.
*
- * @param App &$a
* @return string HTML from parsed admin_summary.tpl
*/
function admin_page_summary() {
-
+
// list total user accounts, expirations etc.
$accounts = array();
$r = q("SELECT COUNT(*) AS total, COUNT(CASE WHEN account_expires > %s THEN 1 ELSE NULL END) AS expiring, COUNT(CASE WHEN account_expires < %s AND account_expires > '%s' THEN 1 ELSE NULL END) AS expired, COUNT(CASE WHEN (account_flags & %d)>0 THEN 1 ELSE NULL END) AS blocked FROM account",
@@ -99,11 +96,11 @@ class Admin extends \Zotlabs\Web\Controller {
$accounts['expired'] = array('label' => t('# expired accounts'), 'val' => $r[0]['expired']);
$accounts['expiring'] = array('label' => t('# expiring accounts'), 'val' => $r[0]['expiring']);
}
-
+
// pending registrations
- $r = q("SELECT COUNT(id) AS `count` FROM `register` WHERE `uid` != '0'");
- $pending = $r[0]['count'];
-
+ $r = q("SELECT COUNT(id) AS rtotal FROM register WHERE uid != '0'");
+ $pending = $r[0]['rtotal'];
+
// available channels, primary and clones
$channels = array();
$r = q("SELECT COUNT(*) AS total, COUNT(CASE WHEN channel_primary = 1 THEN 1 ELSE NULL END) AS main, COUNT(CASE WHEN channel_primary = 0 THEN 1 ELSE NULL END) AS clones FROM channel WHERE channel_removed = 0");
@@ -112,15 +109,15 @@ class Admin extends \Zotlabs\Web\Controller {
$channels['main'] = array('label' => t('# primary'), 'val' => $r[0]['main']);
$channels['clones'] = array('label' => t('# clones'), 'val' => $r[0]['clones']);
}
-
+
// We can do better, but this is a quick queue status
$r = q("SELECT COUNT(outq_delivered) AS total FROM outq WHERE outq_delivered = 0");
$queue = (($r) ? $r[0]['total'] : 0);
$queues = array( 'label' => t('Message queues'), 'queue' => $queue );
-
+
// If no plugins active return 0, otherwise list of plugin names
$plugins = (count(\App::$plugins) == 0) ? count(\App::$plugins) : \App::$plugins;
-
+
// Could be extended to provide also other alerts to the admin
$alertmsg = '';
// annoy admin about upcoming unsupported PHP version
@@ -135,7 +132,6 @@ class Admin extends \Zotlabs\Web\Controller {
$upgrade = ((version_compare(STD_VERSION,$vmaster) < 0) ? t('Your software should be updated') : '');
-
$t = get_markup_template('admin_summary.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
@@ -150,10 +146,8 @@ class Admin extends \Zotlabs\Web\Controller {
'$vmaster' => array( t('Repository version (master)'), $vmaster),
'$vdev' => array( t('Repository version (dev)'), $vdev),
'$upgrade' => $upgrade,
- '$build' => get_config('system', 'db_version')
+ '$build' => get_config('system', 'db_version')
));
}
-
-
-
+
}
diff --git a/Zotlabs/Module/Admin/Account_edit.php b/Zotlabs/Module/Admin/Account_edit.php
index ddb7e19f4..6dfadf183 100644
--- a/Zotlabs/Module/Admin/Account_edit.php
+++ b/Zotlabs/Module/Admin/Account_edit.php
@@ -29,6 +29,22 @@ class Account_edit {
info( sprintf( t('Password changed for account %d.'), $account_id). EOL);
}
+
+ $service_class = trim($_REQUEST['service_class']);
+ $account_level = intval(trim($_REQUEST['account_level']));
+ $account_language = trim($_REQUEST['account_language']);
+
+ $r = q("update account set account_service_class = '%s', account_level = %d, account_language = '%s'
+ where account_id = %d",
+ dbesc($service_class),
+ intval($account_level),
+ dbesc($account_language),
+ intval($account_id)
+ );
+
+ if($r)
+ info( t('Account settings updated.') . EOL);
+
goaway(z_root() . '/admin/accounts');
}
@@ -46,11 +62,15 @@ class Account_edit {
return '';
}
+
$a = replace_macros(get_markup_template('admin_account_edit.tpl'), [
'$account' => $x[0],
'$title' => t('Account Edit'),
'$pass1' => [ 'pass1', t('New Password'), ' ','' ],
'$pass2' => [ 'pass2', t('New Password again'), ' ','' ],
+ '$account_level' => [ 'account_level', t('Technical skill level'), $x[0]['account_level'], '', \Zotlabs\Lib\Techlevels::levels() ],
+ '$account_language' => [ 'account_language' , t('Account language (for emails)'), $x[0]['account_language'], '', language_list() ],
+ '$service_class' => [ 'service_class', t('Service class'), $x[0]['account_service_class'], '' ],
'$submit' => t('Submit'),
]
);
diff --git a/Zotlabs/Module/Admin/Accounts.php b/Zotlabs/Module/Admin/Accounts.php
index 143d00a3b..2043550fc 100644
--- a/Zotlabs/Module/Admin/Accounts.php
+++ b/Zotlabs/Module/Admin/Accounts.php
@@ -133,10 +133,9 @@ class Accounts {
$base = z_root() . '/admin/accounts?f=';
$odir = (($dir === 'asc') ? '0' : '1');
- $users = q("SELECT `account_id` , `account_email`, `account_lastlog`, `account_created`, `account_expires`, " . "`account_service_class`, ( account_flags & %d ) > 0 as `blocked`, " .
- "(SELECT %s FROM channel as ch " .
- "WHERE ch.channel_account_id = ac.account_id and ch.channel_removed = 0 ) as `channels` " .
- "FROM account as ac where true $serviceclass order by $key $dir limit %d offset %d ",
+ $users = q("SELECT account_id , account_email, account_lastlog, account_created, account_expires, account_service_class, ( account_flags & %d ) > 0 as blocked,
+ (SELECT %s FROM channel as ch WHERE ch.channel_account_id = ac.account_id and ch.channel_removed = 0 ) as channels FROM account as ac
+ where true $serviceclass order by $key $dir limit %d offset %d ",
intval(ACCOUNT_BLOCKED),
db_concat('ch.channel_address', ' '),
intval(\App::$pager['itemspage']),
diff --git a/Zotlabs/Module/Admin/Channels.php b/Zotlabs/Module/Admin/Channels.php
index b9b345105..e0f26112d 100644
--- a/Zotlabs/Module/Admin/Channels.php
+++ b/Zotlabs/Module/Admin/Channels.php
@@ -2,35 +2,36 @@
namespace Zotlabs\Module\Admin;
-
+/**
+ * @brief Admin Module for Channels.
+ *
+ */
class Channels {
-
/**
- * @brief Channels admin page.
+ * @brief Handle POST actions on channels admin page.
*
- * @param App &$a
*/
function post() {
$channels = ( x($_POST, 'channel') ? $_POST['channel'] : Array() );
-
+
check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels');
-
+
$xor = db_getfunc('^');
-
- if (x($_POST,'page_channels_block')){
- foreach($channels as $uid){
+
+ if(x($_POST, 'page_channels_block')) {
+ foreach($channels as $uid) {
q("UPDATE channel SET channel_pageflags = ( channel_pageflags $xor %d ) where channel_id = %d",
intval(PAGE_CENSORED),
intval( $uid )
);
- \Zotlabs\Daemon\Master::Summon(array('Directory',$uid,'nopush'));
+ \Zotlabs\Daemon\Master::Summon(array('Directory', $uid, 'nopush'));
}
notice( sprintf( tt("%s channel censored/uncensored", "%s channels censored/uncensored", count($channels)), count($channels)) );
}
- if (x($_POST,'page_channels_code')){
- foreach($channels as $uid){
+ if(x($_POST, 'page_channels_code')) {
+ foreach($channels as $uid) {
q("UPDATE channel SET channel_pageflags = ( channel_pageflags $xor %d ) where channel_id = %d",
intval(PAGE_ALLOWCODE),
intval( $uid )
@@ -38,74 +39,71 @@ class Channels {
}
notice( sprintf( tt("%s channel code allowed/disallowed", "%s channels code allowed/disallowed", count($channels)), count($channels)) );
}
- if (x($_POST,'page_channels_delete')){
- foreach($channels as $uid){
- channel_remove($uid,true);
+ if(x($_POST, 'page_channels_delete')) {
+ foreach($channels as $uid) {
+ channel_remove($uid, true);
}
notice( sprintf( tt("%s channel deleted", "%s channels deleted", count($channels)), count($channels)) );
}
-
+
goaway(z_root() . '/admin/channels' );
}
-
/**
- * @brief
+ * @brief Generate channels admin page and handle single item operations.
*
- * @return string
+ * @return string with parsed HTML
*/
-
function get() {
if(argc() > 2) {
$uid = argv(3);
$channel = q("SELECT * FROM channel WHERE channel_id = %d",
intval($uid)
);
-
+
if(! $channel) {
notice( t('Channel not found') . EOL);
goaway(z_root() . '/admin/channels' );
}
-
+
switch(argv(2)) {
case "delete":{
check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
// delete channel
channel_remove($uid,true);
-
+
notice( sprintf(t("Channel '%s' deleted"), $channel[0]['channel_name']) . EOL);
}; break;
-
+
case "block":{
check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
- $pflags = $channel[0]['channel_pageflags'] ^ PAGE_CENSORED;
+ $pflags = $channel[0]['channel_pageflags'] ^ PAGE_CENSORED;
q("UPDATE channel SET channel_pageflags = %d where channel_id = %d",
intval($pflags),
intval( $uid )
);
\Zotlabs\Daemon\Master::Summon(array('Directory',$uid,'nopush'));
-
+
notice( sprintf( (($pflags & PAGE_CENSORED) ? t("Channel '%s' censored"): t("Channel '%s' uncensored")) , $channel[0]['channel_name'] . ' (' . $channel[0]['channel_address'] . ')' ) . EOL);
}; break;
-
+
case "code":{
check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
- $pflags = $channel[0]['channel_pageflags'] ^ PAGE_ALLOWCODE;
+ $pflags = $channel[0]['channel_pageflags'] ^ PAGE_ALLOWCODE;
q("UPDATE channel SET channel_pageflags = %d where channel_id = %d",
intval($pflags),
intval( $uid )
);
-
+
notice( sprintf( (($pflags & PAGE_ALLOWCODE) ? t("Channel '%s' code allowed"): t("Channel '%s' code disallowed")) , $channel[0]['channel_name'] . ' (' . $channel[0]['channel_address'] . ')' ) . EOL);
}; break;
-
- default:
+
+ default:
break;
}
goaway(z_root() . '/admin/channels' );
}
-
$key = (($_REQUEST['key']) ? dbesc($_REQUEST['key']) : 'channel_id');
$dir = 'asc';
if(array_key_exists('dir',$_REQUEST))
@@ -114,10 +112,8 @@ class Channels {
$base = z_root() . '/admin/channels?f=';
$odir = (($dir === 'asc') ? '0' : '1');
-
-
/* get channels */
-
+
$total = q("SELECT count(*) as total FROM channel where channel_removed = 0 and channel_system = 0");
if($total) {
\App::set_pager_total($total[0]['total']);
@@ -135,15 +131,15 @@ class Channels {
$channels[$x]['blocked'] = true;
else
$channels[$x]['blocked'] = false;
-
+
if($channels[$x]['channel_pageflags'] & PAGE_ALLOWCODE)
$channels[$x]['allowcode'] = true;
else
$channels[$x]['allowcode'] = false;
}
}
-
- $t = get_markup_template("admin_channels.tpl");
+
+ $t = get_markup_template('admin_channels.tpl');
$o = replace_macros($t, array(
// strings //
'$title' => t('Administration'),
@@ -158,29 +154,23 @@ class Channels {
'$h_channels' => t('Channel'),
'$base' => $base,
'$odir' => $odir,
- '$th_channels' => array(
+ '$th_channels' => array(
[ t('UID'), 'channel_id' ],
[ t('Name'), 'channel_name' ],
[ t('Address'), 'channel_address' ]),
-
+
'$confirm_delete_multi' => t('Selected channels will be deleted!\n\nEverything that was posted in these channels on this site will be permanently deleted!\n\nAre you sure?'),
'$confirm_delete' => t('The channel {0} will be deleted!\n\nEverything that was posted in this channel on this site will be permanently deleted!\n\nAre you sure?'),
-
- '$form_security_token' => get_form_security_token("admin_channels"),
-
+
+ '$form_security_token' => get_form_security_token('admin_channels'),
+
// values //
'$baseurl' => z_root(),
'$channels' => $channels,
));
$o .= paginate($a);
-
+
return $o;
}
-
-
-
-
-
-
} \ No newline at end of file
diff --git a/Zotlabs/Module/Admin/Dbsync.php b/Zotlabs/Module/Admin/Dbsync.php
index 305126c7d..cff8a2484 100644
--- a/Zotlabs/Module/Admin/Dbsync.php
+++ b/Zotlabs/Module/Admin/Dbsync.php
@@ -42,7 +42,7 @@ class Dbsync {
}
$failed = array();
- $r = q("select * from config where `cat` = 'database' ");
+ $r = q("select * from config where cat = 'database' ");
if(count($r)) {
foreach($r as $rr) {
$upd = intval(substr($rr['k'],8));
diff --git a/Zotlabs/Module/Admin/Site.php b/Zotlabs/Module/Admin/Site.php
index 8397cabbd..829ca71e4 100644
--- a/Zotlabs/Module/Admin/Site.php
+++ b/Zotlabs/Module/Admin/Site.php
@@ -5,11 +5,9 @@ namespace Zotlabs\Module\Admin;
class Site {
-
/**
* @brief POST handler for Admin Site Page.
*
- * @param App &$a
*/
function post(){
if (!x($_POST, 'page_site')) {
@@ -17,38 +15,39 @@ class Site {
}
check_form_security_token_redirectOnErr('/admin/site', 'admin_site');
-
+
$sitename = ((x($_POST,'sitename')) ? notags(trim($_POST['sitename'])) : '');
$server_role = ((x($_POST,'server_role')) ? notags(trim($_POST['server_role'])) : 'standard');
- $banner = ((x($_POST,'banner')) ? trim($_POST['banner']) : false);
+ $banner = ((x($_POST,'banner')) ? trim($_POST['banner']) : false);
$admininfo = ((x($_POST,'admininfo')) ? trim($_POST['admininfo']) : false);
+ $siteinfo = ((x($_POST,'siteinfo')) ? trim($_POST['siteinfo']) : '');
$language = ((x($_POST,'language')) ? notags(trim($_POST['language'])) : '');
$theme = ((x($_POST,'theme')) ? notags(trim($_POST['theme'])) : '');
$theme_mobile = ((x($_POST,'theme_mobile')) ? notags(trim($_POST['theme_mobile'])) : '');
- // $site_channel = ((x($_POST,'site_channel')) ? notags(trim($_POST['site_channel'])) : '');
+// $site_channel = ((x($_POST,'site_channel')) ? notags(trim($_POST['site_channel'])) : '');
$maximagesize = ((x($_POST,'maximagesize')) ? intval(trim($_POST['maximagesize'])) : 0);
-
+
$register_policy = ((x($_POST,'register_policy')) ? intval(trim($_POST['register_policy'])) : 0);
-
+
$access_policy = ((x($_POST,'access_policy')) ? intval(trim($_POST['access_policy'])) : 0);
- $invite_only = ((x($_POST,'invite_only')) ? True : False);
- $abandon_days = ((x($_POST,'abandon_days')) ? intval(trim($_POST['abandon_days'])) : 0);
-
+ $invite_only = ((x($_POST,'invite_only')) ? True : False);
+ $abandon_days = ((x($_POST,'abandon_days')) ? intval(trim($_POST['abandon_days'])) : 0);
+
$register_text = ((x($_POST,'register_text')) ? notags(trim($_POST['register_text'])) : '');
- $frontpage = ((x($_POST,'frontpage')) ? notags(trim($_POST['frontpage'])) : '');
- $mirror_frontpage = ((x($_POST,'mirror_frontpage')) ? intval(trim($_POST['mirror_frontpage'])) : 0);
- $directory_server = ((x($_POST,'directory_server')) ? trim($_POST['directory_server']) : '');
- $allowed_sites = ((x($_POST,'allowed_sites')) ? notags(trim($_POST['allowed_sites'])) : '');
- $force_publish = ((x($_POST,'publish_all')) ? True : False);
- $disable_discover_tab = ((x($_POST,'disable_discover_tab')) ? False : True);
- $login_on_homepage = ((x($_POST,'login_on_homepage')) ? True : False);
- $enable_context_help = ((x($_POST,'enable_context_help')) ? True : False);
+ $frontpage = ((x($_POST,'frontpage')) ? notags(trim($_POST['frontpage'])) : '');
+ $mirror_frontpage = ((x($_POST,'mirror_frontpage')) ? intval(trim($_POST['mirror_frontpage'])) : 0);
+ $directory_server = ((x($_POST,'directory_server')) ? trim($_POST['directory_server']) : '');
+ $allowed_sites = ((x($_POST,'allowed_sites')) ? notags(trim($_POST['allowed_sites'])) : '');
+ $force_publish = ((x($_POST,'publish_all')) ? True : False);
+ $disable_discover_tab = ((x($_POST,'disable_discover_tab')) ? False : True);
+ $login_on_homepage = ((x($_POST,'login_on_homepage')) ? True : False);
+ $enable_context_help = ((x($_POST,'enable_context_help')) ? True : False);
$global_directory = ((x($_POST,'directory_submit_url')) ? notags(trim($_POST['directory_submit_url'])) : '');
$no_community_page = !((x($_POST,'no_community_page')) ? True : False);
$default_expire_days = ((array_key_exists('default_expire_days',$_POST)) ? intval($_POST['default_expire_days']) : 0);
-
+
$verifyssl = ((x($_POST,'verifyssl')) ? True : False);
$proxyuser = ((x($_POST,'proxyuser')) ? notags(trim($_POST['proxyuser'])) : '');
$proxy = ((x($_POST,'proxy')) ? notags(trim($_POST['proxy'])) : '');
@@ -62,11 +61,9 @@ class Site {
$techlevel_lock = ((x($_POST,'techlock')) ? intval($_POST['techlock']) : 0);
$techlevel = null;
- if(array_key_exists('techlevel',$_POST))
+ if(array_key_exists('techlevel', $_POST))
$techlevel = intval($_POST['techlevel']);
-
-
set_config('system', 'server_role', $server_role);
set_config('system', 'feed_contacts', $feed_contacts);
set_config('system', 'delivery_interval', $delivery_interval);
@@ -84,16 +81,16 @@ class Site {
if(! is_null($techlevel))
set_config('system', 'techlevel', $techlevel);
-
+
if($directory_server)
set_config('system','directory_server',$directory_server);
-
+
if ($banner == '') {
del_config('system', 'banner');
} else {
set_config('system', 'banner', $banner);
}
-
+
if ($admininfo == ''){
del_config('system', 'admininfo');
} else {
@@ -101,6 +98,7 @@ class Site {
linkify_tags($a, $admininfo, local_channel());
set_config('system', 'admininfo', $admininfo);
}
+ set_config('system','siteinfo',$siteinfo);
set_config('system', 'language', $language);
set_config('system', 'theme', $theme);
if ( $theme_mobile === '---' ) {
@@ -110,9 +108,9 @@ class Site {
}
// set_config('system','site_channel', $site_channel);
set_config('system','maximagesize', $maximagesize);
-
+
set_config('system','register_policy', $register_policy);
- set_config('system','invitation_only', $invite_only);
+ set_config('system','invitation_only', $invite_only);
set_config('system','access_policy', $access_policy);
set_config('system','account_abandon_days', $abandon_days);
set_config('system','register_text', $register_text);
@@ -124,14 +122,14 @@ class Site {
} else {
set_config('system', 'directory_submit_url', $global_directory);
}
-
+
set_config('system','no_community_page', $no_community_page);
set_config('system','no_utf', $no_utf);
set_config('system','verifyssl', $verifyssl);
set_config('system','proxyuser', $proxyuser);
set_config('system','proxy', $proxy);
set_config('system','curl_timeout', $timeout);
-
+
info( t('Site settings updated.') . EOL);
goaway(z_root() . '/admin/site' );
}
@@ -139,15 +137,14 @@ class Site {
/**
* @brief Admin page site.
*
- * @return string
+ * @return string with HTML
*/
-
function get() {
-
+
/* Installed langs */
$lang_choices = array();
$langs = glob('view/*/hstrings.php');
-
+
if(is_array($langs) && count($langs)) {
if(! in_array('view/en/hstrings.php',$langs))
$langs[] = 'view/en/';
@@ -157,7 +154,7 @@ class Site {
$lang_choices[$t[1]] = $t[1];
}
}
-
+
/* Installed themes */
$theme_choices_mobile["---"] = t("Default");
$theme_choices = array();
@@ -184,13 +181,13 @@ class Site {
}
}
}
-
+
$dir_choices = null;
$dirmode = get_config('system','directory_mode');
$realm = get_directory_realm();
-
+
// directory server should not be set or settable unless we are a directory client
-
+
if($dirmode == DIRECTORY_MODE_NORMAL) {
$x = q("select site_url from site where site_flags in (%d,%d) and site_realm = '%s'",
intval(DIRECTORY_MODE_SECONDARY),
@@ -204,25 +201,25 @@ class Site {
}
}
}
-
+
/* Banner */
-
+
$banner = get_config('system', 'banner');
- if($banner === false)
+ if($banner === false)
$banner = get_config('system','sitename');
-
+
$banner = htmlspecialchars($banner);
-
+
/* Admin Info */
$admininfo = get_config('system', 'admininfo');
-
+
/* Register policy */
$register_choices = Array(
REGISTER_CLOSED => t("No"),
REGISTER_APPROVE => t("Yes - with approval"),
REGISTER_OPEN => t("Yes")
);
-
+
/* Acess policy */
$access_choices = Array(
ACCESS_PRIVATE => t("My site is not a public server"),
@@ -230,36 +227,32 @@ class Site {
ACCESS_FREE => t("My site has free access only"),
ACCESS_TIERED => t("My site offers free accounts with optional paid upgrades")
);
-
+
$discover_tab = get_config('system','disable_discover_tab');
// $disable public streams by default
if($discover_tab === false)
$discover_tab = 1;
// now invert the logic for the setting.
$discover_tab = (1 - $discover_tab);
-
+
$server_roles = [
'basic' => t('Basic/Minimal Social Networking'),
'standard' => t('Standard Configuration (default)'),
'pro' => t('Professional')
];
-
$techlevels = [
'0' => t('Beginner/Basic'),
'1' => t('Novice - not skilled but willing to learn'),
'2' => t('Intermediate - somewhat comfortable'),
'3' => t('Advanced - very comfortable'),
- '4' => t('Expert - I can write computer code'),
+ '4' => t('Expert - I can write computer code'),
'5' => t('Wizard - I probably know more than you do')
];
-
-
-
$homelogin = get_config('system','login_on_homepage');
$enable_context_help = get_config('system','enable_context_help');
-
+
$t = get_markup_template("admin_site.tpl");
return replace_macros($t, array(
'$title' => t('Administration'),
@@ -269,7 +262,7 @@ class Site {
'$upload' => t('File upload'),
'$corporate' => t('Policies'),
'$advanced' => t('Advanced'),
-
+
'$baseurl' => z_root(),
// name, label, value, help string, extra data...
'$sitename' => array('sitename', t("Site name"), htmlspecialchars(get_config('system','sitename'), ENT_QUOTES, 'UTF-8'),''),
@@ -280,14 +273,14 @@ class Site {
'$techlock' => [ 'techlock', t('Lock the technical skill level setting'), get_config('system','techlevel_lock'), t('Members can set their own technical comfort level by default') ],
-
'$banner' => array('banner', t("Banner/Logo"), $banner, ""),
'$admininfo' => array('admininfo', t("Administrator Information"), $admininfo, t("Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here")),
+ '$siteinfo' => array('siteinfo', t('Site Information'), get_config('system','siteinfo'), t("Publicly visible description of this site. Displayed on siteinfo page. BBCode can be used here")),
'$language' => array('language', t("System language"), get_config('system','language'), "", $lang_choices),
'$theme' => array('theme', t("System theme"), get_config('system','theme'), t("Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"), $theme_choices),
'$theme_mobile' => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile_theme'), t("Theme for mobile devices"), $theme_choices_mobile),
- // '$site_channel' => array('site_channel', t("Channel to use for this website's static pages"), get_config('system','site_channel'), t("Site Channel")),
- '$feed_contacts' => array('feed_contacts', t('Allow Feeds as Connections'),get_config('system','feed_contacts'),t('(Heavy system resource usage)')),
+// '$site_channel' => array('site_channel', t("Channel to use for this website's static pages"), get_config('system','site_channel'), t("Site Channel")),
+ '$feed_contacts' => array('feed_contacts', t('Allow Feeds as Connections'),get_config('system','feed_contacts'),t('(Heavy system resource usage)')),
'$maximagesize' => array('maximagesize', t("Maximum image size"), intval(get_config('system','maximagesize')), t("Maximum size in bytes of uploaded images. Default is 0, which means no limits.")),
'$register_policy' => array('register_policy', t("Does this site allow new member registration?"), get_config('system','register_policy'), "", $register_choices),
'$invite_only' => array('invite_only', t("Invitation only"), get_config('system','invitation_only'), t("Only allow new member registrations with an invitation code. Above register policy must be set to Yes.")),
@@ -302,9 +295,9 @@ class Site {
'$disable_discover_tab' => array('disable_discover_tab', t('Import Public Streams'), $discover_tab, t('Import and allow access to public content pulled from other sites. Warning: this content is unmoderated.')),
'$login_on_homepage' => array('login_on_homepage', t("Login on Homepage"),((intval($homelogin) || $homelogin === false) ? 1 : '') , t("Present a login box to visitors on the home page if no other content has been configured.")),
'$enable_context_help' => array('enable_context_help', t("Enable context help"),((intval($enable_context_help) === 1 || $enable_context_help === false) ? 1 : 0) , t("Display contextual help for the current page when the help button is pressed.")),
-
+
'$directory_server' => (($dir_choices) ? array('directory_server', t("Directory Server URL"), get_config('system','directory_server'), t("Default directory server"), $dir_choices) : null),
-
+
'$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
'$proxy' => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""),
'$timeout' => array('timeout', t("Network timeout"), (x(get_config('system','curl_timeout'))?get_config('system','curl_timeout'):60), t("Value is in seconds. Set to 0 for unlimited (not recommended).")),
@@ -316,8 +309,5 @@ class Site {
'$form_security_token' => get_form_security_token("admin_site"),
));
}
-
-
-
} \ No newline at end of file
diff --git a/Zotlabs/Module/Api.php b/Zotlabs/Module/Api.php
index 4fd59acc4..a2a1aac1d 100644
--- a/Zotlabs/Module/Api.php
+++ b/Zotlabs/Module/Api.php
@@ -3,9 +3,21 @@ namespace Zotlabs\Module;
require_once('include/api.php');
+class Api extends \Zotlabs\Web\Controller {
-class Api extends \Zotlabs\Web\Controller {
+ function init() {
+ zot_api_init();
+
+ api_register_func('api/client/register', 'api_client_register', false);
+ api_register_func('api/oauth/request_token', 'api_oauth_request_token', false);
+ api_register_func('api/oauth/access_token', 'api_oauth_access_token', false);
+
+ $args = [];
+ call_hooks('api_register',$args);
+
+ return;
+ }
function post() {
if(! local_channel()) {
@@ -17,13 +29,13 @@ class Api extends \Zotlabs\Web\Controller {
function get() {
- if(\App::$cmd=='api/oauth/authorize'){
+ if(\App::$cmd === 'api/oauth/authorize'){
/*
* api/oauth/authorize interact with the user. return a standard page
*/
- \App::$page['template'] = "minimal";
+ \App::$page['template'] = 'minimal';
// get consumer/client from request token
try {
@@ -42,8 +54,8 @@ class Api extends \Zotlabs\Web\Controller {
$consumer = new OAuth1Consumer($app['client_id'], $app['pw'], $app['redirect_uri']);
- $verifier = md5($app['secret'].local_channel());
- set_config("oauth", $verifier, local_channel());
+ $verifier = md5($app['secret'] . local_channel());
+ set_config('oauth', $verifier, local_channel());
if($consumer->callback_url != null) {
@@ -78,11 +90,11 @@ class Api extends \Zotlabs\Web\Controller {
$tpl = get_markup_template('oauth_authorize.tpl');
$o = replace_macros($tpl, array(
- '$title' => t('Authorize application connection'),
- '$app' => $app,
+ '$title' => t('Authorize application connection'),
+ '$app' => $app,
'$authorize' => t('Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?'),
- '$yes' => t('Yes'),
- '$no' => t('No'),
+ '$yes' => t('Yes'),
+ '$no' => t('No'),
));
//echo "<pre>"; var_dump($app); killme();
diff --git a/Zotlabs/Module/Cal.php b/Zotlabs/Module/Cal.php
index b2e1c9235..1279a51b1 100644
--- a/Zotlabs/Module/Cal.php
+++ b/Zotlabs/Module/Cal.php
@@ -109,7 +109,7 @@ class Cal extends \Zotlabs\Web\Controller {
/* edit/create form */
if($event_id) {
- $r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
dbesc($event_id),
intval($channel['channel_id'])
);
@@ -228,7 +228,7 @@ class Cal extends \Zotlabs\Web\Controller {
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
from event left join item on event_hash = resource_id
- where resource_type = 'event' and event.uid = %d $ignored
+ where resource_type = 'event' and event.uid = %d and event.uid = item.uid $ignored
AND (( adjust = 0 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )
OR ( adjust = 1 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )) $sql_extra ",
intval($channel['channel_id']),
diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php
index 209d86236..45da92184 100644
--- a/Zotlabs/Module/Channel.php
+++ b/Zotlabs/Module/Channel.php
@@ -1,6 +1,6 @@
<?php
-namespace Zotlabs\Module;
+namespace Zotlabs\Module;
require_once('include/contact_widgets.php');
require_once('include/items.php');
@@ -10,6 +10,10 @@ require_once('include/conversation.php');
require_once('include/acl_selectors.php');
require_once('include/permissions.php');
+/**
+ * @brief Channel Controller
+ *
+ */
class Channel extends \Zotlabs\Web\Controller {
function init() {
@@ -34,7 +38,7 @@ class Channel extends \Zotlabs\Web\Controller {
if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
$which = $channel['channel_address'];
- $profile = argv(1);
+ $profile = argv(1);
}
\App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" title="' . t('Posts and comments') . '" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n" ;
@@ -48,12 +52,10 @@ class Channel extends \Zotlabs\Web\Controller {
// we start loading content
profile_load($which,$profile);
-
}
function get($update = 0, $load = false) {
-
if($load)
$_SESSION['loadtime'] = datetime_convert();
@@ -66,12 +68,13 @@ class Channel extends \Zotlabs\Web\Controller {
$datequery = ((x($_GET,'dend') && is_a_date_arg($_GET['dend'])) ? notags($_GET['dend']) : '');
$datequery2 = ((x($_GET,'dbegin') && is_a_date_arg($_GET['dbegin'])) ? notags($_GET['dbegin']) : '');
- if(observer_prohibited(true)) {
+ if(observer_prohibited(true)) {
return login();
}
$category = ((x($_REQUEST,'cat')) ? $_REQUEST['cat'] : '');
$hashtags = ((x($_REQUEST,'tag')) ? $_REQUEST['tag'] : '');
+ $static = ((array_key_exists('static',$_REQUEST)) ? intval($_REQUEST['static']) : 0);
$groups = array();
@@ -108,15 +111,17 @@ class Channel extends \Zotlabs\Web\Controller {
if(! $update) {
+ $static = channel_manual_conv_update(\App::$profile['profile_uid']);
+
$o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
$o .= common_friends_visitor_widget(\App::$profile['profile_uid']);
if($channel && $is_owner) {
$channel_acl = array(
- 'allow_cid' => $channel['channel_allow_cid'],
- 'allow_gid' => $channel['channel_allow_gid'],
- 'deny_cid' => $channel['channel_deny_cid'],
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
'deny_gid' => $channel['channel_deny_gid']
);
}
@@ -143,9 +148,9 @@ class Channel extends \Zotlabs\Web\Controller {
'bbco_autocomplete' => 'bbcode',
'bbcode' => true,
'jotnets' => true
- );
+ );
- $o .= status_editor($a,$x);
+ $o .= status_editor($a,$x);
}
}
@@ -168,12 +173,15 @@ class Channel extends \Zotlabs\Web\Controller {
$simple_update = (($update) ? " AND item_unseen = 1 " : '');
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string) . '" title="oembed" />' . "\r\n";
-
+
if($update && $_SESSION['loadtime'])
$simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) ";
if($load)
$simple_update = '';
+ if($static && $simple_update)
+ $simple_update .= " and item_thread_top = 0 and author_xchan = '" . protect_sprintf(get_observer_hash()) . "' ";
+
if(($update) && (! $load)) {
if($mid) {
@@ -183,9 +191,9 @@ class Channel extends \Zotlabs\Web\Controller {
intval(\App::$profile['profile_uid'])
);
$_SESSION['loadtime'] = datetime_convert();
- }
+ }
else {
- $r = q("SELECT distinct parent AS `item_id`, created from item
+ $r = q("SELECT distinct parent AS item_id, created from item
left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids )
WHERE uid = %d $item_normal
AND item_wall = 1 $simple_update
@@ -201,10 +209,10 @@ class Channel extends \Zotlabs\Web\Controller {
else {
if(x($category)) {
- $sql_extra .= protect_sprintf(term_query('item', $category, TERM_CATEGORY));
+ $sql_extra .= protect_sprintf(term_query('item', $category, TERM_CATEGORY));
}
if(x($hashtags)) {
- $sql_extra .= protect_sprintf(term_query('item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG));
+ $sql_extra .= protect_sprintf(term_query('item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG));
}
if($datequery) {
@@ -228,10 +236,9 @@ class Channel extends \Zotlabs\Web\Controller {
if (! $r) {
notice( t('Permission denied.') . EOL);
}
-
- }
+ }
else {
- $r = q("SELECT distinct id AS item_id, created FROM item
+ $r = q("SELECT distinct id AS item_id, created FROM item
left join abook on item.author_xchan = abook.abook_xchan
WHERE uid = %d $item_normal
AND item_wall = 1 and item_thread_top = 1
@@ -250,11 +257,11 @@ class Channel extends \Zotlabs\Web\Controller {
if($r) {
$parents_str = ids_to_querystr($r,'item_id');
-
- $items = q("SELECT `item`.*, `item`.`id` AS `item_id`
- FROM `item`
- WHERE `item`.`uid` = %d $item_normal
- AND `item`.`parent` IN ( %s )
+
+ $items = q("SELECT item.*, item.id AS item_id
+ FROM item
+ WHERE item.uid = %d $item_normal
+ AND item.parent IN ( %s )
$sql_extra ",
intval(\App::$profile['profile_uid']),
dbesc($parents_str)
@@ -270,8 +277,7 @@ class Channel extends \Zotlabs\Web\Controller {
notice( t('Permission denied.') . EOL);
}
- }
- else {
+ } else {
$items = array();
}
@@ -285,7 +291,7 @@ class Channel extends \Zotlabs\Web\Controller {
$maxheight = 400;
$o .= '<div id="live-channel"></div>' . "\r\n";
- $o .= "<script> var profile_uid = " . \App::$profile['profile_uid']
+ $o .= "<script> var profile_uid = " . \App::$profile['profile_uid']
. "; var netargs = '?f='; var profile_page = " . \App::$pager['page']
. "; divmore_height = " . intval($maxheight) . "; </script>\r\n";
@@ -304,6 +310,7 @@ class Channel extends \Zotlabs\Web\Controller {
'$nouveau' => '0',
'$wall' => '1',
'$fh' => '0',
+ '$static' => $static,
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => '',
'$order' => '',
@@ -317,7 +324,6 @@ class Channel extends \Zotlabs\Web\Controller {
'$dbegin' => $datequery2
));
-
}
$update_unseen = '';
@@ -325,10 +331,10 @@ class Channel extends \Zotlabs\Web\Controller {
if($page_mode === 'list') {
/**
- * in "list mode", only mark the parent item and any like activities as "seen".
+ * in "list mode", only mark the parent item and any like activities as "seen".
* We won't distinguish between comment likes and post likes. The important thing
* is that the number of unseen comments will be accurate. The SQL to separate the
- * comment likes could also get somewhat hairy.
+ * comment likes could also get somewhat hairy.
*/
if($parents_str) {
@@ -351,7 +357,7 @@ class Channel extends \Zotlabs\Web\Controller {
if($checkjs->disabled()) {
$o .= conversation($a,$items,'channel',$update,'traditional');
- }
+ }
else {
$o .= conversation($a,$items,'channel',$update,$page_mode);
}
@@ -362,7 +368,7 @@ class Channel extends \Zotlabs\Web\Controller {
\App::$page['title'] = $items[0]['title'] . " - " . \App::$page['title'];
}
- if($mid)
+ if($mid)
$o .= '<div id="content-complete"></div>';
return $o;
diff --git a/Zotlabs/Module/Chanview.php b/Zotlabs/Module/Chanview.php
index c6dd07eb7..01ee74d5a 100644
--- a/Zotlabs/Module/Chanview.php
+++ b/Zotlabs/Module/Chanview.php
@@ -58,7 +58,9 @@ class Chanview extends \Zotlabs\Web\Controller {
}
logger('mod_chanview: constructed address ' . print_r($matches,true));
}
-
+
+ $r = null;
+
if($_REQUEST['address']) {
$j = \Zotlabs\Zot\Finger::run($_REQUEST['address'],null);
if($j['success']) {
@@ -66,40 +68,74 @@ class Chanview extends \Zotlabs\Web\Controller {
$r = q("select * from xchan where xchan_addr = '%s' limit 1",
dbesc($_REQUEST['address'])
);
- if($r)
+ if($r) {
\App::$poi = $r[0];
+ }
+ }
+ if(! $r) {
+ if(discover_by_webbie($_REQUEST['address'])) {
+ $r = q("select * from xchan where xchan_addr = '%s' limit 1",
+ dbesc($_REQUEST['address'])
+ );
+ if($r) {
+ \App::$poi = $r[0];
+ }
+ }
}
}
}
if(! \App::$poi) {
- // We don't know who this is, and we can't figure it out from the URL
- // On the plus side, there's a good chance we know somebody else at that
- // hub so sending them there with a Zid will probably work anyway.
+
+ // We don't know who this is, and we can't figure it out from the URL
+ // On the plus side, there's a good chance we know somebody else at that
+ // hub so sending them there with a Zid will probably work anyway.
+
$url = ($_REQUEST['url']);
+ if(! $url) {
+ notice( t('Channel not found.') . EOL);
+ return;
+ }
if($observer)
$url = zid($url);
+
}
+
+ $is_zot = false;
if (\App::$poi) {
- $url = \App::$poi['xchan_url'];
- if($observer)
- $url = zid($url);
+ $url = \App::$poi['xchan_url'];
+ if(\App::$poi['xchan_network'] === 'zot') {
+ $is_zot = true;
+ }
}
- // let somebody over-ride the iframed viewport presentation
- // or let's just declare this a failed experiment.
-
- // if((! local_channel()) || (get_pconfig(local_channel(),'system','chanview_full')))
-
- goaway($url);
-
- // $o = replace_macros(get_markup_template('chanview.tpl'),array(
- // '$url' => $url,
- // '$full' => t('toggle full screen mode')
- // ));
+
+ // We will load the chanview template if it's a foreign network,
+ // just so that we can provide a connect button along with a profile
+ // photo. Chances are we can't load the remote profile into an iframe
+ // because of cross-domain security headers. So provide a link to
+ // the remote profile.
+
+ // Zot channels will usually have a connect link.
+ // If it isn't zot, 'pro' members won't be able to use the connect
+ // button as it is a foreign network so just send them to the remote
+ // profile.
+
- // return $o;
+ if($is_zot || \Zotlabs\Lib\System::get_server_role() === 'pro') {
+ if($is_zot && $observer) {
+ $url = zid($url);
+ }
+ goaway($url);
+ }
+ else {
+ $o = replace_macros(get_markup_template('chanview.tpl'),array(
+ '$url' => $url,
+ '$full' => t('toggle full screen mode')
+ ));
+ return $o;
+ }
}
}
diff --git a/Zotlabs/Module/Cloud.php b/Zotlabs/Module/Cloud.php
index 68d84e070..1fda8e32b 100644
--- a/Zotlabs/Module/Cloud.php
+++ b/Zotlabs/Module/Cloud.php
@@ -1,7 +1,7 @@
<?php
namespace Zotlabs\Module;
/**
- * @file mod/cloud.php
+ * @file Zotlabs/Module/Cloud.php
* @brief Initialize Hubzilla's cloud (SabreDAV).
*
* Module for accessing the DAV storage area.
@@ -17,34 +17,35 @@ require_once('include/attach.php');
/**
- * @brief Fires up the SabreDAV server.
+ * @brief Cloud Module.
*
- * @param App &$a
*/
-
-
class Cloud extends \Zotlabs\Web\Controller {
+ /**
+ * @brief Fires up the SabreDAV server.
+ *
+ */
function init() {
-
+
if (! is_dir('store'))
os_mkdir('store', STORAGE_DEFAULT_PERMISSIONS, false);
-
+
$which = null;
if (argc() > 1)
$which = argv(1);
-
+
$profile = 0;
-
+
\App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n";
-
+
if ($which)
profile_load( $which, $profile);
-
+
$auth = new \Zotlabs\Storage\BasicAuth();
-
+
$ob_hash = get_observer_hash();
-
+
if ($ob_hash) {
if (local_channel()) {
$channel = \App::get_channel();
@@ -57,40 +58,40 @@ class Cloud extends \Zotlabs\Web\Controller {
}
$auth->observer = $ob_hash;
}
-
+
if ($_GET['davguest'])
$_SESSION['davguest'] = true;
-
+
$_SERVER['QUERY_STRING'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['QUERY_STRING']);
$_SERVER['QUERY_STRING'] = strip_zids($_SERVER['QUERY_STRING']);
$_SERVER['QUERY_STRING'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['QUERY_STRING']);
-
+
$_SERVER['REQUEST_URI'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['REQUEST_URI']);
$_SERVER['REQUEST_URI'] = strip_zids($_SERVER['REQUEST_URI']);
$_SERVER['REQUEST_URI'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['REQUEST_URI']);
-
+
$rootDirectory = new \Zotlabs\Storage\Directory('/', $auth);
-
+
// A SabreDAV server-object
$server = new SDAV\Server($rootDirectory);
// prevent overwriting changes each other with a lock backend
$lockBackend = new SDAV\Locks\Backend\File('store/[data]/locks');
$lockPlugin = new SDAV\Locks\Plugin($lockBackend);
-
+
$server->addPlugin($lockPlugin);
-
+
$is_readable = false;
-
+
// provide a directory view for the cloud in Hubzilla
$browser = new \Zotlabs\Storage\Browser($auth);
$auth->setBrowserPlugin($browser);
-
+
$server->addPlugin($browser);
-
+
// Experimental QuotaPlugin
// require_once('\Zotlabs\Storage/QuotaPlugin.php');
// $server->addPlugin(new \Zotlabs\Storage\\QuotaPlugin($auth));
-
+
ob_start();
// All we need to do now, is to fire up the server
$server->exec();
@@ -99,5 +100,5 @@ class Cloud extends \Zotlabs\Web\Controller {
killme();
}
-
+
}
diff --git a/Zotlabs/Module/Connect.php b/Zotlabs/Module/Connect.php
index dec375104..cd43ea290 100644
--- a/Zotlabs/Module/Connect.php
+++ b/Zotlabs/Module/Connect.php
@@ -29,7 +29,7 @@ class Connect extends \Zotlabs\Web\Controller {
profile_load($which,'');
}
- function post() {
+ function post() {
if(! array_key_exists('channel', \App::$data))
return;
@@ -78,7 +78,7 @@ class Connect extends \Zotlabs\Web\Controller {
- function get() {
+ function get() {
$edit = ((local_channel() && (local_channel() == \App::$data['channel']['channel_id'])) ? true : false);
diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php
index 43feac189..5968ccde6 100644
--- a/Zotlabs/Module/Connedit.php
+++ b/Zotlabs/Module/Connedit.php
@@ -41,11 +41,13 @@ class Connedit extends \Zotlabs\Web\Controller {
}
}
+
$channel = \App::get_channel();
if($channel)
head_set_icon($channel['xchan_photo_s']);
}
+
/* @brief Evaluate posted values and set changes
*
@@ -96,7 +98,7 @@ class Connedit extends \Zotlabs\Web\Controller {
$profile_id = $_POST['profile_assign'];
if($profile_id) {
- $r = q("SELECT profile_guid FROM profile WHERE profile_guid = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("SELECT profile_guid FROM profile WHERE profile_guid = '%s' AND uid = %d LIMIT 1",
dbesc($profile_id),
intval(local_channel())
);
@@ -396,6 +398,7 @@ class Connedit extends \Zotlabs\Web\Controller {
return login();
}
+ $section = ((array_key_exists('section',$_REQUEST)) ? $_REQUEST['section'] : '');
$channel = \App::get_channel();
$my_perms = get_channel_default_perms(local_channel());
$role = get_pconfig(local_channel(),'system','permissions_role');
@@ -448,7 +451,7 @@ class Connedit extends \Zotlabs\Web\Controller {
}
if($cmd === 'resetphoto') {
- q("update xchan set xchan_photo_date = '2001-01-01 00:00:00' where xchan_hash = '%s' limit 1",
+ q("update xchan set xchan_photo_date = '2001-01-01 00:00:00' where xchan_hash = '%s'",
dbesc($orig_record[0]['xchan_hash'])
);
$cmd = 'refresh';
@@ -521,11 +524,12 @@ class Connedit extends \Zotlabs\Web\Controller {
if($cmd === 'drop') {
- // FIXME
- // We need to send either a purge or a refresh packet to the other side (the channel being unfriended).
- // The issue is that the abook DB record _may_ get destroyed when we call contact_remove. As the notifier runs
- // in the background there could be a race condition preventing this packet from being sent in all cases.
- // PLACEHOLDER
+ // @FIXME
+ // We need to send either a purge or a refresh packet to the other side (the channel being unfriended).
+ // The issue is that the abook DB record _may_ get destroyed when we call contact_remove. As the notifier
+ // runs in the background there could be a race condition preventing this packet from being sent in all
+ // cases.
+ // PLACEHOLDER
contact_remove(local_channel(), $orig_record[0]['abook_id']);
build_sync_packet(0 /* use the current local_channel */,
@@ -545,9 +549,33 @@ class Connedit extends \Zotlabs\Web\Controller {
if(\App::$poi) {
+ $abook_prev = 0;
+ $abook_next = 0;
+
$contact_id = \App::$poi['abook_id'];
$contact = \App::$poi;
-
+
+ $cn = q("SELECT abook_id, xchan_name from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and abook_self = 0 order by xchan_name",
+ intval(local_channel())
+ );
+
+ if($cn) {
+ $pntotal = count($cn);
+
+ for($x = 0; $x < $pntotal; $x ++) {
+ if($cn[$x]['abook_id'] == $contact_id) {
+ if($x === 0)
+ $abook_prev = 0;
+ else
+ $abook_prev = $cn[$x - 1]['abook_id'];
+ if($x === $pntotal)
+ $abook_next = 0;
+ else
+ $abook_next = $cn[$x +1]['abook_id'];
+ }
+ }
+ }
+
$tools = array(
'view' => array(
@@ -614,8 +642,10 @@ class Connedit extends \Zotlabs\Web\Controller {
$self = false;
- if(intval($contact['abook_self']))
+ if(intval($contact['abook_self'])) {
$self = true;
+ $abook_prev = $abook_next = 0;
+ }
$tpl = get_markup_template("abook_edit.tpl");
@@ -750,6 +780,7 @@ class Connedit extends \Zotlabs\Web\Controller {
'$header' => (($self) ? t('Connection Default Permissions') : sprintf( t('Connection: %s'),$contact['xchan_name'])),
'$autoperms' => array('autoperms',t('Apply these permissions automatically'), ((get_pconfig(local_channel(),'system','autoperms')) ? 1 : 0), t('Connection requests will be approved without your interaction'), $yes_no),
'$addr' => $contact['xchan_addr'],
+ '$section' => $section,
'$addr_text' => t('This connection\'s primary address is'),
'$loc_text' => t('Available locations:'),
'$locstr' => $locstr,
@@ -791,7 +822,8 @@ class Connedit extends \Zotlabs\Web\Controller {
'$multiprofs' => $multiprofs,
'$contact_id' => $contact['abook_id'],
'$name' => $contact['xchan_name'],
-
+ '$abook_prev' => $abook_prev,
+ '$abook_next' => $abook_next
));
$arr = array('contact' => $contact,'output' => $o);
@@ -800,9 +832,6 @@ class Connedit extends \Zotlabs\Web\Controller {
return $arr['output'];
- }
-
-
+ }
}
-
}
diff --git a/Zotlabs/Module/Contactgroup.php b/Zotlabs/Module/Contactgroup.php
index bbe56b4ad..2ba53517f 100644
--- a/Zotlabs/Module/Contactgroup.php
+++ b/Zotlabs/Module/Contactgroup.php
@@ -23,7 +23,7 @@ class Contactgroup extends \Zotlabs\Web\Controller {
if((argc() > 1) && (intval(argv(1)))) {
- $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
+ $r = q("SELECT * FROM groups WHERE id = %d AND uid = %d AND deleted = 0 LIMIT 1",
intval(argv(1)),
intval(local_channel())
);
diff --git a/Zotlabs/Module/Cover_photo.php b/Zotlabs/Module/Cover_photo.php
index 886958b37..72ec1020d 100644
--- a/Zotlabs/Module/Cover_photo.php
+++ b/Zotlabs/Module/Cover_photo.php
@@ -88,7 +88,7 @@ class Cover_photo extends \Zotlabs\Web\Controller {
if($r) {
$base_image = $r[0];
- $base_image['content'] = (($r[0]['os_storage']) ? @file_get_contents($base_image['content']) : dbunescbin($base_image['content']));
+ $base_image['content'] = (($r[0]['os_storage']) ? @file_get_contents(dbunescbin($base_image['content'])) : dbunescbin($base_image['content']));
$im = photo_factory($base_image['content'], $base_image['mimetype']);
if($im->is_valid()) {
@@ -309,7 +309,7 @@ class Cover_photo extends \Zotlabs\Web\Controller {
$havescale = true;
}
- $r = q("SELECT `content`, `mimetype`, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1",
+ $r = q("SELECT content, mimetype, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1",
intval($r[0]['id']),
intval(local_channel())
@@ -320,7 +320,7 @@ class Cover_photo extends \Zotlabs\Web\Controller {
}
if(intval($r[0]['os_storage']))
- $data = @file_get_contents($r[0]['content']);
+ $data = @file_get_contents(dbunescbin($r[0]['content']));
else
$data = dbunescbin($r[0]['content']);
diff --git a/Zotlabs/Module/Dav.php b/Zotlabs/Module/Dav.php
index aaf69844c..8ae2e8991 100644
--- a/Zotlabs/Module/Dav.php
+++ b/Zotlabs/Module/Dav.php
@@ -1,31 +1,26 @@
<?php
-
-namespace Zotlabs\Module;
/**
- * @file mod/dav.php
+ * @file Zotlabs/Module/Dav.php
* @brief Initialize Hubzilla's cloud (SabreDAV).
*
* Module for accessing the DAV storage area from a DAV client.
*/
+namespace Zotlabs\Module;
+
use \Sabre\DAV as SDAV;
use \Zotlabs\Storage;
-// composer autoloader for SabreDAV
-require_once('vendor/autoload.php');
-
require_once('include/attach.php');
-/**
- * @brief Fires up the SabreDAV server.
- *
- * @param App &$a
- */
-
class Dav extends \Zotlabs\Web\Controller {
+ /**
+ * @brief Fires up the SabreDAV server.
+ *
+ */
function init() {
-
+
// workaround for HTTP-auth in CGI mode
if (x($_SERVER, 'REDIRECT_REMOTE_USER')) {
$userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"], 6)) ;
@@ -47,16 +42,16 @@ class Dav extends \Zotlabs\Web\Controller {
if (! is_dir('store'))
os_mkdir('store', STORAGE_DEFAULT_PERMISSIONS, false);
-
+
if (argc() > 1)
profile_load(argv(1),0);
-
+
$auth = new \Zotlabs\Storage\BasicAuth();
$auth->setRealm(ucfirst(\Zotlabs\Lib\System::get_platform_name()) . ' ' . 'WebDAV');
$rootDirectory = new \Zotlabs\Storage\Directory('/', $auth);
-
+
// A SabreDAV server-object
$server = new SDAV\Server($rootDirectory);
@@ -68,21 +63,20 @@ class Dav extends \Zotlabs\Web\Controller {
// prevent overwriting changes each other with a lock backend
$lockBackend = new SDAV\Locks\Backend\File('store/[data]/locks');
$lockPlugin = new SDAV\Locks\Plugin($lockBackend);
-
+
$server->addPlugin($lockPlugin);
-
+
// provide a directory view for the cloud in Hubzilla
$browser = new \Zotlabs\Storage\Browser($auth);
$auth->setBrowserPlugin($browser);
-
+
// Experimental QuotaPlugin
- // require_once('Zotlabs/Storage/QuotaPlugin.php');
// $server->addPlugin(new \Zotlabs\Storage\QuotaPlugin($auth));
-
+
// All we need to do now, is to fire up the server
$server->exec();
-
+
killme();
}
-
+
}
diff --git a/Zotlabs/Module/Directory.php b/Zotlabs/Module/Directory.php
index e1068223b..da9bb146f 100644
--- a/Zotlabs/Module/Directory.php
+++ b/Zotlabs/Module/Directory.php
@@ -1,4 +1,5 @@
<?php
+
namespace Zotlabs\Module;
require_once('include/socgraph.php');
diff --git a/Zotlabs/Module/Dirsearch.php b/Zotlabs/Module/Dirsearch.php
index 4b9dcaa54..e6cf5449a 100644
--- a/Zotlabs/Module/Dirsearch.php
+++ b/Zotlabs/Module/Dirsearch.php
@@ -12,7 +12,7 @@ class Dirsearch extends \Zotlabs\Web\Controller {
}
- function get() {
+ function get() {
$ret = array('success' => false);
@@ -185,7 +185,7 @@ class Dirsearch extends \Zotlabs\Web\Controller {
else {
$qlimit = " LIMIT " . intval($perpage) . " OFFSET " . intval($startrec);
if($return_total) {
- $r = q("SELECT COUNT(xchan_hash) AS `total` FROM xchan left join xprof on xchan_hash = xprof_hash where $logic $sql_extra and xchan_network = 'zot' and xchan_hidden = 0 and xchan_orphan = 0 and xchan_deleted = 0 $safesql ");
+ $r = q("SELECT COUNT(xchan_hash) AS total FROM xchan left join xprof on xchan_hash = xprof_hash where $logic $sql_extra and xchan_network = 'zot' and xchan_hidden = 0 and xchan_orphan = 0 and xchan_deleted = 0 $safesql ");
if($r) {
$ret['total_items'] = $r[0]['total'];
}
@@ -457,6 +457,6 @@ class Dirsearch extends \Zotlabs\Web\Controller {
}
}
return $ret;
- }
-
+ }
+
}
diff --git a/Zotlabs/Module/Display.php b/Zotlabs/Module/Display.php
index e9441bbdf..42f6dd4ac 100644
--- a/Zotlabs/Module/Display.php
+++ b/Zotlabs/Module/Display.php
@@ -121,6 +121,8 @@ class Display extends \Zotlabs\Web\Controller {
return '';
}
}
+
+ $static = ((array_key_exists('static',$_REQUEST)) ? intval($_REQUEST['static']) : 0);
$simple_update = (($update) ? " AND item_unseen = 1 " : '');
@@ -130,10 +132,13 @@ class Display extends \Zotlabs\Web\Controller {
if($load)
$simple_update = '';
-
+ if($static && $simple_update)
+ $simple_update .= " and item_thread_top = 0 and author_xchan = '" . protect_sprintf(get_observer_hash()) . "' ";
if((! $update) && (! $load)) {
+
+ $static = ((local_channel()) ? channel_manual_conv_update(local_channel()) : 0);
$o .= '<div id="live-display"></div>' . "\r\n";
$o .= "<script> var profile_uid = " . ((intval(local_channel())) ? local_channel() : (-1))
@@ -154,6 +159,7 @@ class Display extends \Zotlabs\Web\Controller {
'$fh' => '0',
'$nouveau' => '0',
'$wall' => '0',
+ '$static' => $static,
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$search' => '',
@@ -214,8 +220,8 @@ class Display extends \Zotlabs\Web\Controller {
$r = q("SELECT * from item
WHERE mid = '%s'
- AND (((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
- AND `item`.`deny_gid` = '' AND item_private = 0 )
+ AND (((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = ''
+ AND item.deny_gid = '' AND item_private = 0 )
and owner_xchan in ( " . stream_perms_xchans(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
OR uid = %d )
$sql_extra )
@@ -258,8 +264,8 @@ class Display extends \Zotlabs\Web\Controller {
$r = q("SELECT * from item
WHERE mid = '%s'
- AND (((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
- AND `item`.`deny_gid` = '' AND item_private = 0 )
+ AND (((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = ''
+ AND item.deny_gid = '' AND item_private = 0 )
and owner_xchan in ( " . stream_perms_xchans(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
OR uid = %d )
$sql_extra )
@@ -282,8 +288,8 @@ class Display extends \Zotlabs\Web\Controller {
$parents_str = ids_to_querystr($r,'id');
if($parents_str) {
- $items = q("SELECT `item`.*, `item`.`id` AS `item_id`
- FROM `item`
+ $items = q("SELECT item.*, item.id AS item_id
+ FROM item
WHERE parent in ( %s ) $item_normal ",
dbesc($parents_str)
);
@@ -321,7 +327,7 @@ class Display extends \Zotlabs\Web\Controller {
/*
elseif((! $update) && (! {
- $r = q("SELECT `id`, item_flags FROM `item` WHERE `id` = '%s' OR `mid` = '%s' LIMIT 1",
+ $r = q("SELECT id, item_flags FROM item WHERE id = '%s' OR mid = '%s' LIMIT 1",
dbesc($item_hash),
dbesc($item_hash)
);
diff --git a/Zotlabs/Module/Dreport.php b/Zotlabs/Module/Dreport.php
index 3fdeff369..76e07b147 100644
--- a/Zotlabs/Module/Dreport.php
+++ b/Zotlabs/Module/Dreport.php
@@ -21,10 +21,11 @@ class Dreport extends \Zotlabs\Web\Controller {
$table = 'push';
$mid = ((argc() > 2) ? argv(2) : '');
if($mid) {
- $i = q("select id from item where mid = '%s' and author_xchan = '%s' and uid = %d",
+ $i = q("select id from item where mid = '%s' and uid = %d and ( author_xchan = '%s' or ( owner_xchan = '%s' and item_wall = 1 )) ",
dbesc($mid),
+ intval($channel['channel_id']),
dbesc($channel['channel_hash']),
- intval($channel['channel_id'])
+ dbesc($channel['channel_hash'])
);
if($i) {
\Zotlabs\Daemon\Master::Summon([ 'Notifier', 'edit_post', $i[0]['id'] ]);
@@ -47,8 +48,9 @@ class Dreport extends \Zotlabs\Web\Controller {
switch($table) {
case 'item':
- $i = q("select id from item where mid = '%s' and author_xchan = '%s' ",
+ $i = q("select id from item where mid = '%s' and ( author_xchan = '%s' or ( owner_xchan = '%s' and item_wall = 1 )) ",
dbesc($mid),
+ dbesc($channel['channel_hash']),
dbesc($channel['channel_hash'])
);
break;
diff --git a/Zotlabs/Module/Editblock.php b/Zotlabs/Module/Editblock.php
index 6a9fa5f2d..654e2251d 100644
--- a/Zotlabs/Module/Editblock.php
+++ b/Zotlabs/Module/Editblock.php
@@ -80,7 +80,7 @@ class Editblock extends \Zotlabs\Web\Controller {
return;
}
- $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
+ $itm = q("SELECT * FROM item WHERE id = %d and uid = %s LIMIT 1",
intval($post_id),
intval($owner)
);
diff --git a/Zotlabs/Module/Editlayout.php b/Zotlabs/Module/Editlayout.php
index 26732dc77..ea637fcba 100644
--- a/Zotlabs/Module/Editlayout.php
+++ b/Zotlabs/Module/Editlayout.php
@@ -91,7 +91,7 @@ class Editlayout extends \Zotlabs\Web\Controller {
return;
}
- $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
+ $itm = q("SELECT * FROM item WHERE id = %d and uid = %s LIMIT 1",
intval($post_id),
intval($owner)
);
diff --git a/Zotlabs/Module/Editpost.php b/Zotlabs/Module/Editpost.php
index 838fe9e4f..5c04653b8 100644
--- a/Zotlabs/Module/Editpost.php
+++ b/Zotlabs/Module/Editpost.php
@@ -25,7 +25,7 @@ class Editpost extends \Zotlabs\Web\Controller {
return;
}
- $itm = q("SELECT * FROM `item` WHERE `id` = %d AND ( owner_xchan = '%s' OR author_xchan = '%s' ) LIMIT 1",
+ $itm = q("SELECT * FROM item WHERE id = %d AND ( owner_xchan = '%s' OR author_xchan = '%s' ) LIMIT 1",
intval($post_id),
dbesc(get_observer_hash()),
dbesc(get_observer_hash())
@@ -85,6 +85,7 @@ class Editpost extends \Zotlabs\Web\Controller {
'hide_voting' => true,
'hide_future' => true,
'hide_location' => true,
+ 'parent' => (($itm[0]['mid'] === $itm[0]['parent_mid']) ? 0 : $itm[0]['parent']),
'mimetype' => $itm[0]['mimetype'],
'ptyp' => $itm[0]['obj_type'],
'body' => htmlspecialchars_decode(undo_post_tagging($itm[0]['body']),ENT_COMPAT),
diff --git a/Zotlabs/Module/Editwebpage.php b/Zotlabs/Module/Editwebpage.php
index 2da8871a2..3d4af107d 100644
--- a/Zotlabs/Module/Editwebpage.php
+++ b/Zotlabs/Module/Editwebpage.php
@@ -95,7 +95,7 @@ class Editwebpage extends \Zotlabs\Web\Controller {
$sql_extra = item_permissions_sql($owner);
- $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s $sql_extra LIMIT 1",
+ $itm = q("SELECT * FROM item WHERE id = %d and uid = %s $sql_extra LIMIT 1",
intval($post_id),
intval($owner)
);
diff --git a/Zotlabs/Module/Embedphotos.php b/Zotlabs/Module/Embedphotos.php
index 0dc745b0a..48667795c 100644
--- a/Zotlabs/Module/Embedphotos.php
+++ b/Zotlabs/Module/Embedphotos.php
@@ -1,99 +1,96 @@
<?php
+
namespace Zotlabs\Module;
/**
+ * @brief
*
- * This is the POST destination for the embedphotos button
- *
- */
-
-
+ */
class Embedphotos extends \Zotlabs\Web\Controller {
function get() {
-
+
}
+ /**
+ *
+ * This is the POST destination for the embedphotos button
+ *
+ */
function post() {
-
- if (argc() > 1 && argv(1) === 'album') {
- // API: /embedphotos/album
- $name = (x($_POST,'name') ? $_POST['name'] : null );
- if (!$name) {
- json_return_and_die(array('errormsg' => 'Error retrieving album', 'status' => false));
- }
- $album = $this->embedphotos_widget_album(array('channel' => \App::get_channel(), 'album' => $name));
- json_return_and_die(array('status' => true, 'content' => $album));
-
- }
- if (argc() > 1 && argv(1) === 'albumlist') {
- // API: /embedphotos/albumlist
- $album_list = $this->embedphotos_album_list($a);
- json_return_and_die(array('status' => true, 'albumlist' => $album_list));
-
- }
- if (argc() > 1 && argv(1) === 'photolink') {
- // API: /embedphotos/photolink
- $href = (x($_POST,'href') ? $_POST['href'] : null );
- if (!$href) {
- json_return_and_die(array('errormsg' => 'Error retrieving link ' . $href, 'status' => false));
- }
- $resource_id = array_pop(explode("/", $href));
- $r = q("SELECT obj,body from item where resource_type = 'photo' and resource_id = '%s' limit 1",
- dbesc($resource_id)
- );
- if(!$r) {
- json_return_and_die(array('errormsg' => 'Error retrieving resource ' . $resource_id, 'status' => false));
- }
- $obj = json_decode($r[0]['obj'], true);
- if(x($obj,'body')) {
- $photolink = $obj['body'];
- } elseif (x($obj,'bbcode')) {
- $photolink = $obj['bbcode'];
- } elseif ($r[0]['body'] !== '') {
- $photolink = $r[0]['body'];
- } else {
- json_return_and_die(array('errormsg' => 'Error retrieving resource ' . $resource_id, 'status' => false));
- }
- json_return_and_die(array('status' => true, 'photolink' => $photolink));
-
- }
+ if (argc() > 1 && argv(1) === 'album') {
+ // API: /embedphotos/album
+ $name = (x($_POST,'name') ? $_POST['name'] : null );
+ if(!$name) {
+ json_return_and_die(array('errormsg' => 'Error retrieving album', 'status' => false));
+ }
+ $album = $this->embedphotos_widget_album(array('channel' => \App::get_channel(), 'album' => $name));
+ json_return_and_die(array('status' => true, 'content' => $album));
+ }
+ if(argc() > 1 && argv(1) === 'albumlist') {
+ // API: /embedphotos/albumlist
+ $album_list = $this->embedphotos_album_list($a);
+ json_return_and_die(array('status' => true, 'albumlist' => $album_list));
+ }
+ if(argc() > 1 && argv(1) === 'photolink') {
+ // API: /embedphotos/photolink
+ $href = (x($_POST,'href') ? $_POST['href'] : null );
+ if(!$href) {
+ json_return_and_die(array('errormsg' => 'Error retrieving link ' . $href, 'status' => false));
+ }
+ $resource_id = array_pop(explode("/", $href));
+ $r = q("SELECT obj from item where resource_type = 'photo' and resource_id = '%s' limit 1",
+ dbesc($resource_id)
+ );
+ if(!$r) {
+ json_return_and_die(array('errormsg' => 'Error retrieving resource ' . $resource_id, 'status' => false));
+ }
+ $obj = json_decode($r[0]['obj'], true);
+ if(x($obj,'body')) {
+ $photolink = $obj['body'];
+ } elseif (x($obj,'bbcode')) {
+ $photolink = $obj['bbcode'];
+ } else {
+ json_return_and_die(array('errormsg' => 'Error retrieving resource ' . $resource_id, 'status' => false));
+ }
+ json_return_and_die(array('status' => true, 'photolink' => $photolink));
+ }
}
-
-
-/**
- * Copied from include/widgets.php::widget_album() with a modification to get the profile_uid from
- * the input array as in widget_item()
- * @param type $name
- * @return string
- */
-function embedphotos_widget_album($args) {
-
- $channel_id = 0;
- if(array_key_exists('channel',$args))
- $channel = $args['channel'];
- $channel_id = intval($channel['channel_id']);
- if(! $channel_id)
- $channel_id = \App::$profile_uid;
- if(! $channel_id)
- return '';
+
+ /**
+ * Copied from include/widgets.php::widget_album() with a modification to get the profile_uid from
+ * the input array as in widget_item()
+ *
+ * @param array $args
+ * @return string with HTML
+ */
+ function embedphotos_widget_album($args) {
+
+ $channel_id = 0;
+ if(array_key_exists('channel', $args))
+ $channel = $args['channel'];
+ $channel_id = intval($channel['channel_id']);
+ if(! $channel_id)
+ $channel_id = \App::$profile_uid;
+ if(! $channel_id)
+ return '';
+
$owner_uid = $channel_id;
- require_once('include/security.php');
- $sql_extra = permissions_sql($channel_id);
+ require_once('include/security.php');
+ $sql_extra = permissions_sql($channel_id);
- if(! perm_is_allowed($channel_id,get_observer_hash(),'view_storage'))
- return '';
+ if(! perm_is_allowed($channel_id,get_observer_hash(),'view_storage'))
+ return '';
- if($args['album'])
- $album = (($args['album'] === '/') ? '' : $args['album'] );
- if($args['title'])
- $title = $args['title'];
+ if($args['album'])
+ $album = $args['album'];
+ if($args['title'])
+ $title = $args['title'];
- /**
+ /**
* This may return incorrect permissions if you have multiple directories of the same name.
* It is a limitation of the photo table using a name for a photo album instead of a folder hash
*/
-
if($album) {
$x = q("select hash from attach where filename = '%s' and uid = %d limit 1",
dbesc($album),
@@ -109,34 +106,33 @@ function embedphotos_widget_album($args) {
$order = 'DESC';
$r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.imgscale, p.description, p.created FROM photo p INNER JOIN
- (SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) $sql_extra GROUP BY resource_id) ph
+ (SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) $sql_extra GROUP BY resource_id) ph
ON (p.resource_id = ph.resource_id AND p.imgscale = ph.imgscale)
- ORDER BY created $order",
- intval($owner_uid),
- dbesc($album),
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE)
+ ORDER BY created $order",
+ intval($owner_uid),
+ dbesc($album),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
);
$photos = array();
- if(count($r)) {
- $twist = 'rotright';
- foreach($r as $rr) {
-
- if($twist == 'rotright')
- $twist = 'rotleft';
- else
- $twist = 'rotright';
-
- $ext = $phototypes[$rr['mimetype']];
-
- $imgalt_e = $rr['filename'];
- $desc_e = $rr['description'];
-
- $imagelink = (z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $rr['resource_id']
+ if(count($r)) {
+ $twist = 'rotright';
+ foreach($r as $rr) {
+ if($twist == 'rotright')
+ $twist = 'rotleft';
+ else
+ $twist = 'rotright';
+
+ $ext = $phototypes[$rr['mimetype']];
+
+ $imgalt_e = $rr['filename'];
+ $desc_e = $rr['description'];
+
+ $imagelink = (z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $rr['resource_id']
. (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''));
-
- $photos[] = array(
+
+ $photos[] = array(
'id' => $rr['id'],
'twist' => ' ' . $twist . rand(2,4),
'link' => $imagelink,
@@ -148,8 +144,8 @@ function embedphotos_widget_album($args) {
'hash'=> $rr['resource_id'],
'unknown' => t('Unknown')
);
- }
}
+ }
$tpl = get_markup_template('photo_album.tpl');
$o .= replace_macros($tpl, array(
@@ -165,18 +161,16 @@ function embedphotos_widget_album($args) {
));
return $o;
-}
-
+ }
-function embedphotos_album_list($a) {
- $o = '';
- require_once('include/photos.php');
- $p = photos_albums_list(\App::get_channel(), \App::get_observer());
- if ($p['success']) {
- return $p['albums'];
- } else {
- return null;
- }
-}
+ function embedphotos_album_list($a) {
+ require_once('include/photos.php');
+ $p = photos_albums_list(\App::get_channel(), \App::get_observer());
+ if($p['success']) {
+ return $p['albums'];
+ } else {
+ return null;
+ }
+ }
}
diff --git a/Zotlabs/Module/Events.php b/Zotlabs/Module/Events.php
index 2bff4676e..b8910b644 100644
--- a/Zotlabs/Module/Events.php
+++ b/Zotlabs/Module/Events.php
@@ -57,9 +57,6 @@ class Events extends \Zotlabs\Web\Controller {
$start = sprintf('%d-%d-%d %d:%d:0',$startyear,$startmonth,$startday,$starthour,$startminute);
}
- if($nofinish) {
- $finish = NULL_DATE;
- }
if($finish_text) {
$finish = $finish_text;
@@ -67,6 +64,11 @@ class Events extends \Zotlabs\Web\Controller {
else {
$finish = sprintf('%d-%d-%d %d:%d:0',$finishyear,$finishmonth,$finishday,$finishhour,$finishminute);
}
+
+ if($nofinish) {
+ $finish = NULL_DATE;
+ }
+
if($adjust) {
$start = datetime_convert(date_default_timezone_get(),'UTC',$start);
@@ -118,8 +120,10 @@ class Events extends \Zotlabs\Web\Controller {
goaway($onerror_url);
}
- $share = ((intval($_POST['distr'])) ? intval($_POST['distr']) : 0);
-
+ // $share = ((intval($_POST['distr'])) ? intval($_POST['distr']) : 0);
+
+ $share = 1;
+
$channel = \App::get_channel();
$acl = new \Zotlabs\Access\AccessList(false);
@@ -207,7 +211,6 @@ class Events extends \Zotlabs\Web\Controller {
$event = event_store_event($datarray);
-
if($post_tags)
$datarray['term'] = $post_tags;
@@ -336,7 +339,7 @@ class Events extends \Zotlabs\Web\Controller {
/* edit/create form */
if($event_id) {
- $r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
dbesc($event_id),
intval(local_channel())
);
@@ -438,8 +441,6 @@ class Events extends \Zotlabs\Web\Controller {
$permissions = ((x($orig_event)) ? $orig_event : $perm_defaults);
- //print_r(acl2json($permissions['allow_gid'])); killme();
-
$tpl = get_markup_template('event_form.tpl');
$form = replace_macros($tpl,array(
@@ -467,9 +468,6 @@ class Events extends \Zotlabs\Web\Controller {
'$l_text' => (($event_id) ? t('Edit Location') : t('Location')),
'$l_orig' => $l_orig,
'$t_orig' => $t_orig,
- '$sh_text' => t('Share this event'),
- '$sh_checked' => $sh_checked,
- '$share' => array('distr', t('Share this event'), $sh_checked, '', array(t('No'),t('Yes'))),
'$preview' => t('Preview'),
'$perms_label' => t('Permission settings'),
// populating the acl dialog was a permission description from view_stream because Cal.php, which
@@ -481,6 +479,8 @@ class Events extends \Zotlabs\Web\Controller {
'$deny_cid' => acl2json($permissions['deny_cid']),
'$deny_gid' => acl2json($permissions['deny_gid']),
+ '$lockstate' => (($acl->is_private()) ? 'lock' : 'unlock'),
+
'$submit' => t('Submit'),
'$advanced' => t('Advanced Options')
@@ -545,8 +545,8 @@ class Events extends \Zotlabs\Web\Controller {
);
} elseif($export) {
$r = q("SELECT * from event where uid = %d
- AND (( `adjust` = 0 AND ( `dtend` >= '%s' or nofinish = 1 ) AND `dtstart` <= '%s' )
- OR ( `adjust` = 1 AND ( `dtend` >= '%s' or nofinish = 1 ) AND `dtstart` <= '%s' )) ",
+ AND (( adjust = 0 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )
+ OR ( adjust = 1 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )) ",
intval(local_channel()),
dbesc($start),
dbesc($finish),
@@ -559,10 +559,10 @@ class Events extends \Zotlabs\Web\Controller {
// There's still an issue if the finish date crosses the end of month.
// Noting this for now - it will need to be fixed here and in Friendica.
// Ultimately the finish date shouldn't be involved in the query.
-
+
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
from event left join item on event_hash = resource_id
- where resource_type = 'event' and event.uid = %d $ignored
+ where resource_type = 'event' and event.uid = %d and event.uid = item.uid $ignored
AND (( adjust = 0 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )
OR ( adjust = 1 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )) ",
intval(local_channel()),
@@ -571,7 +571,6 @@ class Events extends \Zotlabs\Web\Controller {
dbesc($adjust_start),
dbesc($adjust_finish)
);
-
}
$links = array();
@@ -609,6 +608,12 @@ class Events extends \Zotlabs\Web\Controller {
$end = null;
} else {
$end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtend'], 'c') : datetime_convert('UTC','UTC',$rr['dtend'],'c'));
+
+ // give a fake end to birthdays so they get crammed into a
+ // single day on the calendar
+
+ if($rr['etype'] === 'birthday')
+ $end = null;
}
@@ -694,7 +699,7 @@ class Events extends \Zotlabs\Web\Controller {
}
if($mode === 'drop' && $event_id) {
- $r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
dbesc($event_id),
intval(local_channel())
);
@@ -702,7 +707,7 @@ class Events extends \Zotlabs\Web\Controller {
$sync_event = $r[0];
if($r) {
- $r = q("delete from event where event_hash = '%s' and uid = %d limit 1",
+ $r = q("delete from event where event_hash = '%s' and uid = %d",
dbesc($event_id),
intval(local_channel())
);
diff --git a/Zotlabs/Module/Fbrowser.php b/Zotlabs/Module/Fbrowser.php
index c534e8f72..3bac81c5a 100644
--- a/Zotlabs/Module/Fbrowser.php
+++ b/Zotlabs/Module/Fbrowser.php
@@ -32,7 +32,7 @@ class Fbrowser extends \Zotlabs\Web\Controller {
$sql_extra2 = " ORDER BY created DESC LIMIT 0, 10";
if (\App::$argc==2){
- $albums = q("SELECT distinct(`album`) AS `album` FROM `photo` WHERE `uid` = %d ",
+ $albums = q("SELECT distinct(album) AS album FROM photo WHERE uid = %d ",
intval(local_channel())
);
// anon functions only from 5.3.0... meglio tardi che mai..
@@ -43,14 +43,14 @@ class Fbrowser extends \Zotlabs\Web\Controller {
$album = "";
if (\App::$argc==3){
$album = hex2bin(\App::$argv[2]);
- $sql_extra = sprintf("AND `album` = '%s' ",dbesc($album));
+ $sql_extra = sprintf("AND album = '%s' ",dbesc($album));
$sql_extra2 = "";
$path[]=array(z_root() . "/fbrowser/image/" . \App::$argv[2] . "/", $album);
}
- $r = q("SELECT `resource_id`, `id`, `filename`, type, min(`imgscale`) AS `hiq`,max(`imgscale`) AS `loq`, `description`
- FROM `photo` WHERE `uid` = %d $sql_extra
- GROUP BY `resource_id` $sql_extra2",
+ $r = q("SELECT resource_id, id, filename, type, min(imgscale) AS hiq,max(imgscale) AS loq, description
+ FROM photo WHERE uid = %d $sql_extra
+ GROUP BY resource_id $sql_extra2",
intval(local_channel())
);
@@ -70,7 +70,7 @@ class Fbrowser extends \Zotlabs\Web\Controller {
break;
case "file":
if (\App::$argc==2){
- $files = q("SELECT id, filename, filetype FROM `attach` WHERE `uid` = %d ",
+ $files = q("SELECT id, filename, filetype FROM attach WHERE uid = %d ",
intval(local_channel())
);
diff --git a/Zotlabs/Module/File_upload.php b/Zotlabs/Module/File_upload.php
index d5c0c7e05..769134808 100644
--- a/Zotlabs/Module/File_upload.php
+++ b/Zotlabs/Module/File_upload.php
@@ -12,7 +12,7 @@ class File_upload extends \Zotlabs\Web\Controller {
// logger('file upload: ' . print_r($_REQUEST,true));
- $channel = (($_REQUEST['channick']) ? get_channel_by_nick($_REQUEST['channick']) : null);
+ $channel = (($_REQUEST['channick']) ? channelx_by_nick($_REQUEST['channick']) : null);
if(! $channel) {
logger('channel not found');
diff --git a/Zotlabs/Module/Filestorage.php b/Zotlabs/Module/Filestorage.php
index 8b8620d6f..874445145 100644
--- a/Zotlabs/Module/Filestorage.php
+++ b/Zotlabs/Module/Filestorage.php
@@ -1,7 +1,7 @@
<?php
namespace Zotlabs\Module;
/**
- * @file mod/filestorage.php
+ * @file Zotlabs/Module/Filestorage.php
*
*/
@@ -16,43 +16,43 @@ require_once('include/attach.php');
class Filestorage extends \Zotlabs\Web\Controller {
function post() {
-
+
$channel_id = ((x($_POST, 'uid')) ? intval($_POST['uid']) : 0);
-
+
if((! $channel_id) || (! local_channel()) || ($channel_id != local_channel())) {
notice( t('Permission denied.') . EOL);
return;
}
-
+
$recurse = ((x($_POST, 'recurse')) ? intval($_POST['recurse']) : 0);
$resource = ((x($_POST, 'filehash')) ? notags($_POST['filehash']) : '');
$notify = ((x($_POST, 'notify')) ? intval($_POST['notify']) : 0);
-
+
if(! $resource) {
notice(t('Item not found.') . EOL);
return;
}
-
+
$channel = \App::get_channel();
-
+
$acl = new \Zotlabs\Access\AccessList($channel);
$acl->set_from_array($_REQUEST);
$x = $acl->get();
-
+
$cloudPath = get_parent_cloudpath($channel_id, $channel['channel_address'], $resource);
-
+
//get the object before permissions change so we can catch eventual former allowed members
$object = get_file_activity_object($channel_id, $resource, $cloudPath);
-
+
attach_change_permissions($channel_id, $resource, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], $recurse, true);
-
+
file_activity($channel_id, $object, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], 'post', $notify);
-
+
goaway($cloudPath);
}
-
+
function get() {
-
+
if(argc() > 1)
$which = argv(1);
else {
@@ -60,7 +60,7 @@ class Filestorage extends \Zotlabs\Web\Controller {
\App::$error = 404;
return;
}
-
+
$r = q("select * from channel where channel_address = '%s'",
dbesc($which)
);
@@ -68,32 +68,32 @@ class Filestorage extends \Zotlabs\Web\Controller {
$channel = $r[0];
$owner = intval($r[0]['channel_id']);
}
-
+
$observer = \App::get_observer();
$ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
+
$perms = get_all_perms($owner, $ob_hash);
-
+
if(! $perms['view_storage']) {
notice( t('Permission denied.') . EOL);
return;
}
-
+
// Since we have ACL'd files in the wild, but don't have ACL here yet, we
// need to return for anyone other than the owner, despite the perms check for now.
-
+
$is_owner = (((local_channel()) && ($owner == local_channel())) ? true : false);
if(! $is_owner) {
info( t('Permission Denied.') . EOL );
return;
}
-
+
if(argc() > 3 && argv(3) === 'delete') {
if(! $perms['write_storage']) {
notice( t('Permission denied.') . EOL);
return;
}
-
+
$file = intval(argv(2));
$r = q("SELECT hash FROM attach WHERE id = %d AND uid = %d LIMIT 1",
dbesc($file),
@@ -103,17 +103,17 @@ class Filestorage extends \Zotlabs\Web\Controller {
notice( t('File not found.') . EOL);
goaway(z_root() . '/cloud/' . $which);
}
-
+
$f = $r[0];
$channel = \App::get_channel();
-
+
$parentpath = get_parent_cloudpath($channel['channel_id'], $channel['channel_address'], $f['hash']);
-
+
attach_delete($owner, $f['hash']);
-
+
goaway($parentpath);
}
-
+
if(argc() > 3 && argv(3) === 'edit') {
require_once('include/acl_selectors.php');
if(! $perms['write_storage']) {
@@ -121,23 +121,23 @@ class Filestorage extends \Zotlabs\Web\Controller {
return;
}
$file = intval(argv(2));
-
+
$r = q("select id, uid, folder, filename, revision, flags, is_dir, os_storage, hash, allow_cid, allow_gid, deny_cid, deny_gid from attach where id = %d and uid = %d limit 1",
intval($file),
intval($owner)
);
-
+
$f = $r[0];
$channel = \App::get_channel();
-
+
$cloudpath = get_cloudpath($f) . (intval($f['is_dir']) ? '?f=&davguest=1' : '');
$parentpath = get_parent_cloudpath($channel['channel_id'], $channel['channel_address'], $f['hash']);
-
+
$aclselect_e = populate_acl($f, false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_storage'));
$is_a_dir = (intval($f['is_dir']) ? true : false);
-
- $lockstate = (($f['allow_cid'] || $f['allow_gid'] || $f['deny_cid'] || $f['deny_gid']) ? 'lock' : 'unlock');
-
+
+ $lockstate = (($f['allow_cid'] || $f['allow_gid'] || $f['deny_cid'] || $f['deny_gid']) ? 'lock' : 'unlock');
+
// Encode path that is used for link so it's a valid URL
// Keep slashes as slashes, otherwise mod_rewrite doesn't work correctly
$encoded_path = str_replace('%2F', '/', rawurlencode($cloudpath));
@@ -167,12 +167,12 @@ class Filestorage extends \Zotlabs\Web\Controller {
'$link_btn_title' => t('Show URL to this file'),
'$notify' => array('notify', t('Notify your contacts about this file'), 0, '', array(t('No'), t('Yes'))),
));
-
+
echo $o;
killme();
}
-
+
goaway(z_root() . '/cloud/' . $which);
}
-
+
}
diff --git a/Zotlabs/Module/Follow.php b/Zotlabs/Module/Follow.php
index da9ab3670..d8a86d0ce 100644
--- a/Zotlabs/Module/Follow.php
+++ b/Zotlabs/Module/Follow.php
@@ -20,9 +20,6 @@ class Follow extends \Zotlabs\Web\Controller {
$channel = \App::get_channel();
- // Warning: Do not edit the following line. The first symbol is UTF-8 &#65312;
- $url = str_replace('@','@',$url);
-
$result = new_contact($uid,$url,$channel,true,$confirm);
if($result['success'] == false) {
diff --git a/Zotlabs/Module/Group.php b/Zotlabs/Module/Group.php
index 291566c6d..646310356 100644
--- a/Zotlabs/Module/Group.php
+++ b/Zotlabs/Module/Group.php
@@ -34,7 +34,7 @@ class Group extends \Zotlabs\Web\Controller {
if((argc() == 2) && (intval(argv(1)))) {
check_form_security_token_redirectOnErr('/group', 'group_edit');
- $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM groups WHERE id = %d AND uid = %d LIMIT 1",
intval(argv(1)),
intval(local_channel())
);
@@ -48,7 +48,7 @@ class Group extends \Zotlabs\Web\Controller {
$public = intval($_POST['public']);
if((strlen($groupname)) && (($groupname != $group['gname']) || ($public != $group['visible']))) {
- $r = q("UPDATE `groups` SET `gname` = '%s', visible = %d WHERE `uid` = %d AND `id` = %d",
+ $r = q("UPDATE groups SET gname = '%s', visible = %d WHERE uid = %d AND id = %d",
dbesc($groupname),
intval($public),
intval(local_channel()),
@@ -101,7 +101,7 @@ class Group extends \Zotlabs\Web\Controller {
check_form_security_token_redirectOnErr('/group', 'group_drop', 't');
if(intval(argv(2))) {
- $r = q("SELECT `gname` FROM `groups` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $r = q("SELECT gname FROM groups WHERE id = %d AND uid = %d LIMIT 1",
intval(argv(2)),
intval(local_channel())
);
@@ -133,7 +133,7 @@ class Group extends \Zotlabs\Web\Controller {
if((argc() > 1) && (intval(argv(1)))) {
require_once('include/acl_selectors.php');
- $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
+ $r = q("SELECT * FROM groups WHERE id = %d AND uid = %d AND deleted = 0 LIMIT 1",
intval(argv(1)),
intval(local_channel())
);
@@ -212,7 +212,7 @@ class Group extends \Zotlabs\Web\Controller {
group_rmv_member(local_channel(),$group['gname'],$member['xchan_hash']);
}
- $r = q("SELECT abook.*, xchan.* FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE `abook_channel` = %d AND abook_self = 0 and abook_blocked = 0 and abook_pending = 0 and xchan_deleted = 0 order by xchan_name asc",
+ $r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d AND abook_self = 0 and abook_blocked = 0 and abook_pending = 0 and xchan_deleted = 0 order by xchan_name asc",
intval(local_channel())
);
diff --git a/Zotlabs/Module/Help.php b/Zotlabs/Module/Help.php
index 54d4aecfb..e247416d9 100644
--- a/Zotlabs/Module/Help.php
+++ b/Zotlabs/Module/Help.php
@@ -1,66 +1,100 @@
<?php
namespace Zotlabs\Module;
-
require_once('include/help.php');
/**
* You can create local site resources in doc/Site.md and either link to doc/Home.md for the standard resources
* or use our include mechanism to include it on your local page.
- *
+ *@code
* #include doc/Home.md;
+ *@endcode
*
- * The syntax is somewhat strict.
- *
+ * The syntax is somewhat strict.
*/
-
class Help extends \Zotlabs\Web\Controller {
function get() {
-
nav_set_selected('help');
-
+
if($_REQUEST['search']) {
-
$o .= '<div id="help-content" class="generic-content-wrapper">';
$o .= '<div class="section-title-wrapper">';
$o .= '<h2>' . t('Documentation Search') . ' - ' . htmlspecialchars($_REQUEST['search']) . '</h2>';
$o .= '</div>';
$o .= '<div class="section-content-wrapper">';
-
+
$r = search_doc_files($_REQUEST['search']);
if($r) {
$o .= '<ul class="help-searchlist">';
foreach($r as $rr) {
$dirname = dirname($rr['v']);
$fname = basename($rr['v']);
- $fname = substr($fname,0,strrpos($fname,'.'));
- $path = trim(substr($dirname,4),'/');
-
- $o .= '<li><a href="help/' . (($path) ? $path . '/' : '') . $fname . '" >' . ucwords(str_replace('_',' ',notags($fname))) . '</a><br />'
- . '<b><i>' . 'help/' . (($path) ? $path . '/' : '') . $fname . '</i></b><br />' .
- '...' . str_replace('$Projectname',\Zotlabs\Lib\System::get_platform_name(),$rr['text']) . '...<br /><br /></li>';
-
+ $fname = substr($fname, 0, strrpos($fname, '.'));
+ $path = trim(substr($dirname, 4), '/');
+
+ $o .= '<li><a href="help/' . (($path) ? $path . '/' : '') . $fname . '" >' . ucwords(str_replace('_',' ',notags($fname))) . '</a><br>'
+ . '<b><i>' . 'help/' . (($path) ? $path . '/' : '') . $fname . '</i></b><br>'
+ . '...' . str_replace('$Projectname', \Zotlabs\Lib\System::get_platform_name(), $rr['text']) . '...<br><br></li>';
}
$o .= '</ul>';
$o .= '</div>';
$o .= '</div>';
}
+
return $o;
}
-
+
+
+ if(argc() > 2 && argv(argc()-2) === 'assets') {
+ $path = '';
+ for($x = 1; $x < argc(); $x ++) {
+ if(strlen($path))
+ $path .= '/';
+ $path .= argv($x);
+ }
+ $realpath = 'doc/' . $path;
+ //Set the content-type header as appropriate
+ $imageInfo = getimagesize($realpath);
+ switch ($imageInfo[2]) {
+ case IMAGETYPE_JPEG:
+ header("Content-Type: image/jpeg");
+ break;
+ case IMAGETYPE_GIF:
+ header("Content-Type: image/gif");
+ break;
+ case IMAGETYPE_PNG:
+ header("Content-Type: image/png");
+ break;
+ default:
+ break;
+ }
+ header("Content-Length: " . filesize($realpath));
- $content = get_help_content();
+ // dump the picture and stop the script
+ readfile($realpath);
+ killme();
+ }
+ $headings = [
+ 'about' => t('About'),
+ 'member' => t('Members'),
+ 'admin' => t('Administrators'),
+ 'developer' => t('Developers'),
+ 'tutorials' => t('Tutorials')
+ ];
- return replace_macros(get_markup_template("help.tpl"), array(
+ if(array_key_exists(argv(1), $headings))
+ $heading = $headings[argv(1)];
+
+ $content = get_help_content();
+
+ return replace_macros(get_markup_template('help.tpl'), array(
'$title' => t('$Projectname Documentation'),
- '$content' => $content
+ '$tocHeading' => t('Contents'),
+ '$content' => $content,
+ '$heading' => $heading
));
-
}
-
-
-
-
+
}
diff --git a/Zotlabs/Module/Import.php b/Zotlabs/Module/Import.php
index 9574de07c..451effaca 100644
--- a/Zotlabs/Module/Import.php
+++ b/Zotlabs/Module/Import.php
@@ -77,23 +77,27 @@ class Import extends \Zotlabs\Web\Controller {
$channelname = substr($old_address,0,strpos($old_address,'@'));
$servername = substr($old_address,strpos($old_address,'@')+1);
-
- $scheme = 'https://';
- $api_path = '/api/red/channel/export/basic?f=&channel=' . $channelname;
+
+ $api_path = probe_api_path($servername);
+ if(! $api_path) {
+ notice( t('Unable to download data from old server') . EOL);
+ return;
+ }
+
+ $api_path .= 'channel/export/basic?f=&channel=' . $channelname;
if($import_posts)
$api_path .= '&posts=1';
$binary = false;
$redirects = 0;
$opts = array('http_auth' => $email . ':' . $password);
- $url = $scheme . $servername . $api_path;
- $ret = z_fetch_url($url, $binary, $redirects, $opts);
- if(! $ret['success'])
- $ret = z_fetch_url('http://' . $servername . $api_path, $binary, $redirects, $opts);
- if($ret['success'])
+ $ret = z_fetch_url($api_path, $binary, $redirects, $opts);
+ if($ret['success']) {
$data = $ret['body'];
- else
+ }
+ else {
notice( t('Unable to download data from old server') . EOL);
-
+ return;
+ }
}
if(! $data) {
@@ -294,15 +298,8 @@ class Import extends \Zotlabs\Web\Controller {
);
if($r)
continue;
-
- dbesc_array($xchan);
-
- $r = dbq("INSERT INTO xchan (`"
- . implode("`, `", array_keys($xchan))
- . "`) VALUES ('"
- . implode("', '", array_values($xchan))
- . "')" );
-
+
+ create_table_from_array('xchan',$xchan);
require_once('include/photo/photo_driver.php');
$photos = import_xchan_photo($xchan['xchan_photo_l'],$xchan['xchan_hash']);
@@ -382,13 +379,8 @@ class Import extends \Zotlabs\Web\Controller {
continue;
}
- dbesc_array($abook);
- $r = dbq("INSERT INTO abook (`"
- . implode("`, `", array_keys($abook))
- . "`) VALUES ('"
- . implode("', '", array_values($abook))
- . "')" );
-
+ create_table_from_array('abook',$abook);
+
$friends ++;
if(intval($abook['abook_feed']))
$feeds ++;
@@ -423,15 +415,11 @@ class Import extends \Zotlabs\Web\Controller {
unset($group['name']);
}
unset($group['id']);
- $group['uid'] = $channel['channel_id'];
- dbesc_array($group);
- $r = dbq("INSERT INTO groups (`"
- . implode("`, `", array_keys($group))
- . "`) VALUES ('"
- . implode("', '", array_values($group))
- . "')" );
+ $group['uid'] = $channel['channel_id'];
+
+ create_table_from_array('groups',$group);
}
- $r = q("select * from `groups` where uid = %d",
+ $r = q("select * from groups where uid = %d",
intval($channel['channel_id'])
);
if($r) {
@@ -451,12 +439,7 @@ class Import extends \Zotlabs\Web\Controller {
if($x['old'] == $group_member['gid'])
$group_member['gid'] = $x['new'];
}
- dbesc_array($group_member);
- $r = dbq("INSERT INTO group_member (`"
- . implode("`, `", array_keys($group_member))
- . "`) VALUES ('"
- . implode("', '", array_values($group_member))
- . "')" );
+ create_table_from_array('group_member',$group_member);
}
}
logger('import step 9');
diff --git a/Zotlabs/Module/Invite.php b/Zotlabs/Module/Invite.php
index 5198b1231..6b6f80a31 100644
--- a/Zotlabs/Module/Invite.php
+++ b/Zotlabs/Module/Invite.php
@@ -111,7 +111,7 @@ class Invite extends \Zotlabs\Web\Controller {
$invite_code = autoname(8) . rand(1000,9999);
$nmessage = str_replace('$invite_code',$invite_code,$message);
- $r = q("INSERT INTO `register` (`hash`,`created`) VALUES ('%s', '%s') ",
+ $r = q("INSERT INTO register (hash,created) VALUES ('%s', '%s') ",
dbesc($invite_code),
dbesc(datetime_convert())
);
diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php
index a2128e47a..085c02742 100644
--- a/Zotlabs/Module/Item.php
+++ b/Zotlabs/Module/Item.php
@@ -126,6 +126,8 @@ class Item extends \Zotlabs\Web\Controller {
$ret = $this->item_check_service_class($uid,(($_REQUEST['webpage'] == ITEM_TYPE_WEBPAGE) ? true : false));
if (!$ret['success']) {
notice( t($ret['message']) . EOL) ;
+ if($api_source)
+ return ( [ 'success' => false, 'message' => 'service class exception' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -156,13 +158,13 @@ class Item extends \Zotlabs\Web\Controller {
$obj_type = ACTIVITY_OBJ_COMMENT;
if($parent) {
- $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1",
+ $r = q("SELECT * FROM item WHERE id = %d LIMIT 1",
intval($parent)
);
}
elseif($parent_mid && $uid) {
// This is coming from an API source, and we are logged in
- $r = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
dbesc($parent_mid),
intval($uid)
);
@@ -172,7 +174,7 @@ class Item extends \Zotlabs\Web\Controller {
$parid = $r[0]['parent'];
$parent_mid = $r[0]['mid'];
if($r[0]['id'] != $r[0]['parent']) {
- $r = q("SELECT * FROM `item` WHERE `id` = `parent` AND `parent` = %d LIMIT 1",
+ $r = q("SELECT * FROM item WHERE id = parent AND parent = %d LIMIT 1",
intval($parid)
);
}
@@ -180,6 +182,8 @@ class Item extends \Zotlabs\Web\Controller {
if(($r === false) || (! count($r))) {
notice( t('Unable to locate original post.') . EOL);
+ if($api_source)
+ return ( [ 'success' => false, 'message' => 'invalid post id' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -214,6 +218,8 @@ class Item extends \Zotlabs\Web\Controller {
if(! $can_comment) {
notice( t('Permission denied.') . EOL) ;
+ if($api_source)
+ return ( [ 'success' => false, 'message' => 'permission denied' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -222,6 +228,8 @@ class Item extends \Zotlabs\Web\Controller {
else {
if(! perm_is_allowed($profile_uid,$observer['xchan_hash'],($webpage) ? 'write_pages' : 'post_wall')) {
notice( t('Permission denied.') . EOL) ;
+ if($api_source)
+ return ( [ 'success' => false, 'message' => 'permission denied' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -246,7 +254,7 @@ class Item extends \Zotlabs\Web\Controller {
$iconfig = null;
if($post_id) {
- $i = q("SELECT * FROM `item` WHERE `uid` = %d AND `id` = %d LIMIT 1",
+ $i = q("SELECT * FROM item WHERE uid = %d AND id = %d LIMIT 1",
intval($profile_uid),
intval($post_id)
);
@@ -276,6 +284,8 @@ class Item extends \Zotlabs\Web\Controller {
if(! $channel) {
logger("mod_item: no channel.");
+ if($api_source)
+ return ( [ 'success' => false, 'message' => 'no channel' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -291,6 +301,8 @@ class Item extends \Zotlabs\Web\Controller {
}
else {
logger("mod_item: no owner.");
+ if($api_source)
+ return ( [ 'success' => false, 'message' => 'no owner' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -433,6 +445,8 @@ class Item extends \Zotlabs\Web\Controller {
if($preview)
killme();
info( t('Empty post discarded.') . EOL );
+ if($api_source)
+ return ( [ 'success' => false, 'message' => 'no content' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -473,6 +487,8 @@ class Item extends \Zotlabs\Web\Controller {
}
else {
notice( t('Executable content type not permitted to this channel.') . EOL);
+ if($api_source)
+ return ( [ 'success' => false, 'message' => 'forbidden content type' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -508,7 +524,7 @@ class Item extends \Zotlabs\Web\Controller {
// $body = escape_tags(trim($body));
// $body = str_replace("\n",'<br />', $body);
// $body = preg_replace_callback('/\[share(.*?)\]/ism','\share_shield',$body);
- // $body = diaspora2bb($body,true);
+ // $body = markdown_to_bb($body,true);
// $body = preg_replace_callback('/\[share(.*?)\]/ism','\share_unshield',$body);
// }
@@ -553,8 +569,8 @@ class Item extends \Zotlabs\Web\Controller {
$body = preg_replace_callback('/\[zrl(.*?)\[\/(zrl)\]/ism','\red_escape_codeblock',$body);
- $body = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,]+)/ism", 'nakedoembed', $body);
- $body = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,]+)/ism", '\red_zrl_callback', $body);
+ $body = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,\(\)]+)/ism", 'nakedoembed', $body);
+ $body = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,\(\)]+)/ism", '\red_zrl_callback', $body);
$body = preg_replace_callback('/\[\$b64zrl(.*?)\[\/(zrl)\]/ism','\red_unescape_codeblock',$body);
$body = preg_replace_callback('/\[\$b64url(.*?)\[\/(url)\]/ism','\red_unescape_codeblock',$body);
@@ -863,7 +879,8 @@ class Item extends \Zotlabs\Web\Controller {
logger('mod_item: post cancelled by plugin or duplicate suppressed.');
if($return_path)
goaway(z_root() . "/" . $return_path);
-
+ if($api_source)
+ return ( [ 'success' => false, 'message' => 'operation cancelled' ] );
$json = array('cancel' => 1);
$json['reload'] = z_root() . '/' . $_REQUEST['jsreload'];
echo json_encode($json);
@@ -901,6 +918,8 @@ class Item extends \Zotlabs\Web\Controller {
$x = item_store_update($datarray,$execflag);
+ item_create_edit_activity($x);
+
if(! $parent) {
$r = q("select * from item where id = %d",
intval($post_id)
@@ -914,6 +933,10 @@ class Item extends \Zotlabs\Web\Controller {
if(! $nopush)
\Zotlabs\Daemon\Master::Summon(array('Notifier', 'edit_post', $post_id));
+
+ if($api_source)
+ return($x);
+
if((x($_REQUEST,'return')) && strlen($return_path)) {
logger('return: ' . $return_path);
goaway(z_root() . "/" . $return_path );
@@ -988,8 +1011,11 @@ class Item extends \Zotlabs\Web\Controller {
else {
logger('mod_item: unable to retrieve post that was just stored.');
notice( t('System error. Post not saved.') . EOL);
- goaway(z_root() . "/" . $return_path );
- // NOTREACHED
+ if($return_path)
+ goaway(z_root() . "/" . $return_path );
+ if($api_source)
+ return ( [ 'success' => false, 'message' => 'system error' ] );
+ killme();
}
if(($parent) && ($parent != $post_id)) {
@@ -1082,6 +1108,14 @@ class Item extends \Zotlabs\Web\Controller {
else {
// complex deletion that needs to propagate and be performed in phases
drop_item($i[0]['id'],true,DROPITEM_PHASE1);
+ $r = q("select * from item where id = %d",
+ intval($i[0]['id'])
+ );
+ if($r) {
+ xchan_query($r);
+ $sync_item = fetch_post_tags($r);
+ build_sync_packet($i[0]['uid'],array('item' => array(encode_item($sync_item[0],true))));
+ }
tag_deliver($i[0]['uid'],$i[0]['id']);
}
}
diff --git a/Zotlabs/Module/Like.php b/Zotlabs/Module/Like.php
index dd0bc99d4..43d318623 100644
--- a/Zotlabs/Module/Like.php
+++ b/Zotlabs/Module/Like.php
@@ -226,7 +226,7 @@ class Like extends \Zotlabs\Web\Controller {
$z[0]['deleted'] = 1;
build_sync_packet($ch[0]['channel_id'],array('likes' => $z));
- q("delete from likes where id = %d limit 1",
+ q("delete from likes where id = %d",
intval($z[0]['id'])
);
if($z[0]['i_mid']) {
diff --git a/Zotlabs/Module/Linkinfo.php b/Zotlabs/Module/Linkinfo.php
index e1a3a6abe..8f8231c49 100644
--- a/Zotlabs/Module/Linkinfo.php
+++ b/Zotlabs/Module/Linkinfo.php
@@ -13,7 +13,7 @@ class Linkinfo extends \Zotlabs\Web\Controller {
$text = null;
$str_tags = '';
-
+ $process_oembed = true;
$br = "\n";
@@ -22,6 +22,11 @@ class Linkinfo extends \Zotlabs\Web\Controller {
else
$url = trim($_GET['url']);
+ if(substr($url,0,1) === '!') {
+ $process_oembed = false;
+ $url = substr($url,1);
+ }
+
$url = strip_zids($url);
if((substr($url,0,1) != '/') && (substr($url,0,4) != 'http'))
@@ -91,10 +96,12 @@ class Linkinfo extends \Zotlabs\Web\Controller {
killme();
}
- $x = oembed_process($url);
- if($x) {
- echo $x;
- killme();
+ if($process_oembed) {
+ $x = oembed_process($url);
+ if($x) {
+ echo $x;
+ killme();
+ }
}
if($url && $title && $text) {
diff --git a/Zotlabs/Module/Lockview.php b/Zotlabs/Module/Lockview.php
index d86a3c1d8..7d1d8a43f 100644
--- a/Zotlabs/Module/Lockview.php
+++ b/Zotlabs/Module/Lockview.php
@@ -102,7 +102,7 @@ class Lockview extends \Zotlabs\Web\Controller {
stringify_array_elms($deny_users,true);
if(count($allowed_groups)) {
- $r = q("SELECT gname FROM `groups` WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
+ $r = q("SELECT gname FROM groups WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
if($r)
foreach($r as $rr)
$l[] = '<li><b>' . $rr['gname'] . '</b></li>';
@@ -121,7 +121,7 @@ class Lockview extends \Zotlabs\Web\Controller {
}
}
if(count($deny_groups)) {
- $r = q("SELECT gname FROM `groups` WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
+ $r = q("SELECT gname FROM groups WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
if($r)
foreach($r as $rr)
$l[] = '<li><b><strike>' . $rr['gname'] . '</strike></b></li>';
diff --git a/Zotlabs/Module/Locs.php b/Zotlabs/Module/Locs.php
index 4b1e3ffe2..47ece8041 100644
--- a/Zotlabs/Module/Locs.php
+++ b/Zotlabs/Module/Locs.php
@@ -80,7 +80,7 @@ class Locs extends \Zotlabs\Web\Controller {
- function get() {
+ function get() {
if(! local_channel()) {
diff --git a/Zotlabs/Module/Mail.php b/Zotlabs/Module/Mail.php
index a61b02cdf..c767c8e56 100644
--- a/Zotlabs/Module/Mail.php
+++ b/Zotlabs/Module/Mail.php
@@ -83,10 +83,24 @@ class Mail extends \Zotlabs\Web\Controller {
linkify_tags($a, $body, local_channel());
if($preview) {
+ $mail = [
+ 'mailbox' => 'outbox',
+ 'id' => 0,
+ 'mid' => 'M0',
+ 'from_name' => $channel['xchan_name'],
+ 'from_url' => $channel['xchan_url'],
+ 'from_photo' => $channel['xchan_photo_s'],
+ 'subject' => smilies(bbcode($subject)),
+ 'body' => smilies(bbcode($body)),
+ 'attachments' => '',
+ 'can_recall' => false,
+ 'is_recalled' => '',
+ 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'], 'c')
+ ];
-
-
-
+ echo replace_macros(get_markup_template('mail_conv.tpl'), [ '$mail' => $mail ] );
+ killme();
+
}
if(! $recipient) {
diff --git a/Zotlabs/Module/Manage.php b/Zotlabs/Module/Manage.php
index ec9ef4c06..3b7b3c3dd 100644
--- a/Zotlabs/Module/Manage.php
+++ b/Zotlabs/Module/Manage.php
@@ -93,9 +93,9 @@ class Manage extends \Zotlabs\Web\Controller {
$channels[$x]['mail'] = intval($mails[0]['total']);
- $events = q("SELECT etype, dtstart, adjust FROM `event`
- WHERE `event`.`uid` = %d AND dtstart < '%s' AND dtstart > '%s' and `dismissed` = 0
- ORDER BY `dtstart` ASC ",
+ $events = q("SELECT etype, dtstart, adjust FROM event
+ WHERE event.uid = %d AND dtstart < '%s' AND dtstart > '%s' and dismissed = 0
+ ORDER BY dtstart ASC ",
intval($channels[$x]['channel_id']),
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + 7 days')),
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
diff --git a/Zotlabs/Module/Match.php b/Zotlabs/Module/Match.php
index c422e4b3e..63bdb60a4 100644
--- a/Zotlabs/Module/Match.php
+++ b/Zotlabs/Module/Match.php
@@ -25,7 +25,7 @@ class Match extends \Zotlabs\Web\Controller {
$o .= '<h2>' . t('Profile Match') . '</h2>';
- $r = q("SELECT `keywords` FROM `profile` WHERE `is_default` = 1 AND `uid` = %d LIMIT 1",
+ $r = q("SELECT keywords FROM profile WHERE is_default = 1 AND uid = %d LIMIT 1",
intval(local_channel())
);
if (! count($r))
diff --git a/Zotlabs/Module/Msearch.php b/Zotlabs/Module/Msearch.php
deleted file mode 100644
index e96f78e16..000000000
--- a/Zotlabs/Module/Msearch.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-namespace Zotlabs\Module;
-
-
-class Msearch extends \Zotlabs\Web\Controller {
-
- function post() {
-
- $perpage = (($_POST['n']) ? $_POST['n'] : 80);
- $page = (($_POST['p']) ? intval($_POST['p'] - 1) : 0);
- $startrec = (($page+1) * $perpage) - $perpage;
-
- $search = $_POST['s'];
- if(! strlen($search))
- killme();
-
- $r = q("SELECT COUNT(*) AS `total` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is_default` = 1 AND `user`.`hidewall` = 0 AND MATCH `keywords` AGAINST ('%s') ",
- dbesc($search)
- );
- if(count($r))
- $total = $r[0]['total'];
-
- $r = q("SELECT `keywords`, `username`, `nickname`, `user`.`uid` FROM `user` LEFT JOIN `profile` ON `user`.`uid` = `profile`.`uid` WHERE `is_default` = 1 AND `user`.`hidewall` = 0 AND MATCH `keywords` AGAINST ('%s') LIMIT %d , %d ",
- dbesc($search),
- intval($startrec),
- intval($perpage)
- );
-
- $results = array();
- if(count($r)) {
- foreach($r as $rr)
- $results[] = array(
- 'name' => $rr['name'],
- 'url' => z_root() . '/channel/' . $rr['nickname'],
- 'photo' => z_root() . '/photo/avatar/' . $rr['uid'],
- 'tags' => str_replace(array(',',' '),array(' ',' '),$rr['keywords'])
- );
- }
-
- $output = array('total' => $total, 'items_page' => $perpage, 'page' => $page + 1, 'results' => $results);
-
- echo json_encode($output);
-
- killme();
-
- }
-}
diff --git a/Zotlabs/Module/Network.php b/Zotlabs/Module/Network.php
index 4f831c050..8263420b6 100644
--- a/Zotlabs/Module/Network.php
+++ b/Zotlabs/Module/Network.php
@@ -54,6 +54,7 @@ class Network extends \Zotlabs\Web\Controller {
$datequery = ((x($_GET,'dend') && is_a_date_arg($_GET['dend'])) ? notags($_GET['dend']) : '');
$datequery2 = ((x($_GET,'dbegin') && is_a_date_arg($_GET['dbegin'])) ? notags($_GET['dbegin']) : '');
$nouveau = ((x($_GET,'new')) ? intval($_GET['new']) : 0);
+ $static = ((x($_GET,'static')) ? intval($_GET['static']) : 0);
$gid = ((x($_GET,'gid')) ? intval($_GET['gid']) : 0);
$category = ((x($_REQUEST,'cat')) ? $_REQUEST['cat'] : '');
$hashtags = ((x($_REQUEST,'tag')) ? $_REQUEST['tag'] : '');
@@ -186,6 +187,8 @@ class Network extends \Zotlabs\Web\Controller {
$status_editor = status_editor($a,$x);
$o .= $status_editor;
+
+ $static = channel_manual_conv_update(local_channel());
}
@@ -201,7 +204,7 @@ class Network extends \Zotlabs\Web\Controller {
$sql_nets = '';
- $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE item_thread_top = 1 $sql_options ) ";
+ $sql_extra = " AND item.parent IN ( SELECT parent FROM item WHERE item_thread_top = 1 $sql_options ) ";
if($group) {
$contact_str = '';
@@ -295,6 +298,7 @@ class Network extends \Zotlabs\Web\Controller {
'$fh' => (($firehose) ? $firehose : '0'),
'$nouveau' => (($nouveau) ? $nouveau : '0'),
'$wall' => '0',
+ '$static' => $static,
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => (($search) ? $search : ''),
@@ -401,7 +405,8 @@ class Network extends \Zotlabs\Web\Controller {
$page_mode = 'client';
$simple_update = (($update) ? " and item_unseen = 1 " : '');
-
+
+
// This fixes a very subtle bug so I'd better explain it. You wake up in the morning or return after a day
// or three and look at your matrix page - after opening up your browser. The first page loads just as it
// should. All of a sudden a few seconds later, page 2 will get inserted at the beginning of the page
@@ -418,6 +423,9 @@ class Network extends \Zotlabs\Web\Controller {
$simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) ";
if($load)
$simple_update = '';
+
+ if($static && $simple_update)
+ $simple_update .= " and item_thread_top = 0 and author_xchan = '" . protect_sprintf(get_observer_hash()) . "' ";
if($nouveau && $load) {
// "New Item View" - show all items unthreaded in reverse created date order
diff --git a/Zotlabs/Module/Notifications.php b/Zotlabs/Module/Notifications.php
index 9da28a360..2db02c758 100644
--- a/Zotlabs/Module/Notifications.php
+++ b/Zotlabs/Module/Notifications.php
@@ -1,70 +1,11 @@
<?php
namespace Zotlabs\Module;
+require_once('include/bbcode.php');
class Notifications extends \Zotlabs\Web\Controller {
- function post() {
-
- if(! local_channel()) {
- goaway(z_root());
- }
-
- $request_id = ((\App::$argc > 1) ? \App::$argv[1] : 0);
-
- if($request_id === "all")
- return;
-
- if($request_id) {
-
- $r = q("SELECT * FROM `intro` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($request_id),
- intval(local_channel())
- );
-
- if(count($r)) {
- $intro_id = $r[0]['id'];
- $contact_id = $r[0]['contact-id'];
- }
- else {
- notice( t('Invalid request identifier.') . EOL);
- return;
- }
-
- // If it is a friend suggestion, the contact is not a new friend but an existing friend
- // that should not be deleted.
-
- $fid = $r[0]['fid'];
-
- if($_POST['submit'] == t('Discard')) {
- $r = q("DELETE FROM `intro` WHERE `id` = %d",
- intval($intro_id)
- );
- if(! $fid) {
-
- // The check for blocked and pending is in case the friendship was already approved
- // and we just want to get rid of the now pointless notification
-
- $r = q("DELETE FROM `contact` WHERE `id` = %d AND `uid` = %d AND `self` = 0 AND `blocked` = 1 AND `pending` = 1",
- intval($contact_id),
- intval(local_channel())
- );
- }
- goaway(z_root() . '/notifications/intros');
- }
- if($_POST['submit'] == t('Ignore')) {
- $r = q("UPDATE `intro` SET `ignore` = 1 WHERE `id` = %d",
- intval($intro_id));
- goaway(z_root() . '/notifications/intros');
- }
- }
- }
-
-
-
-
-
- function get() {
+ function get() {
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
@@ -74,36 +15,32 @@ class Notifications extends \Zotlabs\Web\Controller {
nav_set_selected('notifications');
$o = '';
-
- $notif_tpl = get_markup_template('notifications.tpl');
-
- $not_tpl = get_markup_template('notify.tpl');
- require_once('include/bbcode.php');
-
- $r = q("SELECT * from notify where uid = %d and seen = 0 order by created desc",
- intval(local_channel())
- );
+
+ $r = q("SELECT * from notify where uid = %d and seen = 0 order by created desc",
+ intval(local_channel())
+ );
- if ($r > 0) {
- $notifications_available =1;
- foreach ($r as $it) {
- $notif_content .= replace_macros($not_tpl,array(
- '$item_link' => z_root().'/notify/view/'. $it['id'],
- '$item_image' => $it['photo'],
- '$item_text' => strip_tags(bbcode($it['msg'])),
- '$item_when' => relative_date($it['created'])
- ));
- }
- } else {
- $notif_content .= t('No more system notifications.');
+ if($r) {
+ $notifications_available = 1;
+ foreach ($r as $it) {
+ $notif_content .= replace_macros(get_markup_template('notify.tpl'),array(
+ '$item_link' => z_root().'/notify/view/'. $it['id'],
+ '$item_image' => $it['photo'],
+ '$item_text' => strip_tags(bbcode($it['msg'])),
+ '$item_when' => relative_date($it['created'])
+ ));
}
+ }
+ else {
+ $notif_content .= t('No more system notifications.');
+ }
- $o .= replace_macros($notif_tpl,array(
- '$notif_header' => t('System Notifications'),
- '$notif_link_mark_seen' => t('Mark all system notifications seen'),
- '$notif_content' => $notif_content,
- '$notifications_available' => $notifications_available,
- ));
+ $o .= replace_macros(get_markup_template('notifications.tpl'),array(
+ '$notif_header' => t('System Notifications'),
+ '$notif_link_mark_seen' => t('Mark all system notifications seen'),
+ '$notif_content' => $notif_content,
+ '$notifications_available' => $notifications_available,
+ ));
return $o;
}
diff --git a/Zotlabs/Module/Photo.php b/Zotlabs/Module/Photo.php
index 4332fd6e9..256a51e71 100644
--- a/Zotlabs/Module/Photo.php
+++ b/Zotlabs/Module/Photo.php
@@ -127,17 +127,7 @@ class Photo extends \Zotlabs\Web\Controller {
}
}
- // If using resolution 1, make sure it exists before proceeding:
- if($resolution == 1) {
- $r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND imgscale = %d LIMIT 1",
- dbesc($photo),
- intval($resolution)
- );
- if(! $r) {
- $resolution = 2;
- }
- }
-
+
$r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND imgscale = %d LIMIT 1",
dbesc($photo),
intval($resolution)
@@ -166,6 +156,14 @@ class Photo extends \Zotlabs\Web\Controller {
intval($resolution)
);
+ $d = [ 'imgscale' => $resolution, 'resource_id' => $photo, 'photo' => $r, 'allowed' => $allowed ];
+ call_hooks('get_photo',$d);
+
+ $resolution = $d['imgscale'];
+ $photo = $d['resource_id'];
+ $r = $d['photo'];
+ $allowed = $d['allowed'];
+
if($r && $allowed) {
$data = dbunescbin($r[0]['content']);
$mimetype = $r[0]['mimetype'];
@@ -183,7 +181,7 @@ class Photo extends \Zotlabs\Web\Controller {
// they won't have the photo link, so there's a reasonable chance that the person
// might be able to obtain permission to view it.
- $r = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `imgscale` = %d LIMIT 1",
+ $r = q("SELECT * FROM photo WHERE resource_id = '%s' AND imgscale = %d LIMIT 1",
dbesc($photo),
intval($resolution)
);
@@ -200,6 +198,9 @@ class Photo extends \Zotlabs\Web\Controller {
}
}
+
+
+
if(! isset($data)) {
if(isset($resolution)) {
switch($resolution) {
diff --git a/Zotlabs/Module/Photos.php b/Zotlabs/Module/Photos.php
index 040a90aaa..e459469ef 100644
--- a/Zotlabs/Module/Photos.php
+++ b/Zotlabs/Module/Photos.php
@@ -195,7 +195,7 @@ class Photos extends \Zotlabs\Web\Controller {
if(! $ob_hash)
goaway(z_root() . '/' . $_SESSION['photo_return']);
- $r = q("SELECT `id`, `resource_id` FROM `photo` WHERE ( xchan = '%s' or `uid` = %d ) AND `resource_id` = '%s' LIMIT 1",
+ $r = q("SELECT id, resource_id FROM photo WHERE ( xchan = '%s' or uid = %d ) AND resource_id = '%s' LIMIT 1",
dbesc($ob_hash),
intval(local_channel()),
dbesc(\App::$argv[2])
@@ -241,12 +241,12 @@ class Photos extends \Zotlabs\Web\Controller {
( (intval($_POST['rotate']) == 1) || (intval($_POST['rotate']) == 2) )) {
logger('rotate');
- $r = q("select * from photo where `resource_id` = '%s' and uid = %d and imgscale = 0 limit 1",
+ $r = q("select * from photo where resource_id = '%s' and uid = %d and imgscale = 0 limit 1",
dbesc($resource_id),
intval($page_owner_uid)
);
if(count($r)) {
- $d = (($r[0]['os_storage']) ? @file_get_contents($r[0]['content']) : dbunescbin($r[0]['content']));
+ $d = (($r[0]['os_storage']) ? @file_get_contents(dbunescbin($r[0]['content'])) : dbunescbin($r[0]['content']));
$ph = photo_factory($d, $r[0]['mimetype']);
if($ph->is_valid()) {
$rotate_deg = ( (intval($_POST['rotate']) == 1) ? 270 : 90 );
@@ -259,7 +259,7 @@ class Photos extends \Zotlabs\Web\Controller {
@file_put_contents($r[0]['content'],$ph->imageString());
$data = $r[0]['content'];
$fsize = @filesize($r[0]['content']);
- q("update attach set filesize = %d where hash = '%s' and uid = %d limit 1",
+ q("update attach set filesize = %d where hash = '%s' and uid = %d",
intval($fsize),
dbesc($resource_id),
intval($page_owner_uid)
@@ -270,7 +270,7 @@ class Photos extends \Zotlabs\Web\Controller {
$fsize = strlen($data);
}
- $x = q("update photo set content = '%s', filesize = %d, height = %d, width = %d where `resource_id` = '%s' and uid = %d and imgscale = 0",
+ $x = q("update photo set content = '%s', filesize = %d, height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 0",
dbescbin($data),
intval($fsize),
intval($height),
@@ -285,7 +285,7 @@ class Photos extends \Zotlabs\Web\Controller {
$width = $ph->getWidth();
$height = $ph->getHeight();
- $x = q("update photo set content = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and imgscale = 1",
+ $x = q("update photo set content = '%s', height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 1",
dbescbin($ph->imageString()),
intval($height),
intval($width),
@@ -300,7 +300,7 @@ class Photos extends \Zotlabs\Web\Controller {
$width = $ph->getWidth();
$height = $ph->getHeight();
- $x = q("update photo set content = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and imgscale = 2",
+ $x = q("update photo set content = '%s', height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 2",
dbescbin($ph->imageString()),
intval($height),
intval($width),
@@ -315,7 +315,7 @@ class Photos extends \Zotlabs\Web\Controller {
$width = $ph->getWidth();
$height = $ph->getHeight();
- $x = q("update photo set content = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and imgscale = 3",
+ $x = q("update photo set content = '%s', height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 3",
dbescbin($ph->imageString()),
intval($height),
intval($width),
@@ -333,7 +333,7 @@ class Photos extends \Zotlabs\Web\Controller {
if($p) {
$ext = $phototypes[$p[0]['mimetype']];
- $r = q("UPDATE `photo` SET `description` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource_id` = '%s' AND `uid` = %d",
+ $r = q("UPDATE photo SET description = '%s', allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' WHERE resource_id = '%s' AND uid = %d",
dbesc($desc),
dbesc($perm['allow_cid']),
dbesc($perm['allow_gid']),
@@ -367,7 +367,7 @@ class Photos extends \Zotlabs\Web\Controller {
}
if($item_id) {
- $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM item WHERE id = %d AND uid = %d LIMIT 1",
intval($item_id),
intval($page_owner_uid)
);
@@ -695,8 +695,8 @@ class Photos extends \Zotlabs\Web\Controller {
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
- $r = q("SELECT `resource_id`, max(`imgscale`) AS `imgscale` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
- AND `imgscale` <= 4 and photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY `resource_id`",
+ $r = q("SELECT resource_id, max(imgscale) AS imgscale FROM photo WHERE uid = %d AND album = '%s'
+ AND imgscale <= 4 and photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY resource_id",
intval($owner_uid),
dbesc($album),
intval(PHOTO_NORMAL),
@@ -843,8 +843,8 @@ class Photos extends \Zotlabs\Web\Controller {
// fetch image, item containing image, then comments
- $ph = q("SELECT id,aid,uid,xchan,resource_id,created,edited,title,`description`,album,filename,mimetype,height,width,filesize,imgscale,photo_usage,is_nsfw,allow_cid,allow_gid,deny_cid,deny_gid FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'
- $sql_extra ORDER BY `imgscale` ASC ",
+ $ph = q("SELECT id,aid,uid,xchan,resource_id,created,edited,title,description,album,filename,mimetype,height,width,filesize,imgscale,photo_usage,is_nsfw,allow_cid,allow_gid,deny_cid,deny_gid FROM photo WHERE uid = %d AND resource_id = '%s'
+ $sql_extra ORDER BY imgscale ASC ",
intval($owner_uid),
dbesc($datum)
);
@@ -875,8 +875,8 @@ class Photos extends \Zotlabs\Web\Controller {
$order = 'DESC';
- $prvnxt = q("SELECT `resource_id` FROM `photo` WHERE `album` = '%s' AND `uid` = %d AND `imgscale` = 0
- $sql_extra ORDER BY `created` $order ",
+ $prvnxt = q("SELECT resource_id FROM photo WHERE album = '%s' AND uid = %d AND imgscale = 0
+ $sql_extra ORDER BY created $order ",
dbesc($ph[0]['album']),
intval($owner_uid)
);
@@ -993,7 +993,7 @@ class Photos extends \Zotlabs\Web\Controller {
}
if((local_channel()) && (local_channel() == $link_item['uid'])) {
- q("UPDATE `item` SET item_unseen = 0 WHERE parent = %d and uid = %d and item_unseen = 1",
+ q("UPDATE item SET item_unseen = 0 WHERE parent = %d and uid = %d and item_unseen = 1",
intval($link_item['parent']),
intval(local_channel())
);
@@ -1283,8 +1283,8 @@ class Photos extends \Zotlabs\Web\Controller {
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
- $r = q("SELECT `resource_id`, max(`imgscale`) AS `imgscale` FROM `photo` WHERE `uid` = %d
- and photo_usage in ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY `resource_id`",
+ $r = q("SELECT resource_id, max(imgscale) AS imgscale FROM photo WHERE uid = %d
+ and photo_usage in ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY resource_id",
intval(\App::$data['channel']['channel_id']),
intval(PHOTO_NORMAL),
intval(PHOTO_PROFILE),
diff --git a/Zotlabs/Module/Ping.php b/Zotlabs/Module/Ping.php
index e01c3b49a..bf2fa5cc9 100644
--- a/Zotlabs/Module/Ping.php
+++ b/Zotlabs/Module/Ping.php
@@ -1,32 +1,27 @@
<?php
-namespace Zotlabs\Module;
-/**
- * @file mod/ping.php
- *
- */
+namespace Zotlabs\Module;
require_once('include/bbcode.php');
-
/**
- * @brief do several updates when pinged.
- *
- * This function does several tasks. Whenever called it checks for new messages,
- * introductions, notifications, etc. and returns a json with the results.
+ * @brief Ping Controller.
*
- * @param App &$a
- * @result JSON
*/
-
-
class Ping extends \Zotlabs\Web\Controller {
+ /**
+ * @brief do several updates when pinged.
+ *
+ * This function does several tasks. Whenever called it checks for new messages,
+ * introductions, notifications, etc. and returns a json with the results.
+ *
+ * @result JSON
+ */
function init() {
-
$result = array();
$notifs = array();
-
+
$result['notify'] = 0;
$result['home'] = 0;
$result['network'] = 0;
@@ -41,45 +36,45 @@ class Ping extends \Zotlabs\Web\Controller {
$result['all_events_today'] = 0;
$result['notice'] = array();
$result['info'] = array();
-
+
$t0 = dba_timer();
-
+
header("content-type: application/json");
-
+
$vnotify = false;
-
+
$item_normal = item_normal();
-
- if(local_channel()) {
+
+ if(local_channel()) {
$vnotify = get_pconfig(local_channel(),'system','vnotify');
$evdays = intval(get_pconfig(local_channel(),'system','evdays'));
$ob_hash = get_observer_hash();
}
-
+
// if unset show all visual notification types
if($vnotify === false)
$vnotify = (-1);
if($evdays < 1)
$evdays = 3;
-
+
/**
* If you have several windows open to this site and switch to a different channel
- * in one of them, the others may get into a confused state showing you a page or options
+ * in one of them, the others may get into a confused state showing you a page or options
* on that page which were only valid under the old identity. You session has changed.
* Therefore we send a notification of this fact back to the browser where it is picked up
* in javascript and which reloads the page it is on so that it is valid under the context
- * of the now current channel.
+ * of the now current channel.
*/
-
+
$result['invalid'] = ((intval($_GET['uid'])) && (intval($_GET['uid']) != local_channel()) ? 1 : 0);
-
+
/**
* Send all system messages (alerts) to the browser.
* Some are marked as informational and some represent
* errors or serious notifications. These typically
* will popup on the current page (no matter what page it is)
*/
-
+
if(x($_SESSION, 'sysmsg')){
foreach ($_SESSION['sysmsg'] as $m){
$result['notice'][] = array('message' => $m);
@@ -96,17 +91,16 @@ class Ping extends \Zotlabs\Web\Controller {
$result['info'] = array();
if(! ($vnotify & VNOTIFY_ALERT))
$result['notice'] = array();
-
-
+
if(\App::$install) {
echo json_encode($result);
killme();
}
-
+
/**
* Update chat presence indication (if applicable)
*/
-
+
if(get_observer_hash() && (! $result['invalid'])) {
$r = q("select cp_id, cp_room from chatpresence where cp_xchan = '%s' and cp_client = '%s' and cp_room = 0 limit 1",
dbesc(get_observer_hash()),
@@ -114,7 +108,7 @@ class Ping extends \Zotlabs\Web\Controller {
);
$basic_presence = false;
if($r) {
- $basic_presence = true;
+ $basic_presence = true;
q("update chatpresence set cp_last = '%s' where cp_id = %d",
dbesc(datetime_convert()),
intval($r[0]['cp_id'])
@@ -130,40 +124,39 @@ class Ping extends \Zotlabs\Web\Controller {
);
}
}
-
+
/**
* Chatpresence continued... if somebody hasn't pinged recently, they've most likely left the page
* and shouldn't count as online anymore. We allow an expection for bots.
*/
-
+
q("delete from chatpresence where cp_last < %s - INTERVAL %s and cp_client != 'auto' ",
db_utcnow(), db_quoteinterval('3 MINUTE')
- );
-
+ );
+
if((! local_channel()) || ($result['invalid'])) {
echo json_encode($result);
killme();
}
-
+
/**
* Everything following is only permitted under the context of a locally authenticated site member.
*/
-
-
+
/**
* Handle "mark all xyz notifications read" requests.
*/
-
+
// mark all items read
if(x($_REQUEST, 'markRead') && local_channel()) {
switch($_REQUEST['markRead']) {
case 'network':
- $r = q("update item set item_unseen = 0 where item_unseen = 1 and uid = %d",
+ $r = q("update item set item_unseen = 0 where item_unseen = 1 and uid = %d",
intval(local_channel())
);
break;
case 'home':
- $r = q("update item set item_unseen = 0 where item_unseen = 1 and item_wall = 1 and uid = %d",
+ $r = q("update item set item_unseen = 0 where item_unseen = 1 and item_wall = 1 and uid = %d",
intval(local_channel())
);
break;
@@ -173,7 +166,7 @@ class Ping extends \Zotlabs\Web\Controller {
);
break;
case 'all_events':
- $r = q("update event set `dismissed` = 1 where `dismissed` = 0 and uid = %d AND dtstart < '%s' AND dtstart > '%s' ",
+ $r = q("update event set dismissed = 1 where dismissed = 0 and uid = %d AND dtstart < '%s' AND dtstart > '%s' ",
intval(local_channel()),
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
@@ -188,21 +181,18 @@ class Ping extends \Zotlabs\Web\Controller {
break;
}
}
-
+
if(x($_REQUEST, 'markItemRead') && local_channel()) {
- $r = q("update item set item_unseen = 0 where parent = %d and uid = %d",
+ $r = q("update item set item_unseen = 0 where parent = %d and uid = %d",
intval($_REQUEST['markItemRead']),
intval(local_channel())
);
}
-
-
-
+
/**
* URL ping/something will return detail for "something", e.g. a json list with which to populate a notification
* dropdown menu.
*/
-
if(argc() > 1 && argv(1) === 'notify') {
$t = q("select count(*) as total from notify where uid = %d and seen = 0",
intval(local_channel())
@@ -212,8 +202,7 @@ class Ping extends \Zotlabs\Web\Controller {
and seen = 0 order by created desc limit 50",
intval(local_channel())
);
- }
- else {
+ } else {
$z1 = q("select * from notify where uid = %d
and seen = 0 order by created desc limit 50",
intval(local_channel())
@@ -225,62 +214,62 @@ class Ping extends \Zotlabs\Web\Controller {
);
$z = array_merge($z1,$z2);
}
-
+
if(count($z)) {
foreach($z as $zz) {
$notifs[] = array(
- 'notify_link' => z_root() . '/notify/view/' . $zz['id'],
+ 'notify_link' => z_root() . '/notify/view/' . $zz['id'],
'name' => $zz['xname'],
'url' => $zz['url'],
'photo' => $zz['photo'],
- 'when' => relative_date($zz['created']),
- 'hclass' => (($zz['seen']) ? 'notify-seen' : 'notify-unseen'),
+ 'when' => relative_date($zz['created']),
+ 'hclass' => (($zz['seen']) ? 'notify-seen' : 'notify-unseen'),
'message' => strip_tags(bbcode($zz['msg']))
);
}
}
-
+
echo json_encode(array('notify' => $notifs));
killme();
}
-
+
if(argc() > 1 && argv(1) === 'messages') {
$channel = \App::get_channel();
- $t = q("select mail.*, xchan.* from mail left join xchan on xchan_hash = from_xchan
- where channel_id = %d and mail_seen = 0 and mail_deleted = 0
+ $t = q("select mail.*, xchan.* from mail left join xchan on xchan_hash = from_xchan
+ where channel_id = %d and mail_seen = 0 and mail_deleted = 0
and from_xchan != '%s' order by created desc limit 50",
intval(local_channel()),
dbesc($channel['channel_hash'])
);
-
+
if($t) {
foreach($t as $zz) {
$notifs[] = array(
- 'notify_link' => z_root() . '/mail/' . $zz['id'],
+ 'notify_link' => z_root() . '/mail/' . $zz['id'],
'name' => $zz['xchan_name'],
'url' => $zz['xchan_url'],
'photo' => $zz['xchan_photo_s'],
- 'when' => relative_date($zz['created']),
- 'hclass' => (intval($zz['mail_seen']) ? 'notify-seen' : 'notify-unseen'),
+ 'when' => relative_date($zz['created']),
+ 'hclass' => (intval($zz['mail_seen']) ? 'notify-seen' : 'notify-unseen'),
'message' => t('sent you a private message'),
);
}
}
-
+
echo json_encode(array('notify' => $notifs));
killme();
}
-
+
if(argc() > 1 && (argv(1) === 'network' || argv(1) === 'home')) {
$result = array();
-
+
$r = q("SELECT * FROM item
WHERE item_unseen = 1 and uid = %d $item_normal
and author_xchan != '%s' ORDER BY created DESC limit 300",
intval(local_channel()),
dbesc($ob_hash)
);
-
+
if($r) {
xchan_query($r);
foreach($r as $item) {
@@ -289,18 +278,18 @@ class Ping extends \Zotlabs\Web\Controller {
$result[] = \Zotlabs\Lib\Enotify::format($item);
}
}
- // logger('ping (network||home): ' . print_r($result, true), LOGGER_DATA);
+// logger('ping (network||home): ' . print_r($result, true), LOGGER_DATA);
echo json_encode(array('notify' => $result));
killme();
}
-
+
if(argc() > 1 && (argv(1) === 'intros')) {
$result = array();
-
+
$r = q("SELECT * FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ORDER BY abook_created DESC LIMIT 50",
intval(local_channel())
);
-
+
if($r) {
foreach($r as $rr) {
$result[] = array(
@@ -308,8 +297,8 @@ class Ping extends \Zotlabs\Web\Controller {
'name' => $rr['xchan_name'],
'url' => $rr['xchan_url'],
'photo' => $rr['xchan_photo_s'],
- 'when' => relative_date($rr['abook_created']),
- 'hclass' => ('notify-unseen'),
+ 'when' => relative_date($rr['abook_created']),
+ 'hclass' => ('notify-unseen'),
'message' => t('added your channel')
);
}
@@ -318,40 +307,35 @@ class Ping extends \Zotlabs\Web\Controller {
echo json_encode(array('notify' => $result));
killme();
}
-
+
if(argc() > 1 && (argv(1) === 'all_events')) {
$bd_format = t('g A l F d') ; // 8 AM Friday January 18
-
+
$result = array();
-
+
$r = q("SELECT * FROM event left join xchan on event_xchan = xchan_hash
- WHERE `event`.`uid` = %d AND dtstart < '%s' AND dtstart > '%s' and `dismissed` = 0
+ WHERE event.uid = %d AND dtstart < '%s' AND dtstart > '%s' and dismissed = 0
and etype in ( 'event', 'birthday' )
- ORDER BY `dtstart` DESC LIMIT 1000",
+ ORDER BY dtstart DESC LIMIT 1000",
intval(local_channel()),
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
);
-
+
if($r) {
foreach($r as $rr) {
- if($rr['adjust'])
- $md = datetime_convert('UTC', date_default_timezone_get(), $rr['dtstart'], 'Y/m');
- else
- $md = datetime_convert('UTC', 'UTC', $rr['dtstart'], 'Y/m');
-
+
$strt = datetime_convert('UTC', (($rr['adjust']) ? date_default_timezone_get() : 'UTC'), $rr['dtstart']);
$today = ((substr($strt, 0, 10) === datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d')) ? true : false);
-
$when = day_translate(datetime_convert('UTC', (($rr['adjust']) ? date_default_timezone_get() : 'UTC'), $rr['dtstart'], $bd_format)) . (($today) ? ' ' . t('[today]') : '');
-
+
$result[] = array(
- 'notify_link' => z_root() . '/events', // FIXME this takes you to an edit page and it may not be yours, we really want to just view the single event --> '/events/event/' . $rr['event_hash'],
+ 'notify_link' => z_root() . '/events', /// @FIXME this takes you to an edit page and it may not be yours, we really want to just view the single event --> '/events/event/' . $rr['event_hash'],
'name' => $rr['xchan_name'],
'url' => $rr['xchan_url'],
'photo' => $rr['xchan_photo_s'],
'when' => $when,
- 'hclass' => ('notify-unseen'),
+ 'hclass' => ('notify-unseen'),
'message' => t('posted an event')
);
}
@@ -360,13 +344,10 @@ class Ping extends \Zotlabs\Web\Controller {
echo json_encode(array('notify' => $result));
killme();
}
-
-
-
+
/**
* Normal ping - just the counts, no detail
*/
-
if($vnotify & VNOTIFY_SYSTEM) {
$t = q("select count(*) as total from notify where uid = %d and seen = 0",
intval(local_channel())
@@ -374,9 +355,9 @@ class Ping extends \Zotlabs\Web\Controller {
if($t)
$result['notify'] = intval($t[0]['total']);
}
-
+
$t1 = dba_timer();
-
+
if($vnotify & (VNOTIFY_NETWORK|VNOTIFY_CHANNEL)) {
$r = q("SELECT id, item_wall FROM item
WHERE item_unseen = 1 and uid = %d
@@ -385,11 +366,11 @@ class Ping extends \Zotlabs\Web\Controller {
intval(local_channel()),
dbesc($ob_hash)
);
-
- if($r) {
+
+ if($r) {
$arr = array('items' => $r);
call_hooks('network_ping', $arr);
-
+
foreach ($r as $it) {
if(intval($it['item_wall']))
$result['home'] ++;
@@ -402,24 +383,23 @@ class Ping extends \Zotlabs\Web\Controller {
$result['network'] = 0;
if(! ($vnotify & VNOTIFY_CHANNEL))
$result['home'] = 0;
-
-
+
$t2 = dba_timer();
-
+
if($vnotify & VNOTIFY_INTRO) {
$intr = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash where abook_channel = %d and abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ",
intval(local_channel())
);
-
+
$t3 = dba_timer();
-
+
if($intr)
$result['intros'] = intval($intr[0]['total']);
}
-
+
$t4 = dba_timer();
$channel = \App::get_channel();
-
+
if($vnotify & VNOTIFY_MAIL) {
$mails = q("SELECT count(id) as total from mail
WHERE channel_id = %d AND mail_seen = 0 and from_xchan != '%s' ",
@@ -429,7 +409,7 @@ class Ping extends \Zotlabs\Web\Controller {
if($mails)
$result['mail'] = intval($mails[0]['total']);
}
-
+
if($vnotify & VNOTIFY_REGISTER) {
if (\App::$config['system']['register_policy'] == REGISTER_APPROVE && is_site_admin()) {
$regs = q("SELECT count(account_id) as total from account where (account_flags & %d) > 0",
@@ -438,23 +418,23 @@ class Ping extends \Zotlabs\Web\Controller {
if($regs)
$result['register'] = intval($regs[0]['total']);
}
- }
-
+ }
+
$t5 = dba_timer();
-
+
if($vnotify & (VNOTIFY_EVENT|VNOTIFY_EVENTTODAY|VNOTIFY_BIRTHDAY)) {
- $events = q("SELECT etype, dtstart, adjust FROM `event`
- WHERE `event`.`uid` = %d AND dtstart < '%s' AND dtstart > '%s' and `dismissed` = 0
+ $events = q("SELECT etype, dtstart, adjust FROM event
+ WHERE event.uid = %d AND dtstart < '%s' AND dtstart > '%s' and dismissed = 0
and etype in ( 'event', 'birthday' )
- ORDER BY `dtstart` ASC ",
+ ORDER BY dtstart ASC ",
intval(local_channel()),
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
);
-
+
if($events) {
$result['all_events'] = count($events);
-
+
if($result['all_events']) {
$str_now = datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d');
foreach($events as $x) {
@@ -483,16 +463,15 @@ class Ping extends \Zotlabs\Web\Controller {
$result['all_events_today'] = $result['events_today'] = 0;
if(! ($vnotify & VNOTIFY_BIRTHDAY))
$result['birthdays'] = 0;
-
-
+
$x = json_encode($result);
-
+
$t6 = dba_timer();
-
- // logger('ping timer: ' . sprintf('%01.4f %01.4f %01.4f %01.4f %01.4f %01.4f',$t6 - $t5, $t5 - $t4, $t4 - $t3, $t3 - $t2, $t2 - $t1, $t1 - $t0));
-
+
+// logger('ping timer: ' . sprintf('%01.4f %01.4f %01.4f %01.4f %01.4f %01.4f',$t6 - $t5, $t5 - $t4, $t4 - $t3, $t3 - $t2, $t2 - $t1, $t1 - $t0));
+
echo $x;
killme();
}
-
+
}
diff --git a/Zotlabs/Module/Post.php b/Zotlabs/Module/Post.php
index af231ab50..c78484a45 100644
--- a/Zotlabs/Module/Post.php
+++ b/Zotlabs/Module/Post.php
@@ -1,36 +1,34 @@
<?php
-namespace Zotlabs\Module;
-
/**
- * @file mod/post.php
+ * @file Zotlabs/Module/Post.php
*
* @brief Zot endpoint.
*
*/
-require_once('include/zot.php');
+namespace Zotlabs\Module;
+require_once('include/zot.php');
+/**
+ * @brief Post module.
+ *
+ */
class Post extends \Zotlabs\Web\Controller {
function init() {
-
- if (array_key_exists('auth', $_REQUEST)) {
+ if(array_key_exists('auth', $_REQUEST)) {
$x = new \Zotlabs\Zot\Auth($_REQUEST);
+
exit;
}
-
}
-
-
- function post() {
-
- $z = new \Zotlabs\Zot\Receiver($_REQUEST['data'],get_config('system','prvkey'), new \Zotlabs\Zot\ZotHandler());
-
+
+ function post() {
+ $z = new \Zotlabs\Zot\Receiver($_REQUEST['data'], get_config('system', 'prvkey'), new \Zotlabs\Zot\ZotHandler());
+
// notreached;
-
exit;
-
}
-
+
}
diff --git a/Zotlabs/Module/Profile_photo.php b/Zotlabs/Module/Profile_photo.php
index f459f7deb..5b88f67f5 100644
--- a/Zotlabs/Module/Profile_photo.php
+++ b/Zotlabs/Module/Profile_photo.php
@@ -98,7 +98,7 @@ class Profile_photo extends \Zotlabs\Web\Controller {
if($r) {
$base_image = $r[0];
- $base_image['content'] = (($r[0]['os_storage']) ? @file_get_contents($base_image['content']) : dbunescbin($base_image['content']));
+ $base_image['content'] = (($r[0]['os_storage']) ? @file_get_contents(dbunescbin($base_image['content'])) : dbunescbin($base_image['content']));
$im = photo_factory($base_image['content'], $base_image['mimetype']);
if($im->is_valid()) {
@@ -149,7 +149,7 @@ class Profile_photo extends \Zotlabs\Web\Controller {
if($is_default_profile) {
$r = q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d
- AND resource_id != '%s' AND `uid` = %d",
+ AND resource_id != '%s' AND uid = %d",
intval(PHOTO_NORMAL),
intval(PHOTO_PROFILE),
dbesc($base_image['resource_id']),
@@ -205,15 +205,23 @@ class Profile_photo extends \Zotlabs\Web\Controller {
$hash = photo_new_resource();
+ $importing = false;
$smallest = 0;
- require_once('include/attach.php');
+
+ if($_REQUEST['importfile']) {
+ $hash = $_REQUEST['importfile'];
+ $importing = true;
+ }
+ else {
+ require_once('include/attach.php');
- $res = attach_store(\App::get_channel(), get_observer_hash(), '', array('album' => t('Profile Photos'), 'hash' => $hash));
+ $res = attach_store(\App::get_channel(), get_observer_hash(), '', array('album' => t('Profile Photos'), 'hash' => $hash));
- logger('attach_store: ' . print_r($res,true));
+ logger('attach_store: ' . print_r($res,true));
+ }
- if($res && intval($res['data']['is_photo'])) {
+ if(($res && intval($res['data']['is_photo'])) || $importing) {
$i = q("select * from photo where resource_id = '%s' and uid = %d order by imgscale",
dbesc($hash),
intval(local_channel())
@@ -235,7 +243,7 @@ class Profile_photo extends \Zotlabs\Web\Controller {
}
}
- $imagedata = (($os_storage) ? @file_get_contents($imagedata) : $imagedata);
+ $imagedata = (($os_storage) ? @file_get_contents(dbunescbin($imagedata)) : dbunescbin($imagedata));
$ph = photo_factory($imagedata, $filetype);
if(! $ph->is_valid()) {
@@ -284,14 +292,17 @@ class Profile_photo extends \Zotlabs\Web\Controller {
// When using an existing photo, we don't have a dialogue to offer a choice of profiles,
// so it gets attached to the default
- $p = q("select id from profile where is_default = 1 and uid = %d",
+ $c = q("select id, is_default from profile where uid = %d",
intval(local_channel())
);
- if($p) {
- $_REQUEST['profile'] = $p[0]['id'];
+
+ $multi_profiles = true;
+
+ if(($c) && (count($c) === 1) && (intval($c[0]['is_default']))) {
+ $_REQUEST['profile'] = $c[0]['id'];
+ $multi_profiles = false;
}
-
$r = q("SELECT id, album, imgscale FROM photo WHERE uid = %d AND resource_id = '%s' ORDER BY imgscale ASC",
intval(local_channel()),
dbesc($resource_id)
@@ -308,7 +319,7 @@ class Profile_photo extends \Zotlabs\Web\Controller {
// set an already loaded and cropped photo as profile photo
- if(($r[0]['album'] == t('Profile Photos')) && ($havescale)) {
+ if($havescale) {
// unset any existing profile photos
$r = q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d AND uid = %d",
intval(PHOTO_NORMAL),
@@ -343,7 +354,7 @@ class Profile_photo extends \Zotlabs\Web\Controller {
}
if(intval($r[0]['os_storage']))
- $data = @file_get_contents($r[0]['content']);
+ $data = @file_get_contents(dbunescbin($r[0]['content']));
else
$data = dbunescbin($r[0]['content']);
@@ -366,9 +377,15 @@ class Profile_photo extends \Zotlabs\Web\Controller {
}
}
- $this->profile_photo_crop_ui_head($a, $ph, $hash, $smallest);
+ if($multi_profiles) {
+ \App::$data['importfile'] = $resource_id;
+ }
+ else {
+ $this->profile_photo_crop_ui_head($a, $ph, $hash, $smallest);
+ }
// falls through with App::$data['imagecrop'] set so we go straight to the cropping section
+
}
@@ -377,6 +394,8 @@ class Profile_photo extends \Zotlabs\Web\Controller {
$profiles = q("select id, profile_name as name, is_default from profile where uid = %d order by id asc",
intval(local_channel())
);
+
+ $importing = ((array_key_exists('importfile',\App::$data)) ? true : false);
if(! x(\App::$data,'imagecrop')) {
@@ -384,10 +403,11 @@ class Profile_photo extends \Zotlabs\Web\Controller {
$o .= replace_macros($tpl,array(
'$user' => \App::$channel['channel_address'],
+ '$importfile' => (($importing) ? \App::$data['importfile'] : ''),
'$lbl_upfile' => t('Upload File:'),
'$lbl_profiles' => t('Select a profile:'),
- '$title' => t('Upload Profile Photo'),
- '$submit' => t('Upload'),
+ '$title' => (($importing) ? t('Use Photo for Profile') : t('Upload Profile Photo')),
+ '$submit' => (($importing) ? t('Use') : t('Upload')),
'$profiles' => $profiles,
'$single' => ((count($profiles) == 1) ? true : false),
'$profile0' => $profiles[0],
diff --git a/Zotlabs/Module/Profiles.php b/Zotlabs/Module/Profiles.php
index 788673296..19a642a83 100644
--- a/Zotlabs/Module/Profiles.php
+++ b/Zotlabs/Module/Profiles.php
@@ -16,7 +16,7 @@ class Profiles extends \Zotlabs\Web\Controller {
}
if((argc() > 2) && (argv(1) === "drop") && intval(argv(2))) {
- $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d AND `is_default` = 0 LIMIT 1",
+ $r = q("SELECT * FROM profile WHERE id = %d AND uid = %d AND is_default = 0 LIMIT 1",
intval(argv(2)),
intval(local_channel())
);
@@ -31,12 +31,12 @@ class Profiles extends \Zotlabs\Web\Controller {
// move every contact using this profile as their default to the user default
- $r = q("UPDATE abook SET abook_profile = (SELECT profile_guid AS FROM profile WHERE is_default = 1 AND uid = %d LIMIT 1) WHERE abook_profile = '%s' AND abook_channel = %d ",
+ $r = q("UPDATE abook SET abook_profile = (SELECT profile_guid FROM profile WHERE is_default = 1 AND uid = %d LIMIT 1) WHERE abook_profile = '%s' AND abook_channel = %d ",
intval(local_channel()),
dbesc($profile_guid),
intval(local_channel())
);
- $r = q("DELETE FROM `profile` WHERE `id` = %d AND `uid` = %d",
+ $r = q("DELETE FROM profile WHERE id = %d AND uid = %d",
intval(argv(2)),
intval(local_channel())
);
@@ -61,16 +61,16 @@ class Profiles extends \Zotlabs\Web\Controller {
// check_form_security_token_redirectOnErr('/profiles', 'profile_new', 't');
- $r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
+ $r0 = q("SELECT id FROM profile WHERE uid = %d",
intval(local_channel()));
$num_profiles = count($r0);
$name = t('Profile-') . ($num_profiles + 1);
- $r1 = q("SELECT `fullname`, `photo`, `thumb` FROM `profile` WHERE `uid` = %d AND `is_default` = 1 LIMIT 1",
+ $r1 = q("SELECT fullname, photo, thumb FROM profile WHERE uid = %d AND is_default = 1 LIMIT 1",
intval(local_channel()));
- $r2 = q("INSERT INTO `profile` (`aid`, `uid` , `profile_guid`, `profile_name` , `fullname`, `photo`, `thumb`)
+ $r2 = q("INSERT INTO profile (aid, uid , profile_guid, profile_name , fullname, photo, thumb)
VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s' )",
intval(get_account_id()),
intval(local_channel()),
@@ -81,7 +81,7 @@ class Profiles extends \Zotlabs\Web\Controller {
dbesc($r1[0]['thumb'])
);
- $r3 = q("SELECT `id` FROM `profile` WHERE `uid` = %d AND `profile_name` = '%s' LIMIT 1",
+ $r3 = q("SELECT id FROM profile WHERE uid = %d AND profile_name = '%s' LIMIT 1",
intval(local_channel()),
dbesc($name)
);
@@ -97,12 +97,12 @@ class Profiles extends \Zotlabs\Web\Controller {
check_form_security_token_redirectOnErr('/profiles', 'profile_clone', 't');
- $r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
+ $r0 = q("SELECT id FROM profile WHERE uid = %d",
intval(local_channel()));
$num_profiles = count($r0);
$name = t('Profile-') . ($num_profiles + 1);
- $r1 = q("SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d LIMIT 1",
+ $r1 = q("SELECT * FROM profile WHERE uid = %d AND id = %d LIMIT 1",
intval(local_channel()),
intval(\App::$argv[2])
);
@@ -117,15 +117,9 @@ class Profiles extends \Zotlabs\Web\Controller {
$r1[0]['profile_name'] = dbesc($name);
$r1[0]['profile_guid'] = dbesc(random_string());
- dbesc_array($r1[0]);
+ create_table_from_array('profile', $r1[0]);
- $r2 = dbq("INSERT INTO `profile` (`"
- . implode("`, `", array_keys($r1[0]))
- . "`) VALUES ('"
- . implode("', '", array_values($r1[0]))
- . "')" );
-
- $r3 = q("SELECT `id` FROM `profile` WHERE `uid` = %d AND `profile_name` = '%s' LIMIT 1",
+ $r3 = q("SELECT id FROM profile WHERE uid = %d AND profile_name = '%s' LIMIT 1",
intval(local_channel()),
dbesc($name)
);
@@ -143,7 +137,7 @@ class Profiles extends \Zotlabs\Web\Controller {
if((argc() > 2) && (argv(1) === 'export')) {
- $r1 = q("SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d LIMIT 1",
+ $r1 = q("SELECT * FROM profile WHERE uid = %d AND id = %d LIMIT 1",
intval(local_channel()),
intval(argv(2))
);
@@ -181,7 +175,7 @@ class Profiles extends \Zotlabs\Web\Controller {
if($x)
$id = $x[0]['id'];
}
- $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM profile WHERE id = %d AND uid = %d LIMIT 1",
intval($id),
intval(local_channel())
);
@@ -238,7 +232,7 @@ class Profiles extends \Zotlabs\Web\Controller {
if((argc() > 1) && (argv(1) !== "new") && intval(argv(1))) {
- $orig = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $orig = q("SELECT * FROM profile WHERE id = %d AND uid = %d LIMIT 1",
intval(\App::$argv[1]),
intval(local_channel())
);
@@ -484,41 +478,41 @@ class Profiles extends \Zotlabs\Web\Controller {
}
- $r = q("UPDATE `profile`
- SET `profile_name` = '%s',
- `fullname` = '%s',
- `pdesc` = '%s',
- `gender` = '%s',
- `dob` = '%s',
- `address` = '%s',
- `locality` = '%s',
- `region` = '%s',
- `postal_code` = '%s',
- `country_name` = '%s',
- `marital` = '%s',
- `partner` = '%s',
- `howlong` = '%s',
- `sexual` = '%s',
- `homepage` = '%s',
- `hometown` = '%s',
- `politic` = '%s',
- `religion` = '%s',
- `keywords` = '%s',
- `likes` = '%s',
- `dislikes` = '%s',
- `about` = '%s',
- `interest` = '%s',
- `contact` = '%s',
- `channels` = '%s',
- `music` = '%s',
- `book` = '%s',
- `tv` = '%s',
- `film` = '%s',
- `romance` = '%s',
- `employment` = '%s',
- `education` = '%s',
- `hide_friends` = %d
- WHERE `id` = %d AND `uid` = %d",
+ $r = q("UPDATE profile
+ SET profile_name = '%s',
+ fullname = '%s',
+ pdesc = '%s',
+ gender = '%s',
+ dob = '%s',
+ address = '%s',
+ locality = '%s',
+ region = '%s',
+ postal_code = '%s',
+ country_name = '%s',
+ marital = '%s',
+ partner = '%s',
+ howlong = '%s',
+ sexual = '%s',
+ homepage = '%s',
+ hometown = '%s',
+ politic = '%s',
+ religion = '%s',
+ keywords = '%s',
+ likes = '%s',
+ dislikes = '%s',
+ about = '%s',
+ interest = '%s',
+ contact = '%s',
+ channels = '%s',
+ music = '%s',
+ book = '%s',
+ tv = '%s',
+ film = '%s',
+ romance = '%s',
+ employment = '%s',
+ education = '%s',
+ hide_friends = %d
+ WHERE id = %d AND uid = %d",
dbesc($profile_name),
dbesc($name),
dbesc($pdesc),
@@ -617,7 +611,7 @@ class Profiles extends \Zotlabs\Web\Controller {
if($x)
$id = $x[0]['id'];
}
- $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM profile WHERE id = %d AND uid = %d LIMIT 1",
intval($id),
intval(local_channel())
);
@@ -755,7 +749,7 @@ class Profiles extends \Zotlabs\Web\Controller {
}
else {
- $r = q("SELECT * FROM `profile` WHERE `uid` = %d",
+ $r = q("SELECT * FROM profile WHERE uid = %d",
local_channel());
if($r) {
diff --git a/Zotlabs/Module/Profperm.php b/Zotlabs/Module/Profperm.php
index b1da147c1..99cd4c58f 100644
--- a/Zotlabs/Module/Profperm.php
+++ b/Zotlabs/Module/Profperm.php
@@ -55,7 +55,7 @@ class Profperm extends \Zotlabs\Web\Controller {
if((argc() > 1) && (intval(argv(1)))) {
- $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d AND `is_default` = 0 LIMIT 1",
+ $r = q("SELECT * FROM profile WHERE id = %d AND uid = %d AND is_default = 0 LIMIT 1",
intval(argv(1)),
intval(local_channel())
);
diff --git a/Zotlabs/Module/Pubsites.php b/Zotlabs/Module/Pubsites.php
index 1c9cd5121..d87967189 100644
--- a/Zotlabs/Module/Pubsites.php
+++ b/Zotlabs/Module/Pubsites.php
@@ -36,7 +36,7 @@ class Pubsites extends \Zotlabs\Web\Controller {
$o .= '</tr>';
if($j['sites']) {
foreach($j['sites'] as $jj) {
- if(! $jj['project'])
+ if(! \Zotlabs\Lib\System::compatible_project($jj['project']))
continue;
if(strpos($jj['version'],' ')) {
$x = explode(' ', $jj['version']);
diff --git a/Zotlabs/Module/Pubstream.php b/Zotlabs/Module/Pubstream.php
index 312be7718..6c4d479d4 100644
--- a/Zotlabs/Module/Pubstream.php
+++ b/Zotlabs/Module/Pubstream.php
@@ -21,8 +21,13 @@ class Pubstream extends \Zotlabs\Web\Controller {
return;
$item_normal = item_normal();
+
+ $static = ((array_key_exists('static',$_REQUEST)) ? intval($_REQUEST['static']) : 0);
+
if(! $update) {
+
+ $static = ((local_channel()) ? channel_manual_conv_update(local_channel()) : 0);
$maxheight = get_config('system','home_divmore_height');
if(! $maxheight)
@@ -49,6 +54,7 @@ class Pubstream extends \Zotlabs\Web\Controller {
'$nouveau' => '0',
'$wall' => '0',
'$list' => '0',
+ '$static' => $static,
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => '',
'$order' => 'comment',
@@ -96,7 +102,10 @@ class Pubstream extends \Zotlabs\Web\Controller {
$simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) ";
if($load)
$simple_update = '';
-
+
+ if($static && $simple_update)
+ $simple_update .= " and item_thread_top = 0 and author_xchan = '" . protect_sprintf(get_observer_hash()) . "' ";
+
//logger('update: ' . $update . ' load: ' . $load);
if($update) {
diff --git a/Zotlabs/Module/Regdir.php b/Zotlabs/Module/Regdir.php
index 48a7cc16d..f4d16c562 100644
--- a/Zotlabs/Module/Regdir.php
+++ b/Zotlabs/Module/Regdir.php
@@ -54,8 +54,7 @@ class Regdir extends \Zotlabs\Web\Controller {
if ($url) {
$m = parse_url($url);
- if ((! $m) || ((! @dns_get_record($m['host'], DNS_A + DNS_CNAME + DNS_PTR)) && (! filter_var($m['host'], FILTER_VALIDATE_IP) ))) {
-
+ if ((! $m) || (! z_dns_check($m['host']))) {
$result['message'] = 'unparseable url';
json_return_and_die($result);
}
@@ -71,7 +70,7 @@ class Regdir extends \Zotlabs\Web\Controller {
if(! $result['success'])
$valid = 0;
- q("update site set site_valid = %d where site_url = '%s' limit 1",
+ q("update site set site_valid = %d where site_url = '%s'",
intval($valid),
strtolower($url)
);
diff --git a/Zotlabs/Module/Search.php b/Zotlabs/Module/Search.php
index 402a27d40..b319b19d6 100644
--- a/Zotlabs/Module/Search.php
+++ b/Zotlabs/Module/Search.php
@@ -53,6 +53,8 @@ class Search extends \Zotlabs\Web\Controller {
$tag = true;
$search = ((x($_GET,'tag')) ? trim(rawurldecode($_GET['tag'])) : '');
}
+
+ $static = ((array_key_exists('static',$_REQUEST)) ? intval($_REQUEST['static']) : 0);
if((! local_channel()) || (! feature_enabled(local_channel(),'savedsearch')))
$o .= search($search,'search-box','/search',((local_channel()) ? true : false));
@@ -79,7 +81,7 @@ class Search extends \Zotlabs\Web\Controller {
return $o;
if($tag) {
- $sql_extra = sprintf(" AND `item`.`id` IN (select `oid` from term where otype = %d and ttype in ( %d , %d) and term = '%s') ",
+ $sql_extra = sprintf(" AND item.id IN (select oid from term where otype = %d and ttype in ( %d , %d) and term = '%s') ",
intval(TERM_OBJ_POST),
intval(TERM_HASHTAG),
intval(TERM_COMMUNITYTAG),
@@ -88,7 +90,7 @@ class Search extends \Zotlabs\Web\Controller {
}
else {
$regstr = db_getfunc('REGEXP');
- $sql_extra = sprintf(" AND `item`.`body` $regstr '%s' ", dbesc(protect_sprintf(preg_quote($search))));
+ $sql_extra = sprintf(" AND item.body $regstr '%s' ", dbesc(protect_sprintf(preg_quote($search))));
}
// Here is the way permissions work in the search module...
@@ -96,8 +98,12 @@ class Search extends \Zotlabs\Web\Controller {
// OR your own posts if you are a logged in member
// No items will be shown if the member has a blocked profile wall.
+
if((! $update) && (! $load)) {
+ $static = ((local_channel()) ? channel_manual_conv_update(local_channel()) : 0);
+
+
// This is ugly, but we can't pass the profile_uid through the session to the ajax updater,
// because browser prefetching might change it on us. We have to deliver it with the page.
@@ -120,6 +126,7 @@ class Search extends \Zotlabs\Web\Controller {
'$fh' => '0',
'$nouveau' => '0',
'$wall' => '0',
+ '$static' => $static,
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => (($tag) ? urlencode('#') : '') . $search,
@@ -165,8 +172,8 @@ class Search extends \Zotlabs\Web\Controller {
}
if(local_channel()) {
$r = q("SELECT $prefix mid, item.id as item_id, item.* from item
- WHERE ((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND item_private = 0 )
- OR ( `item`.`uid` = %d )) OR item.owner_xchan = '%s' )
+ WHERE ((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = '' AND item.deny_gid = '' AND item_private = 0 )
+ OR ( item.uid = %d )) OR item.owner_xchan = '%s' )
$item_normal
$sql_extra
$suffix $pager_sql ",
@@ -176,8 +183,8 @@ class Search extends \Zotlabs\Web\Controller {
}
if($r === null) {
$r = q("SELECT $prefix mid, item.id as item_id, item.* from item
- WHERE (((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
- AND `item`.`deny_gid` = '' AND item_private = 0 )
+ WHERE (((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = ''
+ AND item.deny_gid = '' AND item_private = 0 )
and owner_xchan in ( " . stream_perms_xchans(($observer) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
$pub_sql ) OR owner_xchan = '%s')
$item_normal
diff --git a/Zotlabs/Module/Settings/Account.php b/Zotlabs/Module/Settings/Account.php
index cd5ed1fca..ec176797d 100644
--- a/Zotlabs/Module/Settings/Account.php
+++ b/Zotlabs/Module/Settings/Account.php
@@ -101,15 +101,7 @@ class Account {
$email = \App::$account['account_email'];
- $techlevels = [
- '0' => t('Beginner/Basic'),
- '1' => t('Novice - not skilled but willing to learn'),
- '2' => t('Intermediate - somewhat comfortable'),
- '3' => t('Advanced - very comfortable'),
- '4' => t('Expert - I can write computer code'),
- '5' => t('Wizard - I probably know more than you do')
- ];
-
+ $techlevels = \Zotlabs\Lib\Techlevels::levels();
$def_techlevel = \App::$account['account_level'];
$techlock = get_config('system','techlevel_lock');
diff --git a/Zotlabs/Module/Settings/Channel.php b/Zotlabs/Module/Settings/Channel.php
index 88c454890..a73aa2e60 100644
--- a/Zotlabs/Module/Settings/Channel.php
+++ b/Zotlabs/Module/Settings/Channel.php
@@ -289,7 +289,7 @@ class Channel {
$yes_no = array(t('No'),t('Yes'));
- $p = q("SELECT * FROM `profile` WHERE `is_default` = 1 AND `uid` = %d LIMIT 1",
+ $p = q("SELECT * FROM profile WHERE is_default = 1 AND uid = %d LIMIT 1",
intval(local_channel())
);
if(count($p))
@@ -326,7 +326,11 @@ class Channel {
$permiss[] = array($k,$perm,$limits[$k],'',$options);
}
-
+
+ // logger('permiss: ' . print_r($permiss,true));
+
+
+
$username = $channel['channel_name'];
$nickname = $channel['channel_address'];
$timezone = $channel['channel_timezone'];
@@ -400,8 +404,11 @@ class Channel {
'$desc' => t('Your channel address is'),
'$nickname' => $nickname,
'$subdir' => $subdir,
+ '$davdesc' => t('Your files/photos are accessible via WebDAV at'),
+ '$davpath' => ((get_account_techlevel() > 3) ? z_root() . '/dav/' . $nickname : ''),
'$basepath' => \App::get_hostname()
));
+
$stpl = get_markup_template('settings.tpl');
@@ -511,6 +518,8 @@ class Channel {
'$notify7' => array('notify7', t('You are tagged in a post'), ($notify & NOTIFY_TAGSELF), NOTIFY_TAGSELF, '', $yes_no),
'$notify8' => array('notify8', t('You are poked/prodded/etc. in a post'), ($notify & NOTIFY_POKE), NOTIFY_POKE, '', $yes_no),
+ '$notify9' => array('notify9', t('Someone likes your post/comment'), ($notify & NOTIFY_LIKE), NOTIFY_LIKE, '', $yes_no),
+
'$lbl_vnot' => t('Show visual notifications including:'),
diff --git a/Zotlabs/Module/Settings/Display.php b/Zotlabs/Module/Settings/Display.php
index 8da875de7..25d1d21a0 100644
--- a/Zotlabs/Module/Settings/Display.php
+++ b/Zotlabs/Module/Settings/Display.php
@@ -28,6 +28,7 @@ class Display {
$title_tosource = ((x($_POST,'title_tosource')) ? intval($_POST['title_tosource']) : 0);
$channel_list_mode = ((x($_POST,'channel_list_mode')) ? intval($_POST['channel_list_mode']) : 0);
$network_list_mode = ((x($_POST,'network_list_mode')) ? intval($_POST['network_list_mode']) : 0);
+ $manual_update = ((array_key_exists('manual_update',$_POST)) ? intval($_POST['manual_update']) : 0);
$channel_divmore_height = ((x($_POST,'channel_divmore_height')) ? intval($_POST['channel_divmore_height']) : 400);
if($channel_divmore_height < 50)
@@ -61,6 +62,7 @@ class Display {
set_pconfig(local_channel(),'system','network_list_mode', $network_list_mode);
set_pconfig(local_channel(),'system','channel_divmore_height', $channel_divmore_height);
set_pconfig(local_channel(),'system','network_divmore_height', $network_divmore_height);
+ set_pconfig(local_channel(),'system','manual_conversation_update', $manual_update);
$newschema = '';
if($theme == $existing_theme){
@@ -157,7 +159,7 @@ class Display {
$preload_images = (($preload_images===false)? '0': $preload_images); // default if not set: 0
$user_scalable = get_pconfig(local_channel(),'system','user_scalable');
- $user_scalable = (($user_scalable===false)? '1': $user_scalable); // default if not set: 1
+ $user_scalable = (($user_scalable===false)? '0': $user_scalable); // default if not set: 0
$browser_update = intval(get_pconfig(local_channel(), 'system','update_interval'));
$browser_update = (($browser_update == 0) ? 80 : $browser_update / 1000); // default if not set: 40 seconds
@@ -204,6 +206,7 @@ class Display {
'$ajaxint' => array('browser_update', t("Update browser every xx seconds"), $browser_update, t('Minimum of 10 seconds, no maximum')),
'$itemspage' => array('itemspage', t("Maximum number of conversations to load at any time:"), $itemspage, t('Maximum of 100 items')),
'$nosmile' => array('nosmile', t("Show emoticons (smilies) as images"), 1-intval($nosmile), '', $yes_no),
+ '$manual_update' => array('manual_update', t('Manual conversation updates'), channel_manual_conv_update(local_channel()), t('Default is automatic, which may increase screen jumping'), $yes_no),
'$title_tosource' => array('title_tosource', t("Link post titles to source"), $title_tosource, '', $yes_no),
'$layout_editor' => t('System Page Layout Editor - (advanced)'),
'$theme_config' => $theme_config,
@@ -237,4 +240,4 @@ class Display {
-} \ No newline at end of file
+}
diff --git a/Zotlabs/Module/Settings/Featured.php b/Zotlabs/Module/Settings/Featured.php
index 7d7b1a734..eec5f6c02 100644
--- a/Zotlabs/Module/Settings/Featured.php
+++ b/Zotlabs/Module/Settings/Featured.php
@@ -19,7 +19,7 @@ class Featured {
$o = '';
- $r = q("SELECT * FROM `hook` WHERE `hook` = 'feature_settings' ");
+ $r = q("SELECT * FROM hook WHERE hook = 'feature_settings' ");
if(! $r)
$settings_addons = t('No feature settings configured');
diff --git a/Zotlabs/Module/Settings/Tokens.php b/Zotlabs/Module/Settings/Tokens.php
index e63fed128..d32a00c95 100644
--- a/Zotlabs/Module/Settings/Tokens.php
+++ b/Zotlabs/Module/Settings/Tokens.php
@@ -115,6 +115,7 @@ class Tokens {
$desc2 = t('You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:');
$global_perms = \Zotlabs\Access\Permissions::Perms();
+ $their_perms = [];
$existing = get_all_perms(local_channel(),(($atoken_xchan) ? $atoken_xchan : ''));
@@ -123,7 +124,6 @@ class Tokens {
intval(local_channel()),
dbesc($atoken_xchan)
);
- $their_perms = array();
if($theirs) {
foreach($theirs as $t) {
$their_perms[$t['k']] = $t['v'];
diff --git a/Zotlabs/Module/Setup.php b/Zotlabs/Module/Setup.php
index 88481b4b1..b5258a28f 100644
--- a/Zotlabs/Module/Setup.php
+++ b/Zotlabs/Module/Setup.php
@@ -1,9 +1,9 @@
<?php
namespace Zotlabs\Module;
/**
- * @file mod/setup.php
+ * @file Zotlabs/Module/Setup.php
*
- * Controller for the initial setup/installation.
+ * @brief Controller for the initial setup/installation.
*
* @todo This setup module could need some love and improvements.
*/
@@ -13,51 +13,50 @@ namespace Zotlabs\Module;
* @brief Initialisation for the setup module.
*
*/
-
class Setup extends \Zotlabs\Web\Controller {
private static $install_wizard_pass = 1;
-
+ /**
+ * {@inheritDoc}
+ * @see \\Zotlabs\\Web\\Controller::init()
+ */
function init() {
-
// Ensure that if somebody hasn't read the install documentation and doesn't have all
// the required modules or has a totally borked shared hosting provider and they can't
// figure out what the hell is going on - that we at least spit out an error message which
// we can inquire about when they write to tell us that our software doesn't work.
-
+
// The worst thing we can do at this point is throw a white screen of death and rely on
// them knowing about servers and php modules and logfiles enough so that we can guess
// at the source of the problem. As ugly as it may be, we need to throw a technically worded
// PHP error message in their face. Once installation is complete application errors will
// throw a white screen because these error messages divulge information which can
// potentially be useful to hackers.
-
+
error_reporting(E_ERROR | E_WARNING | E_PARSE );
ini_set('log_errors', '0');
ini_set('display_errors', '1');
-
+
// $baseurl/setup/testrwrite to test if rewite in .htaccess is working
if (argc() == 2 && argv(1) == "testrewrite") {
echo 'ok';
killme();
}
-
+
if (x($_POST, 'pass')) {
$this->install_wizard_pass = intval($_POST['pass']);
- }
- else {
+ } else {
$this->install_wizard_pass = 1;
}
}
-
+
/**
* @brief Handle the actions of the different setup steps.
*
*/
-
function post() {
-
+
switch($this->install_wizard_pass) {
case 1:
case 2:
@@ -77,15 +76,15 @@ class Setup extends \Zotlabs\Web\Controller {
$server_role = trim($_POST['server_role']);
if(! $server_role)
$server_role = 'standard';
-
+
// $siteurl should not have a trailing slash
-
+
$siteurl = rtrim($siteurl,'/');
-
+
require_once('include/dba/dba_driver.php');
$db = \DBA::dba_factory($dbhost, $dbport, $dbuser, $dbpass, $dbdata, $dbtype, true);
-
+
if(! \DBA::$dba->connected) {
echo 'Database Connect failed: ' . \DBA::$dba->error;
killme();
@@ -107,7 +106,7 @@ class Setup extends \Zotlabs\Web\Controller {
$server_role = trim($_POST['server_role']);
if(! $server_role)
$server_role = 'standard';
-
+
if($siteurl != z_root()) {
$test = z_fetch_url($siteurl."/setup/testrewrite");
if((! $test['success']) || ($test['body'] != 'ok')) {
@@ -116,7 +115,7 @@ class Setup extends \Zotlabs\Web\Controller {
return;
}
}
-
+
if(! \DBA::$dba->connected) {
// connect to db
$db = \DBA::dba_factory($dbhost, $dbport, $dbuser, $dbpass, $dbdata, $dbtype, true);
@@ -126,7 +125,7 @@ class Setup extends \Zotlabs\Web\Controller {
echo 'CRITICAL: DB not connected.';
killme();
}
-
+
$tpl = get_intltext_template('htconfig.tpl');
$txt = replace_macros($tpl,array(
'$dbhost' => $dbhost,
@@ -142,33 +141,26 @@ class Setup extends \Zotlabs\Web\Controller {
'$phpath' => $phpath,
'$adminmail' => $adminmail
));
-
+
$result = file_put_contents('.htconfig.php', $txt);
if(! $result) {
\App::$data['txt'] = $txt;
}
-
+
$errors = $this->load_database($db);
-
+
if($errors)
\App::$data['db_failed'] = $errors;
else
\App::$data['db_installed'] = true;
-
+
return;
// implied break;
default:
break;
}
}
-
- function get_db_errno() {
- if(class_exists('mysqli'))
- return mysqli_connect_errno();
- else
- return mysql_errno();
- }
-
+
/**
* @brief Get output for the setup page.
*
@@ -178,11 +170,11 @@ class Setup extends \Zotlabs\Web\Controller {
*/
function get() {
-
+
$o = '';
$wizard_status = '';
$install_title = t('$Projectname Server - Setup');
-
+
if(x(\App::$data, 'db_conn_failed')) {
$this->install_wizard_pass = 2;
$wizard_status = t('Could not connect to database.');
@@ -193,7 +185,7 @@ class Setup extends \Zotlabs\Web\Controller {
if(\App::$data['url_error'])
$wizard_status .= ' ' . \App::$data['url_error'];
}
-
+
if(x(\App::$data, 'db_create_failed')) {
$this->install_wizard_pass = 2;
$wizard_status = t('Could not create table.');
@@ -211,7 +203,7 @@ class Setup extends \Zotlabs\Web\Controller {
$db_return_text .= $txt;
}
if(\DBA::$dba && \DBA::$dba->connected) {
- $r = q("SELECT COUNT(*) as `total` FROM `account`");
+ $r = q("SELECT COUNT(*) as total FROM account");
if($r && count($r) && $r[0]['total']) {
$tpl = get_markup_template('install.tpl');
return replace_macros($tpl, array(
@@ -222,11 +214,11 @@ class Setup extends \Zotlabs\Web\Controller {
));
}
}
-
+
if(x(\App::$data, 'txt') && strlen(\App::$data['txt'])) {
$db_return_text .= $this->manual_config($a);
}
-
+
if ($db_return_text != "") {
$tpl = get_markup_template('install.tpl');
return replace_macros($tpl, array(
@@ -235,33 +227,33 @@ class Setup extends \Zotlabs\Web\Controller {
'$text' => $db_return_text . $this->what_next(),
));
}
-
+
switch ($this->install_wizard_pass){
case 1: { // System check
-
+
$checks = array();
-
+
$this->check_funcs($checks);
-
+
$this->check_htconfig($checks);
-
+
$this->check_store($checks);
-
+
$this->check_smarty3($checks);
-
+
$this->check_keys($checks);
-
+
if (x($_POST, 'phpath'))
$phpath = notags(trim($_POST['phpath']));
-
+
$this->check_php($phpath, $checks);
-
+
$this->check_phpconfig($checks);
-
+
$this->check_htaccess($checks);
-
+
$checkspassed = array_reduce($checks, "self::check_passed", true);
-
+
$tpl = get_markup_template('install_checks.tpl');
$o .= replace_macros($tpl, array(
'$title' => $install_title,
@@ -276,9 +268,9 @@ class Setup extends \Zotlabs\Web\Controller {
));
return $o;
}; break;
-
+
case 2: { // Database config
-
+
$dbhost = ((x($_POST,'dbhost')) ? trim($_POST['dbhost']) : '127.0.0.1');
$dbuser = trim($_POST['dbuser']);
$dbport = intval(trim($_POST['dbport']));
@@ -288,7 +280,7 @@ class Setup extends \Zotlabs\Web\Controller {
$phpath = trim($_POST['phpath']);
$adminmail = trim($_POST['adminmail']);
$siteurl = trim($_POST['siteurl']);
-
+
$tpl = get_markup_template('install_db.tpl');
$o .= replace_macros($tpl, array(
'$title' => $install_title,
@@ -296,24 +288,24 @@ class Setup extends \Zotlabs\Web\Controller {
'$info_01' => t('In order to install $Projectname we need to know how to connect to your database.'),
'$info_02' => t('Please contact your hosting provider or site administrator if you have questions about these settings.'),
'$info_03' => t('The database you specify below should already exist. If it does not, please create it before continuing.'),
-
+
'$status' => $wizard_status,
-
+
'$dbhost' => array('dbhost', t('Database Server Name'), $dbhost, t('Default is 127.0.0.1')),
'$dbport' => array('dbport', t('Database Port'), $dbport, t('Communication port number - use 0 for default')),
'$dbuser' => array('dbuser', t('Database Login Name'), $dbuser, ''),
'$dbpass' => array('dbpass', t('Database Login Password'), $dbpass, ''),
'$dbdata' => array('dbdata', t('Database Name'), $dbdata, ''),
'$dbtype' => array('dbtype', t('Database Type'), $dbtype, '', array( 0=>'MySQL', 1=>'PostgreSQL' )),
-
+
'$adminmail' => array('adminmail', t('Site administrator email address'), $adminmail, t('Your account email address must match this in order to use the web admin panel.')),
'$siteurl' => array('siteurl', t('Website URL'), z_root(), t('Please use SSL (https) URL if available.')),
'$lbl_10' => t('Please select a default timezone for your website'),
-
+
'$baseurl' => z_root(),
-
+
'$phpath' => $phpath,
-
+
'$submit' => t('Submit'),
));
return $o;
@@ -327,11 +319,11 @@ class Setup extends \Zotlabs\Web\Controller {
$dbdata = trim($_POST['dbdata']);
$dbtype = intval(trim($_POST['dbtype']));
$phpath = trim($_POST['phpath']);
-
+
$adminmail = trim($_POST['adminmail']);
$siteurl = trim($_POST['siteurl']);
$timezone = ((x($_POST,'timezone')) ? ($_POST['timezone']) : 'America/Los_Angeles');
-
+
$server_roles = [
'basic' => t('Basic/Minimal Social Networking'),
'standard' => t('Standard Configuration (default)'),
@@ -343,7 +335,7 @@ class Setup extends \Zotlabs\Web\Controller {
'$title' => $install_title,
'$pass' => t('Site settings'),
'$status' => $wizard_status,
-
+
'$dbhost' => $dbhost,
'$dbport' => $dbport,
'$dbuser' => $dbuser,
@@ -351,24 +343,24 @@ class Setup extends \Zotlabs\Web\Controller {
'$dbdata' => $dbdata,
'$phpath' => $phpath,
'$dbtype' => $dbtype,
-
+
'$adminmail' => array('adminmail', t('Site administrator email address'), $adminmail, t('Your account email address must match this in order to use the web admin panel.')),
-
+
'$siteurl' => array('siteurl', t('Website URL'), z_root(), t('Please use SSL (https) URL if available.')),
- '$server_role' => array('server_role', t("Server Configuration/Role"), 'standard','',$server_roles),
-
+ '$server_role' => array('server_role', t("Server Configuration/Role"), 'standard','',$server_roles),
+
'$timezone' => array('timezone', t('Please select a default timezone for your website'), $timezone, '', get_timezones()),
-
+
'$baseurl' => z_root(),
-
+
'$submit' => t('Submit'),
));
return $o;
}; break;
}
}
-
+
/**
* @brief Add a check result to the array for output.
*
@@ -376,7 +368,7 @@ class Setup extends \Zotlabs\Web\Controller {
* @param string $title a title for the check
* @param boolean $status
* @param boolean $required
- * @param[optional] string $help optional help string
+ * @param string $help optional help string
*/
function check_add(&$checks, $title, $status, $required, $help = '') {
$checks[] = array(
@@ -386,7 +378,7 @@ class Setup extends \Zotlabs\Web\Controller {
'help' => $help
);
}
-
+
/**
* @brief Checks the PHP environment.
*
@@ -395,7 +387,7 @@ class Setup extends \Zotlabs\Web\Controller {
*/
function check_php(&$phpath, &$checks) {
$help = '';
-
+
if(version_compare(PHP_VERSION, '5.5') < 0) {
$help .= t('PHP version 5.5 or greater is required.');
$this->check_add($checks, t('PHP version'), false, false, $help);
@@ -403,15 +395,16 @@ class Setup extends \Zotlabs\Web\Controller {
if (strlen($phpath)) {
$passed = file_exists($phpath);
- } else {
+ }
+ elseif(function_exists('shell_exec')) {
if(is_windows())
$phpath = trim(shell_exec('where php'));
else
$phpath = trim(shell_exec('which php'));
-
+
$passed = strlen($phpath);
}
-
+
if(!$passed) {
$help .= t('Could not find a command line version of PHP in the web server PATH.'). EOL;
$help .= t('If you don\'t have a command line version of PHP installed on server, you will not be able to run background polling via cron.') . EOL;
@@ -422,24 +415,28 @@ class Setup extends \Zotlabs\Web\Controller {
));
$phpath = '';
}
-
+
$this->check_add($checks, t('Command line PHP').($passed?" (<tt>$phpath</tt>)":""), $passed, false, $help);
-
+
if($passed) {
$str = autoname(8);
$cmd = "$phpath install/testargs.php $str";
- $result = trim(shell_exec($cmd));
- $passed2 = $result == $str;
$help = '';
+
+ if(function_exists('shell_exec'))
+ $result = trim(shell_exec($cmd));
+ else
+ $help .= t('Unable to check command line PHP, as shell_exec() is disabled. This is required.') . EOL;
+ $passed2 = (($result == $str) ? true : false);
if(!$passed2) {
$help .= t('The command line version of PHP on your system does not have "register_argc_argv" enabled.'). EOL;
$help .= t('This is required for message delivery to work.');
}
-
+
$this->check_add($checks, t('PHP register_argc_argv'), $passed, true, $help);
}
}
-
+
/**
* @brief Some PHP configuration checks.
*
@@ -450,20 +447,20 @@ class Setup extends \Zotlabs\Web\Controller {
*/
function check_phpconfig(&$checks) {
require_once 'include/environment.php';
-
+
$help = '';
-
+
$result = getPhpiniUploadLimits();
$help = sprintf(t('Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once.'),
userReadableSize($result['post_max_size']),
userReadableSize($result['max_upload_filesize']),
$result['max_file_uploads']
);
- $help .= '<br>' . t('You can adjust these settings in the servers php.ini.');
-
+ $help .= '<br>' . t('You can adjust these settings in the server php.ini file.');
+
$this->check_add($checks, t('PHP upload limits'), true, false, $help);
}
-
+
/**
* @brief Check if the openssl implementation can generate keys.
*
@@ -472,7 +469,7 @@ class Setup extends \Zotlabs\Web\Controller {
function check_keys(&$checks) {
$help = '';
$res = false;
-
+
if (function_exists('openssl_pkey_new')) {
$res = openssl_pkey_new(array(
'digest_alg' => 'sha1',
@@ -480,17 +477,17 @@ class Setup extends \Zotlabs\Web\Controller {
'encrypt_key' => false)
);
}
-
+
// Get private key
-
+
if (! $res) {
$help .= t('Error: the "openssl_pkey_new" function on this system is not able to generate encryption keys'). EOL;
$help .= t('If running under Windows, please see "http://www.php.net/manual/en/openssl.installation.php".');
}
-
+
$this->check_add($checks, t('Generate encryption keys'), $res, true, $help);
}
-
+
/**
* @brief Check for some PHP functions and modules.
*
@@ -498,15 +495,15 @@ class Setup extends \Zotlabs\Web\Controller {
*/
function check_funcs(&$checks) {
$ck_funcs = array();
-
+
// add check metadata, the real check is done bit later and return values set
$this->check_add($ck_funcs, t('libCurl PHP module'), true, true);
$this->check_add($ck_funcs, t('GD graphics PHP module'), true, true);
$this->check_add($ck_funcs, t('OpenSSL PHP module'), true, true);
- $this->check_add($ck_funcs, t('mysqli or postgres PHP module'), true, true);
+ $this->check_add($ck_funcs, t('PDO database PHP module'), true, true);
$this->check_add($ck_funcs, t('mb_string PHP module'), true, true);
$this->check_add($ck_funcs, t('xml PHP module'), true, true);
-
+
if(function_exists('apache_get_modules')){
if (! in_array('mod_rewrite', apache_get_modules())) {
$this->check_add($ck_funcs, t('Apache mod_rewrite module'), false, true, t('Error: Apache webserver mod-rewrite module is required but not installed.'));
@@ -514,13 +511,19 @@ class Setup extends \Zotlabs\Web\Controller {
$this->check_add($ck_funcs, t('Apache mod_rewrite module'), true, true);
}
}
- if((! function_exists('proc_open')) || strstr(ini_get('disable_functions'),'proc_open')) {
- $this->check_add($ck_funcs, t('proc_open'), false, true, t('Error: proc_open is required but is either not installed or has been disabled in php.ini'));
+ if((! function_exists('exec')) || strstr(ini_get('disable_functions'),'exec')) {
+ $this->check_add($ck_funcs, t('exec'), false, true, t('Error: exec is required but is either not installed or has been disabled in php.ini'));
+ }
+ else {
+ $this->check_add($ck_funcs, t('exec'), true, true);
+ }
+ if((! function_exists('shell_exec')) || strstr(ini_get('disable_functions'),'shell_exec')) {
+ $this->check_add($ck_funcs, t('shell_exec'), false, true, t('Error: shell_exec is required but is either not installed or has been disabled in php.ini'));
}
else {
- $this->check_add($ck_funcs, t('proc_open'), true, true);
+ $this->check_add($ck_funcs, t('shell_exec'), true, true);
}
-
+
if(! function_exists('curl_init')) {
$ck_funcs[0]['status'] = false;
$ck_funcs[0]['help'] = t('Error: libCURL PHP module required but not installed.');
@@ -533,9 +536,9 @@ class Setup extends \Zotlabs\Web\Controller {
$ck_funcs[2]['status'] = false;
$ck_funcs[2]['help'] = t('Error: openssl PHP module required but not installed.');
}
- if(! function_exists('mysqli_connect') && !function_exists('pg_connect')) {
+ if(! class_exists('PDO')) {
$ck_funcs[3]['status'] = false;
- $ck_funcs[3]['help'] = t('Error: mysqli or postgres PHP module required but neither are installed.');
+ $ck_funcs[3]['help'] = t('Error: PDO database PHP module required but not installed.');
}
if(! function_exists('mb_strlen')) {
$ck_funcs[4]['status'] = false;
@@ -545,10 +548,10 @@ class Setup extends \Zotlabs\Web\Controller {
$ck_funcs[6]['status'] = false;
$ck_funcs[6]['help'] = t('Error: xml PHP module required for DAV but not installed.');
}
-
+
$checks = array_merge($checks, $ck_funcs);
}
-
+
/**
* @brief Check for .htconfig requirements.
*
@@ -557,7 +560,7 @@ class Setup extends \Zotlabs\Web\Controller {
function check_htconfig(&$checks) {
$status = true;
$help = '';
-
+
if( (file_exists('.htconfig.php') && !is_writable('.htconfig.php')) ||
(!file_exists('.htconfig.php') && !is_writable('.')) ) {
$status = false;
@@ -566,10 +569,10 @@ class Setup extends \Zotlabs\Web\Controller {
$help .= t('At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder.').EOL;
$help .= t('You can alternatively skip this procedure and perform a manual installation. Please see the file "install/INSTALL.txt" for instructions.').EOL;
}
-
+
$this->check_add($checks, t('.htconfig.php is writable'), $status, false, $help);
}
-
+
/**
* @brief Checks for our templating engine Smarty3 requirements.
*
@@ -578,18 +581,18 @@ class Setup extends \Zotlabs\Web\Controller {
function check_smarty3(&$checks) {
$status = true;
$help = '';
-
+
if(! is_writable(TEMPLATE_BUILD_PATH) ) {
$status = false;
- $help = t('Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.') .EOL;
+ $help = t('This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.') .EOL;
$help .= sprintf( t('In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder.'), TEMPLATE_BUILD_PATH) . EOL;
$help .= t('Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.').EOL;
$help .= sprintf( t('Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains.'), TEMPLATE_BUILD_PATH) . EOL;
}
-
+
$this->check_add($checks, sprintf( t('%s is writable'), TEMPLATE_BUILD_PATH), $status, true, $help);
}
-
+
/**
* @brief Check for store directory.
*
@@ -598,18 +601,18 @@ class Setup extends \Zotlabs\Web\Controller {
function check_store(&$checks) {
$status = true;
$help = '';
-
+
@os_mkdir(TEMPLATE_BUILD_PATH, STORAGE_DEFAULT_PERMISSIONS, true);
-
+
if(! is_writable('store')) {
$status = false;
- $help = t('This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder') . EOL;
+ $help = t('This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder') . EOL;
$help .= t('Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.').EOL;
}
-
+
$this->check_add($checks, t('store is writable'), $status, true, $help);
}
-
+
/**
* @brief Check URL rewrite und SSL certificate.
*
@@ -620,9 +623,9 @@ class Setup extends \Zotlabs\Web\Controller {
$status = true;
$help = '';
$ssl_error = false;
-
+
$url = z_root() . '/setup/testrewrite';
-
+
if (function_exists('curl_init')){
$test = z_fetch_url($url);
if(! $test['success']) {
@@ -638,7 +641,7 @@ class Setup extends \Zotlabs\Web\Controller {
$ssl_error = true;
}
}
-
+
if($ssl_error) {
$help = t('SSL certificate cannot be validated. Fix certificate or disable https access to this site.') . EOL;
$help .= t('If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!') . EOL;
@@ -649,31 +652,35 @@ class Setup extends \Zotlabs\Web\Controller {
$help .= t('If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications.') . EOL;
-
$this->check_add($checks, t('SSL certificate validation'), false, true, $help);
}
}
-
+
if ((! $test['success']) || ($test['body'] != "ok")) {
$status = false;
$help = t('Url rewrite in .htaccess is not working. Check your server configuration.'.'Test: '.var_export($test,true));
}
-
+
$this->check_add($checks, t('Url rewrite is working'), $status, true, $help);
} else {
// cannot check modrewrite if libcurl is not installed
}
}
-
-
+
+ /**
+ * @brief
+ *
+ * @param App &$a
+ * @return string with paresed HTML
+ */
function manual_config(&$a) {
$data = htmlspecialchars(\App::$data['txt'], ENT_COMPAT, 'UTF-8');
$o = t('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.');
$o .= "<textarea rows=\"24\" cols=\"80\" >$data</textarea>";
-
+
return $o;
}
-
+
function load_database_rem($v, $i){
$l = trim($i);
if (strlen($l)>1 && ($l[0]=="-" || ($l[0]=="/" && $l[1]=="*"))){
@@ -682,11 +689,11 @@ class Setup extends \Zotlabs\Web\Controller {
return $v."\n".$i;
}
}
-
-
+
+
function load_database($db) {
$str = file_get_contents(\DBA::$dba->get_install_script());
- $arr = explode(';',$str);
+ $arr = explode(';', $str);
$errors = false;
foreach($arr as $a) {
if(strlen(trim($a))) {
@@ -696,21 +703,25 @@ class Setup extends \Zotlabs\Web\Controller {
}
}
}
-
+
return $errors;
}
-
+
+ /**
+ * @brief
+ *
+ * @return string with parsed HTML
+ */
function what_next() {
$a = get_app();
// install the standard theme
set_config('system', 'allowed_themes', 'redbasic');
-
// Set a lenient list of ciphers if using openssl. Other ssl engines
// (e.g. NSS used in RedHat) require different syntax, so hopefully
// the default curl cipher list will work for most sites. If not,
// this can set via config. Many distros are now disabling RC4,
- // but many Red sites still use it and are unable to change it.
+ // but many existing sites still use it and are unable to change it.
// We do not use SSL for encryption, only to protect session cookies.
// z_fetch_url() is also used to import shared links and other content
// so in theory most any cipher could show up and we should do our best
@@ -718,15 +729,15 @@ class Setup extends \Zotlabs\Web\Controller {
// weird SSL error which they can't do anything about. This does not affect
// the SSL server, but is only a client negotiation to find something workable.
// Hence it will not make your system susceptible to POODL or other nasties.
-
+
$x = curl_version();
if(stristr($x['ssl_version'],'openssl'))
set_config('system','curl_ssl_ciphers','ALL:!eNULL');
-
+
// Create a system channel
require_once ('include/channel.php');
create_sys_channel();
-
+
$baseurl = z_root();
return
t('<h1>What next</h1>')
@@ -737,13 +748,18 @@ class Setup extends \Zotlabs\Web\Controller {
."</p>";
}
-
+ /**
+ * @brief
+ *
+ * @param unknown $v
+ * @param array $c
+ * @return array
+ */
static private function check_passed($v, $c) {
if ($c['required'])
$v = $v && $c['status'];
-
+
return $v;
}
-
}
diff --git a/Zotlabs/Module/Siteinfo.php b/Zotlabs/Module/Siteinfo.php
index a15e2896d..7c3918425 100644
--- a/Zotlabs/Module/Siteinfo.php
+++ b/Zotlabs/Module/Siteinfo.php
@@ -15,63 +15,33 @@ class Siteinfo extends \Zotlabs\Web\Controller {
function get() {
- if(! get_config('system','hidden_version_siteinfo')) {
- $version = sprintf( t('Version %s'), \Zotlabs\Lib\System::get_project_version());
- if(@is_dir('.git') && function_exists('shell_exec')) {
- $commit = @shell_exec('git log -1 --format="%h"');
- $tag = \Zotlabs\Lib\System::get_std_version(); // @shell_exec('git describe --tags --abbrev=0');
- }
- if(! isset($commit) || strlen($commit) > 16)
- $commit = '';
- }
- else {
- $version = $commit = '';
- }
+ $siteinfo = replace_macros(get_markup_template('siteinfo.tpl'),
+ [
+ '$title' => t('About this site'),
+ '$sitenametxt' => t('Site Name'),
+ '$sitename' => \Zotlabs\Lib\System::get_site_name(),
+ '$headline' => t('Site Information'),
+ '$site_about' => bbcode(get_config('system','siteinfo')),
+ '$admin_headline' => t('Administrator'),
+ '$admin_about' => bbcode(get_config('system','admininfo')),
+ '$terms' => t('Terms of Service'),
+ '$prj_header' => t('Software and Project information'),
+ '$prj_name' => t('This site is powered by $Projectname'),
+ '$prj_transport' => t('Federated and decentralised networking and identity services provided by Zot'),
+ '$transport_link' => '<a href="https://zotlabs.com">https://zotlabs.com</a>',
+ '$prj_version' => ((get_config('system','hidden_version_siteinfo')) ? '' : sprintf( t('Version %s'), \Zotlabs\Lib\System::get_project_version())),
+ '$prj_linktxt' => t('Project homepage'),
+ '$prj_srctxt' => t('Developer homepage'),
+ '$prj_link' => \Zotlabs\Lib\System::get_project_link(),
+ '$prj_src' => \Zotlabs\Lib\System::get_project_srclink(),
+ ]
+ );
- $plugins_list = implode(', ',visible_plugin_list());
+ call_hooks('about_hook', $siteinfo);
+
+ return $siteinfo;
- if($plugins_list)
- $plugins_text = t('Installed plugins/addons/apps:');
- else
- $plugins_text = t('No installed plugins/addons/apps');
-
- $txt = get_config('system','admininfo');
- $admininfo = bbcode($txt);
-
- if(file_exists('doc/site_donate.html'))
- $donate .= file_get_contents('doc/site_donate.html');
-
- if(function_exists('sys_getloadavg'))
- $loadavg = sys_getloadavg();
-
- $o = replace_macros(get_markup_template('siteinfo.tpl'), array(
- '$title' => t('$Projectname'),
- '$description' => t('This is a hub of $Projectname - a global cooperative network of decentralized privacy enhanced websites.'),
- '$version' => $version,
- '$tag_txt' => t('Tag: '),
- '$tag' => $tag,
- '$polled' => t('Last background fetch: '),
- '$lastpoll' => get_poller_runtime(),
- '$load_average' => t('Current load average: '),
- '$loadavg_all' => $loadavg[0] . ', ' . $loadavg[1] . ', ' . $loadavg[2],
- '$commit' => $commit,
- '$web_location' => t('Running at web location') . ' ' . z_root(),
- '$visit' => t('Please visit <a href="http://hubzilla.org">hubzilla.org</a> to learn more about $Projectname.'),
- '$bug_text' => t('Bug reports and issues: please visit'),
- '$bug_link_url' => 'https://github.com/redmatrix/hubzilla/issues',
- '$bug_link_text' => t('$projectname issues'),
- '$contact' => t('Suggestions, praise, etc. - please email "redmatrix" at librelist - dot com'),
- '$donate' => $donate,
- '$adminlabel' => t('Site Administrators'),
- '$admininfo' => $admininfo,
- '$plugins_text' => $plugins_text,
- '$plugins_list' => $plugins_list
- ));
-
- call_hooks('about_hook', $o);
-
- return $o;
-
}
+
}
diff --git a/Zotlabs/Module/Snap.php b/Zotlabs/Module/Snap.php
new file mode 100644
index 000000000..89aebc097
--- /dev/null
+++ b/Zotlabs/Module/Snap.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace Zotlabs\Module;
+
+/**
+ * @brief Initialize Hubzilla's cloud (SabreDAV).
+ *
+ * Module for accessing the DAV storage area from a DAV client.
+ */
+
+use \Sabre\DAV as SDAV;
+use \Zotlabs\Storage;
+
+// composer autoloader for SabreDAV
+require_once('vendor/autoload.php');
+
+
+/**
+ * @brief Fires up the SabreDAV server.
+ *
+ * @param App &$a
+ */
+
+class Snap extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ // workaround for HTTP-auth in CGI mode
+ if (x($_SERVER, 'REDIRECT_REMOTE_USER')) {
+ $userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"], 6)) ;
+ if(strlen($userpass)) {
+ list($name, $password) = explode(':', $userpass);
+ $_SERVER['PHP_AUTH_USER'] = $name;
+ $_SERVER['PHP_AUTH_PW'] = $password;
+ }
+ }
+
+ if (x($_SERVER, 'HTTP_AUTHORIZATION')) {
+ $userpass = base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)) ;
+ if(strlen($userpass)) {
+ list($name, $password) = explode(':', $userpass);
+ $_SERVER['PHP_AUTH_USER'] = $name;
+ $_SERVER['PHP_AUTH_PW'] = $password;
+ }
+ }
+
+ if (! is_dir('store'))
+ os_mkdir('store', STORAGE_DEFAULT_PERMISSIONS, false);
+
+ $which = null;
+ if (argc() > 1)
+ $which = argv(1);
+
+ $profile = 0;
+
+ if($which)
+ profile_load( $which, $profile);
+ else
+ killme();
+
+ if($_SERVER['PHP_AUTH_USER'] && $_SERVER['PHP_AUTH_USER'] !== $which)
+ killme();
+
+ if(local_channel()) {
+ $c = \App::get_channel();
+ if($c && $c['channel_address'] !== $which)
+ killme();
+ }
+
+ if(! in_array(strtolower($_SERVER['REQUEST_METHOD']),['propfind','get','head']))
+ killme();
+
+ $auth = new \Zotlabs\Storage\BasicAuth();
+ $auth->setRealm(ucfirst(\Zotlabs\Lib\System::get_platform_name()) . 'WebDAV');
+
+ $rootDirectory = new SDAV\FS\Directory("store");
+
+ // The server object is responsible for making sense out of the WebDAV protocol
+ $server = new SDAV\Server($rootDirectory);
+
+ $authPlugin = new \Sabre\DAV\Auth\Plugin($auth);
+ $server->addPlugin($authPlugin);
+
+ // If your server is not on your webroot, make sure the following line has the
+ // correct information
+ $server->setBaseUri('/snap');
+
+ // The lock manager is reponsible for making sure users don't overwrite
+ // each others changes.
+ $lockBackend = new SDAV\Locks\Backend\File('store/[data]/locks');
+ $lockPlugin = new SDAV\Locks\Plugin($lockBackend);
+ $server->addPlugin($lockPlugin);
+
+ // This ensures that we get a pretty index in the browser, but it is
+ // optional.
+
+// $server->addPlugin(new SDAV\Browser\Plugin());
+
+ // All we need to do now, is to fire up the server
+ $server->exec();
+ killme();
+
+ }
+
+}
diff --git a/Zotlabs/Module/Sslify.php b/Zotlabs/Module/Sslify.php
index db73f85e0..2891f3691 100644
--- a/Zotlabs/Module/Sslify.php
+++ b/Zotlabs/Module/Sslify.php
@@ -10,21 +10,16 @@ class Sslify extends \Zotlabs\Web\Controller {
$h = explode("\n",$x['header']);
foreach ($h as $l) {
list($k,$v) = array_map("trim", explode(":", trim($l), 2));
- $hdrs[$k] = $v;
+ $hdrs[strtolower($k)] = $v;
}
- if (array_key_exists('Content-Type', $hdrs))
- $type = $hdrs['Content-Type'];
-
- header('Content-Type: ' . $type);
+ if (array_key_exists('content-type', $hdrs)) {
+ $type = $hdrs['content-type'];
+ header('Content-Type: ' . $type);
+ }
+
echo $x['body'];
killme();
}
killme();
- // for some reason when this fallback is in place - it gets triggered
- // often, (creating mixed content exceptions) even though there is
- // nothing obvious missing on the page when we bypass it.
- goaway($_REQUEST['url']);
- }
-
-
+ }
}
diff --git a/Zotlabs/Module/Tagrm.php b/Zotlabs/Module/Tagrm.php
index 42aa6e90f..a6dc21798 100644
--- a/Zotlabs/Module/Tagrm.php
+++ b/Zotlabs/Module/Tagrm.php
@@ -18,7 +18,7 @@ class Tagrm extends \Zotlabs\Web\Controller {
$tag = ((x($_POST,'tag')) ? trim($_POST['tag']) : '');
$item = ((x($_POST,'item')) ? intval($_POST['item']) : 0 );
- $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM item WHERE id = %d AND uid = %d LIMIT 1",
intval($item),
intval(local_channel())
);
@@ -67,7 +67,7 @@ class Tagrm extends \Zotlabs\Web\Controller {
$item = intval(argv(2));
$tag = argv(3);
- $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM item WHERE id = %d AND uid = %d LIMIT 1",
intval($item),
intval(local_channel())
);
@@ -107,7 +107,7 @@ class Tagrm extends \Zotlabs\Web\Controller {
$item = intval(argv(2));
- $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM item WHERE id = %d AND uid = %d LIMIT 1",
intval($item),
intval(local_channel())
);
diff --git a/Zotlabs/Module/Tasks.php b/Zotlabs/Module/Tasks.php
index 6d0a92d91..c8deb11bf 100644
--- a/Zotlabs/Module/Tasks.php
+++ b/Zotlabs/Module/Tasks.php
@@ -45,7 +45,7 @@ class Tasks extends \Zotlabs\Web\Controller {
if((argc() > 2) && (argv(1) === 'complete') && intval(argv(2))) {
$ret = array('success' => false);
- $r = q("select * from event where `etype` = 'task' and uid = %d and id = %d limit 1",
+ $r = q("select * from event where etype = 'task' and uid = %d and id = %d limit 1",
intval(local_channel()),
intval(argv(2))
);
diff --git a/Zotlabs/Module/Thing.php b/Zotlabs/Module/Thing.php
index a7ac63f73..95c6c5636 100644
--- a/Zotlabs/Module/Thing.php
+++ b/Zotlabs/Module/Thing.php
@@ -1,10 +1,10 @@
<?php
-namespace Zotlabs\Module;
/**
- * @file mod/thing.php
- * @brief
+ * @file Zotlabs/Module/Thing.php
*/
+namespace Zotlabs\Module;
+
require_once('include/items.php');
require_once('include/security.php');
require_once('include/selectors.php');
@@ -14,72 +14,72 @@ require_once('include/acl_selectors.php');
class Thing extends \Zotlabs\Web\Controller {
function init() {
-
+
if(! local_channel())
return;
-
+
$channel = \App::get_channel();
-
+
$term_hash = (($_REQUEST['term_hash']) ? $_REQUEST['term_hash'] : '');
-
+
$name = escape_tags($_REQUEST['term']);
$verb = escape_tags($_REQUEST['verb']);
$activity = intval($_REQUEST['activity']);
$profile_guid = escape_tags($_REQUEST['profile_assign']);
$url = $_REQUEST['url'];
$photo = $_REQUEST['img'];
-
+
$hash = random_string();
-
+
$verbs = obj_verbs();
-
+
/**
- * verbs: [0] = first person singular, e.g. "I want", [1] = 3rd person singular, e.g. "Bill wants"
+ * verbs: [0] = first person singular, e.g. "I want", [1] = 3rd person singular, e.g. "Bill wants"
* We use the first person form when creating an activity, but the third person for use in activities
* @FIXME There is no accounting for verb gender for languages where this is significant. We may eventually
* require obj_verbs() to provide full conjugations and specify which form to use in the $_REQUEST params to this module.
*/
-
+
$translated_verb = $verbs[$verb][1];
-
+
/*
* The site administrator can do things that normals cannot.
* This is restricted because it will likely cause
* an activitystreams protocol violation and the activity might
- * choke in some other network and result in unnecessary
+ * choke in some other network and result in unnecessary
* support requests. It isn't because we're trying to be heavy-handed
- * about what you can and can't do.
+ * about what you can and can't do.
*/
-
+
if(! $translated_verb) {
if(is_site_admin())
$translated_verb = $verb;
}
-
+
/*
* Things, objects: We do not provide definite (a, an) or indefinite (the) articles or singular/plural designators
- * That needs to be specified in your thing. e.g. Mike has "a carrot", Greg wants "balls", Bob likes "the Boston Red Sox".
+ * That needs to be specified in your thing. e.g. Mike has "a carrot", Greg wants "balls", Bob likes "the Boston Red Sox".
*/
-
+
/*
* Future work on this module might produce more complex activities with targets, e.g. Phillip likes Karen's moustache
* and to describe other non-thing objects like channels, such as Karl wants Susan - where Susan represents a channel profile.
*/
-
+
if((! $name) || (! $translated_verb))
return;
-
+
$acl = new \Zotlabs\Access\AccessList($channel);
-
+
if(array_key_exists('contact_allow',$_REQUEST)
|| array_key_exists('group_allow',$_REQUEST)
|| array_key_exists('contact_deny',$_REQUEST)
|| array_key_exists('group_deny',$_REQUEST)) {
$acl->set_from_array($_REQUEST);
}
-
+
$x = $acl->get();
-
+
if($term_hash) {
$t = q("select * from obj where obj_obj = '%s' and obj_channel = %d limit 1",
dbesc($term_hash),
@@ -97,7 +97,7 @@ class Thing extends \Zotlabs\Web\Controller {
}
else
$local_photo = $orig_record['obj_imgurl'];
-
+
$r = q("update obj set obj_term = '%s', obj_url = '%s', obj_imgurl = '%s', obj_edited = '%s', allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' where obj_obj = '%s' and obj_channel = %d ",
dbesc($name),
dbesc(($url) ? $url : z_root() . '/thing/' . $term_hash),
@@ -110,9 +110,9 @@ class Thing extends \Zotlabs\Web\Controller {
dbesc($term_hash),
intval(local_channel())
);
-
+
info( t('Thing updated') . EOL);
-
+
$r = q("select * from obj where obj_channel = %d and obj_obj = '%s' limit 1",
intval(local_channel()),
dbesc($term_hash)
@@ -120,31 +120,31 @@ class Thing extends \Zotlabs\Web\Controller {
if($r) {
build_sync_packet(0, array('obj' => $r));
}
-
+
return;
}
-
+
$sql = (($profile_guid) ? " and profile_guid = '" . dbesc($profile_guid) . "' " : " and is_default = 1 ");
$p = q("select profile_guid, is_default from profile where uid = %d $sql limit 1",
intval(local_channel())
);
-
+
if($p)
$profile = $p[0];
else
return;
-
+
$local_photo = null;
-
+
if($photo) {
$arr = import_xchan_photo($photo,get_observer_hash(),true);
$local_photo = $arr[0];
$local_photo_type = $arr[3];
}
-
+
$created = datetime_convert();
$url = (($url) ? $url : z_root() . '/thing/' . $hash);
-
+
$r = q("insert into obj ( obj_page, obj_verb, obj_type, obj_channel, obj_obj, obj_term, obj_url, obj_imgurl, obj_created, obj_edited, allow_cid, allow_gid, deny_cid, deny_gid ) values ('%s','%s', %d, %d, '%s','%s','%s','%s','%s','%s','%s','%s','%s','%s') ",
dbesc($profile['profile_guid']),
dbesc($verb),
@@ -161,14 +161,14 @@ class Thing extends \Zotlabs\Web\Controller {
dbesc($x['deny_cid']),
dbesc($x['deny_gid'])
);
-
+
if(! $r) {
notice( t('Object store: failed'));
return;
}
-
+
info( t('Thing added'));
-
+
$r = q("select * from obj where obj_channel = %d and obj_obj = '%s' limit 1",
intval(local_channel()),
dbesc($hash)
@@ -176,15 +176,15 @@ class Thing extends \Zotlabs\Web\Controller {
if($r) {
build_sync_packet(0, array('obj' => $r));
}
-
+
if($activity) {
$arr = array();
$links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $url));
if($local_photo)
$links[] = array('rel' => 'photo', 'type' => $local_photo_type, 'href' => $local_photo);
-
+
$objtype = ACTIVITY_OBJ_THING;
-
+
$obj = json_encode(array(
'type' => $objtype,
'id' => $url,
@@ -192,28 +192,28 @@ class Thing extends \Zotlabs\Web\Controller {
'title' => $name,
'content' => $name
));
-
+
$bodyverb = str_replace('OBJ: ', '',t('OBJ: %1$s %2$s %3$s'));
-
+
$arr['owner_xchan'] = $channel['channel_hash'];
$arr['author_xchan'] = $channel['channel_hash'];
-
+
$arr['item_origin'] = 1;
$arr['item_wall'] = 1;
$arr['item_thread_top'] = 1;
-
+
$ulink = '[zrl=' . $channel['xchan_url'] . ']' . $channel['channel_name'] . '[/zrl]';
$plink = '[zrl=' . $url . ']' . $name . '[/zrl]';
-
+
$arr['body'] = sprintf( $bodyverb, $ulink, $translated_verb, $plink );
-
+
if($local_photo)
$arr['body'] .= "\n\n[zmg]" . $local_photo . "[/zmg]";
-
+
$arr['verb'] = $verb;
$arr['obj_type'] = $objtype;
$arr['obj'] = $obj;
-
+
if(! $profile['is_default']) {
$arr['item_private'] = true;
$str = '';
@@ -229,37 +229,37 @@ class Thing extends \Zotlabs\Web\Controller {
else
$arr['allow_cid'] = '<' . get_observer_hash() . '>';
}
-
+
$ret = post_activity_item($arr);
}
}
-
-
+
+
function get() {
-
+
// @FIXME one problem with things is we can't share them unless we provide the channel in the url
- // so we can definitively lookup the owner.
-
+ // so we can definitively lookup the owner.
+
if(argc() == 2) {
-
+
$r = q("select obj_channel from obj where obj_type = %d and obj_obj = '%s' limit 1",
intval(TERM_OBJ_THING),
dbesc(argv(1))
);
- if($r)
+ if($r)
$sql_extra = permissions_sql($r[0]['obj_channel']);
-
+
$r = q("select * from obj where obj_type = %d and obj_obj = '%s' $sql_extra limit 1",
intval(TERM_OBJ_THING),
dbesc(argv(1))
);
-
+
if($r) {
return replace_macros(get_markup_template('show_thing.tpl'), array(
'$header' => t('Show Thing'),
'$edit' => t('Edit'),
'$delete' => t('Delete'),
- '$canedit' => ((local_channel() && local_channel() == $r[0]['obj_channel']) ? true : false),
+ '$canedit' => ((local_channel() && local_channel() == $r[0]['obj_channel']) ? true : false),
'$thing' => $r[0] ));
}
else {
@@ -267,34 +267,34 @@ class Thing extends \Zotlabs\Web\Controller {
return;
}
}
-
+
$channel = \App::get_channel();
-
+
if(! (local_channel() && $channel)) {
notice( t('Permission denied.') . EOL);
return;
}
-
+
$acl = new \Zotlabs\Access\AccessList($channel);
$channel_acl = $acl->get();
-
+
$lockstate = (($acl->is_private()) ? 'lock' : 'unlock');
-
+
$thing_hash = '';
-
+
if(argc() == 3 && argv(1) === 'edit') {
$thing_hash = argv(2);
-
+
$r = q("select * from obj where obj_type = %d and obj_obj = '%s' limit 1",
intval(TERM_OBJ_THING),
dbesc($thing_hash)
);
-
+
if((! $r) || ($r[0]['obj_channel'] != local_channel())) {
notice( t('Permission denied.') . EOL);
return '';
}
-
+
$o .= replace_macros(get_markup_template('thing_edit.tpl'),array(
'$thing_hdr' => t('Edit Thing'),
'$multiprof' => feature_enabled(local_channel(),'multi_profiles'),
@@ -319,36 +319,36 @@ class Thing extends \Zotlabs\Web\Controller {
'$lockstate' => $lockstate,
'$submit' => t('Submit')
));
-
+
return $o;
}
-
+
if(argc() == 3 && argv(1) === 'drop') {
$thing_hash = argv(2);
-
+
$r = q("select * from obj where obj_type = %d and obj_obj = '%s' limit 1",
intval(TERM_OBJ_THING),
dbesc($thing_hash)
);
-
+
if((! $r) || ($r[0]['obj_channel'] != local_channel())) {
notice( t('Permission denied.') . EOL);
return '';
}
-
+
$x = q("delete from obj where obj_obj = '%s' and obj_type = %d and obj_channel = %d",
dbesc($thing_hash),
intval(TERM_OBJ_THING),
intval(local_channel())
);
-
+
$r[0]['obj_deleted'] = 1;
-
+
build_sync_packet(0,array('obj' => $r));
-
+
return $o;
}
-
+
$o .= replace_macros(get_markup_template('thing_input.tpl'),array(
'$thing_hdr' => t('Add Thing to your Profile'),
'$multiprof' => feature_enabled(local_channel(),'multi_profiles'),
@@ -369,8 +369,8 @@ class Thing extends \Zotlabs\Web\Controller {
'$lockstate' => $lockstate,
'$submit' => t('Submit')
));
-
+
return $o;
}
-
+
}
diff --git a/Zotlabs/Module/Wall_attach.php b/Zotlabs/Module/Wall_attach.php
index 9a1019ddb..c6fe7518e 100644
--- a/Zotlabs/Module/Wall_attach.php
+++ b/Zotlabs/Module/Wall_attach.php
@@ -12,15 +12,20 @@ class Wall_attach extends \Zotlabs\Web\Controller {
$using_api = false;
- if(\App::$data['api_info'] && array_key_exists('media',$_FILES)) {
+ if($_REQUEST['api_source'] && array_key_exists('media',$_FILES)) {
$using_api = true;
- $user_info = \App::$data['api_info'];
- $nick = $user_info['screen_name'];
- $channel = get_channel_by_nick($user_info['screen_name']);
}
- elseif(argc() > 1)
- $channel = get_channel_by_nick(argv(1));
-
+
+ if($using_api) {
+ require_once('include/api.php');
+ if(api_user())
+ $channel = channelx_by_n(api_user());
+ }
+ else {
+ if(argc() > 1)
+ $channel = channelx_by_nick(argv(1));
+ }
+
if(! $channel)
killme();
diff --git a/Zotlabs/Module/Wall_upload.php b/Zotlabs/Module/Wall_upload.php
index 3868cb14e..6d58e4032 100644
--- a/Zotlabs/Module/Wall_upload.php
+++ b/Zotlabs/Module/Wall_upload.php
@@ -17,16 +17,14 @@ class Wall_upload extends \Zotlabs\Web\Controller {
if($using_api) {
require_once('include/api.php');
- $user_info = api_get_user($a);
- $nick = $user_info['screen_name'];
+ if(api_user())
+ $channel = channelx_by_n(api_user());
}
else {
if(argc() > 1)
- $nick = argv(1);
+ $channel = channelx_by_nick(argv(1));
}
- $channel = (($nick) ? get_channel_by_nick($nick) : false);
-
if(! $channel) {
if($using_api)
return;
diff --git a/Zotlabs/Module/Wiki.php b/Zotlabs/Module/Wiki.php
index bb4e9179c..7b0ec9d83 100644
--- a/Zotlabs/Module/Wiki.php
+++ b/Zotlabs/Module/Wiki.php
@@ -34,77 +34,134 @@ class Wiki extends \Zotlabs\Web\Controller {
notice( t('Not found') . EOL);
return;
}
-
- $tab = 'wiki';
-
-
+
require_once('include/wiki.php');
require_once('include/acl_selectors.php');
require_once('include/conversation.php');
+ require_once('include/bbcode.php');
// TODO: Combine the interface configuration into a unified object
// Something like $interface = array('new_page_button' => false, 'new_wiki_button' => false, ...)
$wiki_owner = false;
$showNewWikiButton = false;
- $showCommitMsg = false;
- $hidePageHistory = false;
$pageHistory = array();
$local_observer = null;
$resource_id = '';
// init() should have forced the URL to redirect to /wiki/channel so assume argc() > 1
$nick = argv(1);
- $channel = get_channel_by_nick($nick); // The channel who owns the wikis being viewed
- if(! $channel) {
- notice('Invalid channel' . EOL);
+ $owner = channelx_by_nick($nick); // The channel who owns the wikis being viewed
+ if(! $owner) {
+ notice( t('Invalid channel') . EOL);
goaway('/' . argv(0));
}
// Determine if the observer is the channel owner so the ACL dialog can be populated
- if (local_channel() === intval($channel['channel_id'])) {
- $local_observer = \App::get_channel();
+ if (local_channel() === intval($owner['channel_id'])) {
+
$wiki_owner = true;
// Obtain the default permission settings of the channel
- $channel_acl = array(
- 'allow_cid' => $local_observer['channel_allow_cid'],
- 'allow_gid' => $local_observer['channel_allow_gid'],
- 'deny_cid' => $local_observer['channel_deny_cid'],
- 'deny_gid' => $local_observer['channel_deny_gid']
+ $owner_acl = array(
+ 'allow_cid' => $owner['channel_allow_cid'],
+ 'allow_gid' => $owner['channel_allow_gid'],
+ 'deny_cid' => $owner['channel_deny_cid'],
+ 'deny_gid' => $owner['channel_deny_gid']
);
// Initialize the ACL to the channel default permissions
$x = array(
- 'lockstate' => (( $local_observer['channel_allow_cid'] ||
- $local_observer['channel_allow_gid'] ||
- $local_observer['channel_deny_cid'] ||
- $local_observer['channel_deny_gid'])
+ 'lockstate' => (( $owner['channel_allow_cid'] ||
+ $owner['channel_allow_gid'] ||
+ $owner['channel_deny_cid'] ||
+ $owner['channel_deny_gid'])
? 'lock' : 'unlock'
),
- 'acl' => populate_acl($channel_acl),
- 'allow_cid' => acl2json($channel_acl['allow_cid']),
- 'allow_gid' => acl2json($channel_acl['allow_gid']),
- 'deny_cid' => acl2json($channel_acl['deny_cid']),
- 'deny_gid' => acl2json($channel_acl['deny_gid']),
+ 'acl' => populate_acl($owner_acl),
+ 'allow_cid' => acl2json($owner_acl['allow_cid']),
+ 'allow_gid' => acl2json($owner_acl['allow_gid']),
+ 'deny_cid' => acl2json($owner_acl['deny_cid']),
+ 'deny_gid' => acl2json($owner_acl['deny_gid']),
'bang' => ''
);
} else {
// Not the channel owner
- $channel_acl = $x = array();
+ $owner_acl = $x = array();
+ }
+
+ $is_owner = ((local_channel()) && (local_channel() == \App::$profile['profile_uid']) ? true : false);
+ $o = profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+
+ // Download a wiki
+ if((argc() > 3) && (argv(2) === 'download') && (argv(3) === 'wiki')) {
+
+ $resource_id = argv(4);
+
+ $w = wiki_get_wiki($resource_id);
+ if(!$w['path']) {
+ notice(t('Error retrieving wiki') . EOL);
+ }
+
+ $zip_folder_name = random_string(10);
+ $zip_folderpath = '/tmp/' . $zip_folder_name;
+ if(!mkdir($zip_folderpath, 0770, false)) {
+ logger('Error creating zip file export folder: ' . $zip_folderpath, LOGGER_NORMAL);
+ notice(t('Error creating zip file export folder') . EOL);
+ }
+
+ $zip_filename = $w['urlName'];
+ $zip_filepath = '/tmp/' . $zip_folder_name . '/' . $zip_filename;
+
+ // Generate the zip file
+ \Zotlabs\Lib\ExtendedZip::zipTree($w['path'], $zip_filepath, \ZipArchive::CREATE);
+
+ // Output the file for download
+
+ header('Content-disposition: attachment; filename="' . $zip_filename . '.zip"');
+ header('Content-Type: application/zip');
+
+ $success = readfile($zip_filepath);
+
+ if(!$success) {
+ logger('Error downloading wiki: ' . $resource_id);
+ notice(t('Error downloading wiki: ' . $resource_id) . EOL);
+ }
+
+ // delete temporary files
+ rrmdir($zip_folderpath);
+ killme();
+
}
switch (argc()) {
case 2:
- // Configure page template
- $wikiheaderName = t('Wiki');
- $wikiheaderPage = t('Sandbox');
- require_once('library/markdown.php');
- $content = t('"# Wiki Sandbox\n\nContent you **edit** and **preview** here *will not be saved*."');
- $renderedContent = Markdown(json_decode($content));
- $hide_editor = false;
- $showPageControls = false;
- $showNewWikiButton = $wiki_owner;
- $showNewPageButton = false;
- $hidePageHistory = true;
- $showCommitMsg = false;
+ $wikis = wiki_list($owner, get_observer_hash());
+ if ($wikis) {
+ $o .= replace_macros(get_markup_template('wikilist.tpl'), array(
+ '$header' => t('Wikis'),
+ '$channel' => $owner['channel_address'],
+ '$wikis' => $wikis['wikis'],
+ // If the observer is the local channel owner, show the wiki controls
+ '$owner' => ((local_channel() && local_channel() === intval(\App::$profile['uid'])) ? true : false),
+ '$edit' => t('Edit'),
+ '$download' => t('Download'),
+ '$view' => t('View'),
+ '$create' => t('Create New'),
+ '$submit' => t('Submit'),
+ '$wikiName' => array('wikiName', t('Wiki name')),
+ '$mimeType' => array('mimeType', t('Content type'), '', '', ['text/markdown' => 'Markdown', 'text/bbcode' => 'BB Code']),
+ '$name' => t('Name'),
+ '$type' => t('Type'),
+ '$lockstate' => $x['lockstate'],
+ '$acl' => $x['acl'],
+ '$allow_cid' => $x['allow_cid'],
+ '$allow_gid' => $x['allow_gid'],
+ '$deny_cid' => $x['deny_cid'],
+ '$deny_gid' => $x['deny_gid'],
+ '$notify' => array('postVisible', t('Create a status post for this wiki'), '', '', array(t('No'), t('Yes')))
+ ));
+
+ return $o;
+ }
+
break;
case 3:
// /wiki/channel/wiki -> No page was specified, so redirect to Home.md
@@ -115,20 +172,23 @@ class Wiki extends \Zotlabs\Web\Controller {
// Fetch the wiki info and determine observer permissions
$wikiUrlName = urlencode(argv(2));
$pageUrlName = urlencode(argv(3));
- $w = wiki_exists_by_name($channel['channel_id'], $wikiUrlName);
+
+ $w = wiki_exists_by_name($owner['channel_id'], $wikiUrlName);
if(!$w['resource_id']) {
- notice('Wiki not found' . EOL);
+ notice(t('Wiki not found') . EOL);
goaway('/'.argv(0).'/'.argv(1));
+ return; //not reached
}
$resource_id = $w['resource_id'];
if (!$wiki_owner) {
// Check for observer permissions
$observer_hash = get_observer_hash();
- $perms = wiki_get_permissions($resource_id, intval($channel['channel_id']), $observer_hash);
+ $perms = wiki_get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
if(!$perms['read']) {
- notice('Permission denied.' . EOL);
+ notice(t('Permission denied.') . EOL);
goaway('/'.argv(0).'/'.argv(1));
+ return; //not reached
}
if($perms['write']) {
$wiki_editor = true;
@@ -140,69 +200,59 @@ class Wiki extends \Zotlabs\Web\Controller {
}
$wikiheaderName = urldecode($wikiUrlName);
$wikiheaderPage = urldecode($pageUrlName);
+ $renamePage = (($wikiheaderPage === 'Home') ? '' : t('Rename page'));
+
$p = wiki_get_page_content(array('resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
if(!$p['success']) {
- notice('Error retrieving page content' . EOL);
+ notice(t('Error retrieving page content') . EOL);
goaway('/'.argv(0).'/'.argv(1).'/'.$wikiUrlName);
+ return; //not reached
}
- $content = ($p['content'] !== '' ? htmlspecialchars_decode($p['content'],ENT_COMPAT) : '"# New page\n"');
+
+ $mimeType = $p['mimeType'];
+
+ $rawContent = (($p['mimeType'] == 'text/bbcode') ? htmlspecialchars_decode(json_decode($p['content']),ENT_COMPAT) : htmlspecialchars_decode($p['content'],ENT_COMPAT));
+ $content = ($p['content'] !== '' ? $rawContent : '"# New page\n"');
// Render the Markdown-formatted page content in HTML
- require_once('library/markdown.php');
- $html = wiki_generate_toc(purify_html(Markdown(wiki_bbcode(json_decode($content)))));
- $renderedContent = wiki_convert_links($html,argv(0).'/'.argv(1).'/'.$wikiUrlName);
- $hide_editor = false;
+ if($mimeType == 'text/bbcode') {
+ $renderedContent = wiki_convert_links(bbcode($content),argv(0).'/'.argv(1).'/'.$wikiUrlName);
+ }
+ else {
+ require_once('library/markdown.php');
+ $html = wiki_generate_toc(zidify_text(purify_html(Markdown(wiki_bbcode(json_decode($content))))));
+ $renderedContent = wiki_convert_links($html,argv(0).'/'.argv(1).'/'.$wikiUrlName);
+ }
$showPageControls = $wiki_editor;
- $showNewWikiButton = $wiki_owner;
- $showNewPageButton = $wiki_editor;
- $hidePageHistory = false;
- $showCommitMsg = true;
- $pageHistory = wiki_page_history(array('resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
break;
default: // Strip the extraneous URL components
- goaway('/'.argv(0).'/'.argv(1).'/'.$wikiUrlName.'/'.$pageUrlName);
+ goaway('/' . argv(0) . '/' . argv(1) . '/' . $wikiUrlName . '/' . $pageUrlName);
+ return; //not reached
}
$wikiModalID = random_string(3);
- $wikiModal = replace_macros(
- get_markup_template('generic_modal.tpl'), array(
- '$id' => $wikiModalID,
- '$title' => t('Revision Comparison'),
- '$ok' => t('Revert'),
- '$cancel' => t('Cancel')
- )
- );
-
- $is_owner = ((local_channel()) && (local_channel() == \App::$profile['profile_uid']) ? true : false);
-
- $o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
-
+ $wikiModal = replace_macros(get_markup_template('generic_modal.tpl'), array(
+ '$id' => $wikiModalID,
+ '$title' => t('Revision Comparison'),
+ '$ok' => (($showPageControls) ? t('Revert') : ''),
+ '$cancel' => t('Cancel')
+ ));
+
$o .= replace_macros(get_markup_template('wiki.tpl'),array(
'$wikiheaderName' => $wikiheaderName,
'$wikiheaderPage' => $wikiheaderPage,
- '$hideEditor' => $hide_editor,
+ '$renamePage' => $renamePage,
'$showPageControls' => $showPageControls,
- '$showNewWikiButton'=> $showNewWikiButton,
- '$showNewPageButton'=> $showNewPageButton,
- '$hidePageHistory' => $hidePageHistory,
- '$showCommitMsg' => $showCommitMsg,
- '$channel' => $channel['channel_address'],
+ '$editOrSourceLabel' => (($showPageControls) ? t('Edit') : t('Source')),
+ '$tools_label' => 'Page Tools',
+ '$channel' => $owner['channel_address'],
'$resource_id' => $resource_id,
'$page' => $pageUrlName,
- '$lockstate' => $x['lockstate'],
- '$acl' => $x['acl'],
- '$allow_cid' => $x['allow_cid'],
- '$allow_gid' => $x['allow_gid'],
- '$deny_cid' => $x['deny_cid'],
- '$deny_gid' => $x['deny_gid'],
- '$bang' => $x['bang'],
+ '$mimeType' => $mimeType,
'$content' => $content,
'$renderedContent' => $renderedContent,
- '$wikiName' => array('wikiName', t('Enter the name of your new wiki:'), '', ''),
- '$pageName' => array('pageName', t('Enter the name of the new page:'), '', ''),
- '$pageRename' => array('pageRename', t('Enter the new name:'), '', ''),
- '$commitMsg' => array('commitMsg', '', '', '', '', 'placeholder="(optional) Enter a custom message when saving the page..."'),
- '$pageHistory' => $pageHistory['history'],
+ '$pageRename' => array('pageRename', t('New page name'), '', ''),
+ '$commitMsg' => array('commitMsg', '', '', '', '', 'placeholder="Short description of your changes (optional)"'),
'$wikiModal' => $wikiModal,
'$wikiModalID' => $wikiModalID,
'$commit' => 'HEAD',
@@ -212,43 +262,63 @@ class Wiki extends \Zotlabs\Web\Controller {
'$embedPhotosModalOK' => t('OK'),
'$modalchooseimages' => t('Choose images to embed'),
'$modalchoosealbum' => t('Choose an album'),
- '$modaldiffalbum' => t('Choose a different album...'),
+ '$modaldiffalbum' => t('Choose a different album'),
'$modalerrorlist' => t('Error getting album list'),
'$modalerrorlink' => t('Error getting photo link'),
'$modalerroralbum' => t('Error getting album'),
));
- head_add_js('library/ace/ace.js'); // Ace Code Editor
+
+ if($p['mimeType'] != 'text/bbcode')
+ head_add_js('library/ace/ace.js'); // Ace Code Editor
+
return $o;
}
function post() {
require_once('include/wiki.php');
+ require_once('include/bbcode.php');
+
+ $nick = argv(1);
+ $owner = channelx_by_nick($nick);
+ $observer_hash = get_observer_hash();
+
+ if(! $owner) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
// /wiki/channel/preview
// Render mardown-formatted text in HTML for preview
if((argc() > 2) && (argv(2) === 'preview')) {
$content = $_POST['content'];
- $resource_id = $_POST['resource_id'];
- require_once('library/markdown.php');
- $content = wiki_bbcode($content);
- $html = wiki_generate_toc(purify_html(Markdown($content)));
+ $resource_id = $_POST['resource_id'];
$w = wiki_get_wiki($resource_id);
$wikiURL = argv(0).'/'.argv(1).'/'.$w['urlName'];
- $html = wiki_convert_links($html,$wikiURL);
+
+ $mimeType = $w['mimeType'];
+
+ if($mimeType == 'text/bbcode') {
+ $html = wiki_convert_links(bbcode($content),$wikiURL);
+ }
+ else {
+ require_once('library/markdown.php');
+ $content = wiki_bbcode($content);
+ $html = wiki_generate_toc(zidify_text(purify_html(Markdown($content))));
+ $html = wiki_convert_links($html,$wikiURL);
+ }
json_return_and_die(array('html' => $html, 'success' => true));
}
// Create a new wiki
// /wiki/channel/create/wiki
if ((argc() > 3) && (argv(2) === 'create') && (argv(3) === 'wiki')) {
- $nick = argv(1);
- $channel = get_channel_by_nick($nick);
- // Determine if observer has permission to create wiki
- $observer_hash = get_observer_hash();
+
// Only the channel owner can create a wiki, at least until we create a
// more detail permissions framework
- if (local_channel() !== intval($channel['channel_id'])) {
- goaway('/'.argv(0).'/'.$nick.'/');
+
+ if (local_channel() !== intval($owner['channel_id'])) {
+ goaway('/' . argv(0) . '/' . $nick . '/');
}
$wiki = array();
// Generate new wiki info from input name
@@ -256,35 +326,37 @@ class Wiki extends \Zotlabs\Web\Controller {
$wiki['rawName'] = $_POST['wikiName'];
$wiki['htmlName'] = escape_tags($_POST['wikiName']);
$wiki['urlName'] = urlencode($_POST['wikiName']);
+ $wiki['mimeType'] = $_POST['mimeType'];
+
if($wiki['urlName'] === '') {
- notice('Error creating wiki. Invalid name.');
+ notice( t('Error creating wiki. Invalid name.') . EOL);
goaway('/wiki');
}
+
// Get ACL for permissions
- $acl = new \Zotlabs\Access\AccessList($channel);
+ $acl = new \Zotlabs\Access\AccessList($owner);
$acl->set_from_array($_POST);
- $r = wiki_create_wiki($channel, $observer_hash, $wiki, $acl);
+ $r = wiki_create_wiki($owner, $observer_hash, $wiki, $acl);
if ($r['success']) {
$homePage = wiki_create_page('Home', $r['item']['resource_id']);
if(!$homePage['success']) {
- notice('Wiki created, but error creating Home page.');
+ notice( t('Wiki created, but error creating Home page.'));
goaway('/wiki/'.$nick.'/'.$wiki['urlName']);
}
goaway('/wiki/'.$nick.'/'.$wiki['urlName'].'/'.$homePage['page']['urlName']);
} else {
- notice('Error creating wiki');
+ notice(t('Error creating wiki'));
goaway('/wiki');
}
}
// Delete a wiki
if ((argc() > 3) && (argv(2) === 'delete') && (argv(3) === 'wiki')) {
- $nick = argv(1);
- $channel = get_channel_by_nick($nick);
+
// Only the channel owner can delete a wiki, at least until we create a
// more detail permissions framework
- if (local_channel() !== intval($channel['channel_id'])) {
- logger('Wiki delete permission denied.' . EOL);
+ if (local_channel() !== intval($owner['channel_id'])) {
+ logger('Wiki delete permission denied.');
json_return_and_die(array('message' => 'Wiki delete permission denied.', 'success' => false));
}
$resource_id = $_POST['resource_id'];
@@ -297,27 +369,38 @@ class Wiki extends \Zotlabs\Web\Controller {
}
}
+
// Create a page
if ((argc() === 4) && (argv(2) === 'create') && (argv(3) === 'page')) {
- $nick = argv(1);
+
$resource_id = $_POST['resource_id'];
// Determine if observer has permission to create a page
- $channel = get_channel_by_nick($nick);
- if (local_channel() !== intval($channel['channel_id'])) {
- $observer_hash = get_observer_hash();
- $perms = wiki_get_permissions($resource_id, intval($channel['channel_id']), $observer_hash);
- if(!$perms['write']) {
- logger('Wiki write permission denied. ' . EOL);
- json_return_and_die(array('success' => false));
- }
+
+
+ $perms = wiki_get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
+ if(!$perms['write']) {
+ logger('Wiki write permission denied. ' . EOL);
+ json_return_and_die(array('success' => false));
}
+
$name = $_POST['name']; //Get new page name
if(urlencode(escape_tags($_POST['name'])) === '') {
json_return_and_die(array('message' => 'Error creating page. Invalid name.', 'success' => false));
}
$page = wiki_create_page($name, $resource_id);
if ($page['success']) {
- json_return_and_die(array('url' => '/'.argv(0).'/'.argv(1).'/'.$page['wiki']['urlName'].'/'.urlencode($page['page']['urlName']), 'success' => true));
+ $ob = \App::get_observer();
+ $commit = wiki_git_commit(array(
+ 'commit_msg' => t('New page created'),
+ 'resource_id' => $resource_id,
+ 'observer' => $ob,
+ 'files' => array($page['page']['fileName'])
+ ));
+ if($commit['success']) {
+ json_return_and_die(array('url' => '/'.argv(0).'/'.argv(1).'/'.$page['wiki']['urlName'].'/'.$page['page']['urlName'], 'success' => true));
+ } else {
+ json_return_and_die(array('message' => 'Error making git commit','url' => '/'.argv(0).'/'.argv(1).'/'.$page['wiki']['urlName'].'/'.urlencode($page['page']['urlName']),'success' => false));
+ }
} else {
logger('Error creating page');
json_return_and_die(array('message' => 'Error creating page.', 'success' => false));
@@ -327,15 +410,13 @@ class Wiki extends \Zotlabs\Web\Controller {
// Fetch page list for a wiki
if ((argc() === 5) && (argv(2) === 'get') && (argv(3) === 'page') && (argv(4) === 'list')) {
$resource_id = $_POST['resource_id']; // resource_id for wiki in db
- $channel = get_channel_by_nick(argv(1));
- $observer_hash = get_observer_hash();
- if (local_channel() !== intval($channel['channel_id'])) {
- $perms = wiki_get_permissions($resource_id, intval($channel['channel_id']), $observer_hash);
- if(!$perms['read']) {
- logger('Wiki read permission denied.' . EOL);
- json_return_and_die(array('pages' => null, 'message' => 'Permission denied.', 'success' => false));
- }
+
+ $perms = wiki_get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
+ if(!$perms['read']) {
+ logger('Wiki read permission denied.' . EOL);
+ json_return_and_die(array('pages' => null, 'message' => 'Permission denied.', 'success' => false));
}
+
$page_list_html = widget_wiki_pages(array(
'resource_id' => $resource_id,
'refresh' => true,
@@ -354,16 +435,12 @@ class Wiki extends \Zotlabs\Web\Controller {
if ($commitMsg === '') {
$commitMsg = 'Updated ' . $pageHtmlName;
}
- $nick = argv(1);
- $channel = get_channel_by_nick($nick);
+
// Determine if observer has permission to save content
- if (local_channel() !== intval($channel['channel_id'])) {
- $observer_hash = get_observer_hash();
- $perms = wiki_get_permissions($resource_id, intval($channel['channel_id']), $observer_hash);
- if(!$perms['write']) {
- logger('Wiki write permission denied. ' . EOL);
- json_return_and_die(array('success' => false));
- }
+ $perms = wiki_get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
+ if(!$perms['write']) {
+ logger('Wiki write permission denied. ' . EOL);
+ json_return_and_die(array('success' => false));
}
$saved = wiki_save_page(array('resource_id' => $resource_id, 'pageUrlName' => $pageUrlName, 'content' => $content));
@@ -373,7 +450,7 @@ class Wiki extends \Zotlabs\Web\Controller {
'commit_msg' => $commitMsg,
'resource_id' => $resource_id,
'observer' => $ob,
- 'files' => array($pageUrlName.'.md')
+ 'files' => array($saved['fileName'])
));
if($commit['success']) {
json_return_and_die(array('message' => 'Wiki git repo commit made', 'success' => true));
@@ -392,20 +469,19 @@ class Wiki extends \Zotlabs\Web\Controller {
$resource_id = $_POST['resource_id'];
$pageUrlName = $_POST['name'];
- $nick = argv(1);
- $channel = get_channel_by_nick($nick);
+
// Determine if observer has permission to read content
- if (local_channel() !== intval($channel['channel_id'])) {
- $observer_hash = get_observer_hash();
- $perms = wiki_get_permissions($resource_id, intval($channel['channel_id']), $observer_hash);
- if(!$perms['read']) {
- logger('Wiki read permission denied.' . EOL);
- json_return_and_die(array('historyHTML' => '', 'message' => 'Permission denied.', 'success' => false));
- }
+
+ $perms = wiki_get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
+ if(!$perms['read']) {
+ logger('Wiki read permission denied.' . EOL);
+ json_return_and_die(array('historyHTML' => '', 'message' => 'Permission denied.', 'success' => false));
}
+
$historyHTML = widget_wiki_page_history(array(
- 'resource_id' => $resource_id,
- 'pageUrlName' => $pageUrlName
+ 'resource_id' => $resource_id,
+ 'pageUrlName' => $pageUrlName,
+ 'permsWrite' => $perms['write']
));
json_return_and_die(array('historyHTML' => $historyHTML, 'message' => '', 'success' => true));
}
@@ -418,16 +494,13 @@ class Wiki extends \Zotlabs\Web\Controller {
json_return_and_die(array('message' => 'Cannot delete Home','success' => false));
}
// Determine if observer has permission to delete pages
- $nick = argv(1);
- $channel = get_channel_by_nick($nick);
- if (local_channel() !== intval($channel['channel_id'])) {
- $observer_hash = get_observer_hash();
- $perms = wiki_get_permissions($resource_id, intval($channel['channel_id']), $observer_hash);
- if(!$perms['write']) {
- logger('Wiki write permission denied. ' . EOL);
- json_return_and_die(array('success' => false));
- }
+
+ $perms = wiki_get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
+ if(!$perms['write']) {
+ logger('Wiki write permission denied. ' . EOL);
+ json_return_and_die(array('success' => false));
}
+
$deleted = wiki_delete_page(array('resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
if($deleted['success']) {
$ob = \App::get_observer();
@@ -453,16 +526,13 @@ class Wiki extends \Zotlabs\Web\Controller {
$pageUrlName = $_POST['name'];
$commitHash = $_POST['commitHash'];
// Determine if observer has permission to revert pages
- $nick = argv(1);
- $channel = get_channel_by_nick($nick);
- if (local_channel() !== intval($channel['channel_id'])) {
- $observer_hash = get_observer_hash();
- $perms = wiki_get_permissions($resource_id, intval($channel['channel_id']), $observer_hash);
- if(!$perms['write']) {
- logger('Wiki write permission denied.' . EOL);
- json_return_and_die(array('success' => false));
- }
+
+ $perms = wiki_get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
+ if(!$perms['write']) {
+ logger('Wiki write permission denied.' . EOL);
+ json_return_and_die(array('success' => false));
}
+
$reverted = wiki_revert_page(array('commitHash' => $commitHash, 'resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
if($reverted['success']) {
json_return_and_die(array('content' => $reverted['content'], 'message' => '', 'success' => true));
@@ -478,16 +548,13 @@ class Wiki extends \Zotlabs\Web\Controller {
$compareCommit = $_POST['compareCommit'];
$currentCommit = $_POST['currentCommit'];
// Determine if observer has permission to revert pages
- $nick = argv(1);
- $channel = get_channel_by_nick($nick);
- if (local_channel() !== intval($channel['channel_id'])) {
- $observer_hash = get_observer_hash();
- $perms = wiki_get_permissions($resource_id, intval($channel['channel_id']), $observer_hash);
- if(!$perms['read']) {
- logger('Wiki read permission denied.' . EOL);
- json_return_and_die(array('success' => false));
- }
+
+ $perms = wiki_get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
+ if(!$perms['read']) {
+ logger('Wiki read permission denied.' . EOL);
+ json_return_and_die(array('success' => false));
}
+
$compare = wiki_compare_page(array('currentCommit' => $currentCommit, 'compareCommit' => $compareCommit, 'resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
if($compare['success']) {
$diffHTML = '<table class="text-center" width="100%"><tr><td class="lead" width="50%">Current Revision</td><td class="lead" width="50%">Selected Revision</td></tr></table>' . $compare['diff'];
@@ -509,16 +576,13 @@ class Wiki extends \Zotlabs\Web\Controller {
json_return_and_die(array('message' => 'Error renaming page. Invalid name.', 'success' => false));
}
// Determine if observer has permission to rename pages
- $nick = argv(1);
- $channel = get_channel_by_nick($nick);
- if (local_channel() !== intval($channel['channel_id'])) {
- $observer_hash = get_observer_hash();
- $perms = wiki_get_permissions($resource_id, intval($channel['channel_id']), $observer_hash);
- if(!$perms['write']) {
- logger('Wiki write permission denied. ' . EOL);
- json_return_and_die(array('success' => false));
- }
+
+ $perms = wiki_get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
+ if(!$perms['write']) {
+ logger('Wiki write permission denied. ' . EOL);
+ json_return_and_die(array('success' => false));
}
+
$renamed = wiki_rename_page(array('resource_id' => $resource_id, 'pageUrlName' => $pageUrlName, 'pageNewName' => $pageNewName));
if($renamed['success']) {
$ob = \App::get_observer();
@@ -526,7 +590,7 @@ class Wiki extends \Zotlabs\Web\Controller {
'commit_msg' => 'Renamed ' . urldecode($pageUrlName) . ' to ' . $renamed['page']['htmlName'],
'resource_id' => $resource_id,
'observer' => $ob,
- 'files' => array($pageUrlName . '.md', $renamed['page']['fileName']),
+ 'files' => array($pageUrlName . substr($renamed['page']['fileName'], -3), $renamed['page']['fileName']),
'all' => true
));
if($commit['success']) {
@@ -539,7 +603,7 @@ class Wiki extends \Zotlabs\Web\Controller {
}
}
- //notice('You must be authenticated.');
+ //notice( t('You must be authenticated.'));
json_return_and_die(array('message' => 'You must be authenticated.', 'success' => false));
}
diff --git a/Zotlabs/Storage/BasicAuth.php b/Zotlabs/Storage/BasicAuth.php
index 995976dcd..0ff9fad13 100644
--- a/Zotlabs/Storage/BasicAuth.php
+++ b/Zotlabs/Storage/BasicAuth.php
@@ -12,7 +12,7 @@ use Sabre\HTTP\ResponseInterface;
* This class also contains some data which is not necessary for authentication
* like timezone settings.
*
- * @extends Sabre\DAV\Auth\Backend\AbstractBasic
+ * @extends \\Sabre\\DAV\\Auth\\Backend\\AbstractBasic
*
* @link http://github.com/friendica/red
* @license http://opensource.org/licenses/mit-license.php The MIT License (MIT)
@@ -24,37 +24,37 @@ class BasicAuth extends DAV\Auth\Backend\AbstractBasic {
*
* It is used for building path in filestorage/.
*
- * @var string|null
+ * @var string|null $channel_name
*/
protected $channel_name = null;
/**
- * channel_id of the current channel of the logged-in account.
+ * @brief channel_id of the current channel of the logged-in account.
*
- * @var int
+ * @var int $channel_id
*/
public $channel_id = 0;
/**
- * channel_hash of the current channel of the logged-in account.
+ * @brief channel_hash of the current channel of the logged-in account.
*
- * @var string
+ * @var string $channel_hash
*/
public $channel_hash = '';
/**
- * Set in mod/cloud.php to observer_hash.
+ * @brief Set in mod/cloud.php to observer_hash.
*
- * @var string
+ * @var string $observer
*/
public $observer = '';
/**
*
* @see Browser::set_writeable()
- * @var \Sabre\DAV\Browser\Plugin
+ * @var \\Sabre\\DAV\\Browser\\Plugin $browser
*/
public $browser;
/**
- * channel_id of the current visited path. Set in Directory::getDir().
+ * @brief channel_id of the current visited path. Set in Directory::getDir().
*
- * @var int
+ * @var int $owner_id
*/
public $owner_id = 0;
/**
@@ -62,15 +62,15 @@ class BasicAuth extends DAV\Auth\Backend\AbstractBasic {
*
* Used for creating the path in cloud/
*
- * @var string
+ * @var string $owner_nick
*/
public $owner_nick = '';
/**
* Timezone from the visiting channel's channel_timezone.
*
- * Used in @ref RedBrowser
+ * Used in @ref Browser
*
- * @var string
+ * @var string $timezone
*/
protected $timezone = '';
@@ -82,7 +82,7 @@ class BasicAuth extends DAV\Auth\Backend\AbstractBasic {
* @brief Validates a username and password.
*
*
- * @see \Sabre\DAV\Auth\Backend\AbstractBasic::validateUserPass
+ * @see \\Sabre\\DAV\\Auth\\Backend\\AbstractBasic::validateUserPass
* @param string $username
* @param string $password
* @return bool
@@ -211,7 +211,7 @@ class BasicAuth extends DAV\Auth\Backend\AbstractBasic {
*
* If nobody is currently logged in, this method should return null.
*
- * @see \Sabre\DAV\Auth\Backend\AbstractBasic::getCurrentUser
+ * @see \\Sabre\\DAV\\Auth\\Backend\\AbstractBasic::getCurrentUser
* @return string|null
*/
public function getCurrentUser() {
diff --git a/Zotlabs/Storage/Browser.php b/Zotlabs/Storage/Browser.php
index 4a7e49e86..a30eedba5 100644
--- a/Zotlabs/Storage/Browser.php
+++ b/Zotlabs/Storage/Browser.php
@@ -7,10 +7,10 @@ use Sabre\DAV;
/**
* @brief Provides a DAV frontend for the webbrowser.
*
- * RedBrowser is a SabreDAV server-plugin to provide a view to the DAV storage
+ * Browser is a SabreDAV server-plugin to provide a view to the DAV storage
* for the webbrowser.
*
- * @extends \Sabre\DAV\Browser\Plugin
+ * @extends \\Sabre\\DAV\\Browser\\Plugin
*
* @link http://github.com/friendica/red
* @license http://opensource.org/licenses/mit-license.php The MIT License (MIT)
@@ -19,13 +19,13 @@ class Browser extends DAV\Browser\Plugin {
/**
* @see set_writeable()
- * @see \Sabre\DAV\Auth\Backend\BackendInterface
- * @var RedBasicAuth
+ * @see \\Sabre\\DAV\\Auth\\Backend\\BackendInterface
+ * @var BasicAuth $auth
*/
private $auth;
/**
- * @brief Constructor for RedBrowser class.
+ * @brief Constructor for Browser class.
*
* $enablePost will be activated through set_writeable() in a later stage.
* At the moment the write_storage permission is only valid for the whole
@@ -36,7 +36,7 @@ class Browser extends DAV\Browser\Plugin {
* Disable assets with $enableAssets = false. Should get some thumbnail views
* anyway.
*
- * @param RedBasicAuth &$auth
+ * @param BasicAuth &$auth
*/
public function __construct(&$auth) {
$this->auth = $auth;
@@ -95,7 +95,6 @@ class Browser extends DAV\Browser\Plugin {
'{DAV:}getlastmodified',
), 1);
-
$parent = $this->server->tree->getNodeForPath($path);
$parentpath = array();
@@ -263,10 +262,11 @@ class Browser extends DAV\Browser\Plugin {
* @brief Creates a form to add new folders and upload files.
*
* @param \Sabre\DAV\INode $node
- * @param string &$output
+ * @param[in,out] string &$output
+ * @param string $path
*/
public function htmlActionsPanel(DAV\INode $node, &$output, $path) {
- if (! $node instanceof DAV\ICollection)
+ if(! $node instanceof DAV\ICollection)
return;
// We also know fairly certain that if an object is a non-extended
@@ -278,9 +278,9 @@ class Browser extends DAV\Browser\Plugin {
$aclselect = null;
$lockstate = '';
- if ($this->auth->owner_id) {
+ if($this->auth->owner_id) {
$channel = channelx_by_n($this->auth->owner_id);
- if ($channel) {
+ if($channel) {
$acl = new \Zotlabs\Access\AccessList($channel);
$channel_acl = $acl->get();
$lockstate = (($acl->is_private()) ? 'lock' : 'unlock');
@@ -295,12 +295,12 @@ class Browser extends DAV\Browser\Plugin {
intval($this->auth->channel_account_id)
);
$used = $r[0]['total'];
- if ($used) {
+ if($used) {
$quotaDesc = t('You are using %1$s of your available file storage.');
$quotaDesc = sprintf($quotaDesc,
userReadableSize($used));
}
- if ($limit && $used) {
+ if($limit && $used) {
$quotaDesc = t('You are using %1$s of %2$s available file storage. (%3$s&#37;)');
$quotaDesc = sprintf($quotaDesc,
userReadableSize($used),
@@ -355,7 +355,7 @@ class Browser extends DAV\Browser\Plugin {
*
* @param int $owner
* The owner_id
- * @param string $hash
+ * @param string $parentHash
* The parent's folder hash
* @param string $attachName
* The name of the attachment
@@ -373,6 +373,7 @@ class Browser extends DAV\Browser\Plugin {
$hash = $rr['hash'];
}
}
+
return $hash;
}
diff --git a/Zotlabs/Storage/Directory.php b/Zotlabs/Storage/Directory.php
index de4d90da4..5d078b04e 100644
--- a/Zotlabs/Storage/Directory.php
+++ b/Zotlabs/Storage/Directory.php
@@ -9,9 +9,9 @@ use Sabre\DAV;
*
* A class that represents a directory.
*
- * @extends \Sabre\DAV\Node
- * @implements \Sabre\DAV\ICollection
- * @implements \Sabre\DAV\IQuota
+ * @extends \\Sabre\\DAV\\Node
+ * @implements \\Sabre\\DAV\\ICollection
+ * @implements \\Sabre\\DAV\\IQuota
*
* @link http://github.com/friendica/red
* @license http://opensource.org/licenses/mit-license.php The MIT License (MIT)
@@ -21,7 +21,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
/**
* @brief The path inside /cloud
*
- * @var string
+ * @var string $red_path
*/
private $red_path;
private $folder_hash;
@@ -29,7 +29,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
* @brief The full path as seen in the browser.
* /cloud + $red_path
* @todo I think this is not used anywhere, we always strip '/cloud' and only use it in debug
- * @var string
+ * @var string $ext_path
*/
private $ext_path;
private $root_dir = '';
@@ -38,7 +38,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
* @brief The real path on the filesystem.
* The actual path in store/ with the hashed names.
*
- * @var string
+ * @var string $os_path
*/
private $os_path = '';
@@ -46,7 +46,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
* @brief Sets up the directory node, expects a full path.
*
* @param string $ext_path a full path
- * @param RedBasicAuth &$auth_plugin
+ * @param BasicAuth &$auth_plugin
*/
public function __construct($ext_path, &$auth_plugin) {
// $ext_path = urldecode($ext_path);
@@ -55,14 +55,14 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
// remove "/cloud" from the beginning of the path
$modulename = \App::$module;
$this->red_path = ((strpos($ext_path, '/' . $modulename) === 0) ? substr($ext_path, strlen($modulename) + 1) : $ext_path);
- if (! $this->red_path) {
+ if(! $this->red_path) {
$this->red_path = '/';
}
$this->auth = $auth_plugin;
$this->folder_hash = '';
$this->getDir();
- if ($this->auth->browser) {
+ if($this->auth->browser) {
$this->auth->browser->set_writeable();
}
}
@@ -76,8 +76,8 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
/**
* @brief Returns an array with all the child nodes.
*
- * @throw \Sabre\DAV\Exception\Forbidden
- * @return array \Sabre\DAV\INode[]
+ * @throw "\Sabre\DAV\Exception\Forbidden"
+ * @return array \\Sabre\\DAV\\INode[]
*/
public function getChildren() {
logger('children for ' . $this->ext_path, LOGGER_DATA);
@@ -98,8 +98,8 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
/**
* @brief Returns a child by name.
*
- * @throw \Sabre\DAV\Exception\Forbidden
- * @throw \Sabre\DAV\Exception\NotFound
+ * @throw "\Sabre\DAV\Exception\Forbidden"
+ * @throw "\Sabre\DAV\Exception\NotFound"
* @param string $name
*/
public function getChild($name) {
@@ -141,7 +141,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
*
* @todo handle duplicate directory name
*
- * @throw \Sabre\DAV\Exception\Forbidden
+ * @throw "\Sabre\DAV\Exception\Forbidden"
* @param string $name The new name of the directory.
* @return void
*/
@@ -186,7 +186,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
* After successful creation of the file, you may choose to return the ETag
* of the new file here.
*
- * @throw \Sabre\DAV\Exception\Forbidden
+ * @throw "\Sabre\DAV\Exception\Forbidden"
* @param string $name Name of the file
* @param resource|string $data Initial payload
* @return null|string ETag
@@ -244,8 +244,8 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
$deny_gid = $c[0]['channel_deny_gid'];
}
- $r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, folder, os_storage, filetype, filesize, revision, is_photo, content, created, edited, allow_cid, allow_gid, deny_cid, deny_gid )
- VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+ $r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, folder, os_storage, filetype, filesize, revision, is_photo, content, created, edited, os_path, display_path, allow_cid, allow_gid, deny_cid, deny_gid )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
intval($c[0]['channel_account_id']),
intval($c[0]['channel_id']),
dbesc($hash),
@@ -260,6 +260,8 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
dbesc($f),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
+ '', //TODO: use os_path
+ '', //TODO: use display_path
dbesc($allow_cid),
dbesc($allow_gid),
dbesc($deny_cid),
@@ -431,7 +433,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
/**
* @todo add description of what this function does.
*
- * @throw \Sabre\DAV\Exception\NotFound
+ * @throw "\Sabre\DAV\Exception\NotFound"
* @return void
*/
function getDir() {
@@ -557,13 +559,13 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
/**
- * @brief Array with all Directory and File DAV\Node items for the given path.
+ * @brief Array with all Directory and File DAV\\Node items for the given path.
*
* @param string $file path to a directory
* @param \Zotlabs\Storage\BasicAuth &$auth
- * @returns null|array \Sabre\DAV\INode[]
- * @throw \Sabre\DAV\Exception\Forbidden
- * @throw \Sabre\DAV\Exception\NotFound
+ * @returns null|array \\Sabre\\DAV\\INode[]
+ * @throw "\Sabre\DAV\Exception\Forbidden"
+ * @throw "\Sabre\DAV\Exception\NotFound"
*/
function CollectionData($file, &$auth) {
$ret = array();
@@ -710,7 +712,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
* @param BasicAuth &$auth
* @param boolean $test (optional) enable test mode
* @return File|Directory|boolean|null
- * @throw \Sabre\DAV\Exception\Forbidden
+ * @throw "\Sabre\DAV\Exception\Forbidden"
*/
function FileData($file, &$auth, $test = false) {
logger($file . (($test) ? ' (test mode) ' : ''), LOGGER_DATA);
diff --git a/Zotlabs/Storage/File.php b/Zotlabs/Storage/File.php
index 5a70a99f1..d2bca3964 100644
--- a/Zotlabs/Storage/File.php
+++ b/Zotlabs/Storage/File.php
@@ -9,8 +9,8 @@ use Sabre\DAV;
*
* It provides all functions to work with files in Red's cloud through DAV protocol.
*
- * @extends \Sabre\DAV\Node
- * @implements \Sabre\DAV\IFile
+ * @extends \\Sabre\\DAV\\Node
+ * @implements \\Sabre\\DAV\\IFile
*
* @link http://github.com/friendica/red
* @license http://opensource.org/licenses/mit-license.php The MIT License (MIT)
@@ -20,20 +20,20 @@ class File extends DAV\Node implements DAV\IFile {
/**
* The file from attach table.
*
- * @var array
- * data
- * flags
- * filename (string)
- * filetype (string)
+ * @var array $data
+ * * data
+ * * flags
+ * * filename (string)
+ * * filetype (string)
*/
private $data;
/**
- * @see \Sabre\DAV\Auth\Backend\BackendInterface
- * @var \RedMatrix\RedDAV\RedBasicAuth
+ * @see \\Sabre\\DAV\\Auth\\Backend\\BackendInterface
+ * @var \\Zotlabs\\Storage\\BasicAuth $auth
*/
private $auth;
/**
- * @var string
+ * @var string $name
*/
private $name;
@@ -65,8 +65,8 @@ class File extends DAV\Node implements DAV\IFile {
/**
* @brief Renames the file.
*
- * @throw Sabre\DAV\Exception\Forbidden
- * @param string $name The new name of the file.
+ * @throw "\Sabre\DAV\Exception\Forbidden"
+ * @param string $newName The new name of the file.
* @return void
*/
public function setName($newName) {
@@ -95,7 +95,7 @@ class File extends DAV\Node implements DAV\IFile {
$ch = channelx_by_n($this->auth->owner_id);
if($ch) {
$sync = attach_export_data($ch,$this->data['hash']);
- if($sync)
+ if($sync)
build_sync_packet($ch['channel_id'],array('file' => array($sync)));
}
}
@@ -138,7 +138,7 @@ class File extends DAV\Node implements DAV\IFile {
$album = $f1[0]['filename'];
$direct = $f1[0];
}
- }
+ }
$fname = dbunescbin($d[0]['content']);
if(strpos($fname,'store') === false)
$f = 'store/' . $this->auth->owner_nick . '/' . $fname ;
@@ -151,11 +151,11 @@ class File extends DAV\Node implements DAV\IFile {
logger('filename: ' . $f . ' size: ' . $size, LOGGER_DEBUG);
}
$gis = @getimagesize($f);
- logger('getimagesize: ' . print_r($gis,true), LOGGER_DATA);
+ logger('getimagesize: ' . print_r($gis,true), LOGGER_DATA);
if(($gis) && ($gis[2] === IMAGETYPE_GIF || $gis[2] === IMAGETYPE_JPEG || $gis[2] === IMAGETYPE_PNG)) {
$is_photo = 1;
}
- }
+ }
else {
// this shouldn't happen any more
$r = q("UPDATE attach SET content = '%s' WHERE hash = '%s' AND uid = %d",
@@ -222,7 +222,7 @@ class File extends DAV\Node implements DAV\IFile {
$sync = attach_export_data($c[0],$this->data['hash']);
- if($sync)
+ if($sync)
build_sync_packet($c[0]['channel_id'],array('file' => array($sync)));
}
@@ -322,16 +322,16 @@ class File extends DAV\Node implements DAV\IFile {
* This method checks the permissions and then calls attach_delete() function
* to actually remove the file.
*
- * @throw \Sabre\DAV\Exception\Forbidden
+ * @throw "\Sabre\DAV\Exception\Forbidden"
*/
public function delete() {
logger('delete file ' . basename($this->name), LOGGER_DEBUG);
- if ((! $this->auth->owner_id) || (! perm_is_allowed($this->auth->owner_id, $this->auth->observer, 'write_storage'))) {
+ if((! $this->auth->owner_id) || (! perm_is_allowed($this->auth->owner_id, $this->auth->observer, 'write_storage'))) {
throw new DAV\Exception\Forbidden('Permission denied.');
}
- if ($this->auth->owner_id !== $this->auth->channel_id) {
+ if($this->auth->owner_id !== $this->auth->channel_id) {
if (($this->auth->observer !== $this->data['creator']) || intval($this->data['is_dir'])) {
throw new DAV\Exception\Forbidden('Permission denied.');
}
@@ -340,14 +340,14 @@ class File extends DAV\Node implements DAV\IFile {
if(get_pconfig($this->auth->owner_id,'system','os_delete_prohibit') && \App::$module == 'dav') {
throw new DAV\Exception\Forbidden('Permission denied.');
}
-
+
attach_delete($this->auth->owner_id, $this->data['hash']);
$ch = channelx_by_n($this->auth->owner_id);
if($ch) {
- $sync = attach_export_data($ch,$this->data['hash'],true);
- if($sync)
- build_sync_packet($ch['channel_id'],array('file' => array($sync)));
+ $sync = attach_export_data($ch, $this->data['hash'], true);
+ if($sync)
+ build_sync_packet($ch['channel_id'], array('file' => array($sync)));
}
}
}
diff --git a/Zotlabs/Web/Router.php b/Zotlabs/Web/Router.php
index 4ba2a450d..271836ba9 100644
--- a/Zotlabs/Web/Router.php
+++ b/Zotlabs/Web/Router.php
@@ -2,51 +2,53 @@
namespace Zotlabs\Web;
-
+/**
+ *
+ * We have already parsed the server path into App::$argc and App::$argv
+ *
+ * App::$argv[0] is our module name. Let's call it 'foo'. We will load the
+ * Zotlabs/Module/Foo.php (object) or file mod/foo.php (procedural)
+ * and use it for handling our URL request to 'https://ourgreatwebsite.something/foo' .
+ * The module file contains a few functions that we call in various circumstances
+ * and in the following order:
+ * @code{.php}
+ * Object:
+ * class Foo extends \Zotlabs\Web\Controller {
+ * function init() { init function }
+ * function post() { post function }
+ * function get() { normal page function }
+ * }
+ *
+ * Procedual interface:
+ * foo_init()
+ * foo_post() (only called if there are $_POST variables)
+ * foo_content() - the string return of this function contains our page body
+ * @endcode
+ * Modules which emit other serialisations besides HTML (XML,JSON, etc.) should do
+ * so within the module init and/or post functions and then invoke killme() to terminate
+ * further processing.
+ */
class Router {
private $modname = '';
private $controller = null;
+ /**
+ * @brief Router constructor
+ *
+ * @param[in,out] App &$a
+ * @throws Exception module not found
+ */
function __construct(&$a) {
- /**
- *
- * We have already parsed the server path into App::$argc and App::$argv
- *
- * App::$argv[0] is our module name. Let's call it 'foo'. We will load the
- * Zotlabs/Module/Foo.php (object) or file mod/foo.php (procedural)
- * and use it for handling our URL request to 'https://ourgreatwebsite.something/foo' .
- * The module file contains a few functions that we call in various circumstances
- * and in the following order:
- *
- * Object:
- * class Foo extends Zotlabs\Web\Controller {
- * function init() { init function }
- * function post() { post function }
- * function get() { normal page function }
- * }
- *
- * Procedual interface:
- * foo_init()
- * foo_post() (only called if there are $_POST variables)
- * foo_content() - the string return of this function contains our page body
- *
- * Modules which emit other serialisations besides HTML (XML,JSON, etc.) should do
- * so within the module init and/or post functions and then invoke killme() to terminate
- * further processing.
- */
-
$module = \App::$module;
$modname = "Zotlabs\\Module\\" . ucfirst($module);
if(strlen($module)) {
- /**
- *
+ /*
* We will always have a module name.
* First see if we have a plugin which is masquerading as a module.
- *
*/
if(is_array(\App::$plugins) && in_array($module,\App::$plugins) && file_exists("addon/{$module}/{$module}.php")) {
@@ -66,7 +68,7 @@ class Router {
goaway(z_root());
}
- /**
+ /*
* If the site has a custom module to over-ride the standard module, use it.
* Otherwise, look for the standard program module
*/
@@ -101,13 +103,13 @@ class Router {
}
}
}
-
- /**
- * This provides a place for plugins to register module handlers which don't otherwise exist
- * on the system, or to completely over-ride an existing module.
+
+ /*
+ * This provides a place for plugins to register module handlers which don't otherwise exist
+ * on the system, or to completely over-ride an existing module.
* If the plugin sets 'installed' to true we won't throw a 404 error for the specified module even if
* there is no specific module file or matching plugin name.
- * The plugin should catch at least one of the module hooks for this URL.
+ * The plugin should catch at least one of the module hooks for this URL.
*/
$x = array('module' => $module, 'installed' => \App::$module_loaded, 'controller' => $this->controller);
@@ -117,7 +119,7 @@ class Router {
$this->controller = $x['controller'];
}
- /**
+ /*
* The URL provided does not resolve to a valid module.
*
* On Dreamhost sites, quite often things go wrong for no apparent reason and they send us to '/internal_error.html'.
@@ -135,15 +137,21 @@ class Router {
killme();
}
- logger("Module {$module} not found.", LOGGER_DEBUG, LOG_WARNING);
-
- if((x($_SERVER, 'QUERY_STRING')) && ($_SERVER['QUERY_STRING'] === 'q=internal_error.html') && \App::$config['system']['dreamhost_error_hack']) {
- logger('index.php: dreamhost_error_hack invoked. Original URI =' . $_SERVER['REQUEST_URI']);
+ if((x($_SERVER, 'QUERY_STRING'))
+ && ($_SERVER['QUERY_STRING'] === 'q=internal_error.html')
+ && \App::$config['system']['dreamhost_error_hack']) {
+ logger('index.php: dreamhost_error_hack invoked. Original URI =' . $_SERVER['REQUEST_URI'],LOGGER_DEBUG);
goaway(z_root() . $_SERVER['REQUEST_URI']);
}
- logger('index.php: page not found: ' . $_SERVER['REQUEST_URI'] . ' ADDRESS: ' . $_SERVER['REMOTE_ADDR'] . ' QUERY: ' . $_SERVER['QUERY_STRING'], LOGGER_DEBUG);
- header($_SERVER['SERVER_PROTOCOL'] . ' 404 ' . t('Not Found'));
+ if(get_config('system','log_404',true)) {
+ logger("Module {$module} not found.", LOGGER_DEBUG, LOG_WARNING);
+ logger('index.php: page not found: ' . $_SERVER['REQUEST_URI']
+ . ' ADDRESS: ' . $_SERVER['REMOTE_ADDR'] . ' QUERY: '
+ . $_SERVER['QUERY_STRING'], LOGGER_DEBUG);
+ }
+
+ header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
$tpl = get_markup_template('404.tpl');
\App::$page['content'] = replace_macros($tpl, array(
'$message' => t('Page not found.')
@@ -157,7 +165,11 @@ class Router {
}
}
-
+ /**
+ * @brief
+ *
+ * @param[in,out] App &$a
+ */
function Dispatch(&$a) {
/**
@@ -168,14 +180,14 @@ class Router {
\App::$page['page_title'] = \App::$module;
$placeholder = '';
- /**
+ /*
* No theme has been specified when calling the module_init functions
* For this reason, please restrict the use of templates to those which
* do not provide any presentation details - as themes will not be able
* to over-ride them.
*/
- $arr = array('init' => true, 'replace' => false);
+ $arr = array('init' => true, 'replace' => false);
call_hooks(\App::$module . '_mod_init', $arr);
if(! $arr['replace']) {
if($this->controller && method_exists($this->controller,'init')) {
@@ -187,7 +199,7 @@ class Router {
}
}
- /**
+ /*
* Do all theme initialisation here before calling any additional module functions.
* The module_init function may have changed the theme.
* Additionally any page with a Comanche template may alter the theme.
@@ -195,7 +207,7 @@ class Router {
*/
- /**
+ /*
* In case a page has overloaded a module, see if we already have a layout defined
* otherwise, if a PDL file exists for this module, use it
* The member may have also created a customised PDL that's stored in the config
@@ -203,7 +215,7 @@ class Router {
load_pdl($a);
- /**
+ /*
* load current theme info
*/
@@ -226,7 +238,7 @@ class Router {
}
}
- if(($_SERVER['REQUEST_METHOD'] === 'POST') && (! \App::$error) && (! x($_POST, 'auth-params'))) {
+ if(($_SERVER['REQUEST_METHOD'] === 'POST') && (! \App::$error) && (! x($_POST, 'auth-params'))) {
call_hooks(\App::$module . '_mod_post', $_POST);
if($this->controller && method_exists($this->controller,'post')) {
@@ -238,7 +250,7 @@ class Router {
}
}
- if(! \App::$error) {
+ if(! \App::$error) {
$arr = array('content' => \App::$page['content'], 'replace' => false);
call_hooks(\App::$module . '_mod_content', $arr);
\App::$page['content'] = $arr['content'];
diff --git a/Zotlabs/Web/SessionHandler.php b/Zotlabs/Web/SessionHandler.php
index 93b27a7e8..04c5cb5b5 100644
--- a/Zotlabs/Web/SessionHandler.php
+++ b/Zotlabs/Web/SessionHandler.php
@@ -18,13 +18,13 @@ class SessionHandler implements \SessionHandlerInterface {
function read ($id) {
if($id) {
- $r = q("SELECT `sess_data` FROM `session` WHERE `sid`= '%s'", dbesc($id));
+ $r = q("SELECT sess_data FROM session WHERE sid= '%s'", dbesc($id));
if($r) {
return $r[0]['sess_data'];
}
else {
- q("INSERT INTO `session` (sess_data, sid, expire) values ('%s', '%s', '%s')",
+ q("INSERT INTO session (sess_data, sid, expire) values ('%s', '%s', '%s')",
dbesc(''),
dbesc($id),
dbesc(time() + 300)
@@ -59,8 +59,8 @@ class SessionHandler implements \SessionHandlerInterface {
$expire = time() + (60 * 60 * 24 * 1);
}
- q("UPDATE `session`
- SET `sess_data` = '%s', `expire` = '%s' WHERE `sid` = '%s'",
+ q("UPDATE session
+ SET sess_data = '%s', expire = '%s' WHERE sid = '%s'",
dbesc($data),
dbesc($expire),
dbesc($id)
@@ -76,7 +76,7 @@ class SessionHandler implements \SessionHandlerInterface {
function destroy ($id) {
- q("DELETE FROM `session` WHERE `sid` = '%s'", dbesc($id));
+ q("DELETE FROM session WHERE sid = '%s'", dbesc($id));
return true;
}
diff --git a/Zotlabs/Web/SubModule.php b/Zotlabs/Web/SubModule.php
index 5f49b9292..7c8404201 100644
--- a/Zotlabs/Web/SubModule.php
+++ b/Zotlabs/Web/SubModule.php
@@ -2,23 +2,28 @@
namespace Zotlabs\Web;
-
+/*
+ * @brief
+ *
+ */
class SubModule {
private $controller = false;
/**
+ * @brief Submodule constructor.
+ *
* Initiate sub-modules. By default the submodule name is in argv(1), though this is configurable.
* Example: Given a URL path such as /admin/plugins, and the Admin module initiates sub-modules.
* This means we'll look for a class Plugins in Zotlabs/Module/Admin/Plugins.php
- * The specific methods and calling parameters are up to the top level module controller logic.
+ * The specific methods and calling parameters are up to the top level module controller logic.
*
* **If** you were to provide sub-module support on the photos module, you would probably use
* $whicharg = 2, as photos are typically called with a URL path of /photos/channel_address/submodule_name
* where submodule_name might be something like album or image.
+ *
+ * @param int $whicharg
*/
-
-
function __construct($whicharg = 1) {
if(argc() < ($whicharg + 1))
@@ -31,13 +36,20 @@ class SubModule {
}
}
+ /**
+ * @brief
+ *
+ * @param string $method
+ * @return boolean|mixed
+ */
function call($method) {
if(! $this->controller)
return false;
- if(method_exists($this->controller,$method))
+
+ if(method_exists($this->controller, $method))
return $this->controller->$method();
+
return false;
}
}
-
diff --git a/Zotlabs/Zot/Auth.php b/Zotlabs/Zot/Auth.php
index 0837be21a..d4d3bee1d 100644
--- a/Zotlabs/Zot/Auth.php
+++ b/Zotlabs/Zot/Auth.php
@@ -149,9 +149,13 @@ class Auth {
// The actual channel sending the packet ($c[0]) is not important, but this provides a
// generic zot packet with a sender which can be verified
+ $x = q("select site_crypto from site where site_url = '%s' limit 1",
+ dbesc($hubloc['hubloc_url'])
+ );
+
$p = zot_build_packet($channel,$type = 'auth_check',
array(array('guid' => $hubloc['hubloc_guid'],'guid_sig' => $hubloc['hubloc_guid_sig'])),
- $hubloc['hubloc_sitekey'], $this->sec);
+ $hubloc['hubloc_sitekey'], (($x) ? $x[0]['site_crypto'] : ''), $this->sec);
$this->Debug('auth check packet created using sitekey ' . $hubloc['hubloc_sitekey']);
$this->Debug('packet contents: ' . $p);
diff --git a/Zotlabs/Zot/Finger.php b/Zotlabs/Zot/Finger.php
index e7603442f..7e0f5fb7c 100644
--- a/Zotlabs/Zot/Finger.php
+++ b/Zotlabs/Zot/Finger.php
@@ -2,7 +2,10 @@
namespace Zotlabs\Zot;
-
+/**
+ * @brief Finger
+ *
+ */
class Finger {
static private $token;
@@ -19,25 +22,27 @@ class Finger {
*
* @return zotinfo array (with 'success' => true) or array('success' => false);
*/
-
static public function run($webbie, $channel = null, $autofallback = true) {
$ret = array('success' => false);
self::$token = random_string();
- if (strpos($webbie,'@') === false) {
+ if (strpos($webbie, '@') === false) {
$address = $webbie;
$host = \App::get_hostname();
} else {
$address = substr($webbie,0,strpos($webbie,'@'));
$host = substr($webbie,strpos($webbie,'@')+1);
+ if(strpos($host,'/'))
+ $host = substr($host,0,strpos($host,'/'));
}
$xchan_addr = $address . '@' . $host;
if ((! $address) || (! $xchan_addr)) {
logger('zot_finger: no address :' . $webbie);
+
return $ret;
}
@@ -53,16 +58,15 @@ class Finger {
dbesc($xchan_addr)
);
- if ($r) {
+ if($r) {
$url = $r[0]['hubloc_url'];
- if ($r[0]['hubloc_network'] && $r[0]['hubloc_network'] !== 'zot') {
+ if($r[0]['hubloc_network'] && $r[0]['hubloc_network'] !== 'zot') {
logger('zot_finger: alternate network: ' . $webbie);
- logger('url: '.$url.', net: '.var_export($r[0]['hubloc_network'],true), LOGGER_DATA, LOG_DEBUG);
+ logger('url: ' . $url . ', net: ' . var_export($r[0]['hubloc_network'],true), LOGGER_DATA, LOG_DEBUG);
return $ret;
}
- }
- else {
+ } else {
$url = 'https://' . $host;
}
@@ -88,13 +92,12 @@ class Finger {
$result = z_post_url('http://' . $host . $rhs,$postvars);
}
}
- }
- else {
+ } else {
$rhs .= '?f=&address=' . urlencode($address) . '&token=' . self::$token;
$result = z_fetch_url($url . $rhs);
- if ((! $result['success']) && ($autofallback)) {
- if ($https) {
+ if((! $result['success']) && ($autofallback)) {
+ if($https) {
logger('zot_finger: https failed. falling back to http');
$result = z_fetch_url('http://' . $host . $rhs);
}
@@ -103,23 +106,25 @@ class Finger {
if(! $result['success']) {
logger('zot_finger: no results');
+
return $ret;
}
- $x = json_decode($result['body'],true);
+ $x = json_decode($result['body'], true);
if($x) {
- $signed_token = ((is_array($x) && array_key_exists('signed_token',$x)) ? $x['signed_token'] : null);
+ $signed_token = ((is_array($x) && array_key_exists('signed_token', $x)) ? $x['signed_token'] : null);
if($signed_token) {
- $valid = rsa_verify('token.' . self::$token,base64url_decode($signed_token),$x['key']);
+ $valid = rsa_verify('token.' . self::$token, base64url_decode($signed_token), $x['key']);
if(! $valid) {
logger('invalid signed token: ' . $url . $rhs, LOGGER_NORMAL, LOG_ERR);
+
return $ret;
}
}
else {
logger('No signed token from ' . $url . $rhs, LOGGER_NORMAL, LOG_WARNING);
// after 2017-01-01 this will be a hard error unless you over-ride it.
- if((time() > 1483228800) && (! get_config('system','allow_unsigned_zotfinger')))
+ if((time() > 1483228800) && (! get_config('system', 'allow_unsigned_zotfinger')))
return $ret;
}
}
diff --git a/app/bugreport.apd b/app/bugreport.apd
index 3714f0626..6fc9096ab 100644
--- a/app/bugreport.apd
+++ b/app/bugreport.apd
@@ -1,3 +1,3 @@
url: https://github.com/redmatrix/hubzilla/issues
-name: Bug Report
+name: Report Bug
photo: $baseurl/app/bugreport.png
diff --git a/boot.php b/boot.php
index f5733a234..41c52c68b 100755
--- a/boot.php
+++ b/boot.php
@@ -27,6 +27,9 @@
* documented.
*/
+// composer autoloader for all namespaced Classes
+require_once('vendor/autoload.php');
+
require_once('include/config.php');
require_once('include/network.php');
require_once('include/plugin.php');
@@ -41,13 +44,14 @@ require_once('include/taxonomy.php');
require_once('include/channel.php');
require_once('include/connections.php');
require_once('include/account.php');
+require_once('include/zid.php');
define ( 'PLATFORM_NAME', 'hubzilla' );
-define ( 'STD_VERSION', '1.14.3' );
-define ( 'ZOT_REVISION', '1.1' );
+define ( 'STD_VERSION', '2.0RC' );
+define ( 'ZOT_REVISION', '1.2' );
-define ( 'DB_UPDATE_VERSION', 1183 );
+define ( 'DB_UPDATE_VERSION', 1185 );
/**
@@ -59,7 +63,6 @@ define ( 'DB_UPDATE_VERSION', 1183 );
*/
define ( 'EOL', '<br>' . "\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
-//define ( 'NULL_DATE', '0000-00-00 00:00:00' );
define ( 'TEMPLATE_BUILD_PATH', 'store/[data]/smarty3' );
define ( 'DIRECTORY_MODE_NORMAL', 0x0000); // A directory client
@@ -80,8 +83,7 @@ $DIRECTORY_FALLBACK_SERVERS = array(
'https://hubzilla.zottel.net',
'https://hub.pixelbits.de',
'https://my.federated.social',
- 'https://hubzilla.nl',
- 'https://blablanet.es'
+ 'https://hubzilla.nl'
);
@@ -401,6 +403,7 @@ define ( 'NOTIFY_PROFILE', 0x0040 );
define ( 'NOTIFY_TAGSELF', 0x0080 );
define ( 'NOTIFY_TAGSHARE', 0x0100 );
define ( 'NOTIFY_POKE', 0x0200 );
+define ( 'NOTIFY_LIKE', 0x0400 );
define ( 'NOTIFY_SYSTEM', 0x8000 );
@@ -602,6 +605,12 @@ function sys_boot() {
@include('.htconfig.php');
+ // allow somebody to set some initial settings just in case they can't
+ // install without special fiddling
+
+ if(App::$install && file_exists('.htpreconfig.php'))
+ @include('.htpreconfig.php');
+
if(array_key_exists('default_timezone',get_defined_vars())) {
App::$config['system']['timezone'] = $default_timezone;
}
@@ -622,6 +631,18 @@ function sys_boot() {
date_default_timezone_set(App::$timezone);
+ if(! defined('DEFAULT_PLATFORM_ICON')) {
+ define( 'DEFAULT_PLATFORM_ICON', '/images/hz-32.png' );
+ }
+
+ if(! defined('DEFAULT_NOTIFY_ICON')) {
+ define( 'DEFAULT_NOTIFY_ICON', '/images/hz-white-32.png' );
+ }
+
+ if(! defined('CRYPTO_ALGORITHM')) {
+ define( 'CRYPTO_ALGORITHM', 'aes256cbc' );
+ }
+
/*
* Try to open the database;
*/
@@ -695,44 +716,14 @@ function startup() {
}
-class ZotlabsAutoloader {
- static public function loader($className) {
- $debug = false;
- $filename = str_replace('\\', '/', $className) . ".php";
- if(file_exists($filename)) {
- include($filename);
- if (class_exists($className)) {
- return TRUE;
- }
- }
- $arr = explode('\\',$className);
- if($arr && count($arr) > 1) {
- if(! $arr[0])
- $arr = array_shift($arr);
- $filename = 'addon/' . lcfirst($arr[0]) . '/' . $arr[1] . ((count($arr) === 2) ? '.php' : '/' . $arr[2] . ".php");
- if(file_exists($filename)) {
- include($filename);
- if (class_exists($className)) {
- return TRUE;
- }
- }
- }
-
- return FALSE;
- }
-}
-
-
/**
* class miniApp
*
* this is a transient structure which is needed to convert the $a->config settings
* from older (existing) htconfig files which used a global App ($a) into the updated App structure
- * which is now static (although currently constructed at startup). We are only converting
- * 'system' config settings.
+ * which is now static (although currently constructed at startup). We are only converting
+ * 'system' config settings.
*/
-
-
class miniApp {
public $config = array('system' => array());
@@ -976,29 +967,19 @@ class App {
self::$is_mobile = $mobile_detect->isMobile();
self::$is_tablet = $mobile_detect->isTablet();
- self::head_set_icon('/images/hz-32.png');
+ self::head_set_icon(DEFAULT_PLATFORM_ICON);
/*
* register template engines
*/
- spl_autoload_register('ZotlabsAutoloader::loader');
-
self::$meta= new Zotlabs\Web\HttpMeta();
// create an instance of the smarty template engine so we can register it.
$smarty = new Zotlabs\Render\SmartyTemplate();
-
- $dc = get_declared_classes();
-
- foreach ($dc as $k) {
- if(in_array('Zotlabs\\Render\\TemplateEngine', class_implements($k))) {
- self::register_template_engine($k);
- }
- }
-
-
+ /// @todo validate if this is still the desired behavior
+ self::register_template_engine(get_class($smarty));
}
@@ -1159,9 +1140,9 @@ class App {
public static function build_pagehead() {
- $user_scalable = ((local_channel()) ? get_pconfig(local_channel(),'system','user_scalable') : 1);
+ $user_scalable = ((local_channel()) ? get_pconfig(local_channel(),'system','user_scalable') : 0);
if ($user_scalable === false)
- $user_scalable = 1;
+ $user_scalable = 0;
$preload_images = ((local_channel()) ? get_pconfig(local_channel(),'system','preload_images') : 0);
if ($preload_images === false)
@@ -1758,14 +1739,6 @@ function login($register = false, $form_id = 'main-login', $hiddens=false) {
*/
function killme() {
- // Ensure that closing the database is the last function on the shutdown stack.
- // If it is closed prematurely sessions might not get saved correctly.
- // Note the second arg to PHP's session_set_save_handler() seems to order that shutdown
- // procedure last despite our best efforts, so we don't use that and implictly
- // call register_shutdown_function('session_write_close'); within Zotlabs\Web\Session::init()
- // and then register the database close function here where nothing else can register
- // after it.
-
register_shutdown_function('shutdown');
exit;
}
@@ -2480,6 +2453,11 @@ function cert_bad_email() {
function check_for_new_perms() {
+ // Do not execute if we are in the middle of a git update and the relevant versions don't match
+
+ if( \Zotlabs\Access\Permissions::version() != \Zotlabs\Access\PermissionRoles::version())
+ return;
+
$pregistered = get_config('system','perms');
$pcurrent = array_keys(\Zotlabs\Access\Permissions::Perms());
@@ -2509,19 +2487,27 @@ function check_for_new_perms() {
// get the permissions role details
$rp = \Zotlabs\Access\PermissionRoles::role_perms($r[0]['v']);
if($rp) {
- // set the channel limits if appropriate or 0
- if(array_key_exists('limits',$rp) && array_key_exists($p,$rp['limits'])) {
- \Zotlabs\Access\PermissionLimits::Set($cc['uid'],$p,$rp['limits'][$p]);
+
+ // for custom permission roles we need to customise how we initiate this new permission
+ if(array_key_exists('role',$rp) && ($rp['role'] === 'custom' || $rp['role'] === '')) {
+ \Zotlabs\Access\PermissionRoles::new_custom_perms($cc['uid'],$p,$x);
}
else {
- \Zotlabs\Access\PermissionLimits::Set($cc['uid'],$p,0);
- }
+ // set the channel limits if appropriate or 0
+ if(array_key_exists('limits',$rp) && array_key_exists($p,$rp['limits'])) {
+ \Zotlabs\Access\PermissionLimits::Set($cc['uid'],$p,$rp['limits'][$p]);
+ }
+ else {
+ \Zotlabs\Access\PermissionLimits::Set($cc['uid'],$p,0);
+ }
+
- $set = ((array_key_exists('perms_connect',$rp) && array_key_exists($p,$rp['perms_connect'])) ? true : false);
- // foreach connection set to the perms_connect value
- if($x) {
- foreach($x as $xx) {
- set_abconfig($cc['uid'],$xx['abook_xchan'],'my_perms',$p,intval($set));
+ $set = ((array_key_exists('perms_connect',$rp) && array_key_exists($p,$rp['perms_connect'])) ? true : false);
+ // foreach connection set to the perms_connect value
+ if($x) {
+ foreach($x as $xx) {
+ set_abconfig($cc['uid'],$xx['abook_xchan'],'my_perms',$p,intval($set));
+ }
}
}
}
diff --git a/composer.json b/composer.json
new file mode 100644
index 000000000..abf583875
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,55 @@
+{
+ "name" : "zotlabs/hubzilla",
+ "type" : "application",
+ "description" : "Hubzilla is a powerful platform for creating interconnected websites featuring a decentralized identity, communications, and permissions framework built using common webserver technology.",
+ "keywords" : [
+ "CMS",
+ "identity",
+ "decentralisation",
+ "permission",
+ "SSO",
+ "ZOT"
+ ],
+ "homepage" : "http://github.com/redmatrix/hubzilla",
+ "license" : "MIT",
+ "authors" : [{
+ "name" : "Mike Macgirvin",
+ "role" : "founder"
+ }
+ ],
+ "support" : {
+ "issues" : "https://github.com/redmatrix/hubzilla/issues",
+ "source" : "https://github.com/redmatrix/hubzilla"
+ },
+ "require" : {
+ "php" : ">=5.5",
+ "ext-curl" : "*",
+ "ext-gd" : "*",
+ "ext-mbstring" : "*",
+ "ext-xml" : "*",
+ "ext-openssl" : "*",
+ "sabre/dav" : "~3.2"
+ },
+ "require-dev" : {
+ "php" : ">=5.6",
+ "phpunit/phpunit" : "^5.6",
+ "behat/behat" : "@stable",
+ "behat/mink-extension": "@stable",
+ "behat/mink-goutte-driver": "@stable"
+ },
+ "autoload" : {
+ "psr-4" : {
+ "Hubzilla\\" : "include/",
+ "Zotlabs\\" : "Zotlabs/"
+ }
+ },
+ "autoload-dev" : {
+ "psr-4" : {
+ "Zotlabs\\Tests\\Unit\\" : "tests/unit"
+ }
+ },
+ "minimum-stability" : "stable",
+ "config" : {
+ "notify-on-install" : false
+ }
+} \ No newline at end of file
diff --git a/doc/Hubzilla_on_OpenShift.bb b/doc/Hubzilla_on_OpenShift.bb
index 9ccd66284..bdc8bf9bf 100644
--- a/doc/Hubzilla_on_OpenShift.bb
+++ b/doc/Hubzilla_on_OpenShift.bb
@@ -1,4 +1,4 @@
-[b]Hubzilla on OpenShift[/b]
+[b]$Projectname on OpenShift[/b]
You will notice a new .openshift folder when you fetch from upstream, i.e. from [url=https://github.com/redmatrix/hubzilla.git]https://github.com/redmatrix/hubzilla.git[/url] , which contains a deploy script to set up Hubzilla on OpenShift with plugins and extra themes.
As of this writing, 2015-10-28, you do not have to pay for OpenShift on the Free plan, which gives you three gears at no cost. The Bronze plan gives you three gears at no cost too, but you can expand to 16 gears by paying, and this requires you to register your payment card. The three gears can give three instances of Hubzilla with one gear each, or you can combine two gears into one high-availability Hubzilla instance and one extra gear. The main difference to be aware of is this: gears on the Free plan will go into hibernation if left idle for too long, this does not happen on the Bronze plan.
diff --git a/doc/about/about_hub.bb b/doc/about/about_hub.bb
new file mode 100644
index 000000000..0c1082f51
--- /dev/null
+++ b/doc/about/about_hub.bb
@@ -0,0 +1,7 @@
+[h3]Site Info[/h3]
+[list][*][url=[baseurl]/siteinfo]Site Info[/url]
+[*][url=[baseurl]/siteinfo/json]Site Info (JSON format)[/url][/list]
+[h3]Terms of Service[/h3]
+[list][*][url=[baseurl]/help/TermsOfService]Terms of Service for this hub[/url][/list]
+#include doc/SiteTOS.md;
+
diff --git a/doc/about/about_hubzilla.bb b/doc/about/about_hubzilla.bb
new file mode 100644
index 000000000..f249df66f
--- /dev/null
+++ b/doc/about/about_hubzilla.bb
@@ -0,0 +1,218 @@
+[h3]What is Hubzilla?[/h3]
+$Projectname is a [b]free and open source[/b] set of web applications and services running on a special kind of web server, called a "hub", that can connect to other hubs in a decentralised network we like to call "the grid", providing sophisticated communications, identity, and access control services which work together seamlessly across domains and independent websites. It allows anybody to publicly or [b]privately[/b] publish content via "channels", which are the fundamental, cryptographically secured identities that provide authentication independently of the hubs which host them. This revolutionary liberation of online identity from individual servers and domains is called "nomadic identity", and it is powered by the Zot protocol, a new framework for decentralised access control with fine-grained, extensible permissions.
+
+[h3]Right... so what is Hubzilla?[/h3]
+From the practical perspective of hub members who use the software, $Projectname offers a variety of familiar, integrated web apps and services, including:
+[ul]
+[li]social networking discussion threads[/li]
+[li]cloud file storage[/li]
+[li]calendar and contacts (with CalDAV and CardDAV support)[/li]
+[li]webpage hosting with a content management system[/li]
+[li]wiki[/li]
+[li]and more...[/li][/ul]
+While all of these apps and services can be found in other software packages, only $Projectname allows you to set permissions for groups and individuals who may not even have accounts on your hub! In typical web apps, if you want to share things privately on the internet, the people you share with must have accounts on the server hosting your data; otherwise, there is no robust way for your server to [i]authenticate[/i] visitors to the site to know whether to grant them access. $Projectname solves this problem with an advanced system of [i]remote authentication[/i] that validates the identity of visitors by employing techniques that include public key cryptography.
+
+[h3]Software Stack[/h3]
+The $Projectname software stack is a relatively standard webserver application written primarily in PHP/MySQL and [url=https://github.com/redmatrix/hubzilla/blob/master/install/INSTALL.txt]requiring little more than a web server, a MySQL-compatible database, and the PHP scripting language[/url]. It is designed to be easily installable by those with basic website administration skills on typical shared hosting platforms with a broad range of computing hardware. It is also easily extended via plugins and themes and other third-party tools.
+
+[h3]Additional Resources and Links[/h3]
+[list][*][url=http://hubzilla.org]Hubzilla project website[/url]
+[*][url=https://github.com/redmatrix/hubzilla]Hubzilla core code repository[/url]
+[*][url=https://github.com/redmatrix/hubzilla-addons]Hubzilla official addons repository[/url][/list]
+
+[h3]Glossary[/h3]
+[dl terms="b"]
+[*= hub] An instance of the Hubzilla software running on a standard web server
+
+[*= grid] The global network of hubs that exchange information with each other using the Zot protocol.
+
+[*= channel] The fundamental identity on the grid. A channel can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions.
+
+[*= clone] Channels can have clones associated with separate and otherwise unrelated accounts on independent hubs. Communications shared with a channel are synchronized among the channel clones, allowing a channel to send and receive messages and access shared content from multiple hubs. This provides resilience against network and hardware failures, which can be a significant problem for self-hosted or limited-resource web servers. Cloning allows you to completely move a channel from one hub to another, taking your data and connections with you. See nomadic identity.
+
+[*= nomadic identity] The ability to authenticate and easily migrate an identity across independent hubs and web domains. Nomadic identity provides true ownership of an online identity, because the identities of the channels controlled by an account on a hub are not tied to the hub itself. A hub is more like a "host" for channels. With Hubzilla, you don't have an "account" on a server like you do on typical websites; you own an identity that you can take with you across the grid by using clones.
+
+[*= [url=[baseurl]/help/developer/what_is_zot]Zot[/url]] The novel JSON-based protocol for implementing secure decentralised communications and services. It differs from many other communication protocols by building communications on top of a decentralised identity and authentication framework. The authentication component is similar to OpenID conceptually but is insulated from DNS-based identities. Where possible remote authentication is silent and invisible. This provides a mechanism for internet-scale distributed access control which is unobtrusive.
+[/dl]
+
+[h3]Features[/h3]
+This page lists some of the core features of $Projectname that are bundled with the official release. $Projectname is a highly extensible platform, so more features and capabilities can be added via additional themes and plugins.
+
+[h4]Affinity Slider[/h4]
+
+When adding connnections in $Projectname, members have the option of assigning "affinity" levels (how close your friendship is) to the new connection. For example, when adding someone who happens to be a person whose blog you follow, you could assign their channel an affinity level of &quot;Acquaintances&quot;.
+
+On the other hand, when adding a friend's channel, they could be placed under the affinity level of &quot;Friends&quot;.
+
+At this point, $Projectname [i]Affinity Slider[/i] tool, which usually appears at the top of your &quot;Matrix&quot; page, adjusts the content on the page to include those within the desired affinity range. Channels outside that range will not be displayed, unless you adjust the slider to include them.
+
+The Affinity Slider allows instantaneous filtering of large amounts of content, grouped by levels of closeness.
+
+[h4]Connection Filtering[/h4]
+
+You have the ability to control precisely what appears in your stream using the optional "Connection Filter". When enabled, the Connection Editor provides inputs for selecting criteria which needs to be matched in order to include or exclude a specific post from a specific channel. Once a post has been allowed, all comments to that post are allowed regardless of whether they match the selection criteria. You may select words that if present block the post or ensure it is included in your stream. Regular expressions may be used for even finer control, as well as hashtags or even the detected language of the post.
+
+[h4]Access Control Lists[/h4]
+
+When sharing content, members have the option of restricting who sees the content. By clicking on the padlock underneath the sharing box, one may choose desired recipients of the post, by clicking on their names.
+
+Once sent, the message will be viewable only by the sender and the selected recipients. In other words, the message will not appear on any public walls.
+
+Access Control Lists may be applied to content and posts, photos, events, webpages, chatrooms and files.
+
+[h4]Single Sign-on[/h4]
+
+Access Control Lists work for all channels in the grid due to our unique single sign-on technology. Most internal links provide an identity token which can be verified on other $Projectname sites and used to control access to private resources. You login once to your home hub. After that, authentication to all $Projectname resources is "magic".
+
+
+[h4]WebDAV enabled File Storage[/h4]
+
+Files may be uploaded to your personal storage area using your operating system utilities (drag and drop in most cases). You may protect these files with Access Control Lists to any combination of $Projectname members (including some third party network members) or make them public.
+
+[h4]Photo Albums[/h4]
+
+Store photos in albums. All your photos may be protected by Access Control Lists.
+
+[h4]Events Calendar[/h4]
+
+Create and manage events and tasks, which may also be protected with Access Control Lists. Events can be imported/exported to other software using the industry standard vcalendar/iCal format and shared in posts with others. Birthday events are automatically added from your friends and converted to your correct timezone so that you will know precisely when the birthday occurs - no matter where you are located in the world in relation to the birthday person. Events are normally created with attendance counters so your friends and connections can RSVP instantly.
+
+[h4]Chatrooms[/h4]
+
+You may create any number of personal chatrooms and allow access via Access Control Lists. These are typically more secure than XMPP, IRC, and other Instant Messaging transports, though we also allow using these other services via plugins.
+
+[h4]Webpage Building[/h4]
+
+$Projectname has many "Content Management" creation tools for building webpages, including layout editing, menus, blocks, widgets, and page/content regions. All of these may be access controlled so that the resulting pages are private to their intended audience.
+
+[h4]Apps[/h4]
+
+Apps may be built and distributed by members. These are different from traditional "vendor lockin" apps because they are controlled completely by the author - who can provide access control on the destination app pages and charge accordingly for this access. Most apps in $Projectname are free and can be created easily by those with no programming skills.
+
+[h4]Layout[/h4]
+
+Page layout is based on a description language called Comanche. $Projectname is itself written in Comanche layouts which you can change. This allows a level of customisation you won't typically find in so-called "multi-user environments".
+
+[h4]Bookmarks[/h4]
+
+Share and save/manage bookmarks from links provided in conversations.
+
+
+[h4]Private Message Encryption and Privacy Concerns[/h4]
+
+Private mail is stored in an obscured format. While this is not bullet-proof it typically prevents casual snooping by the site administrator or ISP.
+
+Each $Projectname channel has it's own unique set of private and associated public RSA 4096-bit keys, generated when the channels is first created. This is used to protect private messages and posts in transit.
+
+Additionally, messages may be created utilising "end-to-end encryption" which cannot be read by $Projectname operators or ISPs or anybody who does not know the passcode.
+
+Public messages are generally not encrypted in transit or in storage.
+
+Private messages may be retracted (unsent) although there is no guarantee the recipient hasn't read it yet.
+
+Posts and messages may be created with an expiration date, at which time they will be deleted/removed on the recipient's site.
+
+
+[h4]Service Federation[/h4]
+
+In addition to addon "cross-post connectors" to a variety of alternate networks, there is native support for importation of content from RSS/Atom feeds and using this to create special channels. Also, an experimental but working implementation of the Diaspora protocol allows communication with people on the Friendica and Diaspora decentralised social networks. This is currently marked experimental because these networks do not have the same level of privacy and encryption features and abilities as $Projectname and may present privacy risks.
+
+There is also experimental support for OpenID authentication which may be used in Access Control Lists. This is a work in progress. Your $Projectname hub may be used as an OpenID provider to authenticate you to external services which use this technology.
+
+Channels may have permissions to become "derivative channels" where two or more existing channels combine to create a new topical channel.
+
+[h4]Privacy Groups[/h4]
+
+Our implementation of privacy groups is similar to Google "Circles" and Diaspora "Aspects". This allows you to filter your incoming stream by selected groups, and automatically set the outbound Access Control List to only those in that privacy group when you post. You may over-ride this at any time (prior to sending the post).
+
+
+[h4]Directory Services[/h4]
+
+We provide easy access to a directory of members and provide decentralised tools capable of providing friend "suggestions". The directories are normal $Projectname sites which have chosen to accept the directory server role. This requires more resources than most typical sites so is not the default. Directories are synchronised and mirrored so that they all contain up-to-date information on the entire network (subject to normal propagation delays).
+
+
+[h4]TLS/SSL[/h4]
+
+For $Projectname hubs that use TLS/SSL, client to server communications are encrypted via TLS/SSL. Given recent disclosures in the media regarding widespread, global surveillance and encryption circumvention by the NSA and GCHQ, it is reasonable to assume that HTTPS-protected communications may be compromised in various ways. Private communications are consequently encrypted at a higher level before sending offsite.
+
+[h4]Channel Settings[/h4]
+
+When a channel is created, a role is chosen which applies a number of pre-configured security and privacy settings. These are chosen for best practives to maintain privacy at the requested levels.
+
+If you choose a "custom" privacy role, each channel allows fine-grained permissions to be set for various aspects of communication. For example, under the &quot;Security and Privacy Settings&quot; heading, each aspect on the left side of the page, has six (6) possible viewing/access options, that can be selected by clicking on the dropdown menu. There are also a number of other privacy settings you may edit.
+
+The options are:
+
+ - Nobody except yourself.
+ - Only those you specifically allow.
+ - Anybody in your address book.
+ - Anybody on this website.
+ - Anybody in this network.
+ - Anybody authenticated.
+ - Anybody on the Internet.
+
+
+[h4]Public and Private Forums[/h4]
+
+Forums are typically channels which may be open to participation from multiple authors. There are currently two mechanisms to post to forums: 1) "wall-to-wall" posts and 2) via forum @mention tags. Forums can be created by anybody and used for any purpose. The directory contains an option to search for public forums. Private forums can only be posted to and often only seen by members.
+
+
+[h4]Account Cloning[/h4]
+
+Accounts in $Projectname are referred to as [i]nomadic identities[/i], because a member's identity is not bound to the hub where the identity was originally created. For example, when you create a Facebook or Gmail account, it is tied to those services. They cannot function without Facebook.com or Gmail.com.
+
+By contrast, say you've created a $Projectname identity called [b]tina@$Projectnamehub.com[/b]. You can clone it to another $Projectname hub by choosing the same, or a different name: [b]liveForever@Some$ProjectnameHub.info[/b]
+
+Both channels are now synchronized, which means all your contacts and preferences will be duplicated on your clone. It doesn't matter whether you send a post from your original hub, or the new hub. Posts will be mirrored on both accounts.
+
+This is a rather revolutionary feature, if we consider some scenarios:
+
+ - What happens if the hub where an identity is based suddenly goes offline? Without cloning, a member will not be able to communicate until that hub comes back online (no doubt many of you have seen and cursed the Twitter "Fail Whale"). With cloning, you just log into your cloned account, and life goes on happily ever after.
+
+ - The administrator of your hub can no longer afford to pay for his free and public $Projectname hub. He announces that the hub will be shutting down in two weeks. This gives you ample time to clone your identity(ies) and preserve your$Projectname relationships, friends and content.
+
+ - What if your identity is subject to government censorship? Your hub provider may be compelled to delete your account, along with any identities and associated data. With cloning, $Projectname offers [b]censorship resistance[/b]. You can have hundreds of clones, if you wanted to, all named different, and existing on many different hubs, strewn around the internet.
+
+$Projectname offers interesting new possibilities for privacy. You can read more at the &lt;&lt;Private Communications Best Practices&gt;&gt; page.
+
+Some caveats apply. For a full explanation of identity cloning, read the &lt;HOW TO CLONE MY IDENTITY&gt;.
+
+[h4]Multiple Profiles[/h4]
+
+Any number of profiles may be created containing different information and these may be made visible to certain of your connections/friends. A "default" profile can be seen by anybody and may contain limited information, with more information available to select groups or people. This means that the profile (and site content) your beer-drinking buddies see may be different than what your co-workers see, and also completely different from what is visible to the general public.
+
+[h4]Account Backup[/h4]
+
+$Projectname offers a simple, one-click account backup, where you can download a complete backup of your profile(s). Backups can then be used to clone or restore a profile.
+
+[h4]Account Deletion[/h4]
+
+Accounts can be immediately deleted by clicking on a link. That's it. All associated content is then deleted from the grid (this includes posts and any other content produced by the deleted profile). Depending on the number of connections you have, the process of deleting remote content could take some time but it is scheduled to happen as quickly as is practical.
+
+[h4]Content Creation[/h4]
+
+[h4]Writing Posts[/h4]
+
+$Projectname supports a number of different ways of adding rich-text content. The default is a custom variant of BBcode, tailored for use in $Projectname. You may also enable the use of Markdown if you find that easier to work with. A visual editor may also be used. The traditional visual editor for $Projectname had some serious issues and has since been removed. We are currently looking for a replacement.
+
+When creating &quot;Websites&quot;, content may be entered in HTML, Markdown, BBcode, and/or plain text.
+
+[h4]Deletion of content[/h4]
+Any content created in $Projectname remains under the control of the member (or channel) that originally created it. At any time, a member can delete a message, or a range of messages. The deletion process ensures that the content is deleted, regardless of whether it was posted on a channel's primary (home) hub, or on another hub, where the channel was remotely authenticated via Zot ($Projectname communication and authentication protocol).
+
+[h4]Media[/h4]
+Similar to any other modern blogging system, social network, or a micro-blogging service, $Projectname supports the uploading of files, embedding of videos, linking web pages.
+
+[h4]Previewing/Editing[/h4]
+Post can be previewed prior to sending and edited after sending.
+
+[h4]Voting/Consensus[/h4]
+Posts can be turned into "consensus" items which allows readers to offer feedback, which is collated into "agree", "disagree", and "abstain" counters. This lets you gauge interest for ideas and create informal surveys.
+
+[h4]Extending $Projectname[/h4]
+
+$Projectname can be extended in a number of ways, through site customisation, personal customisation, option setting, themes, and addons/plugins.
+
+[h4]API[/h4]
+
+An API is available for use by third-party services. This is based originally on the early Twitter API (for which hundreds of third-party tools exist). It is currently being extended to provide access to facilities and abilities which are specific to $Projectname. Access may be provided by login/password or OAuth and client registration of OAuth applications is provided.
diff --git a/doc/about/hubzilla_project.bb b/doc/about/hubzilla_project.bb
new file mode 100644
index 000000000..7a584687d
--- /dev/null
+++ b/doc/about/hubzilla_project.bb
@@ -0,0 +1,185 @@
+[h3]$Projectname Governance[/h3]
+Governance relates to the management of a project and particularly how this relates to conflict resolution.
+
+[h4]Community Governance[/h4]
+The project is maintained and decisions made by the 'community'. The governance structure is still evolving. Until the structure is finalised, decisions are made in the following order:
+
+[ol]
+[*] Lazy Consensus
+
+If a project proposal is made to one of the community governance forums and there are no serious objections in a "reasonable" amount of time from date of proposal (we usually provide 2-3 days for all interested parties to weigh in), no vote needs to be taken and the proposal will be considered approved. Some concerns may be raised at this time, but if these are addressed during discussion and work-arounds provided, it will still be considered approved.
+
+
+[*] Veto
+
+Senior developers with a significant history of project commits may veto any decision. The decision may not proceed until the veto is removed or an alternative proposal is presented.
+
+
+[*] Community Vote
+
+A decision which does not have a clear mandate or clear consensus, but is not vetoed, can be taken to a community vote. At present this is a simple popular vote in one of the applicable community forums. At this time, popular vote decides the outcome. This may change in the future if the community adopts a 'council' governance model. This document will be updated at that time with the updated governance rules.
+[/ol]
+
+Community Voting does not always provide a pleasant outcome and can generate polarised factions in the community (hence the reason why other models are under consideration). If the proposal is 'down voted' there are still several things which can be done and the proposal re-submitted with slightly different parameters (convert to an addon, convert to an optional feature which is disabled by default, etc.). If interest in the feature is high and the vote is "close", it can generate lots of bad feelings amongst the losing voters. On such close votes, it is [b]strongly recommended[/b] that the proposer take steps to address any concerns that were raised and re-submit.
+
+
+
+[h4]Privacy Policy[/h4]
+
+Q: Who can see my content?
+
+A: By default ANYBODY on the internet, UNLESS you restrict it. $Projectname allows you to choose the privacy level you desire. Restricted content will NOT be visible to "spy networks" and advertisers. It will be protected against eavesdropping by outsiders - to the best of our ability. Hub administrators with sufficient skills and patience MAY be able to eavesdrop on some private communications but they must expend effort to do so. Privacy modes exist within $Projectname which are even resistant to eavesdropping by skilled and determined hub administrators.
+
+Q: Can my content be censored?
+
+A: $Projectname (the network) CANNOT censor your content. Server and hub administrators are subject to local laws and MAY remove objectionable content from their site/hub. Anybody MAY become a hub administrator, including you; and therefore publish content which might otherwise be censored. You still MAY be subject to local laws.
+
+
+[h5]Definitions[/h5]
+
+**$Projectname**
+
+Otherwise referred to as "the network", $Projectname is a collection of individual computers/servers (aka **hubs**) which connect together to form a larger cooperative network.
+
+**hub**
+
+An individual computer or server connected to $Projectname. These are provided by a **hub administrator** and may be public or private, paid or free.
+
+**hub administrator**
+
+The system operator of an individual hub.
+
+[h5]Policies[/h5]
+
+**Public Information**
+
+Any information or anything posted by you within $Projectname MAY be public or visible to anybody on the internet. To the extent possible, $Projectname allows you to protect content and restrict who can view it.
+
+Your profile photo, your channel name, and the location (URL or network address) of your channel are visible to anybody on the internet and privacy controls will not affect the display of these items.
+
+You MAY additionally provide other profile information. Any information which you provide in your "default" or **public profile** MAY be transmitted to other hubs in $Projectname and additionally MAY be displayed in the channel directory. You can restrict the viewing of this profile information. It may be restricted only to members of your hub, or only connections (friends), or other limited sets of viewers as you desire. If you wish for your profile to be restricted, you must set the appropriate privacy setting, or simply DO NOT provide additional information.
+
+**Content**
+
+Content you provide (status posts, photos, files, etc.) belongs to you. $Projectname default is to publish content openly and visible to anybody on the internet (PUBLIC). You MAY control this in your channel settings and restrict the default permissions or you MAY restrict the visibility of any single published item separately (PRIVATE). $Projectname developers will ensure that restricted content is ONLY visible to those in the restriction list - to the best of their ability.
+
+Content (especially status posts) that you share with other networks or that you have made visible to anybody on the internet (PUBLIC) cannot easily be taken back once it has been published. It MAY be shared with other networks and made available through RSS/Atom feeds. It may also be syndicated on other $Projectname sites. It MAY appear on other networks and websites and be visible in internet searches. If you do not wish this default behaviour please adjust your channel settings and restrict who can see your content.
+
+**Comments and Forum posts**
+
+Comments to posts that were created by others and posts which are designated as forum posts belong to you as the creator/author, but the distribution of these posts is not under your direct control, and you relinquish SOME rights to these items. These posts/comments MAY be re-distributed to others, and MAY be visible to anybody on the internet. In the case of comments, the creator of the "first message" in the thread (conversation) to which you are replying controls the distribution of all comments and replies to that message. They "own" and therefore have certain rights with regard to the entire conversation (including all comments contained within it). You can still edit or delete the comment, but the conversation owner also has rights to edit, delete, re-distribute, and backup/restore any or all the content from the conversation.
+
+**Private Information**
+
+$Projectname developers will ensure that any content you provide which is designated as PRIVATE will be protected against eavesdropping - to the best of their ability. Private channel content CAN be seen in the database of every involved hub administrator, but private messages are obscured in the database. The latter means that it is very difficult, but NOT impossible for this content to be seen by a hub administrator. Private channel content and private messages are also stripped from email notifications. End to end encryption is provided as an optional feature and this CANNOT be seen, even by a determined administrator.
+
+[h5]Identity Privacy[/h5]
+
+Privacy for your identity is another aspect. Because you have a decentralized identity in $Projectname, your privacy extends beyond your home hub. If you want to have complete control of your privacy and security you should run your own hub on a dedicated server. For many people, this is complicated and may stretch their technical abilities. So let's list a few precautions you can make to assure your privacy as much as possible.
+
+A decentralized identity has a lot of advantages and gives you al lot of interesting features, but you should be aware of the fact that your identity is known by other hubs in $Projectname network. One of those advantages is that other channels can serve you customized content and allow you to see private things (such as private photos which others wish to share with you). Because of this those channels need to know who you are. But we understand that sometimes those other channels know more from you than you might desire. For instance the plug-in Visage that can tell a channel owner the last time you visit their profile. You can easily OPT-OUT of this low level and we think, harmless tracking.
+
+* You can enable [Do Not Track (DNT)](http://donottrack.us/) in your web browser. We respect this new privacy policy proposal. All modern browsers support DNT. You will find it in the privacy settings of your browsers or else you can consult the web browser's manual. This will not affect the functionality of $Projectname. This setting is probably enough for most people.
+
+*You can [disable publication](settings) of your channel in our channel directory. If you want people to find your channel, you should give your channel address directly to them. We think this is a good indication that you prefer extra privacy and automatically enable "Do Not Track" if this is the case.
+
+* You can have a blocked hub. That means that all channels and content on that hub is not public, and not visible to the outside world. This is something only your hub administrator can do. We also respect this and automatically enable "Do Not Track" if it is set.
+
+[h5]Censorship[/h5]
+
+$Projectname is a global network which is inclusive of all religions and cultures. This does not imply that every member of the network feels the same way you do on contentious issues, and some people may be STRONGLY opposed to the content you post. In general, if you wish to post something that you know may nor be universally acceptable, the best approach is to restrict the audience using privacy controls to a small circle of friends.
+
+$Projectname as a network provider is unable to censor content. However, hub administrators MAY censor any content which appears on their hub to comply with local laws or even personal judgement. Their decision is final. If you have issues with any hub administrator, you may move your account and postings to another site which is more in line with your expectations. Please check (periodically) the [Terms of Service](help/TermsOfService) of your hub to learn about any rules or guidelines. If your content consists of material which is illegal or may cause issues, you are STRONGLY encouraged to host your own (become a hub administrator). You may still find that your content is blocked on some hubs, but $Projectname as a network cannot block it from being posted.
+
+$Projectname RECOMMENDS that hub administrators provide a grace period of 1-2 days between warning an account holder of content that needs to be removed and physically removing or disabling the account. This will give the content owner an opportunity to export their channel meta-data and import it to another site. In rare cases the content may be of such a nature to justify the immediate termination of the account. This is a hub decision, not a $Projectname decision.
+
+If you typically and regularly post content of an adult or offensive nature, you are STRONGLY encouraged to mark your account "NSFW" (Not Safe For Work). This will prevent the display of your profile photo in the directory except to viewers that have chosen to disable "safe mode". If your profile photo is found by directory administrators to be adult or offensive, the directory administrator MAY flag your profile photo as NSFW. There is currently no official mechanism to contest or reverse this decision, which is why you SHOULD mark your own account NSFW if it is likely to be inappropriate for general audiences.
+
+[h3]Credits[/h3]
+
+Thanks to all who have helped and contributed to the project and its predecessors over the years.
+It is possible we missed in your name but this is unintentional. We also thank the community and
+its members for providing valuable input and without whom this entire effort would be meaningless.
+
+It is also worth acknowledging the contributions and solutions to problems which arose from
+discussions amongst members and developers of other somewhat related and competing projects;
+even if we have had our occasional disagreements.
+
+[list]
+[li]Mike Macgirvin[/li]
+[li]Fabio Comuni[/li]
+[li]Simon L'nu[/li]
+[li]marijus[/li]
+[li]Tobias Diekershoff[/li]
+[li]fabrixxm[/li]
+[li]tommy tomson[/li]
+[li]Simon[/li]
+[li]zottel[/li]
+[li]Christian Vogeley[/li]
+[li]Jeroen van Riet Paap (jeroenpraat)[/li]
+[li]Michael Vogel[/li]
+[li]erik[/li]
+[li]Zach Prezkuta[/li]
+[li]Paolo T[/li]
+[li]Michael Meer[/li]
+[li]Michael[/li]
+[li]Abinoam P. Marques Jr[/li]
+[li]Tobias Hößl[/li]
+[li]Alexander Kampmann[/li]
+[li]Olaf Conradi[/li]
+[li]Paolo Tacconi[/li]
+[li]tobiasd[/li]
+[li]Devlon Duthie[/li]
+[li]Zvi ben Yaakov (a.k.a rdc)[/li]
+[li]Alexandre Hannud Abdo[/li]
+[li]Olivier Migeot[/li]
+[li]Chris Case[/li]
+[li]Klaus Weidenbach[/li]
+[li]Michael Johnston[/li]
+[li]olivierm[/li]
+[li]Vasudev Kamath[/li]
+[li]pixelroot[/li]
+[li]Max Weller[/li]
+[li]duthied[/li]
+[li]Martin Schmitt[/li]
+[li]Sebastian Egbers[/li]
+[li]Erkan Yilmaz[/li]
+[li]sasiflo[/li]
+[li]Stefan Parviainen[/li]
+[li]Haakon Meland Eriksen[/li]
+[li]Oliver Hartmann (23n)[/li]
+[li]Erik Lundin[/li]
+[li]habeascodice[/li]
+[li]sirius[/li]
+[li]Charles[/li]
+[li]Tony Baldwin[/li]
+[li]Hauke Zuehl[/li]
+[li]Keith Fernie[/li]
+[li]Anne Walk[/li]
+[li]toclimb[/li]
+[li]Daniel Frank[/li]
+[li]Matthew Exon[/li]
+[li]Michal Supler[/li]
+[li]Tobias Luther[/li]
+[li]U-SOUND\mike[/li]
+[li]mrjive[/li]
+[li]nostupidzone[/li]
+[li]tonnerkiller[/li]
+[li]Antoine G[/li]
+[li]Christian Drechsler[/li]
+[li]Ludovic Grossard[/li]
+[li]RedmatrixCanada[/li]
+[li]Stanislav Lechev [0xAF][/li]
+[li]aweiher[/li]
+[li]bufalo1973[/li]
+[li]dsp1986[/li]
+[li]felixgilles[/li]
+[li]ike[/li]
+[li]maase2[/li]
+[li]mycocham[/li]
+[li]ndurchx[/li]
+[li]pafcu[/li]
+[li]Simó Albert i Beltran[/li]
+[li]Manuel Reva[/li]
+[li]Manuel Jiménez Friaza[/li]
+[/list] \ No newline at end of file
diff --git a/doc/addons.bb b/doc/addons.bb
index b83b3276a..6fa9510f5 100644
--- a/doc/addons.bb
+++ b/doc/addons.bb
@@ -11,14 +11,11 @@
[*] chess - cross domain identity aware interactive chess games
[*] chords - generate fingering charts and alternatives for every known guitar chord
[*] custom_home - set a custom page as the hub start page
-[*] dfedfix - fixes some federation issues with Diaspora releases around aug-sep 2015
[*] diaspora - Diaspora protocol emulator
-[*] diaspost - crosspost to a Diaspora account (different from the Diaspora protocol emulator)
-[*] dirstats - show some interesting statistics generated by the driectory server
+[*] dirstats - show some interesting statistics generated by the directory server
[*] docs - alternate documentation pages
[*] donate - provides a project donation page
[*] dwpost - crosspost to Dreamwidth
-[*] embedphotos - tool to embed photos from your albums in a post
[*] extcron - use an external cron service to run your hub's scheduled tasks
[*] flattrwidget - provides a "Flattr Us" button
[*] flip - create upside down text
@@ -31,7 +28,7 @@
[*] ijpost - crosspost to Insanejournal
[*] irc - connect to IRC chatrooms
[*] jappixmini - XMPP chat
-[*] jsupload - upload multiple photos to photo albums at once.
+[*] js_upload - upload multiple photos to photo albums at once.
[*] keepout - prevents nearly all use of site when not logged in, more restrictive than 'block public' setting
[*] ldapauth - login via account on LDAP or Windows Active Directory domain
[*] libertree - crosspost to Libertree
@@ -40,20 +37,26 @@
[*] logrot - logfile rotation utility
[*] mahjongg - Chinese puzzle game
[*] mailhost - when using multiple channel clones, select one to receive email notifications
+[*] mailtest - interface for testing mail delivery system
[*] metatag - provide SEO friendly pages
[*] mayan_places - set location field to a random city in the Mayan world
[*] morechoice - additional gender/sexual-preference choices for profiles (not safe for work)
[*] moremoods - Additional mood options
[*] morepokes - additional poke options (not safe for work)
[*] msgfooter - provide legal or other text on each outgoing post
-[*] noembed - use noembed.com as an addition to Hubzilla's native oembed functionality (currently broken)
+[*] noembed - use noembed.com as an addition to $Projectname native oembed functionality (currently broken)
[*] nofed - prevent "federation" of channel posts, maintains all interaction on your site
[*] nsabait - add random terrorism related hashtags to your posts
[*] nsfw - Highly recommended plugin to collpase posts with inappropriate content
[*] openclipatar - choose a profile photo from hundreds of royalty free images
+[*] openid - OpenID authentication and OpenID server. Your OpenID URL is [observer.baseurl]/id/[observer.webname]
[*] openstreetmap - render locations and maps using OpenStreetMap
+[*] pageheader - display text at the top of every page on the site
+[*] phpmailer - alternate mail delivery system with more configurability
[*] piwik - open source website analytics
[*] planets - set location field to a random planet from Star Wars
+[*] pong - classic pong game
+[*] pubsubhubbub - PuSH protocol for optimised delivery to feed subscribers (required by GNU-Social protocol)
[*] pumpio - crosspost to Pump.io
[*] qrator - generate QR code images
[*] rainbowtag - display your tag and category clouds in colours
@@ -61,6 +64,7 @@
[*] redfiles - import file storage from redmatrix
[*] redphotos - import photo albums from redmatrix
[*] redred - Crosspost to another Red Matrix or Hubzilla channel
+[*] rendezvous - group location tracking
[*] rtof - Crosspost to Friendica
[*] sendzid - add 'zid' auth parmaters to all outbound links, not just in-network links
[*] skeleton - sample addon/plugin to demonstrate plugin development
diff --git a/doc/admin/administrator_guide.md b/doc/admin/administrator_guide.md
new file mode 100644
index 000000000..b7056e7e3
--- /dev/null
+++ b/doc/admin/administrator_guide.md
@@ -0,0 +1,345 @@
+
+### Overview
+
+$Projectname is more than a simple web application. It is a
+complex communications system which more closely resembles an email server
+than a web server. For reliability and performance, messages are delivered in
+the background and are queued for later delivery when sites are down. This
+kind of functionality requires a bit more of the host system than the typical
+blog. Not every PHP/MySQL hosting provider will be able to support
+$Projectname. Many will but please review the requirements and confirm these
+with your hosting provider prior to installation.
+
+We've tried very hard to ensure that $Projectname will run on commodity
+hosting platforms such as those used to host Wordpress blogs and Drupal
+websites. It will run on most any Linux VPS system. Windows LAMP platforms
+such as XAMPP and WAMP are not officially supported at this time however
+we welcome patches if you manage to get it working.
+
+### Where to find more help
+If you encounter problems or have issues not addressed in this documentation,
+please let us know via the [Github issue
+tracker](https://github.com/redmatrix/hubzilla/issues). Please be as clear as you
+can about your operating environment and provide as much detail as possible
+about any error messages you may see, so that we can prevent it from happening
+in the future. Due to the large variety of operating systems and PHP platforms
+in existence we may have only limited ability to debug your PHP installation or
+acquire any missing modules * but we will do our best to solve any general code
+issues.
+
+### Before you begin
+
+#### Choose a domain name or subdomain name for your server
+
+$Projectname can only be installed into the root of a domain or sub-domain, and can
+not be installed using alternate TCP ports.
+
+#### Decide if you will use SSL and obtain an SSL certificate before software installation
+
+You SHOULD use SSL. If you use SSL, you MUST use a "browser-valid" certificate.
+*You MUST NOT use self-signed certificates!*
+
+Please test your certificate prior to installation. A web tool for testing your
+certificate is available at "http://www.digicert.com/help/". When visiting your
+site for the first time, please use the SSL ("https://") URL if SSL is available.
+This will avoid problems later. The installation routine will not allow you to
+use a non browser-valid certificate.
+
+
+This restriction is incorporated because public posts from you may contain
+references to images on your own hub. Other members viewing their stream on
+other hubs will get warnings if your certificate is not trusted by their web
+browser. This will confuse many people because this is a decentralised network
+and they will get the warning about your hub while viewing their own hub and may
+think their own hub has an issue. These warnings are very technical and scary to
+some folks, many of whom will not know how to proceed except to follow the browser
+advice. This is disruptive to the community. That said, we recognise the issues
+surrounding the current certificate infrastructure and agree there are many
+problems, but that doesn't change the requirement.
+
+Free "browser-valid" certificates are available from providers such as StartSSL
+and LetsEncrypt.
+
+If you do NOT use SSL, there may be a delay of up to a minute for the initial
+install script - while we check the SSL port to see if anything responds there.
+When communicating with new sites, $Projectname always attempts connection on the
+SSL port first, before falling back to a less secure connection. If you do not
+use SSL, your webserver MUST NOT listen on port 443 at all.
+
+If you use LetsEncrypt to provide certificates and create a file under
+.well-known/acme-challenge so that LetsEncrypt can verify your domain ownership,
+please remove or rename the .well-known directory as soon as the certificate is
+generated. $Projectname will provide its own handler for ".well-known" services when
+it is installed, and an existing directory in this location may prevent some of
+these services from working correctly. This should not be a problem with Apache,
+but may be an issue with nginx or other web server platforms.
+
+### Deployment
+There are several ways to deploy a new hub.
+
+* Manual installation on an existing server
+* Automated installation on an existing server using a shell script
+* Automated deployment using an OpenShift virtual private server (VPS)
+
+### Requirements
+* Apache with mod-rewrite enabled and "AllowOverride All" so you can use a
+ local .htaccess file. Some folks have successfully used nginx and lighttpd.
+ Example config scripts are available for these platforms in doc/install.
+ Apache and nginx have the most support.
+
+* PHP 5.5 or later.
+ * Note that on some shared hosting environments, the _command line_ version of
+PHP might differ from the _webserver_ version
+
+* PHP *command line* access with register_argc_argv set to true in the
+ php.ini file * and with no hosting provider restrictions on the use of
+ exec() and proc_open().
+
+* curl, gd (with at least jpeg and png support), mysqli, mbstring, mcrypt,
+ and openssl extensions. The imagick extension is not required but desirable.
+
+* xml extension is required if you want webdav to work.
+
+* some form of email server or email gateway such that PHP mail() works.
+
+* Mysql 5.x or MariaDB or postgres database server.
+
+* ability to schedule jobs with cron.
+
+* Installation into a top-level domain or sub-domain (without a
+ directory/path component in the URL) is REQUIRED.
+
+### Manual Installation
+
+#### Unpack the $Projectname files into the root of your web server document area
+If you copy the directory tree to your webserver, make sure that you include the
+hidden files like .htaccess.
+
+If you are able to do so, we recommend using git to clone the source
+repository rather than to use a packaged tar or zip file. This makes the
+software much easier to update. The Linux command to clone the repository
+into a directory "mywebsite" would be:
+
+ git clone https://github.com/redmatrix/hubzilla.git mywebsite
+
+and then you can pick up the latest changes at any time with:
+
+ git pull
+
+make sure folders ``store/[data]/smarty3`` and ``store`` exist and are
+writable by the webserver:
+
+ mkdir -p "store/[data]/smarty3"
+ chmod -R 777 store
+
+ This permission (777) is very dangerous and if you have sufficient
+ privilege and knowledge you should make these directories writeable
+ only by the webserver and, if different, the user that will run the
+ cron job (see below). In many shared hosting environments this may be
+ difficult without opening a trouble ticket with your provider. The
+ above permissions will allow the software to work, but are not
+ optimal.
+
+The following directories also need to be writable by the webserver in order for certain
+web-based administrative tools to function:
+
+* `addon`
+* `extend`
+* `view/theme`
+* `widget`
+
+#### Official addons
+##### Installation
+Navigate to your webThen you should clone the addon repository (separately). We'll give this repository a nickname of 'hzaddons'. You can pull in other hubzilla addon repositories by giving them different nicknames::
+
+ cd mywebsite
+ util/add_addon_repo https://github.com/redmatrix/hubzilla-addons.git hzaddons
+
+##### Updating
+For keeping the addon tree updated, you should be on your top level website directory and issue an update command for that repository::
+
+ cd mywebsite
+ util/update_addon_repo hzaddons
+
+Create searchable representations of the online documentation. You may do this
+ any time that the documentation is updated :
+
+ cd mywebsite
+ util/importdoc
+
+### Automated installation via the .homeinstall shell script
+There is a shell script in (``.homeinstall/hubzilla-setup.sh``) that will install $Projectname and its dependencies on a fresh installation of Debian 8.3 stable (Jessie). It should work on similar Linux systems but your results may vary.
+
+#### Requirements
+The installation script was originally designed for a small hardware server behind your home router. However, it has been tested on several systems running Debian 8.3:
+
+* Home-PC (Debian-8.3.0-amd64)
+
+ * Internet connection and router at home
+ * Mini-pc connected to your router
+ * USB drive for backups
+ * Fresh installation of Debian on your mini-pc
+ * Router with open ports 80 and 443 for your Debian
+
+* DigitalOcean droplet (Debian 8.3 x64 / 512 MB Memory / 20 GB Disk / NYC3)
+
+#### Overview of installation steps
+1. `apt-get install git`
+1. `mkdir -p /var/www/html`
+1. `cd /var/www/html`
+1. `git clone https://github.com/redmatrix/hubzilla.git .`
+1. `nano .homeinstall/hubzilla-config.txt`
+1. `cd .homeinstall/`
+1. `./hubzilla-setup.sh`
+1. `sed -i "s/^upload_max_filesize =.*/upload_max_filesize = 100M/g" /etc/php5/apache2/php.ini`
+1. `sed -i "s/^post_max_size =.*/post_max_size = 100M/g" /etc/php5/apache2/php.ini`
+1. `service apache2 reload`
+1. Open your domain with a browser and step throught the initial configuration of $Projectname.
+
+### Service Classes
+
+Service classes allow you to set limits on system resources by limiting what individual
+accounts can do, including file storage and top-level post limits. Define custom service
+classes according to your needs in the `.htconfig.php` file. For example, create
+a _standard_ and _premium_ class using the following lines:
+
+ // Service classes
+
+ App::$config['system']['default_service_class']='standard'; // this is the default service class that is attached to every new account
+
+ // configuration for parent service class
+ App::$config['service_class']['standard'] =
+ array('photo_upload_limit'=>2097152, // total photo storage limit per channel (here 2MB)
+ 'total_identities' =>1, // number of channels an account can create
+ 'total_items' =>0, // number of top level posts a channel can create. Applies only to top level posts of the channel user, other posts and comments are unaffected
+ 'total_pages' =>100, // number of pages a channel can create
+ 'total_channels' =>100, // number of channels the user can add, other users can still add this channel, even if the limit is reached
+ 'attach_upload_limit' =>2097152, // total attachment storage limit per channel (here 2MB)
+ 'chatters_inroom' =>20);
+
+ // configuration for teacher service class
+ App::$config['service_class']['premium'] =
+ array('photo_upload_limit'=>20000000000, // total photo storage limit per channel (here 20GB)
+ 'total_identities' =>20, // number of channels an account can create
+ 'total_items' =>20000, // number of top level posts a channel can create. Applies only to top level posts of the channel user, other posts and comments are unaffected
+ 'total_pages' =>400, // number of pages a channel can create
+ 'total_channels' =>2000, // number of channels the user can add, other users can still add this channel, even if the limit is reached
+ 'attach_upload_limit' =>20000000000, // total attachment storage limit per channel (here 20GB)
+ 'chatters_inroom' =>100);
+
+To apply a service class to an existing account, use the command line utility from the
+web root:
+
+`util/service_class`
+list service classes
+
+`util/config system default_service_class firstclass`
+set the default service class to 'firstclass'
+
+`util/service_class firstclass`
+list the services that are part of 'firstclass' service class
+
+`util/service_class firstclass photo_upload_limit 10000000`
+set firstclass total photo disk usage to 10 million bytes
+
+`util/service_class --account=5 firstclass`
+set account id 5 to service class 'firstclass' (with confirmation)
+
+`util/service_class --channel=blogchan firstclass`
+set the account that owns channel 'blogchan' to service class 'firstclass' (with confirmation)
+
+**Service class limit options**
+
+* photo_upload_limit - maximum total bytes for photos
+* total_items - maximum total toplevel posts
+* total_pages - maximum comanche pages
+* total_identities - maximum number of channels owned by account
+* total_channels - maximum number of connections
+* total_feeds - maximum number of rss feed connections
+* attach_upload_limit - maximum file upload storage (bytes)
+* minimum_feedcheck_minutes - lowest setting allowed for polling rss feeds
+* chatrooms - maximum chatrooms
+* chatters_inroom - maximum chatters per room
+* access_tokens - maximum number of Guest Access Tokens per channel
+
+### Theme management
+#### Repo management example
+1. Navigate to your hub web root
+
+ ```
+ root@hub:/root# cd /var/www
+ ```
+2. Add the theme repo and give it a name
+
+ ```
+ root@hub:/var/www# util/add_theme_repo https://github.com/DeadSuperHero/redmatrix-themes.git DeadSuperHero
+ ```
+3. Update the repo by using
+
+ ```
+ root@hub:/var/www# util/update_theme_repo DeadSuperHero
+ ```
+
+### Channel Directory
+
+#### Keywords
+
+There is a "tag cloud" of keywords that can appear on the channel directory page.
+If you wish to hide these keywords, which are drawn from the directory server, you
+can use the *config* tool:
+
+ util/config system disable_directory_keywords 1
+
+If your hub is in the standalone mode because you do not wish to connect to the
+global grid, you may instead ensure the the _directory_server_ system option is
+empty:
+
+ util/config system directory_server ""
+
+### Upgrading from RedMatrix to $Projectname
+
+#### How to migrate an individual channel from RedMatrix to $Projectname
+
+1. Clone the channel by opening an account on a $Projectname hub and performing a basic import (not content) from the original RedMatrix hub. Give your new clone time to sync connections and settings.
+1. Export individual channel content from your RedMatrix hub to a set of JSON text files using the red.hub/uexport tool. Do this in monthly increments if necessary.
+1. Import the JSON data files sequentially in chronological order into the $Projectname clone using the new.hub/import_items tool.
+1. Inform your Friendica and Diaspora contacts that your channel moves. They need to reconnect to your new address.
+1. After successful import (check!) delete your channel on the old RedMatrix Server.
+1. On the $Projectname server visit new.hub/locs and upgrade to your channel to a primary one. And when the old Redmatrix server is still listed delete them here as well. Press "Sync" to inform all other server in the grid.
+
+### Troubleshooting
+#### Log files
+
+There are three different log facilities.
+
+**The first is the database failure log**. This is only used if you create a file called specifically 'dbfail.out' in the root folder of your website and make it write-able by the web server. If we have any database failed queries, they are all reported here. They generally indicate typos in our queries, but also occur if the database server disconnects or tables get corrupted. On rare occasions we'll see race conditions in here where two processes tried to create an xchan or cache entry with the same ID. Any other errors (especially persistent errors) should be investigated.
+
+**The second is the PHP error log**. This is created by the language processor and only reports issues in the language environment. Again these can be syntax errors or programming errors, but these generally are fatal and result in a "white screen of death"; e.g. PHP terminates. You should probably look at this file if something goes wrong that doesn't result in a white screen of death, but it isn't uncommon for this file to be empty for days on end.
+
+There are some lines at the bottom of the supplied .htconfig.php file; which if uncommented will enable a PHP error log (*extremely* useful for finding the source of white screen failures). This isn't done by default due to potential issues with logfile ownership and write permissions and the fact that there is no logfile rotation by default.
+
+
+**The third is the "application log"**. This is used by $Projectname to report what is going on in the program and usually reports any difficulties or unexpected data we received. It also occasionally reports "heartbeat" status messages to indicate that we reached a certain point in a script. **This** is the most important log file to us, as we create it ourself for the sole purpose of reporting the status of background tasks and anything that seems weird or out of place. It may not be fatal, but maybe just unexpected. If you're performing a task and there's a problem, let us know what is in this file when the problem occurred. (Please don't send me 100M dumps you'll only piss me off). Just a few relevant lines so I can rule out a few hundred thousand lines of code and concentrate on where the problem starts showing up.
+
+These are your site logs, not mine. We report serious issues at any log level. I highly recommend 'DEBUG' log level for most sites - which provides a bit of additional info and doesn't create huge logfiles. When there's a problem which defies all attempts to track, you might wish to use DATA log level for a short period of time to capture all the detail of what structures we were dealing with at the time. This log level will use a lot of space so is recommended only for brief periods or for developer test sites.
+
+I recommend configuring logrotate for both the php log and the application log. I usually have a look at dbfail.out every week or two, fix any issues reported and then starting over with a fresh file. Likewise with the PHP logfile. I refer to it once in a while to see if there's something that needs fixing.
+
+If something goes wrong, and it's not a fatal error, I look at the application logfile. Often I will
+```
+tail -f logfile.out
+```
+
+While repeating an operation that has problems. Often I'll insert extra logging statements in the code if there isn't any hint what's going wrong. Even something as simple as "got here" or printing out the value of a variable that might be suspect. You can do this too - in fact I encourage you to do so. Once you've found what you need to find, you can
+
+```
+git checkout file.php
+```
+
+To immediately clear out all the extra logging stuff you added. Use the information from this log and any detail you can provide from your investigation of the problem to file your bug report - unless your analysis points to the source of the problem. In that case, just fix it.
+
+##### Rotating log files
+
+1. Enable the **logrot** addon in the official [hubzilla-addons](https://github.com/redmatrix/hubzilla-addons) repo
+1. Create a directory in your web root called `log` with webserver write permissions
+1. Go to the **logrot** admin settings and enter this folder name as well as the max size and number of retained log files.
diff --git a/doc/admin/hub_snapshots.md b/doc/admin/hub_snapshots.md
new file mode 100644
index 000000000..ab0948aa8
--- /dev/null
+++ b/doc/admin/hub_snapshots.md
@@ -0,0 +1,127 @@
+### Hub Snapshot Tools
+
+Hubzilla developers frequently need to switch between branches that might have
+incompatible database schemas or content. The following two scripts create and
+restore complete snapshots of a Hubzilla instance, including both the hub web
+root and the entire database state. Each script requires a config file called
+`hub-snapshot.conf` residing in the same folder and containing the specific
+directories and database details of your hub.
+
+### Config
+
+The format of the config file is very strict. There must be no spaces between the
+variable name and the value. Replace only the content inside the quotes with your
+configuration. Save this file as `hub-snapshot.conf` alongside the scripts.
+
+ # Location of hub root. Typically this is the location of the Hubzilla repo clone.
+ HUBROOT="/var/www/"
+ # MySQL database name
+ DBNAME="hubzilla"
+ # MySQL database user
+ DBUSER="hubzilla"
+ # MySQL database password
+ DBPWD="akeufajeuwfb"
+ # The target snapshot folder where the git repo will be initialized
+ SNAPSHOTROOT="/root/snapshots/hubzilla/"
+
+### Snapshot
+
+Example usage:
+
+ sh hub-snapshot.sh my-hub.conf "Commit message for the snapshot"
+
+**hub-snapshot.sh**:
+
+ #!/bin/bash
+
+ if ! [ -f "$1" ]; then
+ echo "$1 is not a valid file. Aborting..."
+ exit 1
+ fi
+ source "$1"
+ #echo "$DBNAME"
+ #echo "$DBUSER"
+ #echo "$DBPWD"
+ #echo "$HUBROOT"
+ #echo "$SNAPSHOTROOT"
+ MESSAGE="snapshot: $2"
+
+ if [ "$DBPWD" == "" -o "$SNAPSHOTROOT" == "" -o "$DBNAME" == "" -o "$DBUSER" == "" -o "$HUBROOT" == "" ]; then
+ echo "Required variable is not set. Aborting..."
+ exit 1
+ fi
+
+ if [ ! -d "$SNAPSHOTROOT"/db/ ]; then
+ mkdir -p "$SNAPSHOTROOT"/db/
+ fi
+ if [ ! -d "$SNAPSHOTROOT"/www/ ]; then
+ mkdir -p "$SNAPSHOTROOT"/www/
+ fi
+
+ if [ ! -d "$SNAPSHOTROOT"/www/ ] || [ ! -d "$SNAPSHOTROOT"/db/ ]; then
+ echo "Error creating snapshot directories. Aborting..."
+ exit 1
+ fi
+
+ echo "Export database..."
+ mysqldump -u "$DBUSER" -p"$DBPWD" "$DBNAME" > "$SNAPSHOTROOT"/db/"$DBNAME".sql
+ echo "Copy hub root files..."
+ rsync -va --delete --exclude=.git* "$HUBROOT"/ "$SNAPSHOTROOT"/www/
+
+ cd "$SNAPSHOTROOT"
+
+ if [ ! -d ".git" ]; then
+ git init
+ fi
+ if [ ! -d ".git" ]; then
+ echo "Cannot initialize git repo. Aborting..."
+ exit 1
+ fi
+
+ git add -A
+ echo "Commit hub snapshot..."
+ git commit -a -m "$MESSAGE"
+
+ exit 0
+
+### Restore
+
+ #!/bin/bash
+ # Restore hub to a previous state. Input hub config and commit hash
+
+ if ! [ -f "$1" ]; then
+ echo "$1 is not a valid file. Aborting..."
+ exit 1
+ fi
+ source "$1"
+ COMMIT=$2
+
+ if [ "$DBPWD" == "" -o "$SNAPSHOTROOT" == "" -o "$DBNAME" == "" -o "$DBUSER" == "" -o "$HUBROOT" == "" ]; then
+ echo "Required variable is not set. Aborting..."
+ exit 1
+ fi
+ RESTOREDIR="$(mktemp -d)/"
+
+ if [ ! -d "$RESTOREDIR" ]; then
+ echo "Cannot create restore directory. Aborting..."
+ exit 1
+ fi
+ echo "Cloning the snapshot repo..."
+ git clone "$SNAPSHOTROOT" "$RESTOREDIR"
+ cd "$RESTOREDIR"
+ echo "Checkout requested snapshot..."
+ git checkout "$COMMIT"
+ echo "Restore hub root files..."
+ rsync -a --delete --exclude=.git* "$RESTOREDIR"/www/ "$HUBROOT"/
+ echo "Restore hub database..."
+ mysql -u "$DBUSER" -p"$DBPWD" "$DBNAME" < "$RESTOREDIR"/db/"$DBNAME".sql
+
+ chown -R www-data:www-data "$HUBROOT"/{store,extend,addon,.htlog,.htconfig.php}
+
+ echo "Restored hub to snapshot $COMMIT"
+ echo "Removing temporary files..."
+
+ rm -rf "$RESTOREDIR"
+
+ exit 0
+
diff --git a/doc/api/api_albums.md b/doc/api/api_albums.md
new file mode 100644
index 000000000..230daae3c
--- /dev/null
+++ b/doc/api/api_albums.md
@@ -0,0 +1,66 @@
+API albums
+==========
+
+Description: list photo albums
+
+GET /api/z/1.0/albums
+
+
+Output:
+
+ text - textual name
+
+ total - number of photos in this album
+
+ url - web URL
+
+ urlencode - textual name, urlencoded
+
+ bin2hex - textual name using bin2hex (which is used in the web URL link)
+
+
+Example:
+
+
+ {
+
+ "success": true,
+ "albums": [
+ {
+ "text": "/",
+ "total": "2",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/",
+ "urlencode": "",
+ "bin2hex": ""
+ },
+ {
+ "text": "2016-01",
+ "total": "6",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/323031362d3031",
+ "urlencode": "2016-01",
+ "bin2hex": "323031362d3031"
+ },
+ {
+ "text": "2016-02",
+ "total": "7",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/323031362d3032",
+ "urlencode": "2016-02",
+ "bin2hex": "323031362d3032"
+ },
+ {
+ "text": "Cover Photos",
+ "total": "5",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/436f7665722050686f746f73",
+ "urlencode": "Cover+Photos",
+ "bin2hex": "436f7665722050686f746f73"
+ },
+ {
+ "text": "Profile Photos",
+ "total": "26",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/50726f66696c652050686f746f73",
+ "urlencode": "Profile+Photos",
+ "bin2hex": "50726f66696c652050686f746f73"
+ }
+ ]
+
+ }
diff --git a/doc/api/api_filedata.md b/doc/api/api_filedata.md
new file mode 100644
index 000000000..1d46a495c
--- /dev/null
+++ b/doc/api/api_filedata.md
@@ -0,0 +1,66 @@
+API filedata
+=============
+
+Provides the ability to download a file from cloud storage in chunks
+
+GET /api/z/1.0/filedata
+
+
+Required:
+
+ - file_id
+ attach.hash of desired file ('begins with' match)
+
+
+Optional:
+
+ - start
+ starting byte of returned data in file (counting from 0)
+
+ - length
+ length (prior to base64 encoding) of chunk to download
+
+
+Returns:
+
+ attach (DB) structure with base64 encoded 'content' comprised of the desired chunk
+
+
+
+Example:
+
+ https://xyz.macgirvin.com/api/z/1.0/filedata?f=&file_id=9f5217770fd&start=0&length=48
+
+Returns:
+
+ {
+
+ "attach": {
+ "id": "107",
+ "aid": "1",
+ "uid": "2",
+ "hash": "9f5217770fd55d563bd77f84d534d8e119a187514bbd391714626cd9c0e60207",
+ "creator": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "filename": "pcxtopbm.c",
+ "filetype": "application/octet-stream",
+ "filesize": "3934",
+ "revision": "0",
+ "folder": "",
+ "flags": "0",
+ "is_dir": "0",
+ "is_photo": "0",
+ "os_storage": "1",
+ "os_path": "",
+ "display_path": "",
+ "content": "LyogcGN4dG9wYm0uYyAtIGNvbnZlcnQgUEMgcGFpbnRicnVzaCAoLnBjeCkgZmls",
+ "created": "2016-07-24 23:13:01",
+ "edited": "2016-07-24 23:13:01",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": "",
+ "start": 0,
+ "length": 48
+ }
+
+ } \ No newline at end of file
diff --git a/doc/api/api_files.md b/doc/api/api_files.md
new file mode 100644
index 000000000..c2a10fce5
--- /dev/null
+++ b/doc/api/api_files.md
@@ -0,0 +1,103 @@
+API files
+=========
+
+List file storage (attach DB)
+
+GET /api/z/1.0/files
+
+
+Options:
+
+ - hash
+ return only entries matching hash (exactly)
+
+ - filename
+ return only entries matching filename (substring)
+
+ - filetype
+ return only entries matching filetype/mimetype (substring)
+
+ - start
+ start at record (default 0)
+
+ - records
+ number of records to return or 0 for unlimited
+
+
+
+Example:
+
+curl -u mychannel:mypassword https://xyz.macgirvin.com/api/z/1.0/files -d filetype=multipart/mixed
+
+
+Returns:
+
+ {
+
+ "success": true,
+ "results": [
+ {
+ "id": "1",
+ "aid": "1",
+ "uid": "2",
+ "hash": "44ee8b2a1a7f36dea07b93b7747a2383a1bc0fdd08339e8928bfcbe45f65d939",
+ "filename": "Profile Photos",
+ "filetype": "multipart/mixed",
+ "filesize": "0",
+ "revision": "0",
+ "folder": "",
+ "os_storage": "1",
+ "is_dir": "1",
+ "is_photo": "0",
+ "flags": "0",
+ "created": "2016-01-02 21:51:17",
+ "edited": "2016-01-02 21:51:17",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": ""
+ },
+ {
+ "id": "12",
+ "aid": "1",
+ "uid": "2",
+ "hash": "71883f1fc64af33889229cbc79c5a056deeec5fc277d765f182f19073e1b2998",
+ "filename": "Cover Photos",
+ "filetype": "multipart/mixed",
+ "filesize": "0",
+ "revision": "0",
+ "folder": "",
+ "os_storage": "1",
+ "is_dir": "1",
+ "is_photo": "0",
+ "flags": "0",
+ "created": "2016-01-15 00:24:33",
+ "edited": "2016-01-15 00:24:33",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": ""
+ },
+ {
+ "id": "16",
+ "aid": "1",
+ "uid": "2",
+ "hash": "f48f7ec3278499d1dd86b72c3207beaaf4717b07df5cc9b373f14d7aad2e1bcd",
+ "filename": "2016-01",
+ "filetype": "multipart/mixed",
+ "filesize": "0",
+ "revision": "0",
+ "folder": "",
+ "os_storage": "1",
+ "is_dir": "1",
+ "is_photo": "0",
+ "flags": "0",
+ "created": "2016-01-22 03:24:55",
+ "edited": "2016-01-22 03:26:57",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": ""
+ }
+ ]
+ }
diff --git a/doc/api_functions.bb b/doc/api/api_functions.bb
index e6cde3dc6..e6cde3dc6 100644
--- a/doc/api_functions.bb
+++ b/doc/api/api_functions.bb
diff --git a/doc/api/api_group_members.md b/doc/api/api_group_members.md
new file mode 100644
index 000000000..497e0aac6
--- /dev/null
+++ b/doc/api/api_group_members.md
@@ -0,0 +1,133 @@
+API group_members
+=================
+
+GET /api/z/1.0/group_members
+
+
+
+Required:
+
+ group_id or group_name
+
+
+Returns:
+
+ group_member+abook+xchan (DB join) for each member of the privacy group
+
+
+ [
+
+ {
+ "id": "1",
+ "uid": "2",
+ "gid": "1",
+ "xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "abook_id": "2",
+ "abook_account": "1",
+ "abook_channel": "2",
+ "abook_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "abook_my_perms": "218555",
+ "abook_their_perms": "0",
+ "abook_closeness": "0",
+ "abook_created": "2016-01-02 21:16:26",
+ "abook_updated": "2016-01-02 21:16:26",
+ "abook_connected": "0000-00-00 00:00:00",
+ "abook_dob": "0000-00-00 00:00:00",
+ "abook_flags": "0",
+ "abook_blocked": "0",
+ "abook_ignored": "0",
+ "abook_hidden": "0",
+ "abook_archived": "0",
+ "abook_pending": "0",
+ "abook_unconnected": "0",
+ "abook_self": "1",
+ "abook_feed": "0",
+ "abook_profile": "",
+ "abook_incl": "",
+ "abook_excl": "",
+ "abook_instance": "",
+ "xchan_hash": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "xchan_guid": "lql-1VnxtiO4-WF0h72wLX1Fu8szzHDOXgQaTbELwXW77k8AKFfh-hYr70vqMrc3SSvWN-Flrc5HFhRTWB7ICw",
+ "xchan_guid_sig": "PafvEL0VpKfxATxlCqDjfOeSIMdmpr3iU7X-Sysa1h5LzDpjSXsjO37tYZL-accb1M5itLlfnW5epkTa5I4flsW21zSY1A2jCuBQUTLLGV7rNyyBy7lgqJUFvAMRx0TfXzP9lcaPqlM9T1tA6jfWOsOmkdzwofGeXBnsjGfjsO2xdGYe6vwjOU0DSavukvzDMnOayB9DekpvDnaNBTxeGLM45Skzr7ZEMcNF7TeXMbnvpfLaALYEKeQs9bGH-UgAG8fBWgzVAzeBfx_XSR1rdixjyiZGP0kq0h35SlmMPcEjliodOBFwMXqpXFB7Ibp4F6o6te2p2ErViJccQVG8VNKB6SbKNXY6bhP5zVcVsJ-vR-p4xXoYJJvzTN7yTDsGAXHOLF4ZrXbo5yi5gFAlIrTLAF2EdWQwxSGyLRWKxG8PrDkzEzX6cJJ0VRcLh5z6OI5QqQNdeghPZbshMFMJSc_ApCPi9_hI4ZfctCIOi3T6bdgTNKryLm5fhy_eqjwLAZTGP-aUBgLZpb1mf2UojBn6Ey9cCyq-0T2RWyk-FcIcbV4qJ-p_8oODqw13Qs5FYkjLr1bGBq82SuolkYrXEwQClxnrfKa4KYc2_eHAXPL01iS9zVnI1ySOCNJshB97Odpooc4wk7Nb2Fo-Q6THU9zuu0uK_-JbK7IIl6go2qA",
+ "xchan_pubkey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA18JB76lyP4zzL/y7BCej\neJnfZIWZNtM3MZvI1zEVMWmmwOS+u/yH8oPwyaDk4Y/tnj8GzMPj1lCGVRcd8EJa\nNrCMd50HODA5EsJtxpsOzRcILYjOcTtIAG1K4LtKqELi9ICAaFp0fNfa+Jf0eCek\nvPusx2/ORhy+o23hFoSMhL86o2gmaiRnmnA3Vz4ZMG92ieJEDMXt9IA1EkIqS4y5\nBPZfVPLD1pv8iivj+dtN1XjwplgjUbtxmU0/Ej808nHppscRIqx/XJ0XZU90oNGw\n/wYoK2EzJlPbRsAkwNqoFrAYlr5HPpn4BJ2ebFYQgWBUraD7HwS5atsQEaxGfO21\nlUP0+lDg9t3CXvudDj0UG1jiEKbVIGA+4aG0GN2DSC5AyRq/GRxqyay5W2vQbAZH\nyvxPGrZFO24I65g3pjhpjEsLqZ4ilTLQoLMs0drCIcRm5RxMUo4s/LMg16lT4cEk\n1qRtk2X0Sb1AMQQ2uRXiVtWz77QHMONEYkf6OW4SHbwcv5umvlv69NYEGfCcbgq0\nAV7U4/BWztUz/SWj4r194CG43I9I8dmaEx9CFA/XMePIAXQUuABfe1QMOR6IxLpq\nTHG1peZgHQKeGz4aSGrhQkZNNoOVNaZoIfcvopxcHDTZLigseEIaPPha4WFYoKPi\nUPbZ5o8gTLc750uzrnb2jwcCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "xchan_photo_mimetype": "image/png",
+ "xchan_photo_l": "https://xyz.macgirvin.com/photo/profile/l/2",
+ "xchan_photo_m": "https://xyz.macgirvin.com/photo/profile/m/2",
+ "xchan_photo_s": "https://xyz.macgirvin.com/photo/profile/s/2",
+ "xchan_addr": "teller@xyz.macgirvin.com",
+ "xchan_url": "https://xyz.macgirvin.com/channel/teller",
+ "xchan_connurl": "https://xyz.macgirvin.com/poco/teller",
+ "xchan_follow": "https://xyz.macgirvin.com/follow?f=&url=%s",
+ "xchan_connpage": "",
+ "xchan_name": "Teller",
+ "xchan_network": "zot",
+ "xchan_instance_url": "",
+ "xchan_flags": "0",
+ "xchan_photo_date": "2016-10-19 01:26:50",
+ "xchan_name_date": "2016-01-02 21:16:26",
+ "xchan_hidden": "0",
+ "xchan_orphan": "0",
+ "xchan_censored": "0",
+ "xchan_selfcensored": "0",
+ "xchan_system": "0",
+ "xchan_pubforum": "0",
+ "xchan_deleted": "0"
+ },
+ {
+ "id": "12",
+ "uid": "2",
+ "gid": "1",
+ "xchan": "xuSMUYxw1djBB97qXsbrBN1nzJH_gFwQL6pS4zIy8fuusOfBxNlMiVb4h_q5tOEvpE7tYf1EsryjNciMuPIj5w",
+ "abook_id": "24",
+ "abook_account": "1",
+ "abook_channel": "2",
+ "abook_xchan": "xuSMUYxw1djBB97qXsbrBN1nzJH_gFwQL6pS4zIy8fuusOfBxNlMiVb4h_q5tOEvpE7tYf1EsryjNciMuPIj5w",
+ "abook_my_perms": "218555",
+ "abook_their_perms": "218555",
+ "abook_closeness": "80",
+ "abook_created": "2016-01-27 00:48:43",
+ "abook_updated": "2016-12-04 17:16:58",
+ "abook_connected": "2016-12-04 17:16:58",
+ "abook_dob": "0001-01-01 00:00:00",
+ "abook_flags": "0",
+ "abook_blocked": "0",
+ "abook_ignored": "0",
+ "abook_hidden": "0",
+ "abook_archived": "0",
+ "abook_pending": "0",
+ "abook_unconnected": "0",
+ "abook_self": "0",
+ "abook_feed": "0",
+ "abook_profile": "debb5236efb1626cfbad33ccb49892801e5f844aa04bf81f580cfa7d13204819",
+ "abook_incl": "",
+ "abook_excl": "",
+ "abook_instance": "",
+ "xchan_hash": "xuSMUYxw1djBB97qXsbrBN1nzJH_gFwQL6pS4zIy8fuusOfBxNlMiVb4h_q5tOEvpE7tYf1EsryjNciMuPIj5w",
+ "xchan_guid": "d5EMLlt1tHHZ0dANoA7B5Wq9UgXoWcFS9-gXOkL_AAejcPApoQRyxfHTuu8DoTbUaO-bYmX5HPuWuK9PHyqNmA",
+ "xchan_guid_sig": "CVWEMRPtzI1YcHfnnWHTuv3H964OAmSElgUfxMoX6RdQdxNpqb_POirpVuyP8s3W17mVCfO5V9IAjkg5iKcqCk6YcvOD_egmMy-AnM9TC1kKndQHw55CunD82Q8K_xBNSXkSROizcNkKh9DVLjJPFjW1AqtI4njkZ3EMgrWqnbFRM1qPToUoCY9zM3tEMHoAD9YX1zP90wl40LzfN-dtcNWpSBbiz9owou62uzLbN7mrCwKOMlXLjwwGswRnxIsEnb3O-FXOs8hs0mArKe9snq1-BKeD16LyzxgwlpVLElzIJZGEZGtMdIJgeRzKuBvPjsOIpQ1yAkuOpFJ3nGCM-IPOIIjAmyVl5zD3xPVcxxpZlJRn5fG1Y-gnqTgsrEQCA7M6XPWQdrdHU4akZfyUyFJDhv3uM-jon9VzrYTBw68R0WA-1Z8WafEHA4qh5OWAj85lUarwhr7iTiEckH51ypPCPs6VbT6Pw7yMaxfjFOcipashQagx0tfOlDhE5dQANOXKASFtH1J9-CZY2MQdLPQ6u54d5whuHKMGaJ0V68pnmZ2rOn7g344Ah2WCJrm17jj60QsRMorqRFj7GMdPIA1XB8Wrk88MuYOe3Dhyuu6ZWKI7YTWJS690ZVkKUqAiNHqj0W86DtaiPUc_mmGR0fHl4Gksnko3WmCFv9q2X2E",
+ "xchan_pubkey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAoj2xCJktBA8Ww7Hp+ZNL\nrNuQpo8UB/bfvRkIy+yua3xpF1TuXcnAH61kyRz8vXgOu/l2CyxQbIoaGslCV5Sy\n8JKeNXe+IilUdSSEjMIwCPfSPsYnMHsSnHWmPmclvJwEtQUKOZmW5mMuVBvXy7D2\njomFwc69AYphdyys6eQ7Dcn6+FRBiQbyMprZ5lxyVW+O4DuXVNa3ej2ebx0gCJZ4\ntTIlBoKwEey91dY+FyKVFjdwfNczpmL7LgmZXqcVx+MG3mYgibwdVMiXVj5X06cs\nV9hJ5Xi+Aklsv/UWJtjw9FVt7y9TLptnhh4Ra6T/MDmnBBIAkOR7P/X8cRv078MT\nl0IMsP0RJcDEtTLtwHFVtDs6p52KDFqclKWbqmxmxqV3OTPVYtArRGIzgnJi/5ur\nHRr5G6Cif7QY3UowsIOf78Qvy28LwSbdymgBAWwPPKIviXWxGO+9kMWdmPSUQrWy\nK0+7YA9P9fBUFfn9Hc+p8SJQmQ6OAqLwrDGiPSOlGaNrbEqwqLGgIpXwK+lEFcFJ\n3SPOjJRWdR2whlMxvpwX+39+H7dWN3vSa3Al4/Sq7qW8yW2rYwf+eGyp4Z0lRR+8\nJxFMCwZkSw5g14YdlikAPojv5V1c6KuA5ieg8G1hwyONV7A4JHPyEdPt0W0TZi6C\nCOVkPaC3xGrguETZpJfVpwUCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "xchan_photo_mimetype": "image/png",
+ "xchan_photo_l": "https://xyz.macgirvin.com/photo/9da63aa910ea14e1501ee1a749d181a6-4",
+ "xchan_photo_m": "https://xyz.macgirvin.com/photo/9da63aa910ea14e1501ee1a749d181a6-5",
+ "xchan_photo_s": "https://xyz.macgirvin.com/photo/9da63aa910ea14e1501ee1a749d181a6-6",
+ "xchan_addr": "cloner@xyz.macgirvin.com",
+ "xchan_url": "http://abc.macgirvin.com/channel/cloner",
+ "xchan_connurl": "http://abc.macgirvin.com/poco/cloner",
+ "xchan_follow": "https://xyz.macgirvin.com/follow?f=&url=%s",
+ "xchan_connpage": "",
+ "xchan_name": "Karen",
+ "xchan_network": "zot",
+ "xchan_instance_url": "",
+ "xchan_flags": "0",
+ "xchan_photo_date": "2016-03-31 19:59:20",
+ "xchan_name_date": "2016-01-26 23:23:42",
+ "xchan_hidden": "0",
+ "xchan_orphan": "0",
+ "xchan_censored": "0",
+ "xchan_selfcensored": "0",
+ "xchan_system": "0",
+ "xchan_pubforum": "0",
+ "xchan_deleted": "0"
+ }
+
+ ] \ No newline at end of file
diff --git a/doc/api/api_item_update.md b/doc/api/api_item_update.md
new file mode 100644
index 000000000..cf1a28044
--- /dev/null
+++ b/doc/api/api_item_update.md
@@ -0,0 +1,225 @@
+API item/update
+===============
+
+
+Usage: POST /api/z/1.0/item/update
+
+Description: item/update posts an item (typically a conversation item or post, but can be any item) using form input.
+
+
+Required:
+
+- body
+
+ text/bbcode contents by default.
+
+
+Optional:
+
+- $_FILES['media']
+
+ uploaded media file to include with post
+
+- title
+
+ title of post/item
+
+- contact_allow
+
+ array of xchan.xchan_hash allowed to view this item
+
+- group_allow
+
+ array of group.hash allowed to view this item
+
+- contact_deny
+
+ array of xchan.xchan_hash not allowed to view this item
+
+- group_deny
+
+ array of group.hash not allowed to view this item
+
+- coord
+
+ geographic coordinates
+
+- location
+
+ freefrom location
+
+- expire
+
+ datetime this post will expire or be removed
+
+- mimetype
+
+ mimetype if not text/bbcode
+
+- parent
+
+ item.id of parent to this post (makes it a comment)
+
+- parent_mid
+
+ alternate form of parent using message_id
+
+- remote_xchan
+
+ xchan.xchan_hash of this message author if not the channel owner
+
+- consensus
+
+ boolean set to true if this is a consensus or voting item (default false)
+
+- nocomment
+
+ boolean set to true if comments are to be disabled (default false)
+
+- origin
+
+ do not use this without reading the code
+
+- namespace
+
+ persistent identity for a remote network or service
+
+- remote_id
+
+ message_id of this resource on a remote network or service
+
+- message_id
+
+ message_id of this item (leave unset to generate one)
+
+- created
+
+ datetime of message creation
+
+- post_id
+
+ existing item.id if this is an edit operation
+
+- app
+
+ application or network name to display with item
+
+- categories
+
+ comma separated categories for this item
+
+- webpage
+
+ item.page_type if not 0
+
+- pagetitle
+
+ for webpage and design elements, the 'page name'
+
+- layout_mid
+
+ item.mid of layout for this design element
+
+- plink
+
+ permalink for this item if different than the default
+
+- verb
+
+ activitystream verb for this item/activity
+
+- obj_type
+
+ activitystream object type for this item/activity
+
+
+
+Example:
+
+curl -u mychannel:mypassword https://xyz.macgirvin.com/api/z/1.0/item/update -d body="hello world"
+
+
+Returns:
+
+
+ {
+
+ "success": true,
+ "item_id": "2245",
+ "item": {
+ "id": "2245",
+ "mid": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "aid": "1",
+ "uid": "2",
+ "parent": "2245",
+ "parent_mid": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "thr_parent": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "created": "2016-12-03 20:00:12",
+ "edited": "2016-12-03 20:00:12",
+ "expires": "0001-01-01 00:00:00",
+ "commented": "2016-12-03 20:00:12",
+ "received": "2016-12-03 20:00:12",
+ "changed": "2016-12-03 20:00:12",
+ "comments_closed": "0001-01-01 00:00:00",
+ "owner_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "author_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "source_xchan": "",
+ "mimetype": "text/bbcode",
+ "title": "",
+ "body": "hello world",
+ "html": "",
+ "app": "",
+ "lang": "",
+ "revision": "0",
+ "verb": "http://activitystrea.ms/schema/1.0/post",
+ "obj_type": "http://activitystrea.ms/schema/1.0/note",
+ "obj": "",
+ "tgt_type": "",
+ "target": "",
+ "layout_mid": "",
+ "postopts": "",
+ "route": "",
+ "llink": "https://xyz.macgirvin.com/display/14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "plink": "https://xyz.macgirvin.com/channel/mychannel/?f=&mid=14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "resource_id": "",
+ "resource_type": "",
+ "attach": "",
+ "sig": "sa4TOQNfHtV13HDZ1tuQGWNBpZp-nWhT2GMrZEmelXxa_IvEepD2SEsCTWOBqM8OKPJLfNy8_i-ORXjrOIIgAa_aT8cw5vka7Q0C8L9eEb_LegwQ_BtH0CXO5uT30e_8uowkwzh6kmlVg1ntD8QqrGgD5jTET_fMQOIw4gQUBh40GDG9RB4QnPp_MKsgemGrADnRk2vHO7-bR32yQ0JI-8G-eyeqGaaJmIwkHoi0vXsfjZtU7ijSLuKEBWboNjKEDU89-vQ1c5Kh1r0pmjiDk-a5JzZTYShpuhVA-vQgEcADA7wkf4lJZCYNwu3FRwHTvhSMdF0nmyv3aPFglQDky38-SAXZyQSvd7qlABHGCVVDmYrYaiq7Dh4rRENbAUf-UJFHPCVB7NRg34R8HIqmOKq1Su99bIWaoI2zuAQEVma9wLqMoFsluFhxX58KeVtlCZlro7tZ6z619-dthS_fwt0cL_2dZ3QwjG1P36Q4Y4KrCTpntn9ot5osh-HjVQ01h1I9yNCj6XPgYJ8Im3KT_G4hmMDFM7H9RUrYLl2o9XYyiS2nRrf4aJHa0UweBlAY4zcQG34bw2AMGCY53mwsSArf4Hs3rKu5GrGphuwYX0lHa7XEKMglwBWPWHI49q7-oNWr7aWwn1FnfaMfl4cQppCMtKESMNRKm_nb9Dsh5e0",
+ "diaspora_meta": "",
+ "location": "",
+ "coord": "",
+ "public_policy": "",
+ "comment_policy": "contacts",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": "",
+ "item_restrict": "0",
+ "item_flags": "0",
+ "item_private": "0",
+ "item_origin": "1",
+ "item_unseen": "0",
+ "item_starred": "0",
+ "item_uplink": "0",
+ "item_consensus": "0",
+ "item_wall": "1",
+ "item_thread_top": "1",
+ "item_notshown": "0",
+ "item_nsfw": "0",
+ "item_relay": "0",
+ "item_mentionsme": "0",
+ "item_nocomment": "0",
+ "item_obscured": "0",
+ "item_verified": "1",
+ "item_retained": "0",
+ "item_rss": "0",
+ "item_deleted": "0",
+ "item_type": "0",
+ "item_hidden": "0",
+ "item_unpublished": "0",
+ "item_delayed": "0",
+ "item_pending_remove": "0",
+ "item_blocked": "0"
+ }
+
+ } \ No newline at end of file
diff --git a/doc/api_posting.bb b/doc/api/api_posting.bb
index c708ad143..c708ad143 100644
--- a/doc/api_posting.bb
+++ b/doc/api/api_posting.bb
diff --git a/doc/api/api_xchan.md b/doc/api/api_xchan.md
new file mode 100644
index 000000000..d2b15e04c
--- /dev/null
+++ b/doc/api/api_xchan.md
@@ -0,0 +1,44 @@
+API xchan
+=========
+
+An xchan is a global location independent channel and is the primary record for a network
+identity. It may refer to channels on other websites, networks, or services.
+
+GET /api/z/1.0/xchan
+
+Required: one of [ address, hash, guid ] as GET parameters
+
+Returns a portable xchan structure
+
+Example: https://xyz.macgirvin.com/api/z/1.0/xchan?f=&address=mike@macgirvin.com
+
+Returns:
+
+ {
+ "hash": "jr54M_y2l5NgHX5wBvP0KqWcAHuW23p1ld-6Vn63_pGTZklrI36LF8vUHMSKJMD8xzzkz7s2xxCx4-BOLNPaVA",
+ "guid": "sebQ-IC4rmFn9d9iu17m4BXO-kHuNutWo2ySjeV2SIW1LzksUkss12xVo3m3fykYxN5HMcc7gUZVYv26asx-Pg",
+ "guid_sig": "Llenlbl4zHo6-g4sa63MlQmTP5dRCrsPmXHHFmoCHG63BLq5CUZJRLS1vRrrr_MNxr7zob_Ykt_m5xPKe5H0_i4pDj-UdP8dPZqH2fqhhx00kuYL4YUMJ8gRr5eO17vsZQ3XxTcyKewtgeW0j7ytwMp6-hFVUx_Cq08MrXas429ZrjzaEwgTfxGnbgeQYQ0R5EXpHpEmoERnZx77VaEahftmdjAUx9R4YKAp13pGYadJOX5xnLfqofHQD8DyRHWeMJ4G1OfWPSOlXfRayrV_jhnFlZjMU7vOdQwHoCMoR5TFsRsHuzd-qepbvo3pzvQZRWnTNu6oPucgbf94p13QbalYRpBXKOxdTXJrGdESNhGvhtaZnpT9c1QVqC46jdfP0LOX2xrVdbvvG2JMWFv7XJUVjLSk_yjzY6or2VD4V6ztYcjpCi9d_WoNHruoxro_br1YO3KatySxJs-LQ7SOkQI60FpysfbphNyvYMkotwUFI59G08IGKTMu3-GPnV1wp7NOQD1yzJbGGEGSEEysmEP0SO9vnN45kp3MiqbffBGc1r4_YM4e7DPmqOGM94qksOcLOJk1HNESw2dQYWxWQTBXPfOJT6jW9_crGLMEOsZ3Jcss0XS9KzBUA2p_9osvvhUKuKXbNztqH0oZIWlg37FEVsDs_hUwUJpv2Ar09k4",
+ "pubkey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA7QCwvuEIwCHjhjbpz3Oc\ntyei/Pz9nDksNbsc44Cm8jxYGMXsTPFXDZYCcCB5rcAhPPdZSlzaPkv4vPVcMIrw\n5cdX0tvbwa3rNTng6uFE7qkt15D3YCTkwF0Y9FVZiZ2Ko+G23QeBt9wqb9dlDN1d\nuPmu9BLYXIT/JXoBwf0vjIPFM9WBi5W/EHGaiuqw7lt0qI7zDGw77yO5yehKE4cu\n7dt3SakrXphL70LGiZh2XGoLg9Gmpz98t+gvPAUEotAJxIUqnoiTA8jlxoiQjeRK\nHlJkwMOGmRNPS33awPos0kcSxAywuBbh2X3aSqUMjcbE4cGJ++/13zoa6RUZRObC\nZnaLYJxqYBh13/N8SfH7d005hecDxWnoYXeYuuMeT3a2hV0J84ztkJX5OoxIwk7S\nWmvBq4+m66usn6LNL+p5IAcs93KbvOxxrjtQrzohBXc6+elfLVSQ1Rr9g5xbgpub\npSc+hvzbB6p0tleDRzwAy9X16NI4DYiTj4nkmVjigNo9v2VPnAle5zSam86eiYLO\nt2u9YRqysMLPKevNdj3CIvst+BaGGQONlQalRdIcq8Lin+BhuX+1TBgqyav4XD9K\nd+JHMb1aBk/rFLI9/f2S3BJ1XqpbjXz7AbYlaCwKiJ836+HS8PmLKxwVOnpLMbfH\nPYM8k83Lip4bEKIyAuf02qkCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "photo_mimetype": "image/jpeg",
+ "photo_l": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-4",
+ "photo_m": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-5",
+ "photo_s": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-6",
+ "address": "mike@macgirvin.com",
+ "url": "https://macgirvin.com/channel/mike",
+ "connurl": "https://macgirvin.com/poco/mike",
+ "follow": "https://macgirvin.com/follow?f=&url=%s",
+ "connpage": "https://macgirvin.com/connect/mike",
+ "name": "Mike Macgirvin",
+ "network": "zot",
+ "instance_url": "",
+ "flags": "0",
+ "photo_date": "2012-12-06 05:06:11",
+ "name_date": "2012-12-06 04:59:13",
+ "hidden": "1",
+ "orphan": "0",
+ "censored": "0",
+ "selfcensored": "0",
+ "system": "0",
+ "pubforum": "0",
+ "deleted": "0"
+ } \ No newline at end of file
diff --git a/doc/api/group.md b/doc/api/group.md
new file mode 100644
index 000000000..8829ff416
--- /dev/null
+++ b/doc/api/group.md
@@ -0,0 +1,41 @@
+API group
+=========
+
+GET /api/z/1.0/group
+
+
+Description: list privacy groups
+
+
+Returns: DB tables of all privacy groups.
+
+To use with API group_members, provide either 'group_id' from the id element returned in this call, or 'group_name' from the gname returned in this call.
+
+
+ [
+
+ {
+ "id": "1",
+ "hash": "966c946394f3e2627bbb8a55026b5725e582407098415c02f85232de3f3fde76Friends",
+ "uid": "2",
+ "visible": "0",
+ "deleted": "0",
+ "gname": "Friends"
+ },
+ {
+ "id": "2",
+ "hash": "852ebc17f8c3ed4866f2162e384ded0f9b9d1048f93822c0c84196745f6eec66Family",
+ "uid": "2",
+ "visible": "1",
+ "deleted": "0",
+ "gname": "Family"
+ },
+ {
+ "id": "3",
+ "hash": "cc3cb5a7f9818effd7c7c80a58b09a189b62efa698a74319117babe33ee30ab9Co-workers",
+ "uid": "2",
+ "visible": "0",
+ "deleted": "0",
+ "gname": "Co-workers"
+ }
+ ] \ No newline at end of file
diff --git a/doc/api_zot.md b/doc/api_zot.md
new file mode 100644
index 000000000..6da8cddbe
--- /dev/null
+++ b/doc/api_zot.md
@@ -0,0 +1,84 @@
+Zot API
+=======
+
+
+
+channel/export/basic
+
+ Export channel data
+
+
+
+channel/stream
+
+ Fetch channel conversation items
+
+network/stream
+
+ Fetch network conversation items
+
+
+[files](help/api/api_files)
+
+ List file storage
+
+filemeta
+
+ Export file metadata for any uploaded file
+
+
+[filedata](help/api/api_filedata)
+
+ Fetch file contents or partial contents for any uploaded file
+
+
+file/export
+
+file
+
+[albums](help/api/api_albums)
+
+ List photo albums
+
+
+photos
+
+ list photo metadata
+
+
+photo
+
+
+[group](help/api/group)
+
+ List privacy groups
+
+[group_members](help/api/group_members)
+
+ List members of a privacy group
+
+
+[xchan](help/api/api_xchan)
+
+ Global extended channel (identity) information
+
+[item/update](help/api/api_item_update)
+
+ Create or update an item (post, activity, webpage, etc.)
+
+
+item/full
+
+ Get all data associated with an item
+
+abook
+
+ Connections
+
+abconfig
+
+ Connection metadata (such as permissions)
+
+perm_allowed
+
+ Check a permission for a given xchan
diff --git a/doc/bbcode.html b/doc/bbcode.html
index 7a2c969eb..36f40d3f4 100644
--- a/doc/bbcode.html
+++ b/doc/bbcode.html
@@ -78,6 +78,7 @@ or<br /><br />[dl terms="b"]<br />[*= First element term] First element descript
<li>[observer.baseurl] website of observer</li>
<li>[observer.url] channel URL of observer</li>
<li>[observer.name] name of observer</li>
+<li>[observer.webname] short name in the url of the observer</li>
<li>[observer.address] address (zot-id) of observer</li>
<li>[observer.photo] profile photo of observer<br /></li>
diff --git a/doc/ca/general.bb b/doc/ca/general.bb
index dace92775..682b1ff52 100644
--- a/doc/ca/general.bb
+++ b/doc/ca/general.bb
@@ -2,8 +2,6 @@
[zrl=[baseurl]/help/Privacy]Politica de Privacitat[/zrl]
-[zrl=[baseurl]/help/project/history]Història de $Projectname[/zrl]
-
[h3]Recursos Externs[/h3]
[zrl=[baseurl]/help/external-resource-links]Enllaços a Recursos Externs[/zrl]
diff --git a/doc/context/en/profiles/help.html b/doc/context/en/profiles/help.html
new file mode 100644
index 000000000..41f00fe64
--- /dev/null
+++ b/doc/context/en/profiles/help.html
@@ -0,0 +1,35 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>
+ Once you have registered an <i>account</i> at the matrix you have also created a <i>profile</i> and a <i>channel</i>.
+ </dd>
+ <dt>Account</dt>
+ <dd>
+ You have <i>one</i> account. This consists of your email account and your password. With your account you access your
+ profile and your channel.<i>Think of your account as the way you authenticate at one Hubzilla site. It lets you
+ do things, such as creating profiles and channels with which you can connect to other people.</i>
+ </dd>
+ <dt>Profile</dt>
+ <dd>
+ You have surely registered with some other internet services, such as forums or online communities. For all of them
+ you provided some information about yourself, such as date of birth, country, age and the likes. Unlike other
+ services Hubzilla offers you the advantage of creating
+ <i>many more profiles</i>. That way you are able to distinguish between profiles targeted specially at everyone
+ (your public profile), your work mates, your family and your partner.<i>Think of your profile as the basic
+ information about yourself you tell other people.</i>
+ </dd>
+ <dt>Channel</dt>
+ <dd>
+ During the registration you created your first <i>channel</i>. Yes, besides several profiles you are able to have
+ several channels. This might be a bit confusing in the beginning, but let's clear things up. You already have
+ created one channel. You can use this one for the public, to communicate with people about every day life. But
+ perhaps you are an avid book reader and many people are bored by that. So you open a <i>second channel</i> just
+ for the book lovers, where you all can talk about books as much as you like. Obviously this is a new stream of
+ posts, with a new profile (... or new profile<i>s</i> ...) and completely different contacts. Some connections
+ might exist in both channels, but there will be some that are exclusive to only one of both. You yourself just
+ switch between both of them just like you would in real life switch when talking to people you meet on the street
+ or people you meet specially to talk about books. You can even connect to yourself, or better: to your other
+ channel. :)<i>Think of a channel as different spaces dedicated to different topics where you meet with different
+ people.</i>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/context/en/settings/account/help.html b/doc/context/en/settings/account/help.html
new file mode 100644
index 000000000..41f00fe64
--- /dev/null
+++ b/doc/context/en/settings/account/help.html
@@ -0,0 +1,35 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>
+ Once you have registered an <i>account</i> at the matrix you have also created a <i>profile</i> and a <i>channel</i>.
+ </dd>
+ <dt>Account</dt>
+ <dd>
+ You have <i>one</i> account. This consists of your email account and your password. With your account you access your
+ profile and your channel.<i>Think of your account as the way you authenticate at one Hubzilla site. It lets you
+ do things, such as creating profiles and channels with which you can connect to other people.</i>
+ </dd>
+ <dt>Profile</dt>
+ <dd>
+ You have surely registered with some other internet services, such as forums or online communities. For all of them
+ you provided some information about yourself, such as date of birth, country, age and the likes. Unlike other
+ services Hubzilla offers you the advantage of creating
+ <i>many more profiles</i>. That way you are able to distinguish between profiles targeted specially at everyone
+ (your public profile), your work mates, your family and your partner.<i>Think of your profile as the basic
+ information about yourself you tell other people.</i>
+ </dd>
+ <dt>Channel</dt>
+ <dd>
+ During the registration you created your first <i>channel</i>. Yes, besides several profiles you are able to have
+ several channels. This might be a bit confusing in the beginning, but let's clear things up. You already have
+ created one channel. You can use this one for the public, to communicate with people about every day life. But
+ perhaps you are an avid book reader and many people are bored by that. So you open a <i>second channel</i> just
+ for the book lovers, where you all can talk about books as much as you like. Obviously this is a new stream of
+ posts, with a new profile (... or new profile<i>s</i> ...) and completely different contacts. Some connections
+ might exist in both channels, but there will be some that are exclusive to only one of both. You yourself just
+ switch between both of them just like you would in real life switch when talking to people you meet on the street
+ or people you meet specially to talk about books. You can even connect to yourself, or better: to your other
+ channel. :)<i>Think of a channel as different spaces dedicated to different topics where you meet with different
+ people.</i>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/context/en/settings/channel/help.html b/doc/context/en/settings/channel/help.html
new file mode 100644
index 000000000..41f00fe64
--- /dev/null
+++ b/doc/context/en/settings/channel/help.html
@@ -0,0 +1,35 @@
+<dl class="dl-horizontal">
+ <dt>General</dt>
+ <dd>
+ Once you have registered an <i>account</i> at the matrix you have also created a <i>profile</i> and a <i>channel</i>.
+ </dd>
+ <dt>Account</dt>
+ <dd>
+ You have <i>one</i> account. This consists of your email account and your password. With your account you access your
+ profile and your channel.<i>Think of your account as the way you authenticate at one Hubzilla site. It lets you
+ do things, such as creating profiles and channels with which you can connect to other people.</i>
+ </dd>
+ <dt>Profile</dt>
+ <dd>
+ You have surely registered with some other internet services, such as forums or online communities. For all of them
+ you provided some information about yourself, such as date of birth, country, age and the likes. Unlike other
+ services Hubzilla offers you the advantage of creating
+ <i>many more profiles</i>. That way you are able to distinguish between profiles targeted specially at everyone
+ (your public profile), your work mates, your family and your partner.<i>Think of your profile as the basic
+ information about yourself you tell other people.</i>
+ </dd>
+ <dt>Channel</dt>
+ <dd>
+ During the registration you created your first <i>channel</i>. Yes, besides several profiles you are able to have
+ several channels. This might be a bit confusing in the beginning, but let's clear things up. You already have
+ created one channel. You can use this one for the public, to communicate with people about every day life. But
+ perhaps you are an avid book reader and many people are bored by that. So you open a <i>second channel</i> just
+ for the book lovers, where you all can talk about books as much as you like. Obviously this is a new stream of
+ posts, with a new profile (... or new profile<i>s</i> ...) and completely different contacts. Some connections
+ might exist in both channels, but there will be some that are exclusive to only one of both. You yourself just
+ switch between both of them just like you would in real life switch when talking to people you meet on the street
+ or people you meet specially to talk about books. You can even connect to yourself, or better: to your other
+ channel. :)<i>Think of a channel as different spaces dedicated to different topics where you meet with different
+ people.</i>
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/context/en/settings/tokens/help.html b/doc/context/en/settings/tokens/help.html
new file mode 100644
index 000000000..d37a0fd2b
--- /dev/null
+++ b/doc/context/en/settings/tokens/help.html
@@ -0,0 +1,23 @@
+<dl class="dl-horizontal">
+ <dt>Guest Access Tokens</dt>
+ <dd>
+ In order to facilitate sharing of private resources with non-members or members of federation nodes with limited identification discovery, Hubzilla should provide members with a mechanism to create and manage temporary ("throwaway") logins, aka "Zot Access Tokens". These tokens/credentials may be used to authenticate to a hubzilla site for the sole purpose of accessing privileged or access controlled resources (files, photos, posts, webpages, chatrooms, etc.).
+ </dd>
+ <dt>Create a token</dt>
+ <dd>
+ The form to create/edit accepts three parameters, a human readable name, a password or access token, and an
+ optional expiration. Once expired, the access token is no longer valid, may no longer be used, and will be
+ automatically purged from the list of temporary accounts. The password field in the create/edit forms
+ displays the text of the access token and not an obscured password.
+ </dd>
+ <dt>Share a token</dt>
+ <dd>
+ We do not specify mechanisms for sharing these tokens with others. Any communication method may be used. Any tokens you have created are added to the Access Control List selector and may be used anywhere that Access Control Lists are provided.
+
+ <b>Example</b>: A visitor arrives at your site. She has an access token you have provided, and attempts to visit one of your photo albums (which is restricted to be viewed only by yourself and one temporary identity). Permission is denied.
+
+ The visitor now selects "Login" from the menu navigation bar. This presents a login page. She enters the name and password you have provided her, and she can now view the restricted photo album.
+
+ Alternatively, you may share a link to a protected file by adding a parameter "&zat=abc123" to the URL, where the string "abc123" is the access token or password for the temporary login. No further negotiation is required, and the file is presented.
+ </dd>
+</dl> \ No newline at end of file
diff --git a/doc/context/en/webpages/help.html b/doc/context/en/webpages/help.html
index af57ee88a..a4817e4bf 100644
--- a/doc/context/en/webpages/help.html
+++ b/doc/context/en/webpages/help.html
@@ -3,6 +3,6 @@
<dd>You can create modular, identity-aware websites composed of shareable elements. </dd>
<dt>Pages</dt>
<dd>This page lists your "pages", which are assigned URLs where people can visit your site. The structure of pages are typically described by an associated <b>layout</b>, and their content is constructed from a collection of <b>blocks</b>.</dd>
- <dt><a href='#' onclick='contextualHelpFocus("#website-import-tools", 1); return false;' title="Click to highlight element...">Website import tool</a></dt>
- <dd>The website import tool allows you import multiple webpage elements (pages, layouts, blocks) either from an uploaded zip file or from an existing cloud files folder. <a target="_blank" href="help/webpages">Read more...</a></dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#website-portation-tools", 1); return false;' title="Click to highlight element...">Website portation tools</a></dt>
+ <dd>The website portation tools allows you import/export multiple webpage elements (pages, layouts, blocks). You can <b>import</b> either from an uploaded zip file or from an existing cloud files folder. You can <b>export</b> to either a zip file containing a select group of webpage elements in a form compatible with the import tool, or you can export directly to a cloud files folder. <a target="_blank" href="help/webpages">Read more...</a></dd>
</dl> \ No newline at end of file
diff --git a/doc/context/en/wiki/help.html b/doc/context/en/wiki/help.html
index 314a9d60b..5ac9b22ae 100644
--- a/doc/context/en/wiki/help.html
+++ b/doc/context/en/wiki/help.html
@@ -1,10 +1,12 @@
<dl class="dl-horizontal">
<dt>General</dt>
<dd>Each wiki is a collection of pages, composed as Markdown-formatted text files.</dd>
- <dt><a href='#' onclick='contextualHelpFocus("#wiki_list", 1); return false;' title="Click to highlight element...">Wiki List</a></dt>
+ <dt><a href='#' onclick='contextualHelpFocus("#wikis-index", 1); return false;' title="Click to highlight element...">Wiki List</a></dt>
<dd>Wikis owned by the channel <i>that you have permission to view</i> are listed in the side panel.</dd>
<dt><a href='#' onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Click to highlight element...">Page History</a></dt>
<dd>Every revision of a page is saved to allow quick reversion. Click the <b>History</b> tab to view a history of page revisions, including the date and author of each. The revert button will load the selected revision but will not automatically save the page.</dd>
<dt><a href='#' onclick='contextualHelpFocus("#wiki_page_list", 1); return false;' title="Click to highlight element...">Pages</a></dt>
<dd>The list of pages in the wiki are listed in the <b>Wiki Pages</b> panel. Prior to saving page edits using the <b>Page</b> control dropdown menu, you may <a href='#' onclick='contextualHelpFocus("#id_commitMsg", 0); return false;' title="Click to highlight element...">enter a custom message</a> to be displayed in the <a href='#' onclick='contextualHelpFocus("#wiki-get-history", 0); return false;' title="Click to highlight element..."><b>Page History</b></a> viewer along with the revision.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Click to highlight element...">Channel Content Tabs</a></dt>
+ <dd>The channel content tabs are links to other content published by the channel. The <b>About</b> tab links to the channel profile. The <b>Photos</b> tab links to the channel photo galleries. The <b>Files</b> tab links to the general shared files published by the channel.</dd>
</dl> \ No newline at end of file
diff --git a/doc/context/es-es/connedit/help.html b/doc/context/es-es/connedit/help.html
index 000f28950..e8c92ca28 100644
--- a/doc/context/es-es/connedit/help.html
+++ b/doc/context/es-es/connedit/help.html
@@ -4,7 +4,7 @@
<dt><a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Pulsar para resaltar el elemento...">Conexiones</a></dt>
<dd>El menú <a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Pulsar para resaltar el elemento...">Conexiones</a> le da acceso a varios ajustes: "Ver el perfil", "Ver la actividad reciente", "Recargar los permisos", añadir o quitar estados ("flags") ("Bloquear", "Ignorar", "Archivar", "Ocultar") y eliminar la conexión.</dd>
<dt><a href='#' onclick='contextualHelpFocus("#group-sidebar", 0); return false;' title="Pulsar para resaltar el elemento...">Grupos de canales</a></dt>
- <dd>Todas las conexiones se puede incluir en uno o varios grupos de canales para formar conjuntos de amigos con acceso a publicaciones concretas, ficheros multimedia y otros tipos de contenido. Puede añadirla aquí a un grupo de canales ya existente o crear un grupo nuevo. Cuando añade la conexión a un grupo que ya existe, el efecto es inmediato y no será requerido para confirmarlo.</dd>
+ <dd>Todas las conexiones se pueden incluir en uno o varios grupos de canales para formar conjuntos de amigos con acceso a publicaciones concretas, ficheros multimedia y otros tipos de contenido. Puede añadirla aquí a un grupo de canales ya existente o crear un grupo nuevo. Cuando añade la conexión a un grupo que ya existe, el efecto es inmediato y no será requerido para confirmarlo.</dd>
<dt><a href='#' onclick='contextualHelpFocus("#perms-tool", 0); return false;' title="Pulsar para resaltar el elemento...">Permisos individuales</a></dt>
<dd>La concesión de permisos es, generalmente, automática y no requiere ninguna acción por su parte. Sin embargo, puede, si lo desea, ajustar permisos especiales, diferentes de los permisos concedidos a otros, para una conexión concreta.</dd>
<dt>Ajustes de funcionalidades concretas</dt>
diff --git a/doc/dav_konqueror.bb b/doc/dav_konqueror.bb
index 79108e1d0..97c046e46 100644
--- a/doc/dav_konqueror.bb
+++ b/doc/dav_konqueror.bb
@@ -1,6 +1,6 @@
[b]Using The Cloud - Konqueror[/b]
-Simply visit webdavs://example.com/cloud after logging in to your hub, where &quot;example.com&quot; is the URL of your hub.
+Simply visit webdavs://example.com/dav after logging in to your hub, where &quot;example.com&quot; is the URL of your hub.
No further authentication is required if you are logged in to your hub in the normal manner.
diff --git a/doc/dav_mount.bb b/doc/dav_mount.bb
index 0fd3d4691..94db18ac7 100644
--- a/doc/dav_mount.bb
+++ b/doc/dav_mount.bb
@@ -81,6 +81,3 @@ Unmount your file system, remount your file system, and try copying over a file
If that still doesn't work, disable the cache. Note that this has a performance impact so should only be done if disabling locks didn't solve your problem. Edit the cache_size and set it to [code]cache_size 0[/code] and also set file_refresh to [code]file_refresh 0[/code]. Unmount your filesystem, remount your file system, and test it again.
If it [i]still[/i] doesn't work, there is one more thing you can try. (This one is caused by a bug in older versions of dav2fs itself, so updating to a new version may also help). Enable weak etag dropping by setting [code]drop_weak_etags 1[/code]. Unmount and remount your filesystem to apply the changes.
-
-#include doc/macros/cloud_footer.bb;
-
diff --git a/doc/de/general.bb b/doc/de/general.bb
index 6660370d7..b9b75f161 100644
--- a/doc/de/general.bb
+++ b/doc/de/general.bb
@@ -2,8 +2,6 @@
[zrl=[baseurl]/help/Privacy]Informationen zum Datenschutz[/zrl]
-[zrl=[baseurl]/help/project/history]Zur Geschichte von $Projectname[/zrl]
-
[h3]Externe Ressourcen[/h3]
[zrl=[baseurl]/help/external-resource-links]Links zu externen Ressourcen[/zrl]
diff --git a/doc/developer/api_zot.md b/doc/developer/api_zot.md
new file mode 100644
index 000000000..d75012818
--- /dev/null
+++ b/doc/developer/api_zot.md
@@ -0,0 +1,791 @@
+### What is Zot?
+
+Zot is the revolutionary protocol that powers $Projectname, providing **communications**, **identity management**, and **access control** across a fully **decentralised** network of independent websites, often called "the grid". The resulting platform is a robust system that supports privacy and security while enabling the kind of rich web services typically seen only in centralized, proprietary solutions.
+
+#### Communications
+
+Communications and social networking are an integral part of the grid. Any channel (and any services provided by that channel) can make full use of feature-rich social communications on a global scale. These communications may be public or private - and private communications comprise not only fully encrypted transport, but also encrypted storage to help protect against accidental snooping and disclosure by rogue system administrators and internet service providers.
+
+Zot supports a wide array of background services in the grid, from friend suggestions to directory services. New content and data updates are propagated in the background between hubs across the grid according to access control lists and permissions specified by both sender *and* receiver channels. Data is also synchronized between an arbitrary number of channel clones, allowing hub members to access data and continue collaborating seamlessly in the event that their primary hub is inaccessible or offline.
+
+#### Identity
+
+Zot's identity layer is unique. It provides **invisible single sign-on** across all sites in the grid.
+
+It also provides **nomadic identity**, so that your communications with friends, family, and or anyone else you're communicating with won't be affected by the loss of your primary communication node - either temporarily or permanently.
+
+The important bits of your identity and relationships can be backed up to a thumb drive, or your laptop, and may appear at any node in the grid at any time - with all your friends and preferences intact.
+
+Crucially, these nomadic instances are kept in sync so any instance can take over if another one is compromised or damaged. This protects you against not only major system failure, but also temporary site overloads and governmental manipulation or censorship.
+
+Nomadic identity, single sign-on, and $Projectname's decentralisation of hubs, we believe, introduce a high degree of degree of **resiliency** and **persistence** in internet communications, that are sorely needed amidst global trends towards corporate centralization, as well as mass and indiscriminate government surveillance and censorship.
+
+As you browse the grid, viewing channels and their unique content, you are seamlessly authenticated as you go, even across completely different server hubs. No passwords to enter. Nothing to type. You're just greeted by name on every new site you visit.
+
+How does Zot do that? We call it **magic-auth**, because $Projectname hides the details of the complexities that go into single sign-on logins, and nomadic identities, from the experience of browsing on the grid. This is one of the design goals of $Projectname: to increase privacy, and freedom on the web, while reducing the complexity and tedium brought by the need to enter new passwords and login names for every different sight that someone might visit online.
+
+You login only once on your home hub (or any nomadic backup hub you have chosen). This allows you to access any authenticated services provided anywhere in the grid - such as shopping, blogs, forums, and access to private information. This is just like the services offered by large corporate providers with huge user databases; however you can be a member of this community, as well as a server on this network using a $35 Rasberry Pi. Your password isn't stored on a thousand different sites, or even worse, only on a few sites like Google and Facebook, beyond your direct control.
+
+You cannot be silenced. You cannot be removed from the grid, unless you yourself choose to exit it.
+
+#### Access Control
+
+Zot's identity layer allows you to provide fine-grained permissions to any content you wish to publish - and these permissions extend across $Projectname. This is like having one super huge website made up of an army of small individual websites - and where each channel in the grid can completely control their privacy and sharing preferences for any web resources they create.
+
+Currently, $Projectname supports access control for many types of data, including post/comment discussion threads, photo albums, events, cloud files, web pages, wikis, and more. Every object and how it is shared and with whom is completely under your control.
+
+This type of control is trivial on large corporate providers because they own the user database. Within the grid, there is no need for a huge user database on your machine - because the grid **is** your user database. It has what is essentially infinite capacity (limited by the total number of hubs online across the internet), and is spread amongst hundreds, and potentially millions of computers.
+
+Access can be granted or denied for any resource, to any channel, or any group of channels; anywhere within the grid. Others can access your content if you permit them to do so, and they do not even need to have an account on your hub.
+
+### Zot API
+
+The API endpoints detailed below are relative to `api/z/1.0`, meaning that if an
+API is listed as `channel/stream` the full API URL is
+`[baseurl]/api/z/1.0/channel/stream`
+
+### channel/export/basic
+
+Export channel data
+
+
+### channel/stream
+
+Fetch channel conversation items
+
+### network/stream
+
+
+Fetch network conversation items
+
+
+
+### files
+
+
+List file storage (attach DB)
+
+GET /api/z/1.0/files
+
+
+Options:
+
+ - hash
+ return only entries matching hash (exactly)
+
+ - filename
+ return only entries matching filename (substring)
+
+ - filetype
+ return only entries matching filetype/mimetype (substring)
+
+ - start
+ start at record (default 0)
+
+ - records
+ number of records to return or 0 for unlimited
+
+
+
+Example:
+
+curl -u mychannel:mypassword https://xyz.macgirvin.com/api/z/1.0/files -d filetype=multipart/mixed
+
+
+Returns:
+
+ {
+
+ "success": true,
+ "results": [
+ {
+ "id": "1",
+ "aid": "1",
+ "uid": "2",
+ "hash": "44ee8b2a1a7f36dea07b93b7747a2383a1bc0fdd08339e8928bfcbe45f65d939",
+ "filename": "Profile Photos",
+ "filetype": "multipart/mixed",
+ "filesize": "0",
+ "revision": "0",
+ "folder": "",
+ "os_storage": "1",
+ "is_dir": "1",
+ "is_photo": "0",
+ "flags": "0",
+ "created": "2016-01-02 21:51:17",
+ "edited": "2016-01-02 21:51:17",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": ""
+ },
+ {
+ "id": "12",
+ "aid": "1",
+ "uid": "2",
+ "hash": "71883f1fc64af33889229cbc79c5a056deeec5fc277d765f182f19073e1b2998",
+ "filename": "Cover Photos",
+ "filetype": "multipart/mixed",
+ "filesize": "0",
+ "revision": "0",
+ "folder": "",
+ "os_storage": "1",
+ "is_dir": "1",
+ "is_photo": "0",
+ "flags": "0",
+ "created": "2016-01-15 00:24:33",
+ "edited": "2016-01-15 00:24:33",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": ""
+ },
+ {
+ "id": "16",
+ "aid": "1",
+ "uid": "2",
+ "hash": "f48f7ec3278499d1dd86b72c3207beaaf4717b07df5cc9b373f14d7aad2e1bcd",
+ "filename": "2016-01",
+ "filetype": "multipart/mixed",
+ "filesize": "0",
+ "revision": "0",
+ "folder": "",
+ "os_storage": "1",
+ "is_dir": "1",
+ "is_photo": "0",
+ "flags": "0",
+ "created": "2016-01-22 03:24:55",
+ "edited": "2016-01-22 03:26:57",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": ""
+ }
+ ]
+ }
+
+
+
+
+### filemeta
+
+Export file metadata for any uploaded file
+
+
+### filedata
+
+
+Provides the ability to download a file from cloud storage in chunks
+
+GET /api/z/1.0/filedata
+
+
+Required:
+
+ - file_id
+ attach.hash of desired file ('begins with' match)
+
+
+Optional:
+
+ - start
+ starting byte of returned data in file (counting from 0)
+
+ - length
+ length (prior to base64 encoding) of chunk to download
+
+
+Returns:
+
+ attach (DB) structure with base64 encoded 'content' comprised of the desired chunk
+
+
+
+Example:
+
+ https://xyz.macgirvin.com/api/z/1.0/filedata?f=&file_id=9f5217770fd&start=0&length=48
+
+Returns:
+
+ {
+
+ "attach": {
+ "id": "107",
+ "aid": "1",
+ "uid": "2",
+ "hash": "9f5217770fd55d563bd77f84d534d8e119a187514bbd391714626cd9c0e60207",
+ "creator": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "filename": "pcxtopbm.c",
+ "filetype": "application/octet-stream",
+ "filesize": "3934",
+ "revision": "0",
+ "folder": "",
+ "flags": "0",
+ "is_dir": "0",
+ "is_photo": "0",
+ "os_storage": "1",
+ "os_path": "",
+ "display_path": "",
+ "content": "LyogcGN4dG9wYm0uYyAtIGNvbnZlcnQgUEMgcGFpbnRicnVzaCAoLnBjeCkgZmls",
+ "created": "2016-07-24 23:13:01",
+ "edited": "2016-07-24 23:13:01",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": "",
+ "start": 0,
+ "length": 48
+ }
+
+ }
+
+
+### file/export
+
+
+### file
+
+
+### albums
+
+
+Description: list photo albums
+
+GET /api/z/1.0/albums
+
+
+Output:
+
+ text - textual name
+
+ total - number of photos in this album
+
+ url - web URL
+
+ urlencode - textual name, urlencoded
+
+ bin2hex - textual name using bin2hex (which is used in the web URL link)
+
+
+Example:
+
+
+ {
+
+ "success": true,
+ "albums": [
+ {
+ "text": "/",
+ "total": "2",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/",
+ "urlencode": "",
+ "bin2hex": ""
+ },
+ {
+ "text": "2016-01",
+ "total": "6",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/323031362d3031",
+ "urlencode": "2016-01",
+ "bin2hex": "323031362d3031"
+ },
+ {
+ "text": "2016-02",
+ "total": "7",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/323031362d3032",
+ "urlencode": "2016-02",
+ "bin2hex": "323031362d3032"
+ },
+ {
+ "text": "Cover Photos",
+ "total": "5",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/436f7665722050686f746f73",
+ "urlencode": "Cover+Photos",
+ "bin2hex": "436f7665722050686f746f73"
+ },
+ {
+ "text": "Profile Photos",
+ "total": "26",
+ "url": "https://xyz.macgirvin.com/photos/hubzilla/album/50726f66696c652050686f746f73",
+ "urlencode": "Profile+Photos",
+ "bin2hex": "50726f66696c652050686f746f73"
+ }
+ ]
+
+ }
+
+
+
+### photos
+
+
+list photo metadata
+
+
+### photo
+
+
+
+### group
+
+
+`GET /api/z/1.0/group`
+
+Description: list privacy groups
+
+Returns: DB tables of all privacy groups.
+
+To use with API group_members, provide either 'group_id' from the id element returned in this call, or 'group_name' from the gname returned in this call.
+
+
+ [
+
+ {
+ "id": "1",
+ "hash": "966c946394f3e2627bbb8a55026b5725e582407098415c02f85232de3f3fde76Friends",
+ "uid": "2",
+ "visible": "0",
+ "deleted": "0",
+ "gname": "Friends"
+ },
+ {
+ "id": "2",
+ "hash": "852ebc17f8c3ed4866f2162e384ded0f9b9d1048f93822c0c84196745f6eec66Family",
+ "uid": "2",
+ "visible": "1",
+ "deleted": "0",
+ "gname": "Family"
+ },
+ {
+ "id": "3",
+ "hash": "cc3cb5a7f9818effd7c7c80a58b09a189b62efa698a74319117babe33ee30ab9Co-workers",
+ "uid": "2",
+ "visible": "0",
+ "deleted": "0",
+ "gname": "Co-workers"
+ }
+ ]
+
+### group_members
+
+
+`GET /api/z/1.0/group_members`
+
+Required:
+
+group_id or group_name
+
+
+Returns:
+
+group_member+abook+xchan (DB join) for each member of the privacy group
+
+
+ [
+
+ {
+ "id": "1",
+ "uid": "2",
+ "gid": "1",
+ "xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "abook_id": "2",
+ "abook_account": "1",
+ "abook_channel": "2",
+ "abook_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "abook_my_perms": "218555",
+ "abook_their_perms": "0",
+ "abook_closeness": "0",
+ "abook_created": "2016-01-02 21:16:26",
+ "abook_updated": "2016-01-02 21:16:26",
+ "abook_connected": "0000-00-00 00:00:00",
+ "abook_dob": "0000-00-00 00:00:00",
+ "abook_flags": "0",
+ "abook_blocked": "0",
+ "abook_ignored": "0",
+ "abook_hidden": "0",
+ "abook_archived": "0",
+ "abook_pending": "0",
+ "abook_unconnected": "0",
+ "abook_self": "1",
+ "abook_feed": "0",
+ "abook_profile": "",
+ "abook_incl": "",
+ "abook_excl": "",
+ "abook_instance": "",
+ "xchan_hash": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "xchan_guid": "lql-1VnxtiO4-WF0h72wLX1Fu8szzHDOXgQaTbELwXW77k8AKFfh-hYr70vqMrc3SSvWN-Flrc5HFhRTWB7ICw",
+ "xchan_guid_sig": "PafvEL0VpKfxATxlCqDjfOeSIMdmpr3iU7X-Sysa1h5LzDpjSXsjO37tYZL-accb1M5itLlfnW5epkTa5I4flsW21zSY1A2jCuBQUTLLGV7rNyyBy7lgqJUFvAMRx0TfXzP9lcaPqlM9T1tA6jfWOsOmkdzwofGeXBnsjGfjsO2xdGYe6vwjOU0DSavukvzDMnOayB9DekpvDnaNBTxeGLM45Skzr7ZEMcNF7TeXMbnvpfLaALYEKeQs9bGH-UgAG8fBWgzVAzeBfx_XSR1rdixjyiZGP0kq0h35SlmMPcEjliodOBFwMXqpXFB7Ibp4F6o6te2p2ErViJccQVG8VNKB6SbKNXY6bhP5zVcVsJ-vR-p4xXoYJJvzTN7yTDsGAXHOLF4ZrXbo5yi5gFAlIrTLAF2EdWQwxSGyLRWKxG8PrDkzEzX6cJJ0VRcLh5z6OI5QqQNdeghPZbshMFMJSc_ApCPi9_hI4ZfctCIOi3T6bdgTNKryLm5fhy_eqjwLAZTGP-aUBgLZpb1mf2UojBn6Ey9cCyq-0T2RWyk-FcIcbV4qJ-p_8oODqw13Qs5FYkjLr1bGBq82SuolkYrXEwQClxnrfKa4KYc2_eHAXPL01iS9zVnI1ySOCNJshB97Odpooc4wk7Nb2Fo-Q6THU9zuu0uK_-JbK7IIl6go2qA",
+ "xchan_pubkey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA18JB76lyP4zzL/y7BCej\neJnfZIWZNtM3MZvI1zEVMWmmwOS+u/yH8oPwyaDk4Y/tnj8GzMPj1lCGVRcd8EJa\nNrCMd50HODA5EsJtxpsOzRcILYjOcTtIAG1K4LtKqELi9ICAaFp0fNfa+Jf0eCek\nvPusx2/ORhy+o23hFoSMhL86o2gmaiRnmnA3Vz4ZMG92ieJEDMXt9IA1EkIqS4y5\nBPZfVPLD1pv8iivj+dtN1XjwplgjUbtxmU0/Ej808nHppscRIqx/XJ0XZU90oNGw\n/wYoK2EzJlPbRsAkwNqoFrAYlr5HPpn4BJ2ebFYQgWBUraD7HwS5atsQEaxGfO21\nlUP0+lDg9t3CXvudDj0UG1jiEKbVIGA+4aG0GN2DSC5AyRq/GRxqyay5W2vQbAZH\nyvxPGrZFO24I65g3pjhpjEsLqZ4ilTLQoLMs0drCIcRm5RxMUo4s/LMg16lT4cEk\n1qRtk2X0Sb1AMQQ2uRXiVtWz77QHMONEYkf6OW4SHbwcv5umvlv69NYEGfCcbgq0\nAV7U4/BWztUz/SWj4r194CG43I9I8dmaEx9CFA/XMePIAXQUuABfe1QMOR6IxLpq\nTHG1peZgHQKeGz4aSGrhQkZNNoOVNaZoIfcvopxcHDTZLigseEIaPPha4WFYoKPi\nUPbZ5o8gTLc750uzrnb2jwcCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "xchan_photo_mimetype": "image/png",
+ "xchan_photo_l": "https://xyz.macgirvin.com/photo/profile/l/2",
+ "xchan_photo_m": "https://xyz.macgirvin.com/photo/profile/m/2",
+ "xchan_photo_s": "https://xyz.macgirvin.com/photo/profile/s/2",
+ "xchan_addr": "teller@xyz.macgirvin.com",
+ "xchan_url": "https://xyz.macgirvin.com/channel/teller",
+ "xchan_connurl": "https://xyz.macgirvin.com/poco/teller",
+ "xchan_follow": "https://xyz.macgirvin.com/follow?f=&url=%s",
+ "xchan_connpage": "",
+ "xchan_name": "Teller",
+ "xchan_network": "zot",
+ "xchan_instance_url": "",
+ "xchan_flags": "0",
+ "xchan_photo_date": "2016-10-19 01:26:50",
+ "xchan_name_date": "2016-01-02 21:16:26",
+ "xchan_hidden": "0",
+ "xchan_orphan": "0",
+ "xchan_censored": "0",
+ "xchan_selfcensored": "0",
+ "xchan_system": "0",
+ "xchan_pubforum": "0",
+ "xchan_deleted": "0"
+ },
+ {
+ "id": "12",
+ "uid": "2",
+ "gid": "1",
+ "xchan": "xuSMUYxw1djBB97qXsbrBN1nzJH_gFwQL6pS4zIy8fuusOfBxNlMiVb4h_q5tOEvpE7tYf1EsryjNciMuPIj5w",
+ "abook_id": "24",
+ "abook_account": "1",
+ "abook_channel": "2",
+ "abook_xchan": "xuSMUYxw1djBB97qXsbrBN1nzJH_gFwQL6pS4zIy8fuusOfBxNlMiVb4h_q5tOEvpE7tYf1EsryjNciMuPIj5w",
+ "abook_my_perms": "218555",
+ "abook_their_perms": "218555",
+ "abook_closeness": "80",
+ "abook_created": "2016-01-27 00:48:43",
+ "abook_updated": "2016-12-04 17:16:58",
+ "abook_connected": "2016-12-04 17:16:58",
+ "abook_dob": "0001-01-01 00:00:00",
+ "abook_flags": "0",
+ "abook_blocked": "0",
+ "abook_ignored": "0",
+ "abook_hidden": "0",
+ "abook_archived": "0",
+ "abook_pending": "0",
+ "abook_unconnected": "0",
+ "abook_self": "0",
+ "abook_feed": "0",
+ "abook_profile": "debb5236efb1626cfbad33ccb49892801e5f844aa04bf81f580cfa7d13204819",
+ "abook_incl": "",
+ "abook_excl": "",
+ "abook_instance": "",
+ "xchan_hash": "xuSMUYxw1djBB97qXsbrBN1nzJH_gFwQL6pS4zIy8fuusOfBxNlMiVb4h_q5tOEvpE7tYf1EsryjNciMuPIj5w",
+ "xchan_guid": "d5EMLlt1tHHZ0dANoA7B5Wq9UgXoWcFS9-gXOkL_AAejcPApoQRyxfHTuu8DoTbUaO-bYmX5HPuWuK9PHyqNmA",
+ "xchan_guid_sig": "CVWEMRPtzI1YcHfnnWHTuv3H964OAmSElgUfxMoX6RdQdxNpqb_POirpVuyP8s3W17mVCfO5V9IAjkg5iKcqCk6YcvOD_egmMy-AnM9TC1kKndQHw55CunD82Q8K_xBNSXkSROizcNkKh9DVLjJPFjW1AqtI4njkZ3EMgrWqnbFRM1qPToUoCY9zM3tEMHoAD9YX1zP90wl40LzfN-dtcNWpSBbiz9owou62uzLbN7mrCwKOMlXLjwwGswRnxIsEnb3O-FXOs8hs0mArKe9snq1-BKeD16LyzxgwlpVLElzIJZGEZGtMdIJgeRzKuBvPjsOIpQ1yAkuOpFJ3nGCM-IPOIIjAmyVl5zD3xPVcxxpZlJRn5fG1Y-gnqTgsrEQCA7M6XPWQdrdHU4akZfyUyFJDhv3uM-jon9VzrYTBw68R0WA-1Z8WafEHA4qh5OWAj85lUarwhr7iTiEckH51ypPCPs6VbT6Pw7yMaxfjFOcipashQagx0tfOlDhE5dQANOXKASFtH1J9-CZY2MQdLPQ6u54d5whuHKMGaJ0V68pnmZ2rOn7g344Ah2WCJrm17jj60QsRMorqRFj7GMdPIA1XB8Wrk88MuYOe3Dhyuu6ZWKI7YTWJS690ZVkKUqAiNHqj0W86DtaiPUc_mmGR0fHl4Gksnko3WmCFv9q2X2E",
+ "xchan_pubkey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAoj2xCJktBA8Ww7Hp+ZNL\nrNuQpo8UB/bfvRkIy+yua3xpF1TuXcnAH61kyRz8vXgOu/l2CyxQbIoaGslCV5Sy\n8JKeNXe+IilUdSSEjMIwCPfSPsYnMHsSnHWmPmclvJwEtQUKOZmW5mMuVBvXy7D2\njomFwc69AYphdyys6eQ7Dcn6+FRBiQbyMprZ5lxyVW+O4DuXVNa3ej2ebx0gCJZ4\ntTIlBoKwEey91dY+FyKVFjdwfNczpmL7LgmZXqcVx+MG3mYgibwdVMiXVj5X06cs\nV9hJ5Xi+Aklsv/UWJtjw9FVt7y9TLptnhh4Ra6T/MDmnBBIAkOR7P/X8cRv078MT\nl0IMsP0RJcDEtTLtwHFVtDs6p52KDFqclKWbqmxmxqV3OTPVYtArRGIzgnJi/5ur\nHRr5G6Cif7QY3UowsIOf78Qvy28LwSbdymgBAWwPPKIviXWxGO+9kMWdmPSUQrWy\nK0+7YA9P9fBUFfn9Hc+p8SJQmQ6OAqLwrDGiPSOlGaNrbEqwqLGgIpXwK+lEFcFJ\n3SPOjJRWdR2whlMxvpwX+39+H7dWN3vSa3Al4/Sq7qW8yW2rYwf+eGyp4Z0lRR+8\nJxFMCwZkSw5g14YdlikAPojv5V1c6KuA5ieg8G1hwyONV7A4JHPyEdPt0W0TZi6C\nCOVkPaC3xGrguETZpJfVpwUCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "xchan_photo_mimetype": "image/png",
+ "xchan_photo_l": "https://xyz.macgirvin.com/photo/9da63aa910ea14e1501ee1a749d181a6-4",
+ "xchan_photo_m": "https://xyz.macgirvin.com/photo/9da63aa910ea14e1501ee1a749d181a6-5",
+ "xchan_photo_s": "https://xyz.macgirvin.com/photo/9da63aa910ea14e1501ee1a749d181a6-6",
+ "xchan_addr": "cloner@xyz.macgirvin.com",
+ "xchan_url": "http://abc.macgirvin.com/channel/cloner",
+ "xchan_connurl": "http://abc.macgirvin.com/poco/cloner",
+ "xchan_follow": "https://xyz.macgirvin.com/follow?f=&url=%s",
+ "xchan_connpage": "",
+ "xchan_name": "Karen",
+ "xchan_network": "zot",
+ "xchan_instance_url": "",
+ "xchan_flags": "0",
+ "xchan_photo_date": "2016-03-31 19:59:20",
+ "xchan_name_date": "2016-01-26 23:23:42",
+ "xchan_hidden": "0",
+ "xchan_orphan": "0",
+ "xchan_censored": "0",
+ "xchan_selfcensored": "0",
+ "xchan_system": "0",
+ "xchan_pubforum": "0",
+ "xchan_deleted": "0"
+ }
+
+ ]
+
+
+### xchan
+
+
+An xchan is a global location independent channel and is the primary record for a network
+identity. It may refer to channels on other websites, networks, or services.
+
+`GET /api/z/1.0/xchan`
+
+Required: one of [ address, hash, guid ] as GET parameters
+
+Returns a portable xchan structure
+
+Example: https://xyz.macgirvin.com/api/z/1.0/xchan?f=&address=mike@macgirvin.com
+
+Returns:
+
+ {
+ "hash": "jr54M_y2l5NgHX5wBvP0KqWcAHuW23p1ld-6Vn63_pGTZklrI36LF8vUHMSKJMD8xzzkz7s2xxCx4-BOLNPaVA",
+ "guid": "sebQ-IC4rmFn9d9iu17m4BXO-kHuNutWo2ySjeV2SIW1LzksUkss12xVo3m3fykYxN5HMcc7gUZVYv26asx-Pg",
+ "guid_sig": "Llenlbl4zHo6-g4sa63MlQmTP5dRCrsPmXHHFmoCHG63BLq5CUZJRLS1vRrrr_MNxr7zob_Ykt_m5xPKe5H0_i4pDj-UdP8dPZqH2fqhhx00kuYL4YUMJ8gRr5eO17vsZQ3XxTcyKewtgeW0j7ytwMp6-hFVUx_Cq08MrXas429ZrjzaEwgTfxGnbgeQYQ0R5EXpHpEmoERnZx77VaEahftmdjAUx9R4YKAp13pGYadJOX5xnLfqofHQD8DyRHWeMJ4G1OfWPSOlXfRayrV_jhnFlZjMU7vOdQwHoCMoR5TFsRsHuzd-qepbvo3pzvQZRWnTNu6oPucgbf94p13QbalYRpBXKOxdTXJrGdESNhGvhtaZnpT9c1QVqC46jdfP0LOX2xrVdbvvG2JMWFv7XJUVjLSk_yjzY6or2VD4V6ztYcjpCi9d_WoNHruoxro_br1YO3KatySxJs-LQ7SOkQI60FpysfbphNyvYMkotwUFI59G08IGKTMu3-GPnV1wp7NOQD1yzJbGGEGSEEysmEP0SO9vnN45kp3MiqbffBGc1r4_YM4e7DPmqOGM94qksOcLOJk1HNESw2dQYWxWQTBXPfOJT6jW9_crGLMEOsZ3Jcss0XS9KzBUA2p_9osvvhUKuKXbNztqH0oZIWlg37FEVsDs_hUwUJpv2Ar09k4",
+ "pubkey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA7QCwvuEIwCHjhjbpz3Oc\ntyei/Pz9nDksNbsc44Cm8jxYGMXsTPFXDZYCcCB5rcAhPPdZSlzaPkv4vPVcMIrw\n5cdX0tvbwa3rNTng6uFE7qkt15D3YCTkwF0Y9FVZiZ2Ko+G23QeBt9wqb9dlDN1d\nuPmu9BLYXIT/JXoBwf0vjIPFM9WBi5W/EHGaiuqw7lt0qI7zDGw77yO5yehKE4cu\n7dt3SakrXphL70LGiZh2XGoLg9Gmpz98t+gvPAUEotAJxIUqnoiTA8jlxoiQjeRK\nHlJkwMOGmRNPS33awPos0kcSxAywuBbh2X3aSqUMjcbE4cGJ++/13zoa6RUZRObC\nZnaLYJxqYBh13/N8SfH7d005hecDxWnoYXeYuuMeT3a2hV0J84ztkJX5OoxIwk7S\nWmvBq4+m66usn6LNL+p5IAcs93KbvOxxrjtQrzohBXc6+elfLVSQ1Rr9g5xbgpub\npSc+hvzbB6p0tleDRzwAy9X16NI4DYiTj4nkmVjigNo9v2VPnAle5zSam86eiYLO\nt2u9YRqysMLPKevNdj3CIvst+BaGGQONlQalRdIcq8Lin+BhuX+1TBgqyav4XD9K\nd+JHMb1aBk/rFLI9/f2S3BJ1XqpbjXz7AbYlaCwKiJ836+HS8PmLKxwVOnpLMbfH\nPYM8k83Lip4bEKIyAuf02qkCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "photo_mimetype": "image/jpeg",
+ "photo_l": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-4",
+ "photo_m": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-5",
+ "photo_s": "https://xyz.macgirvin.com/photo/350b74555c04429148f2e12775f6c403-6",
+ "address": "mike@macgirvin.com",
+ "url": "https://macgirvin.com/channel/mike",
+ "connurl": "https://macgirvin.com/poco/mike",
+ "follow": "https://macgirvin.com/follow?f=&url=%s",
+ "connpage": "https://macgirvin.com/connect/mike",
+ "name": "Mike Macgirvin",
+ "network": "zot",
+ "instance_url": "",
+ "flags": "0",
+ "photo_date": "2012-12-06 05:06:11",
+ "name_date": "2012-12-06 04:59:13",
+ "hidden": "1",
+ "orphan": "0",
+ "censored": "0",
+ "selfcensored": "0",
+ "system": "0",
+ "pubforum": "0",
+ "deleted": "0"
+ }
+
+### item/update
+
+
+Create or update an item (post, activity, webpage, etc.)
+
+Usage: `POST /api/z/1.0/item/update`
+
+Description: item/update posts an item (typically a conversation item or post, but can be any item) using form input.
+
+
+Required:
+
+- body
+
+ text/bbcode contents by default.
+
+
+Optional:
+
+- $_FILES['media']
+
+ uploaded media file to include with post
+
+- title
+
+ title of post/item
+
+- contact_allow
+
+ array of xchan.xchan_hash allowed to view this item
+
+- group_allow
+
+ array of group.hash allowed to view this item
+
+- contact_deny
+
+ array of xchan.xchan_hash not allowed to view this item
+
+- group_deny
+
+ array of group.hash not allowed to view this item
+
+- coord
+
+ geographic coordinates
+
+- location
+
+ freefrom location
+
+- expire
+
+ datetime this post will expire or be removed
+
+- mimetype
+
+ mimetype if not text/bbcode
+
+- parent
+
+ item.id of parent to this post (makes it a comment)
+
+- parent_mid
+
+ alternate form of parent using message_id
+
+- remote_xchan
+
+ xchan.xchan_hash of this message author if not the channel owner
+
+- consensus
+
+ boolean set to true if this is a consensus or voting item (default false)
+
+- nocomment
+
+ boolean set to true if comments are to be disabled (default false)
+
+- origin
+
+ do not use this without reading the code
+
+- namespace
+
+ persistent identity for a remote network or service
+
+- remote_id
+
+ message_id of this resource on a remote network or service
+
+- message_id
+
+ message_id of this item (leave unset to generate one)
+
+- created
+
+ datetime of message creation
+
+- post_id
+
+ existing item.id if this is an edit operation
+
+- app
+
+ application or network name to display with item
+
+- categories
+
+ comma separated categories for this item
+
+- webpage
+
+ item.page_type if not 0
+
+- pagetitle
+
+ for webpage and design elements, the 'page name'
+
+- layout_mid
+
+ item.mid of layout for this design element
+
+- plink
+
+ permalink for this item if different than the default
+
+- verb
+
+ activitystream verb for this item/activity
+
+- obj_type
+
+ activitystream object type for this item/activity
+
+
+
+Example:
+
+ curl -u mychannel:mypassword https://xyz.macgirvin.com/api/z/1.0/item/update -d body="hello world"
+
+
+Returns:
+
+
+ {
+
+ "success": true,
+ "item_id": "2245",
+ "item": {
+ "id": "2245",
+ "mid": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "aid": "1",
+ "uid": "2",
+ "parent": "2245",
+ "parent_mid": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "thr_parent": "14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "created": "2016-12-03 20:00:12",
+ "edited": "2016-12-03 20:00:12",
+ "expires": "0001-01-01 00:00:00",
+ "commented": "2016-12-03 20:00:12",
+ "received": "2016-12-03 20:00:12",
+ "changed": "2016-12-03 20:00:12",
+ "comments_closed": "0001-01-01 00:00:00",
+ "owner_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "author_xchan": "pgcJx1IQjuPkx8aI9qheJlBMZzJz-oTPjHy3h5pWlOVOriBO_cSiUhhqwhuZ74TYJ8_ECO3pPiRMWC0q8YPCQg",
+ "source_xchan": "",
+ "mimetype": "text/bbcode",
+ "title": "",
+ "body": "hello world",
+ "html": "",
+ "app": "",
+ "lang": "",
+ "revision": "0",
+ "verb": "http://activitystrea.ms/schema/1.0/post",
+ "obj_type": "http://activitystrea.ms/schema/1.0/note",
+ "obj": "",
+ "tgt_type": "",
+ "target": "",
+ "layout_mid": "",
+ "postopts": "",
+ "route": "",
+ "llink": "https://xyz.macgirvin.com/display/14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "plink": "https://xyz.macgirvin.com/channel/mychannel/?f=&mid=14135cdecf6b8e3891224e4391748722114da6668eebbcb56fe4667b60b88249@xyz.macgirvin.com",
+ "resource_id": "",
+ "resource_type": "",
+ "attach": "",
+ "sig": "sa4TOQNfHtV13HDZ1tuQGWNBpZp-nWhT2GMrZEmelXxa_IvEepD2SEsCTWOBqM8OKPJLfNy8_i-ORXjrOIIgAa_aT8cw5vka7Q0C8L9eEb_LegwQ_BtH0CXO5uT30e_8uowkwzh6kmlVg1ntD8QqrGgD5jTET_fMQOIw4gQUBh40GDG9RB4QnPp_MKsgemGrADnRk2vHO7-bR32yQ0JI-8G-eyeqGaaJmIwkHoi0vXsfjZtU7ijSLuKEBWboNjKEDU89-vQ1c5Kh1r0pmjiDk-a5JzZTYShpuhVA-vQgEcADA7wkf4lJZCYNwu3FRwHTvhSMdF0nmyv3aPFglQDky38-SAXZyQSvd7qlABHGCVVDmYrYaiq7Dh4rRENbAUf-UJFHPCVB7NRg34R8HIqmOKq1Su99bIWaoI2zuAQEVma9wLqMoFsluFhxX58KeVtlCZlro7tZ6z619-dthS_fwt0cL_2dZ3QwjG1P36Q4Y4KrCTpntn9ot5osh-HjVQ01h1I9yNCj6XPgYJ8Im3KT_G4hmMDFM7H9RUrYLl2o9XYyiS2nRrf4aJHa0UweBlAY4zcQG34bw2AMGCY53mwsSArf4Hs3rKu5GrGphuwYX0lHa7XEKMglwBWPWHI49q7-oNWr7aWwn1FnfaMfl4cQppCMtKESMNRKm_nb9Dsh5e0",
+ "diaspora_meta": "",
+ "location": "",
+ "coord": "",
+ "public_policy": "",
+ "comment_policy": "contacts",
+ "allow_cid": "",
+ "allow_gid": "",
+ "deny_cid": "",
+ "deny_gid": "",
+ "item_restrict": "0",
+ "item_flags": "0",
+ "item_private": "0",
+ "item_origin": "1",
+ "item_unseen": "0",
+ "item_starred": "0",
+ "item_uplink": "0",
+ "item_consensus": "0",
+ "item_wall": "1",
+ "item_thread_top": "1",
+ "item_notshown": "0",
+ "item_nsfw": "0",
+ "item_relay": "0",
+ "item_mentionsme": "0",
+ "item_nocomment": "0",
+ "item_obscured": "0",
+ "item_verified": "1",
+ "item_retained": "0",
+ "item_rss": "0",
+ "item_deleted": "0",
+ "item_type": "0",
+ "item_hidden": "0",
+ "item_unpublished": "0",
+ "item_delayed": "0",
+ "item_pending_remove": "0",
+ "item_blocked": "0"
+ }
+
+ }
+
+### item/full
+
+
+Get all data associated with an item
+
+### abook
+
+
+Connections
+
+### abconfig
+
+
+Connection metadata (such as permissions)
+
+### perm_allowed
+
+
+Check a permission for a given xchan
diff --git a/doc/developer/developer_guide.md b/doc/developer/developer_guide.md
new file mode 100644
index 000000000..fa50de8a1
--- /dev/null
+++ b/doc/developer/developer_guide.md
@@ -0,0 +1,422 @@
+### Who is a Hubzilla developer? Should I read this?
+
+Anyone who contributes to making Hubzilla better is a developer. There are many different and important ways you can contribute to this amazing technology, _even if you do not know how to write code_. The software itself is only a part of the Hubzilla project. You can contribute by
+
+* translating text to your language so that people around the world have the opportunity to use Hubzilla
+* promoting Hubzilla and spreading awareness of the platform through blog posts, articles, and word-of-mouth
+* creating artwork and graphics for project assets such as icons and marketing material
+* supporting project infrastructure like the project website and demo servers
+
+_Software_ developers are of course welcomed; there are so many great ideas to implement and not enough people to make them all a reality! The Hubzilla code base is an advanced and mature system, but the platform is still very flexible and responsive to new ideas.
+
+This document will help you get started learning and contributing to Hubzilla.
+
+### Versioning system
+
+The versioning system is similar to the popular semantic versioning but less stringent. Given x.y.z, x changes yearly. y changes for "stable" monthly builds, and z increments when there are interface changes. We maintain our date and build numbers for medium grain version control (commits within a certain date range) and of course git revs for fine grained control.
+
+### Git repository branches
+
+There are two official branches of the Hubzilla git repo.
+
+* The stable version is maintained on the **master** branch. The latest commit in this branch is considered to be suitable for production hubs.
+* Experimental development occurs on the **dev** branch, which is merged into **master** when it is deemed tested and stable enough.
+
+### Developer tools and workflows
+
+#### Hub Snapshots
+
+The [hub snapshots](/help/admin/hub_snapshots) page provides instructions and scripts for taking complete
+snapshots of a hub to support switching between consistent and completely known
+states. This is useful to prevent situations where the content or database schema
+might be incompatible with the code.
+
+### Translations
+
+Our translations are managed through Transifex. If you wish to help out translating Hubzilla to another language, sign up on transifex.com, visit [https://www.transifex.com/projects/p/red-matrix/](https://www.transifex.com/projects/p/red-matrix/) and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.
+
+#### Translation Process
+
+The strings used in the UI of Hubzilla 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 Hubzilla to a
+currently not supported language, please register an account at transifex.com
+and contact the Redmatrix translation team there.
+
+Translating Hubzilla 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
+Hubzilla 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 "hmessages.po" file from
+transifex which needs to be translated into the PHP file Hubzilla uses. To do
+so, place the file in the directory mentioned above and use the "po2php"
+utility from the util directory of your Hubzilla installation.
+
+Assuming you want to convert the German localization which is placed in
+view/de/hmessages.po you would do the following.
+
+1. Navigate at the command prompt to the base directory of your
+ Hubzilla installation
+
+2. Execute the po2php script, which will place the translation
+ in the hstrings.php file that is used by Hubzilla.
+
+ $> php util/po2php.php view/de/hmessages.po
+
+ The output of the script will be placed at view/de/hstrings.php where
+ froemdoca os expecting it, so you can test your translation mmediately.
+
+3. Visit your Hubzilla 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/hstrings.php
+
+4. commit the two files with a meaningful commit message to your git
+ repository, push it to your fork of the Hubzilla 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 Hubzilla source tree. If you only want to
+translate Hubzilla into another language you wont need any of these tools most
+likely but it gives you an idea how the translation process of Hubzilla
+works.
+
+For further information see the utils/README file.
+
+#### Known Problems
+
+* Hubzilla 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.
+* the early translations are based on the friendica translations, if you
+ some rough translations please let us know or fix them at Transifex.
+
+### To-be-organized information
+
+**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.
+
+You may fork/clone the Red repository from [https://github.com/redmatrix/hubzilla.git](https://github.com/redmatrix/hubzilla.git).
+
+Follow the instructions provided here: [http://help.github.com/fork-a-repo/](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.
+
+Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.
+
+
+**Licensing**
+
+All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.
+
+**Coding Style**
+
+In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.
+
+* All comments should be in English.
+
+* We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.
+
+* Indentation is accomplished primarily with tabs using a tab-width of 4.
+
+* String concatenation and operators should be separated by whitespace. e.g. "$foo = $bar . 'abc';" instead of "$foo=$bar.'abc';"
+
+* Generally speaking, we use single quotes for string variables and double quotes for SQL statements. "Here documents" should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.
+
+* Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.
+
+* Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves.
+
+
+**File system layout:**
+
+[addon] optional addons/plugins
+
+[boot.php] Every process uses this to bootstrap the application structure
+
+[doc] Help Files
+
+[images] core required images
+
+[include] The "model" in MVC - (back-end functions), also contains PHP "executables" for background processing
+
+[index.php] The front-end controller for web access
+
+[install] Installation and upgrade files and DB schema
+
+[library] Third party modules (must be license compatible)
+
+[mod] Controller modules based on URL pathname (e.g. #^[url=http://sitename/foo]http://sitename/foo[/url] loads mod/foo.php)
+
+[mod/site/] site-specific mod overrides, excluded from git
+
+[util] translation tools, main English string database and other miscellaneous utilities
+
+[version.inc] contains current version (auto-updated via cron for the master repository and distributed via git)
+
+[view] theming and language files
+
+[view/(css,js,img,php,tpl)] default theme files
+
+[view/(en,it,es ...)] language strings and resources
+
+[view/theme/] individual named themes containing (css,js,img,php,tpl) over-rides
+
+**The Database:**
+
+
+| Table | Description |
+|-------------------------|--------------------------------------------------------|
+| abconfig | contact table, replaces Friendica 'contact' |
+| abook | |
+| account | service provider account |
+| addon | |
+| addressbookchanges | |
+| addressbooks | |
+| app | |
+| atoken | |
+| attach | |
+| auth_codes | |
+| cache | |
+| cal | |
+| calendarchanges | |
+| calendarinstances | |
+| calendarobjects | |
+| calendars | |
+| calendarsubscriptions | |
+| cards | |
+| channel | |
+| chat | |
+| chatpresence | |
+| chatroom | |
+| clients | |
+| config | |
+| conv | |
+| dreport | |
+| event | |
+| group_member | |
+| groupmembers | |
+| groups | |
+| hook | |
+| hubloc | |
+| iconfig | |
+| issue | |
+| item | |
+| item_id | |
+| likes | |
+| locks | |
+| mail | |
+| menu | |
+| menu_item | |
+| notify | |
+| obj | |
+| outq | |
+| pconfig | personal (per channel) configuration storage |
+| photo | |
+| poll | |
+| poll_elm | |
+| principals | |
+| profdef | |
+| profext | |
+| profile | |
+| profile_check | |
+| propertystorage | |
+| register | |
+| schedulingobjects | |
+| session | |
+| shares | |
+| sign | |
+| site | |
+| source | |
+| sys_perms | |
+| term | |
+| tokens | |
+| updates | |
+| users | |
+| verify | |
+| vote | |
+| xchan | |
+| xchat | |
+| xconfig | |
+| xign | |
+| xlink | |
+| xperm | |
+| xprof | |
+| xtag | |
+
+
+ * abook - contact table, replaces Friendica 'contact'
+ * account - service provider account
+ * addon - registered plugins
+ * app - peronal app data
+ * attach - file attachments
+ * auth_codes - OAuth usage
+ * cache - OEmbed cache
+ * channel - replaces Friendica 'user'
+ * chat - chat room content
+ * chatpresence - channel presence information for chat
+ * chatroom - data for the actual chat room
+ * clients - OAuth usage
+ * config - main configuration storage
+ * conv - Diaspora private messages
+ * event - Events
+ * fcontact - friend suggestion stuff
+ * ffinder - friend suggestion stuff
+ * fserver - obsolete
+ * fsuggest - friend suggestion stuff
+ * groups - privacy groups
+ * group_member - privacy groups
+ * hook - plugin hook registry
+ * hubloc - Red location storage, ties a location to an xchan
+ * item - posts
+ * item_id - other identifiers on other services for posts
+ * likes - likes of 'things'
+ * mail - private messages
+ * menu - channel menu data
+ * menu_item - items uses by channel menus
+ * notify - notifications
+ * notify-threads - need to factor this out and use item thread info on notifications
+ * obj - object data for things (x has y)
+ * outq - output queue
+ * pconfig - personal (per channel) configuration storage
+ * photo - photo storage
+ * poll - data for polls
+ * poll_elm - data for poll elements
+ * profdef - custom profile field definitions
+ * profext - custom profile field data
+ * profile - channel profiles
+ * profile_check - DFRN remote auth use, may be obsolete
+ * register - registrations requiring admin approval
+ * session - web session storage
+ * shares - shared item information
+ * sign - Diaspora signatures. To be phased out.
+ * site - site table to find directory peers
+ * source - channel sources data
+ * spam - unfinished
+ * sys_perms - extensible permissions for the sys channel
+ * term - item taxonomy (categories, tags, etc.) table
+ * tokens - OAuth usage
+ * updates - directory sync updates
+ * verify - general purpose verification structure
+ * vote - vote data for polls
+ * xchan - replaces 'gcontact', list of known channels in the universe
+ * xchat - bookmarked chat rooms
+ * xconfig - as pconfig but for channels with no local account
+ * xlink - "friends of friends" linkages derived from poco
+ * xprof - if this hub is a directory server, contains basic public profile info of everybody in the network
+ * xtag - if this hub is a directory server, contains tags or interests of everybody in the network
+
+
+**How to theme Hubzilla**
+
+This is a short documentation on what I found while trying to modify Hubzilla's appearance.
+
+First, you'll need to create a new theme. This is in /view/theme, and I chose to copy 'redbasic' since it's the only available for now. Let's assume I named it .
+
+Oh, and don't forget to rename the _init function in /php/theme.php to be _init() instead of redbasic_init().
+
+At that point, if you need to add javascript or css files, add them to /js or /css, and then "register" them in _init() through head_add_js('file.js') and head_add_css('file.css').
+
+Now you'll probably want to alter a template. These can be found in in /view/tpl OR view//tpl. All you should have to do is copy whatever you want to tweak from the first place to your theme's own tpl directory.
+
+
+We're pretty relaxed when it comes to developers. We don't have a lot of rules. Some of us are over-worked and if you want to help we're happy to let you help. That said, attention to a few guidelines will make the process smoother and make it easier to work together. We have developers from across the globe with different abilities and different cultural backgrounds and different levels of patience. Our primary rule is to respect others. Sometimes this is hard and sometimes we have very different opinions of how things should work, but if everybody makes an effort, we'll get along just fine.
+
+**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.
+
+You may fork/clone the Red repository from [url=https://github.com/redmatrix/hubzilla.git]https://github.com/redmatrix/hubzilla.git[/url]
+
+Follow the instructions provided here: [url=http://help.github.com/fork-a-repo/]http://help.github.com/fork-a-repo/[/url]
+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.
+
+**Translations**
+
+Our translations are managed through Transifex. If you wish to help out translating the $Projectname to another language, sign up on transifex.com, visit [url=https://www.transifex.com/projects/p/red-matrix/]https://www.transifex.com/projects/p/red-matrix/[/url] and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.
+
+
+**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.
+
+Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.
+
+Further documentation can be found at the Github wiki pages at: [url=https://github.com/friendica/red/wiki]https://github.com/friendica/red/wiki[/url]
+
+**Licensing**
+
+All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.
+
+**Concensus Building**
+
+Code changes which fix an obvious bug are pretty straight-forward. For instance if you click "Save" and the thing you're trying to save isn't saved, it's fairly obvious what the intended behaviour should be. Often when developing feature requests, it may affect large numbers of community members and it's possible that other members of the community won't agree with the need for the feature, or with your proposed implementation. They may not see something as a bug or a desirable feature.
+
+We encourage consensus building within the community when it comes to any feature which might be considered controversial or where there isn't unanimous decision that the proposed feature is the correct way to accomplish the task. The first place to pitch your ideas is to [url=https://zothub.com/channel/one]Channel One[/url]. Others may have some input or be able to point out facets of your concept which might be problematic in our environment. But also, you may encounter opposition to your plan. This doesn't mean you should stop and/or ignore the feature. Listen to the concerns of others and try and work through any implementation issues.
+
+There are places where opposition cannot be resolved. In these cases, please consider making your feature **optional** or non-default behaviour that must be specifically enabled. This technique can often be used when a feature has significant but less than unanimous support. Those who desire the feature can turn it on and those who don't want it - will leave it turned off.
+
+If a feature uses other networks or websites and or is only seen as desirable by a small minority of the community, consider making the functionality available via an addon or plugin. Once again, those who don't desire the feature won't need to install it. Plugins are relatively easy to create and "hooks" can be easily added or modified if the current hooks do not do what is needed to allow your plugin to work.
+
+
+**Coding Style**
+
+In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.
+
+* All comments should be in English.
+
+* We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.
+
+* Indentation is accomplished primarily with tabs using a tab-width of 4.
+
+* String concatenation and operators should be separated by whitespace. e.g. "$foo = $bar . 'abc';" instead of "$foo=$bar.'abc';"
+
+* Generally speaking, we use single quotes for string variables and double quotes for SQL statements. "Here documents" should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.
+
+* Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.
+
+* Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves.
+
+* Some functions take arguments in argc/argv style like main() in C or function args in bash or Perl. Urls are broken up within a module. e.g, given "http://example.com/module/arg1/arg2", then $this->argc will be 3 (integer) and $this->argv will contain: [0] => 'module', [1] => 'arg1', [2] => 'arg2'. There will always be one argument. If provided a naked domain URL, $this->argv[0] is set to "home". \ No newline at end of file
diff --git a/doc/features.bb b/doc/features.bb
index 3daf403c3..578af6050 100644
--- a/doc/features.bb
+++ b/doc/features.bb
@@ -134,6 +134,7 @@ The options are:
- Anybody on this website.
- Anybody in this network.
- Anybody authenticated.
+ - Specific people you provide a Guest Access Token to in order to access a specific item.
- Anybody on the Internet.
diff --git a/doc/general.bb b/doc/general.bb
index cc5de5a56..8390aceb3 100644
--- a/doc/general.bb
+++ b/doc/general.bb
@@ -3,7 +3,7 @@
[zrl=[baseurl]/help/Privacy]Privacy Policy[/zrl]
[zrl=[baseurl]/help/project/governance]Project Governance[/zrl]
[zrl=[baseurl]/help/contributor/convenant]Project Covenant and Code of Conduct[/zrl]
-[zrl=[baseurl]/help/project/history]$Projectname history[/zrl]
+
[h3]External resources[/h3]
[zrl=[baseurl]/help/external-resource-links]List of external resources[/zrl]
[url=https://github.com/redmatrix/hubzilla]Main Website[/url]
diff --git a/doc/hook/crypto_methods.bb b/doc/hook/crypto_methods.bb
new file mode 100644
index 000000000..1b16f567d
--- /dev/null
+++ b/doc/hook/crypto_methods.bb
@@ -0,0 +1,5 @@
+[h2]crypto_mthods[/h2]
+
+Passed an array of crypto methods in local priority order.
+
+You may change the order and add new methods or disable existing methods. 'aes256cbc' is always supported as a fallback and currently removing this has no effect. \ No newline at end of file
diff --git a/doc/hook/get_photo.bb b/doc/hook/get_photo.bb
new file mode 100644
index 000000000..eaf3beffb
--- /dev/null
+++ b/doc/hook/get_photo.bb
@@ -0,0 +1,14 @@
+[h2]get_photo[/h2]
+
+Called when fetching the content of photos (except for profile photos) in mod_photo.
+
+
+Hook arguments:
+
+'imgscale' => integer resolution requested
+'resource_id' => resource_id of requested photo
+'photo' => array of matching photo table rows after querying for the photo
+'allowed' => whether or not access to this resource is allowed
+
+
+
diff --git a/doc/hook/markdown_to_bb.bb b/doc/hook/markdown_to_bb.bb
new file mode 100644
index 000000000..8af637c8c
--- /dev/null
+++ b/doc/hook/markdown_to_bb.bb
@@ -0,0 +1,5 @@
+[h2]markdown_to_bb[/h2]
+
+Called when processing markdown to bbcode conversion such as when importing Diaspora protocol source or other markdown sources. The plugin is called post conversion.
+
+The function takes one argument which is the string being converted. It may be additionally processed by the plugin.
diff --git a/doc/hook/other_encapsulate.bb b/doc/hook/other_encapsulate.bb
new file mode 100644
index 000000000..ea0cdf622
--- /dev/null
+++ b/doc/hook/other_encapsulate.bb
@@ -0,0 +1,7 @@
+[h2]other_encapsulate[/h2]
+
+Passed an array of 'data', 'pubkey', 'alg', 'result' when encrypting data with an algorithm (alg) which is unknown to the system. Hooks are expected to identify their algorithm, encrypt data with pubkey and place the result in 'result'.
+
+
+
+
diff --git a/doc/hook/other_unencapsulate.bb b/doc/hook/other_unencapsulate.bb
new file mode 100644
index 000000000..c8b0b617f
--- /dev/null
+++ b/doc/hook/other_unencapsulate.bb
@@ -0,0 +1,5 @@
+[h2]other_unencapsulate[/h2]
+
+Passed an array of 'data', 'prvkey', 'alg', 'result' when decrypting data with an algorithm (alg) which is unknown to the system. Hooks are expected to identify their algorithm, decrypt data with prvkey and place the result in 'result'.
+
+
diff --git a/doc/hooklist.bb b/doc/hooklist.bb
index d190166f0..52af9608c 100644
--- a/doc/hooklist.bb
+++ b/doc/hooklist.bb
@@ -145,6 +145,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/cron_weekly]cron_weekly[/zrl]
Called when weekly scheduled tasks are executed
+[zrl=[baseurl]/help/hook/crypto_methods]crypto_methods[/zrl]
+ Called when generating a list of crypto algorithms in the locally preferred order
+
[zrl=[baseurl]/help/hook/directory_item]directory_item[/zrl]
Called when generating a directory listing for display
@@ -239,6 +242,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/get_features]get_features[/zrl]
Called when get_features() is called
+[zrl=[baseurl]/help/hook/get_photo]get_photo[/zrl]
+ Called when photo content (except for profile photos) is fetched in mod_photo
+
[zrl=[baseurl]/help/hook/get_profile_photo]get_profile_photo[/zrl]
Called when local profile photo content is fetched in mod_photo
@@ -320,6 +326,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/magic_auth]magic_auth[/zrl]
Called when processing a magic-auth sequence
+[zrl=[baseurl]/help/hook/markdown_to_bb]markdown_to_bb[/zrl]
+ Called when processing markdown conversion
+
[zrl=[baseurl]/help/hook/match_webfinger_location]match_webfinger_location[/zrl]
Called when processing webfinger requests
@@ -380,6 +389,12 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/oembed_probe]oembed_probe[/zrl]
Called when performing an oembed content lookup
+[zrl=[baseurl]/help/hook/other_encapsulate]other_encapsulate[/zrl]
+ Called when encrypting content for which the algorithm is unknown (see also crypto_methods)
+
+[zrl=[baseurl]/help/hook/other_unencapsulate]other_unencapsulate[/zrl]
+ Called when decrypting content for which the algorithm is unknown (see also crypto_methods)
+
[zrl=[baseurl]/help/hook/page_content_top]page_content_top[/zrl]
Called when we generate a webpage (before calling the module content function)
diff --git a/doc/member/member_faq.bb b/doc/member/member_faq.bb
new file mode 100644
index 000000000..9533cb557
--- /dev/null
+++ b/doc/member/member_faq.bb
@@ -0,0 +1,10 @@
+[h3]$Projectname FAQ[/h3]
+[h4]I am able to edit a post's text after I saved it, but is there a way to change the permissions?[/h4]
+Short anser: No, there isn't. There are reasons. You are able to change permissons to your files, photos and the likes, but not to posts after you have saved them. The main reason is: Once you have saved a post it is being distributed either to the public channel and from there to other $Projectname servers or to those you intended it to go. Just like you cannot reclaim something you gave to another person, you cannot change permissions to $Projectname posts. We would need to track everywhere your posting goes, keep track of everyone you allowed to see it and then keep track of from whom to delete it.
+If a posting is public this is even harder, as $Projectname is a global network and there is no way to follow a post, let alone reclaim it reliably. Other networks that may receive your post have no reliable way to delete or reclaim the post.
+[h4]I downloaded my channel and imported it (cloned my identity) to another site but there is no content, no posts, no photos. What is wrong???[/h4]
+Posts and photos/files are provided separately from the channel basic information. This is due to memory limitations dealing with years of conversations and photo archives. Posts and conversations can be synced separately from the basic channel information. Photos and file archives can be transferred using a plugin tool such as 'redfiles', which is currently listed as "experimental". When creating this feature we thought that keeping all your contacts was the most important task. Your friends have already seen your old content. Posts/conversations were next in priority and these may now be synced. Files and photos are the last bit to get completely working. Once we find someone willing to finish implementing this, it will be done. :)
+[h4]I can't see private resources[/h4]
+You have probably disabled third party cookies. You need to enable them for remote authentication to work.
+[h4]There are a lot of foreign language posts. Let's auto-translate them.[/h4]
+There are also a lot of [b]private[/b] foreign language posts and auto-translation services would require us to transmit these private messages to the translation service; and we don't know what they will do with them on their servers. Actually we do know thanks to Edward Snowden. Our best bet is a project called [b][i]Apertium[/i][/b] which is an open source translator we can install locally. It is currently missing German translations - which are the most requested translation in the matrix. Once again, this will be implemented when we find somebody who really wants to make it happen.
diff --git a/doc/member/member_guide.bb b/doc/member/member_guide.bb
new file mode 100644
index 000000000..53cc6b8c7
--- /dev/null
+++ b/doc/member/member_guide.bb
@@ -0,0 +1,486 @@
+[h3]Overview[/h3]
+
+While many features and capabilities of $Projectname are familiar to people who have used social networking sites and blogging software, there are also quite a few new concepts and features that most people have not encountered before. Some of the new ideas are related to the decentralized nature of the grid; others are associated with the advanced permissions system that is necessary to protect your data privacy. The purpose of this guide is to help you understand how to create, configure, and use your nomadic identity.
+
+[h3]Registration[/h3]
+
+Not all $Projectname sites allow open registration. If registration is allowed, you will see a &quot;Register&quot; link immediately below the login prompts on the site home page. Following this link will take you to the site Registration page. On some sites it may redirect you to another site which allow registrations. As all $Projectname sites are linked, it does not matter where your account resides.
+
+[b]Your Email Address[/b]
+
+Please provide a valid email address. Your email address is never published. This address will be used to activate your account, to (optionally) send email notifications for incoming messages or items, [i]and to recover lost passwords[/i].
+
+[b]Password[/b]
+
+Enter a password of your choice, and repeat it in the second box to ensure it was typed correctly. As $Projectname offers a decentralised identity, your account can log you in to many other websites.
+
+[b]Terms Of Service[/b]
+
+Click the link to read the site's [zrl=[baseurl]/help/TermsOfService]Terms of Service[/zrl]. Once you've read them, tick the box in the register form to confirm.
+
+[b]Register[/b]
+
+Once you have provided the necessary details, click the 'Register' button. Some sites may require administrator approval before the registration is processed, and you will be alerted if this is the case. Please watch your email (including spam folders) for your registration approval.
+
+[b]Create a Channel[/b]
+
+Next, you will be presented with the &quot;Add a channel&quot; screen. Normally, your first channel will be one that represents you - so using your own name (or psuedonym) as the channel name is a good idea. The channel name should be thought of as a title, or brief description of your channel. The &quot;choose a short nickname&quot; box is similar to a &quot;username&quot; field. We will use whatever you enter here to create a channel address, which other people will use to connect to you, and you will use to log in to other sites. This looks like an email address, and takes the form nickname@siteyouregisteredat.xyz
+
+When your channel is created you will be taken straight to your settings page where you can define permissions, enable features, etc. All these things are covered in the appropriate section of the helpfiles.
+
+See Also
+[zrl=[baseurl]/help/accounts_profiles_channels_basics]The Basics about Identities within $Projectname[/zrl]
+[zrl=[baseurl]/help/accounts]Accounts[/zrl]
+[zrl=[baseurl]/help/profiles]Profiles[/zrl]
+[zrl=[baseurl]/help/permissions]Permissions[/zrl]
+[zrl=[baseurl]/help/remove_account]Remove Account[/zrl]
+
+[b]Profiles[/b]
+
+$Projectname has unlimited profiles. You may use different profiles to show different &quot;sides of yourself&quot; to different audiences. This is different to having different channels. Different channels allow for completely different sets of information. You may have a channel for yourself, a channel for your sports team, a channel for your website, or whatever else. A profile allows for finely graded &quot;sides&quot; of each channel. For example, your default public profile might say &quot;Hello, I'm Fred, and I like laughing&quot;. You may show your close friends a profile that adds &quot;and I also enjoy dwarf tossing&quot;.
+
+You always have a profile known as your &quot;default&quot; or &quot;public&quot; profile. This profile is always available to the general public and cannot be hidden (there may be rare exceptions on privately run or disconnected sites). You may, and probably should restrict the information you make available on your public profile.
+
+That said, if you want other friends to be able to find you, it helps to have the following information in your public profile...
+
+[ul][*]Your real name or at least a nickname everybody knows
+[*]A photo of you
+[*]Your location on the planet, at least to a country level.[/ul]
+
+In addition, if you'd like to meet people that share some general interests with you, please take a moment and add some &quot;Keywords&quot; to your profile. Such as &quot;music, linux, photography&quot; or whatever. You can add as many keywords as you like.
+
+To create an alternate profile, first go to [zrl=[baseurl]/settings/features]Settings &gt; Additional Features[/zrl] and enable &quot;Multiple Profiles&quot; there, otherwise you won't have the ability to use more than just your default profile.
+
+Then select &quot;Edit Profiles&quot; from the menu of your $Projectname site. You may edit an existing profile, change the profile photo, add things to a profile or create a new profile. You may also create a &quot;clone&quot; of an existing profile if you only wish to change a few items but don't wish to enter all the information again. To do that, click on the profile you want to clone and choose &quot;Clone this profile&quot; there.
+
+In the list of your profiles, you can also choose the contacts who can see a specific profile. Just click on &quot;Edit visibility&quot; next to the profile in question (only available for the profiles that are not your default profile) and then click on user images to add them to or remove them from the group of people who can see this profile.
+
+Once a profile has been selected, when the person views your profile, they will see the private profile you have assigned. If they are not authenticated, they will see your public profile.
+
+There is a setting which allows you to publish your profile to a directory and ensure that it can be found by others. You can change this setting on the &quot;Settings&quot; page.
+
+If you do not wish to be found be people unless you give them your channel address, you may leave your profile unpublished.
+
+[b]Keywords and Directory Search[/b]
+
+On the directory page, you may search for people with published profiles. Currently, only the name field and the keywords are searched. You may also include such keywords in your default profile - which may be used to search for common interests with other members. Keywords are used in the channel suggestion tool and although they aren't visible in the directory, they are shown if people visit your profile page.
+
+On your Connnections page and in the directory there is a link to &quot;Suggestions&quot; or &quot;Channel Suggestions&quot;, respectively. This will find channels who have matching and/or similar keywords. The more keywords you provide, the more relevant the search results that are returned. These are sorted by relevance.
+
+See Also
+
+[zrl=[baseurl]/help/AdvancedSearch]Advanced Searching[/zrl]
+
+[h3]Account Permission Roles[/h3]
+
+
+[h4]Social[/h4]
+
+[b]Mostly Public[/b]
+
+The channel is a typical social networking profile. By default posts and published items are public, but one can over-ride this when creating the item and restrict it. You are listed in the directory. Your online presence and connections are visible to others.
+
+
+[b]Restricted[/b]
+
+By default all posts and published items are sent to your 'Friends' privacy group and not made public. New friends are added to this privacy group. You can over-ride this and create a public post or published item if you desire. You are listed in the directory. Your online presence (for chat) and your connections (friends) are visible to your profile viewers.
+
+[b]Private[/b]
+
+By default all posts and published items are sent to your 'Friends' privacy group. New friends are added to this privacy group. You can over-ride this and create a public post or public item if you desire. You are NOT listed in the directory. Only your connections can see your other connections. Your online presence is hidden.
+
+
+[h4]Forum[/h4]
+
+[b]Mostly Public[/b]
+
+The channel is a typical forum. By default posts and published items are public. Members may post by @mention+ or wall-to-wall post. Posting photos and other published items is blocked. The channel is visible in the directory. Members are added automatically.
+
+
+[b]Restricted[/b]
+
+By default all posts and published items are sent to the channel's 'Friends' privacy group. New friends are added to this privacy group. Members may post by @mention+ or wall-to-wall post, but posts and replies may also be seen by other receipients of the top-level post who are not members. The channel is visible in the directory. Members must be manually added by the forum owner.
+
+[b]Private[/b]
+
+By default all posts and published items are sent to your 'Friends' privacy group. New friends are added to this privacy group. The owner can over-ride this and create a public post or public item if desired. Members cannot. You are NOT listed in the directory. Only your connections can see your other connections. Your online presence is hidden. Members must be manually added by the forum owner. Posting by @mention+ is disabled. Posts can only be made via wall-to-wall posts, and sent to members of the 'Friends' privacy group. They are not publicly visible.
+
+
+[h4]Feed[/h4]
+
+
+[b]Public[/b]
+
+Similiar to Social - Mostly Public, but tailored for RSS feed sources. Items may be freely republished and sourced. Online presence is meaningless, therefore hidden. New connections are automatically approved.
+
+
+[b]Restricted[/b]
+
+Not listed in directory. Online presence is meaningless, therefore hidden. Feed is published only to members of the 'Friends' privacy group. New connections are automatically added to this privacy group. Members must be manually approved by the channel owner.
+
+
+[h4]Special[/h4]
+
+[b]Celebrity/Soapbox[/b]
+
+Listed in directory. Communications are by default public. Online presence is hidden. No commenting or feedback of any form is allowed, though connections have the ability to "like" your profile.
+
+
+[b]Group Repository[/b]
+
+A public forum which allows members to post files/photos/webpages.
+
+
+[h4]Custom/Expert Mode[/h4]
+
+Set all the privacy and permissions manually to suit your specific needs.
+
+
+[h3]Channels[/h3]
+
+[h4]What are channels?[/h4]
+
+Channels are simply collections of content stored in one place. A channel can represent anything. It could represent you, a website, a forum, photo albums, anything. For most people, their first channel with be &quot;Me&quot;.
+
+The most important features for a channel that represents &quot;me&quot; are:
+[ul]
+[*]Secure and private &quot;spam free&quot; communications
+
+[*]Identity and &quot;single-signon&quot; across the entire network
+
+[*]Privacy controls and permissions which extend to the entire network
+
+[*]Directory services (like a phone book)
+[/ul]
+In short, a channel that represents yourself is &quot;me, on the internet&quot;.
+
+[h4]Creating channels[/h4]
+
+You will be required to create your first channel as part of the sign up process. You can also create additonal channels from the &quot;Select channel&quot; link.
+
+You will be asked to provide a channel name, and a short nick name. For a channel that represents yourself, it is a good idea to use your real name here to ensure your friends can find you, and connect to your channel. The short nickname will be used to generate a &quot;webbie&quot;. This is a bit like a username, and will look like an email address, taking the form nickname@domain. You should put a little thought into what you want to use here. Imagine somebody asking for your webbie and having to tell them it is &quot;llamas-are_kewl.123&quot;. &quot;llamasarecool&quot; would be a much better choice.
+
+Once you have created your channel, you will be taken to the settings page, where you can configure your channel, and set your default permissions.
+
+Once you have done this, your channel is ready to use. At [observer=1][observer.url][/observer][observer=0][baseurl]/channel/username[/observer] you will find your channel &quot;stream&quot;. This is where your recent activity will appear, in reverse chronological order. If you post in the box marked &quot;share&quot;, the entry will appear at the top of your stream. You will also find links to all the other communication areas for this channel here. The &quot;About&quot; tab contains your &quot;profile&quot;, the photos page contain photo albums, and the events page contains events share by both yourself and your contacts.
+
+[h4]The grid, permissions and delegation[/h4]
+
+The &quot;Grid&quot; page contains all recent posts from across $Projectname network, again in reverse chronologial order. The exact posts that appear here depend largely on your permissions. At their most permissive, you will receive posts from complete strangers. At the other end of the scale, you may see posts from only your friends - or if you're feeling really anti-social, only your own posts.
+
+As mentioned at the start, many other kinds of channel are possible, however, the creation procedure is the same. The difference between channels lies primarily in the permissions assigned. For example, a channel for sharing documents with colleagues at work would probably want more permissive settings for &quot;Can write to my &quot;public&quot; file storage&quot; than a personal account. For more information, see the [zrl=[baseurl]/help/roles]permissions section[/zrl].
+
+You can also delegate control of your channels' posts and connections, but not its configurations, to another channel. That is done by editing a connection and assigning it the permission to administer your channel's resources.
+
+[h3]Connecting To Channels[/h3]
+
+Connections in $Projectname can take on a great many different meanings. But let's keep it simple, you want to be friends with somebody like you are familiar with from social networking. How do you do it?
+
+First, you need to find some channels to connect to. There are two primary ways of doing this. Firstly, setting the &quot;Can send me their channel stream and posts&quot; permission to &quot;Anybody in this network&quot; will bring posts from complete strangers to your matrix. This will give you a lot of public content and should hopefully help you find interesting, entertaing people, forums, and channels.
+
+The next thing you can do is look at the Directory. The directory is available on every $Projectname website which means searching from your own site will bring in results from the entire network. You can search by name, interest, location and keyword. This is incomplete, so we'll improve this paragraph later.
+
+To connect with other $Projectname channels:
+
+Visit their profile by clicking their photograph in the directory, matrix, or comments, and it will open their channel home page in the channel viewer. At the left hand side of the screen, you will usually see a link called &quot;connect&quot;. Click it, and you're done. Depending on the settings of the channel you are connecting to, you may need to wait for them to approve your connection, but no further action is needed on your part. Once you've initiated the connection, you will be taken to the connection editor. This allows you to assign specific permissions for this channel. If you don't allow any permissions, communication will be very limited. There are some quick links which you can use to avoid setting individual permissions. To provide a social network environment, &quot;Full Sharing&quot; is recommended. You may review the settings that are applied with the quick links to ensure they are suitable for the channel you are connecting with and adjust if necessary. Then scroll to the bottom of the page and click &quot;Submit&quot;.
+
+You may also connect with any channel by visiting the &quot;Connections&quot; page of your site or the Directory and typing their &quot;webbie&quot; into the &quot;Add New Connection&quot; field. Use this method if somebody tells you their webbie and you wish to connect with them. A webbie looks like an email address; for example &quot;bob@example.com&quot;. The process is the same as connecting via the &quot;Connect&quot; button - you will then be taken to the connection editor to set permissions.
+
+[h4] Block/Ignore/Archive/Hide channels [/h4]
+
+Channels in your address book can have statuses such as [i]blocked[/i], [i]ignored[/i], [i]archived[/i] and [i]hidden[/i]. From your connections page you can see tabs that display the channels with those statuses. From your edit connection pages you can change the statuses of a channel.
+
+Here's their meaning:
+
+[b]Blocked:[/b] the channel can't read your items regardless of permissions, nor can it write to your channel.
+
+[b]Ignored:[/b] the channel can read your items if it has permission, but can't write to your channel.
+
+[b]Hidden:[/b] the channel does not show up in your profile's connections list, noone can see you're connected, but beware they may still show up to your other connections, for example in post replies.
+
+[b]Archived:[/b] if a channel can't be reached for 30 days, it is automatically marked as archived. This keeps all the data but stops polling the channel for new information and removes it from autocomplete. If later you learn the channel has come back online, you may manually unarchive it.
+
+[h4]Premium Channels[/h4]
+
+Some channels are designated &quot;Premium Channels&quot; and may require some action on your part before a connection can be established. The Connect button will for these channels will take you to a page which lists in detail what terms the channel owner has set. If the terms are accepted, the connection will then proceed normally. In some cases, such as with celebrities and world-reknowned publishers, this may involve payment. If you do not agree to the terms, the connection will not proceed, or it may proceed but with reduced permissions allowed on your interactions with that channel.
+
+[h3]Permissions[/h3]
+Permissions in $Projectname are more complete than you may be used to. This allows us to define more fine graded relationships than the black and white &quot;this person is my friend, so they can do everything&quot; or &quot;this person is not my friend, so they can't do anything&quot; permissions you may find elsewhere.
+
+[h4]Permission Roles[/h4]
+
+When you create a channel we allow you to select different 'roles' for that channel. These create an entire family of permissions and privacy settings that are appropriate for that role. Typical roles are "Social - mostly public", "Social - mostly private", "Forum - public" and many others. These bring a level of simplicity to managing permissions. Just choose a role and appropriate permissions are automatically applied. You can also choose 'Custom/Expert mode' and change any individual permission setting in any way you desire.
+
+
+[h4]Default Permission Limits[/h4]
+
+There are a large number of individual permissions. These control everything from the ability to view your stream to the ability to chat with you. Every permission has a limit. The scope of these permissions varies from &quot;Only me&quot; to &quot;Everybody on the internet&quot; - though some scopes may not be available for some permissions. The limit applies to any published thing you create which has no privacy or access control. For example if you publish a photo and didn't select a specific audience with permission to view it, we apply the limit. These limits apply to everything within that permission rule, so you cannot apply a limit to one photo. The limit applies to all your photos. If all your photos are visible to everybody on the internet and you reduce the limit only to friends, [b]all[/b] of your photos will now be visible only to friends.
+
+[h4]Access Control[/h4]
+
+Access Control is the preferred method of managing privacy in [i]most[/i] cases, rather than using permission limits. This creates lists of either connections or privacy groups (or both) and uses the access list to decide if a permission is allowed. An access list is attached to everything you publish. Unlike permission limits, if you change the access control list on a single photo, it doesn't affect any of your other photos. You can use privacy groups and a "default access control list" to create and automate the management of access control lists to provide any level of privacy you desire on anything you publish.
+
+We highly recommend that you use the "typical social network" settings when you create your first channel, as it allows others to communicate with you and help you out if you have difficulty. You will find that these settings allow you as much privacy as you desire - when you desire it; but also allow you to communicate in public if you choose to. You are free to use much more private settings once you have learned your way around.
+
+
+[dl terms="l"]
+[*= The scopes of permissions are:]
+[dl terms="i"]
+ [*= Nobody Except Yourself ] This is self explanatory. Only you will be allowed access.
+
+ [*= Only those you specifically allow ] By default, people you are not connected to, and all new contacts will have this permission denied. You will be able to make exceptions for individual channels on their contact edit screen.
+
+ [*= Anybody in your address book ] Anybody you do not know will have this permission denied, but anybody you accept as a contact will have this permission approved. This is the way most legacy platforms handle permissions.
+
+ [*= Anybody On This Hub ] Anybody with a channel on the same hub/website as you will have permission approved. Anybody who is registered at a different hub will have this permission denied.
+
+ [*= Anybody in this network ] Anybody in $Projectname will have this permission approved. Even complete strangers. However, anybody not logged in/authenticated will have this permission denied.
+
+ [*= Anybody authenticated ] This is similar to "anybody in this network" except that it can include anybody who can authenticate by any means - and therefore [i]may[/i] include visitors from other networks.
+
+ [*=Guest Access Token] This allows you to share a file, folder, photo, album, or channel with a specific person or group of people. They don't need to be Hubzilla members. You can set an expiration for the Access Token.
+
+ [*= Anybody on the internet ] Completely public. This permission will be approved for anybody at all.
+[/dl]
+[*= The individual permissions are:]
+[dl terms="i"]
+ [*= Can view my &quot;public&quot; stream and posts. ] This permision determines who can view your channel &quot;stream&quot; that is, the non-private posts that appear on the &quot;home&quot; tab when you're logged in.
+
+ [*= Can view my &quot;public&quot; channel profile. ] This permission determines who can view your channel's profile. This refers to the &quot;about&quot; tab
+
+ [*= Can view my &quot;public&quot; photo albums. ] This permission determines who can view your photo albums. Individual photographs may still be posted to a more private audience.
+
+ [*= Can view my &quot;public&quot; address book. ] This permission determines who can view your contacts. These are the connections displayed in the &quot;View connections&quot; section.
+
+ [*= Can view my &quot;public&quot; file storage. ] This permission determines who can view your public files stored in your cloud.
+
+ [*= Can view my &quot;public&quot; pages. ] This permission determines who can view your public web pages.
+
+ [*= Can send me their channel stream and posts. ] This permission determines whose posts you will view. If your channel is a personal channel (ie, you as a person), you would probably want to set this to &quot;anyone in my address book&quot; at a minimum. A personal notes channel would probably want to choose &quot;nobody except myself&quot;. Setting this to &quot;Anybody in the network&quot; will show you posts from complete strangers, which is a good form of discovery.
+
+ [*= Can post on my channel page (&quot;wall&quot;). ] This permission determines who can write to your wall when clicking through to your channel.
+
+ [*= Can comment on my posts. ] This permission determines who can comment on posts you create. Normally, you would want this to match your &quot;can view my public stream and posts&quot; permission
+
+ [*= Can send me private mail messages. ] This determines who can send you private messages (zotmail).
+
+ [*= Can post photos to my photo albums. ] This determines who can post photographs in your albums. This is very useful for forum-like channels where connections may not be connected to each other.
+
+ [*= Can forward to all my channel contacts via post tags. ] Using @- mentions will reproduce a copy of your post on the profile specified, as though you posted on the channel wall. This determines if people can post to your channel in this way.
+
+ [*= Can chat with me (when available). ] This determines who can join the public chat rooms created by your channel.
+
+ [*= Can write to my &quot;public&quot; file storage. ] This determines who can upload files to your public file storage, or 'cloud'.
+
+ [*= Can edit my &quot;public&quot; pages. ] This determines who can edit your webpages. This is useful for wikis or sites with multiple editors.
+
+ [*= Can administer my channel resources. ] This determines who can have full control of your channel. This should normally be set to &quot;nobody except myself&quot;.
+[/dl][/dl]
+[i]Note:[/i]
+Plugins/addons may provide special permission settings, so you may be offered additional permission settings beyond what is described here.
+
+If you have set any of these permissions to &quot;only those I specifically allow&quot;, you may specify indivudal permissions on the connnection edit screen.
+
+[h4]Affinity[/h4]
+
+The connection edit screen offers a slider to select a degree of friendship with the connnection (this tool is enabled through the &quot;Extra Features&quot; tab of your Settings page). Think of this as a measure of how much you like or dislike them. 1 is for people you like, whose posts you want to see all the time. 99 is for people you don't care for, and whose posts you might only wish to look at occasionally. Once you've assigned a value here, you can use the affinity tool on the matrix page to filter content based on this number.
+
+The slider on the matrix page has both a minimum and maximum value. Posts will only be shown from people who fall between this range. Affinity has no relation to permissions, and is only useful in conjunction with the affinity tool feature.
+
+[h3]Personal Cloud Storage[/h3]
+
+$Projectname provides an ability to store privately and/or share arbitrary files with friends.
+
+You may either upload files from your computer into your storage area, or copy them directly from the operating system using the WebDAV protocol.
+
+On many public servers there may be limits on disk usage.
+
+[h4]File Attachments[/h4]
+
+The quickest and easiest way to share files is through file attachments. In the row of icons below the status post editor is a tool to upload attachments. Click the tool, select a file and submit. After the file is uploaded, you will see an attachment code placed inside the text region. Do not edit this line or it may break the ability for your friends to see the attachment. You can use the post permissions dialogue box or privacy hashtags to restrict the visibility of the file - which will be set to match the permissions of the post your are sending.
+
+To delete attachments or change the permissions on the stored files, visit [observer=1][baseurl]/cloud/[observer.webname][/observer][observer=0][baseurl]/cloud/username replacing username with the nickname you provided during channel creation[/observer].
+
+[h4]Web Access[/h4]
+
+Your files are visible on the web at the location [observer=1][baseurl]/cloud/[observer.webname][/observer][observer=0][baseurl]/cloud/username[/observer] to anybody who is allowed to view them. If the viewer has sufficient privileges, they may also have the ability to create new files and folders/directories.
+
+[h4]WebDAV access[/h4]
+
+See: [zrl=[baseurl]/help/member/member_guide#Cloud_Desktop_Clients]Cloud Desktop Clients[/zrl]
+
+[h4]Permissions[/h4]
+
+When using WebDAV, the file is created with your channel's default file permissions and this cannot be changed from within the operating system. It also may not be as restrictive as you would like. What we've found is that the preferred method of making files private is to first create folders or directories; then visit [observer=1][baseurl]/cloud/[observer.webname][/observer][observer=0][baseurl]/cloud/username[/observer] select the directory and change the permissions. Do this before you put anything into the directory. The directory permissions take precedence so you can then put files or other folders into that container and they will be protected from unwanted viewers by the directory permissions. It is common for folks to create a &quot;personal&quot; or &quot;private&quot; folder which is restricted to themselves. You can use this as a personal cloud to store anything from anywhere on the web or any computer and it is protected from others. You might also create folders for &quot;family&quot; and &quot;friends&quot; with permission granted to appropriate privacy groups.
+
+[h4]Cloud Desktop Clients - Windows[/h4]
+
+RedDav using Windows 7 graphical user interface wizard:
+1. Left-click the Start-button to open the start menu.
+2. Right-click the My computer icon to access its menu.
+3. Left-click Map network drive... to open the connection dialog wizard.
+4. Type #^[url=https://example.net/dav/your_channel_name]https://example.net/dav/your_channel_name[/url] in the textbox and click the Complete button where &quot;example.net&quot; is the URL of your hub.
+5. Type your Hubzilla account's user name. IMPORTANT - NO at-sign or domain name.
+6. Type your Hubzilla password
+
+[h4]Cloud Desktop Clients - Linux[/h4]
+
+[h5]Mount as a filesystem[/h5]
+
+[b]Mounting As A Filesystem[/b]
+
+To install your cloud directory as a filesystem, you first need davfs2 installed. 99% of the time, this will be included in your distributions repositories. In Debian
+
+[code]apt-get install davfs2[/code]
+
+If you want to let normal users mount the filesystem
+
+[code] dpkg-reconfigure davfs2[/code]
+
+and select &quot;yes&quot; at the prompt.
+
+Now you need to add any user you want to be able to mount dav to the davfs2 group
+
+[code]usermod -aG davfs2 &lt;DesktopUser&gt;[/code]
+
+[b]Note:[/b] on some systems the user group may be different, i.e. - "network"
+on Arch Linux. If in doubt, check the davfs documentation for your
+particular OS.
+
+Edit /etc/fstab
+
+[code]nano /etc/fstab[/code]
+
+ to include your cloud directory by adding
+
+[code]
+[baseurl]/dav/ /mount/point davfs user,noauto,uid=&lt;DesktopUser&gt;,file_mode=600,dir_mode=700 0 1
+[/code]
+
+Where [baseurl] is the URL of your hub, /mount/point is the location you want to mount the cloud, and &lt;DesktopUser&gt; is the user you log in to one your computer. Note that if you are mounting as a normal user (not root) the mount point must be in your home directory.
+
+For example, if I wanted to mount my cloud to a directory called 'cloud' in my home directory, and my username was bob, my fstab would be
+
+[code][baseurl]/dav/ /home/bob/cloud davfs user,noauto,uid=bob,file_mode=600,dir_mode=700 0 1[/code]
+
+Now, create the mount point.
+
+[code]mkdir /home/bob/cloud[/code]
+
+and also create a directory file to store your credentials
+
+[code]mkdir /home/bob/.davfs2[/code]
+
+Create a file called 'secrets'
+
+[code]nano /home/bob/.davfs2/secrets[/code]
+
+and add your cloud login credentials
+
+[code]
+[baseurl]/dav &lt;username&gt; &lt;password&gt;
+[/code]
+
+Where &lt;username&gt; and &lt;password&gt; are the username and password [i]for your hub[/i].
+
+Don't let this file be writeable by anyone who doesn't need it with
+
+[code]chmod 600 /home/bob/.davfs2/secrets[/code]
+
+Finally, mount the drive.
+
+[code]mount [baseurl]/dav[/code]
+
+You can now find your cloud at /home/bob/cloud and use it as though it were part of your local filesystem - even if the applications you are using have no dav support themselves.
+
+[b]Troubleshooting[/b]
+
+With some webservers and certain configurations, you may find davfs2 creating files with 0 bytes file size where other clients work just fine. This is generally caused by cache and locks. If you are affected by this issue, you need to edit your davfs2 configuration.
+
+[code]nano /etc/davfs2/davfs2.conf[/code]
+
+Your distribution will provide a sample configuration, and this file should already exist, however, most of it will be commented out with a # at the beginning of the line.
+
+First step is to remove locks.
+
+Edit the use_locks line so it reads [code]use_locks 0[/code].
+
+Unmount your file system, remount your file system, and try copying over a file from the command line. Note you should copy a new file, and not overwrite an old one for this test. Leave it a minute or two then do [code]ls -l -h[/code] and check the file size of your new file is still greater than 0 bytes. If it is, stop there, and do nothing else.
+
+If that still doesn't work, disable the cache. Note that this has a performance impact so should only be done if disabling locks didn't solve your problem. Edit the cache_size and set it to [code]cache_size 0[/code] and also set file_refresh to [code]file_refresh 0[/code]. Unmount your filesystem, remount your file system, and test it again.
+
+If it [i]still[/i] doesn't work, there is one more thing you can try. (This one is caused by a bug in older versions of dav2fs itself, so updating to a new version may also help). Enable weak etag dropping by setting [code]drop_weak_etags 1[/code]. Unmount and remount your filesystem to apply the changes.
+
+
+[h5]Dolphin[/h5]
+Visit webdavs://example.com/dav where &quot;example.com&quot; is the URL of your hub.
+
+When prompted for a username and password, enter your channel name (the first part of your webbie - no @ or domain name) and password for your normal account.
+
+Note, if you are already logged in to the web interface via Konqueror, you will not be prompted for further authentication.
+
+[h5]Konqueror[/h5]
+
+Simply visit webdavs://example.com/dav after logging in to your hub, where &quot;example.com&quot; is the URL of your hub.
+
+No further authentication is required if you are logged in to your hub in the normal manner.
+
+Additionally, if one has authenticated at a different hub during their normal browser session, your identity will be passed to the cloud for these hubs too - meaning you can access any private files on any server, as long as you have permissions to see them, as long as you have visited that site earlier in your session.
+
+This functionality is normally restricted to the web interface, and is not available to any desktop software other than KDE.
+
+[h5]Nautilus[/h5]
+
+1. Open a File browsing window (that's Nautilus)
+2. Select File &gt; Connect to server from the menu
+3. Type davs://&lt;domain_name&gt;/dav/&lt;your_channelname&gt; and click Connect
+4. You will be prompted for your channel name (same as above) and password
+5. Your personal DAV directory will be shown in the window
+
+[h5]Nemo[/h5]
+
+For (file browser) Nemo 1.8.2 under Linux Mint 15, Cinnamon 1.8.8. Nemo ist the standard file browser there.
+
+1st way
+type &quot;davs://&lt;domain_name&gt;/dav/&lt;your_channelname&gt;&quot; in the address bar.
+
+2nd way
+Menu &gt; file &gt; connect to server
+Fill the dialog
+- Server: hubzilla_domain_name
+- Type: Secure WebDAV (https)
+- Folder: /dav
+- Username: yourchannelname
+- Password: yourpassword
+
+Once open you can set a bookmark.
+
+[h5]Server Notes[/h5]
+
+Note: There have been reported issues with clients that use "chunked transfer encoding", which includes Apple iOS services, and also the "AnyClient" and "CyberDuck" tools. These work fine for downloads, but uploads often end up with files of zero size. This is caused by an incorrect implemention of chunked encoding in some current FCGI (fast-cgi) implementations. Apache running with PHP as a module does not have these issues, but when running under FCGI you may need to use alternative clients or use the web uploader. At the time of this writing the issue has been open and no updates provided for at least a year. If you encounter zero size files with other clients, please check the client notes; as there are occasional configuration issues which can also produce these symptoms.
+
+[h3]Remove Channel or Account[/h3]
+
+[h4]Remove Channel[/h4]
+
+Go to the bottom of your channel settings page or visit the URL:
+
+ [baseurl]/removeme
+
+You will need to confirm your password and the channel you are currently logged into will be removed.
+
+[hl][i][b]This is irreversible.[/b][/i][/hl]
+
+If you have identity clones on other hubs this only removes by default the channel instance which exists on this hub.
+
+[h4]Remove Account[/h4]
+
+Go to the bottom of your account settings page or visit the URL:
+
+ [baseurl]/removeaccount
+
+You will need to confirm your password and the account you are currently logged into will be removed.
+
+[hl][i][b]This is irreversible.[/b][/i][/hl]
+
+All your channels will be deleted. If you have identity clones on other hubs this only removes by default the channels instances which exists on this hub.
diff --git a/doc/permissions.bb b/doc/permissions.bb
index 0721c763d..64690d608 100644
--- a/doc/permissions.bb
+++ b/doc/permissions.bb
@@ -32,6 +32,8 @@ We highly recommend that you use the "typical social network" settings when you
[*= Anybody authenticated ] This is similar to "anybody in this network" except that it can include anybody who can authenticate by any means - and therefore [i]may[/i] include visitors from other networks.
+ [*=Guest Access Token] This allows you to share a file, folder, photo, album, or channel with a specific person or group of people. They don't need to be Hubzilla members. You can set an expiration for the Access Token.
+
[*= Anybody on the internet ] Completely public. This permission will be approved for anybody at all.
[/dl]
[*= The individual permissions are:]
diff --git a/doc/project/governance.bb b/doc/project/governance.bb
index e13f6218c..4c1538b4b 100644
--- a/doc/project/governance.bb
+++ b/doc/project/governance.bb
@@ -2,25 +2,9 @@
Governance relates to the management of a project and particularly how this relates to conflict resolution.
-This project uses a dual-governance model.
-
-The project as a whole and the repository were created initially by Mike Macgirvin; who controls the project copyright, and the project license, and manages the project as a Self Appointed Benevolent Dictator for Life. He holds veto power over any project proposal or decision and his word is final.
-
-That said, Mike has no interest in running the day to day activities of the project and influencing its direction, other than to protect his own work from sabotage.
-
-The internal project structure contains multiple "configurations" known as 'basic', 'standard', and 'pro'. Mike's veto power extends to any proposal or decision which he feels might adversely affect the 'pro' configuration.
-
-The 'basic and 'standard' configurations are controlled completely by the community. If the proposal or decision is crafted in such a way that its effects are limited to these configurations, Mike will consider relinquishing his power of veto and convert it to a normal community vote.
-
-Mario Vavti has done an incredible amount of work on the usability and theming of the project and holds veto power over any proposal or decision which might impact usability and "look and feel"; and his decision is also final.
-
-Mario's veto power is likewise restricted to anything using the standard project 'theme'. If a new theme is created and an otherwise vetoed decision is implemented entirely in this different theme and has no impact on the standard project theme, his veto [b]may[/b] also be turned into a normal community vote.
-
-This ability to work around a veto is at the discretion of Mike and Mario. They [b]may[/b] choose to relinquish their veto if the scope of the work is limited as described above, and in most circumstances they will leave the decision to the community. They are not obligated to do so.
-
[h3]Community Governance[/h3]
-Beyond those two special cases, the project is maintained and decisions made by the 'community'. The governance structure is still evolving. Until the structure is finalised, decisions are made in the following order:
+The project is maintained and decisions made by the 'community'. The governance structure is still evolving. Until the structure is finalised, decisions are made in the following order:
[ol]
[*] Lazy Consensus
@@ -29,7 +13,7 @@ If a project proposal is made to one of the community governance forums and ther
[*] Veto
-If a proposal is vetoed, it is not necessarily the final word. See above on how to convert a veto into a normal community vote. This can be done by framing the proposal so that it does not impact the 'pro' configuration or the standard theme.
+Senior developers with a significant history of project commits may veto any decision. The decision may not proceed until the veto is removed or an alternative proposal is presented.
[*] Community Vote
diff --git a/doc/project/history.md b/doc/project/history.md
deleted file mode 100644
index 99cbfec7a..000000000
--- a/doc/project/history.md
+++ /dev/null
@@ -1,74 +0,0 @@
-Hubzilla History
-================
-
-Hubzilla is a community developed open source project based on work introduced in Friendica by the Friendica community and which previously was named Redmatrix. The core design, the project mission, and software base itself were created/written primarily by Mike Macgirvin and represent the culmination of over a decade of software design using variations of this platform and an evolving vision of the role of communication software in our lives. Many others have contributed to this work, both conceptually and in terms of actual code (far too many to list individually).
-
-##Mike Macgirvin -- Biography
-
-Mike Macgirvin is an American software engineer now living in Australia. He spent his early adult years designing and repairing semiconductor fabrication equipment for a number of companies as a self-described "machine wizard". In 1985 he became a research engineer at Stanford University for the Gravity Probe-B space mission and soon became a Unix systems administrator writing communication software and utilities; and becoming an expert in emerging internet technologies such as the now ubiquitous "World Wide Web". He authored an email "client" called "ML" which pioneered some advanced concepts in encryption, the ability to filter message streams into different "views", and multi-protocol support; and was an active proponent of and participant in the open source software *movement*. In 1996 he went to Netscape Communications to become tech lead on their Messaging Server and integrate this with Collabra (groupware) into a comprehensive communications server package. He stayed on after Netscape was acquired by America Online and was tech manager of the Groups@AOL project until 2001.
-
-During a layoff round, Mike was let go from America Online in August 2001 and purchased a music store in Mountain View, California later to be known as "Sonica Music Company". Opening a retail store for non-essential goods at the beginning of a prolonged economic downturn was in retrospect probably not the wisest career move. Sonica eventually folded; in late 2006. Mike returned to working on software and systems support full-time and was employed briefly at Symantec before moving to Australia in early 2007. He currently lives on a farm "out in the middle of nowhere" and is employed as a Computer Systems Officer at the University of Wollongong.
-
-
-##Hubzilla - The Early Years
-
-The software which went into creating Hubzilla has been through several distinct historical phases. It began in 2003 when Mike Macgirvin was looking for a content management system to power the website for his music store and found the available solutions to be lacking in various respects. The project was born as the "PurpleHaze weblog" under the nom de plume "Nerdware Communications". It was a multi-user PHP/MySQL CMS which provided blogs, forums, photo albums, events and more. Initially it provided the basis for a social community and shopping for customers of the store, but was also linked to Mike's personal weblog running on another domain. The distinguishing characteristic of this software was the ability for so-called "normal users" to re-assemble the components and choose different content feeds - and in essence create their own personal "multi-user CMS" as a view. Their custom view was able to communicate with anybody else that used the system, but could be partitioned so that adult sites and motorcycle enthusiast sites would not be visible to each other and not clash (or in this case Mike's personal website and the music store website). This software was developed primarily from 2003 until 2008.
-
-In 2006 this software was used as the prototype for Symantec's "safeweb" reputation and community site. It was developed and enhanced until about 2008. A rewrite took place in 2008 named "Reflection" but work stagnated as the community dwindled. The need for content management systems and communications software dropped dramatically during this time as humans flocked to the new social aggregrators - Facebook and Twitter.
-
-
-##Mistpark/Friendica
-
-In early 2010, Mike left Facebook, concerned at the company's increasing hold and control of personal information. In his words "Companies die. We watched it happen in the dot-com years. When they do, their databases are sold to the highest bidder.". Mike used some remnants of the old CMS project to create a decentralised social communications platform. This was launched in July 2010 as "Mistpark". The name was chosen as a tribute to his new home in the Southern Highlands of Australia. The key innovation in this project was the ability to authenticate remotely and invisibly to other decentralised instances of the software so to allow remote viewing of private photos and provide "wall-to-wall" posting across website instances. The lack of simple remote identity *provenance* was a serious limitation of other decentralised communication protocols.
-
-In late 2010, the name was changed to "Friendika". The name Friendika had some symbolic issues, since the suffix was common with "swastika" and "Amerika", both having negative connotations, however the dot-com domain was available. Friendica was in fact the first choice but the 'friendica.com' domain name was already registered. It became available a year later and the project was renamed to Friendica in late 2011.
-
-Soon after version 1 was released in July 2010 - providing basic social communications, the software also took on a new role - cross-service federation; which was first introduced in August and September 2010. Federation allowed the software to "behave as" a StatusNet site and friends and messages could communicate to the other service from their own platforms. It was also hoped to provide federation with Diaspora - a project with similar scope being developed in secret in New York and first released in November of that year. Over the course of the next year, the federation ability was extended to provide integrated communications from RSS feeds, to and from email, StatusNet, Facebook, Twitter, and the emerging Diaspora project. The software provided a single "view" of your entire social space no matter what provider you or your friends used. StatusNet and Diaspora were supported natively so that one account could access any of these services. Facebook and Twitter used "API federation" which required the person to have an account on those services with which to link.
-
-By July 2012, Twitter and Facebook had both changed their terms of service and essentially outlawed "API federation" in the way Friendica was using it. Diaspora announced they were changing their protocol and would not maintain compatibility nor provide any warning when compatibility would break (or documentation on the proposed changes). The creator of StatusNet was also leaving his project to create something new (pump.io). As the software's primary purpose by this time was "federation of different social services into one interface", this created a bit of a crisis. The federated social web was crumbling. Also of concern was that independent and decentralised social websites shut down frequently, requiring all their members to start over again on another site. Often the effort involved to do this seemed daunting - and many people ran back to the relative safety of the large corporate providers - Facebook, Twitter, and now Google+.
-
-Mike realised he did not want to be held hostage to the decisions that other projects and companies and independent websites make. Friendica could operate on its own without attaching to these other networks, but its vision and implementation of a federated social world depended on federation with others for its project identity - so this created an identity crisis.
-
-Mike had been working on this project for some time and there were a number of things which needed re-writing, including the base communication protocol which Friendica used (DFRN or the "Distributed Friends and Relations Network" protocol). These ideas were starting to emerge as a different method of communication he called "zot". Zot began as a way to create a common language for federated websites, but there was no interest in this ability and as mentioned, the federated web was crumbling. The first version was soon scrapped and zot was re-designed and re-ignited as a streamlined communication protocol which was location-independent; e.g. not tied to any website. This would allow people to carry on unaffected if their website operator shut down temporarily or permanently. They wouldn't have to make friends all over again, and permissions of everything on the system wouldn't have to be changed to allow bob@site1 to see something that was private to him, even though he was now bob@site2. This was a serious problem with decentralisation. People moved and their online identities were lost and had to be re-created from scratch and existing relationships destroyed and had to be created all over again.
-
-
-##Redmatrix
-
-In July 2012, Mike left the Friendica project and began development of "zot" and a new base project called "red" in his somewhat elusive *spare time*. Red is Spanish for "network". It wasn't really a "social network" and especially not a "federated social network". It was just Red (technically "la red"), or "the network". Work began by removing all the "federation" components and going back to basics - communication and remote authentication. It was a major re-write and took roughly six months before even basic communication was re-established. It was also no longer compatible with Friendica - which had been given to the "Friendica community" and by this time (December 2012) was developing separately on its own track.
-
-It became clear during this time that the single most compelling feature of the project wasn't the social network at all, but the authentication layer and decentralised access control mechanisms. Combined with zot's location independence it created a new model for software which had never existed previously - decentralised identity-aware web publishing and single sign-on to any compatible provider across the web. These weren't *evolutionary*, they were **revolutionary**. One of the biggest flaws of the modern web is the reliance on different passwords for every service you use, or reliance on a single provider if you were to tie them to - say your Facebook login. Facebook can remove your account at any time. Gone. If you rely on their authentication for all your websites, your entire online identity - now gone. This is also what was missing from Friendica - a compelling software feature which could stand on its own, without requiring a social network and especially without requiring a federated social network with all the mentioned external dependencies.
-
-An early visitor to the project noted that he had some difficulty finding the project on Google because of the choice of name - "red". Yes, this was a poor decision in retrospect. We were buried on page 23,712 of the search results. The concept that was emerging around this identity-aware publishing was that of "a matrix of inter-connected thought streams", since we didn't have a concept of "people" and "friends". All were just connected "channels" with different ways to connect. So "Redmatrix" was chosen to give it a searchable name. It had nothing to do with the Matrix film and red and blue pills, though that is frequently cited (erronously); and in fact isn't a bad analogy.
-
-The concept of identity-aware content was alien to anything that existed previously on the web, so to make it useful we had to provide the ability to use it for content. It needed content publishing tools. This brought back concepts from the old "Content Management System" on which the software was originally based. To get it up and running quickly we created a markup language for webpages called "Comanche" which let you describe a page in high-level terms based on bbcode tags. We also added WebDAV so you could put decentralised access control on files and drag/drop from your operating system. So now you could have private photos, webpages, files, events, conversations, chatrooms - and they are visible to those you choose - no matter what site they use. All they need is zot. And your viewers could move to another site or just pop up at a different site any time they want and we don't care. And it **also** had a built-in social network; with lots of additional privacy and encryption features which were added even before the Snowden revelations gave them added urgency.
-
-Over time a few federation components re-emerged. The ability to view RSS feeds was important to many people. Diaspora never really managed to re-write their protocol, so that was re-implemented and allowed Redmatrix to connect with Diaspora and Friendica again (Friendica still had their Diaspora protocol intact, so this was the most common language now remaining on the free web - despite its faults). Diaspora communications aren't able to make use of the advanced identity features, but they work for basic communications.
-
-
-##Hubzilla
-
-The Redmatrix project reached a point of stagnation in early 2015 as network growth leveled and active interest in the project declined. Mike met with several external high tech developers and innovators in a round of discussions that were called "Zotopia" in early 2015 to perform an independent review of the project and try to identify what had gone wrong and plan a route forward. The basic consensus is that the project suffered from bad marketing decisions which were compounded by mixed messages about the project goals and target audience. A "rival" project (Diaspora) was marketing itself as a Facebook competitor, but after some long discussions it was determined that Redmatrix wasn't a Facebook competitor at all, and too much emphasis was being placed on the "social network" and "anti-Facebook" features. It was a novel decentralisation platform with distributed identity and permissions, and as was pointed out, the "end user" was the wrong target market. These marketing mistakes were now identified with the project name and random sampling of various "customers" showed that none of them really had a clue about the software goals or target market segment. The mixed messages were associated with the brand identity and this was a problem.
-
-The Redmatrix community held a vote and the project was renamed "Hubzilla", with a renewed identity and focus - to provide software for creating and ultimately linking together unrelated community websites or "hubs" into a global community. This is in fact what we were building all along, but didn't fully recognise it. The target audience for this software as it turns out is not the members or end users, but software integrators and digital community architects and builders. These in turn will be responsible for marketing their own product (their respective online communities) to end-users or members. The software solves a real world need of linking isolated and "walled garden" community sites together into a larger cooperative. The transition from Redmatrix to Hubzilla was complex and has taken several months as we consolidated the marketing and media assets to deliver a consistent message. It is still ongoing at this time, and should be completed in Q4 2015.
-
-Mike stepped down as active coordinator for the project in early 2015 and turned management over to the community. He remains active as a Hubzilla developer.
-
-##And Then...
-
-In 2016, the project was re-architected to support multiple server "roles". These correspond to sub-projects which can be isolated from each other in terms of supported feature sets, but all use and support the same code-base and developers are able to work together on common features and goals. The roles primarily differ in target audience, project [governance](help/project/governance) and decision making structures, and this results in slightly different features and idealogy. They all share a common code repository.
-
-Those roles are:
-
-### Basic
-
-Entry level server. Supported by and governed by the Hubzilla community. Most advanced or complex features have been stripped away to ease federation with external services. It is best suited as a FOSS social network tool.
-
-### Standard
-
-The standard Hubzilla server. This provides a wide range of useful features and is supported by and governed by the Hubzilla community. It is best suited as an open source community and cloud server.
-
-### Pro
-
-This is a specially crafted server with a unique feature set. It is supported by and governed by Mike Macgirvin dba "Zotlabs". Federation with external services has been stripped away in order to support a wide range of more technically advanced and complex features; and also includes features and modes which may not have the support or backing of the Hubzilla open source community. It is best suited for business and workplace applications.
-
-#include doc/macros/main_footer.bb;
diff --git a/doc/project/toc.html b/doc/project/toc.html
index b9489de3d..e264e014d 100644
--- a/doc/project/toc.html
+++ b/doc/project/toc.html
@@ -1,6 +1,5 @@
<h3>Project Information</h3>
<ul>
<li><a href="help/project/governance">Project Governance</a></li>
-<li><a href="help/project/history">Project History</a></li>
<li><a href="help/project/versions">Versions and Versioning</a></li>
</ul>
diff --git a/doc/sv/main.bb b/doc/sv/main.bb
index 27a7a742e..1c6ad3f63 100644
--- a/doc/sv/main.bb
+++ b/doc/sv/main.bb
@@ -43,7 +43,6 @@ Zot är en fantastisk ny kommunikationsprotokoll uppfunnit speciellt för $Proje
[zrl=[baseurl]/help/faq_admins]FAQ For Admins[/zrl]
[h3]Teknisk dokumentation[/h3]
-[zrl=[baseurl]/help/project/history]$Projectname history[/zrl]
[zrl=[baseurl]/help/Zot---A-High-Level-Overview]A high level overview of Zot[/zrl]
[zrl=[baseurl]/help/zot]An introduction to Zot[/zrl]
[zrl=[baseurl]/help/zot_structures]Zot Stuctures[/zrl]
diff --git a/doc/toc.html b/doc/toc.html
index ac21959cf..272f43c7e 100644
--- a/doc/toc.html
+++ b/doc/toc.html
@@ -1,6 +1,94 @@
-<ul>
-<li><a href="help/general">Project/Site Information</a></li>
-<li><a href="help/members">For Members</a></li>
-<li><a href="help/admins">For Administrators</a></li>
-<li><a href="help/develop">For Developers</a></li>
-</ul>
+<div class="" id="accordion">
+ <div class="panel">
+ <div class="">
+ <h3 class="panel-title">
+ About
+ </h3>
+ </div>
+ <div id="about" class="panel-collapse collapse in">
+ <ul class="list-group">
+ <li class="doco-list-group-item"><a href="/help/about/about_hubzilla">About Hubzilla</a></li>
+ <li class="doco-list-group-item"><a href="/help/about/hubzilla_project">Hubzilla project</a></li>
+ <li class="doco-list-group-item"><a href="/help/about/about_hub">About this hub</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="panel">
+ <div class="">
+ <h3 class="panel-title">
+ Members
+ </h3>
+ </div>
+ <div id="members" class="panel-collapse collapse in">
+ <ul class="list-group">
+ <li class="doco-list-group-item"><a href="/help/member/member_guide">Guide</a></li>
+ <li class="doco-list-group-item"><a href="/help/member/member_faq">FAQ</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="panel">
+ <div class="">
+ <h3 class="panel-title">
+ Administrators
+ </h3>
+ </div>
+ <div id="administrators" class="panel-collapse collapse in">
+ <ul class="list-group">
+ <li class="doco-list-group-item"><a href="/help/admin/administrator_guide">Guide</a></li>
+ <li class="doco-list-group-item"><a href="/help/admin/hub_snapshots">Hub Snapshots</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="panel">
+ <div class="">
+ <h3 class="panel-title">
+ Developers
+ </h3>
+ </div>
+ <div id="developers" class="panel-collapse collapse in">
+ <ul class="list-group">
+ <li class="doco-list-group-item"><a href="/help/developer/developer_guide">Guide</a></li>
+ <li class="doco-list-group-item"><a href="/help/developer/api_zot">Zot Protocol and API</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="panel">
+ <div class="">
+ <h3 class="panel-title">
+ Tutorials
+ </h3>
+ </div>
+ <div id="tutorials" class="panel-collapse collapse in">
+ <ul class="list-group">
+ <li class="doco-list-group-item"><a href="/help/tutorials/personal_channel">Personal Channel</a></li>
+ </ul>
+ </div>
+ </div>
+</div>
+<script>
+
+ // Generate the table of contents in the side nav menu (see view/tpl/help.tpl)
+ $(document).ready(function () {
+ $(".panel-collapse.in").find('a').each(function(){
+ window.console.log($(this).attr('href'));
+ var url = document.createElement('a');
+ url.href = window.location;
+ var pageName = url.href.split('/').pop().split('#').shift();
+ window.console.log('pageName: ' + pageName);
+ var linkName = $(this).attr('href').split('/').pop();
+ window.console.log('linkName: ' + linkName);
+ if(pageName === linkName) {
+ var tocUl = $(this).closest('li').append('<ul>').find('ul');
+ tocUl.removeClass(); // Classes are automatically added to <ul> elements by something else
+ tocUl.toc({content: "#doco-content", headings: "h3"});
+ tocUl.addClass('toc-content sub-menu');
+ tocUl.attr('id', 'doco-side-toc');
+
+ }
+ });
+
+ $(document.body).trigger("sticky_kit:recalc");
+
+ });
+
+</script>
diff --git a/doc/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.png b/doc/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.png
new file mode 100644
index 000000000..d5cf1093f
--- /dev/null
+++ b/doc/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.png
Binary files differ
diff --git a/doc/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.png b/doc/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.png
new file mode 100644
index 000000000..d613925aa
--- /dev/null
+++ b/doc/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.png
Binary files differ
diff --git a/doc/tutorials/assets/2243e48ccea25bd907cce3dbd6fc9f7cd832a4c91a4c5dd294b7b219e7d8.png b/doc/tutorials/assets/2243e48ccea25bd907cce3dbd6fc9f7cd832a4c91a4c5dd294b7b219e7d8.png
new file mode 100644
index 000000000..c403bf806
--- /dev/null
+++ b/doc/tutorials/assets/2243e48ccea25bd907cce3dbd6fc9f7cd832a4c91a4c5dd294b7b219e7d8.png
Binary files differ
diff --git a/doc/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.png b/doc/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.png
new file mode 100644
index 000000000..ca8ba6fb9
--- /dev/null
+++ b/doc/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.png
Binary files differ
diff --git a/doc/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.png b/doc/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.png
new file mode 100644
index 000000000..0da2d96e2
--- /dev/null
+++ b/doc/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.png
Binary files differ
diff --git a/doc/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.png b/doc/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.png
new file mode 100644
index 000000000..2a209b2be
--- /dev/null
+++ b/doc/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.png
Binary files differ
diff --git a/doc/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.png b/doc/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.png
new file mode 100644
index 000000000..f992672b0
--- /dev/null
+++ b/doc/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.png
Binary files differ
diff --git a/doc/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.png b/doc/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.png
new file mode 100644
index 000000000..b656192dc
--- /dev/null
+++ b/doc/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.png
Binary files differ
diff --git a/doc/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.png b/doc/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.png
new file mode 100644
index 000000000..6129195b6
--- /dev/null
+++ b/doc/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.png
Binary files differ
diff --git a/doc/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.png b/doc/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.png
new file mode 100644
index 000000000..923403fe9
--- /dev/null
+++ b/doc/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.png
Binary files differ
diff --git a/doc/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.png b/doc/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.png
new file mode 100644
index 000000000..f158ad5d9
--- /dev/null
+++ b/doc/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.png
Binary files differ
diff --git a/doc/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.png b/doc/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.png
new file mode 100644
index 000000000..edc8b01cc
--- /dev/null
+++ b/doc/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.png
Binary files differ
diff --git a/doc/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.png b/doc/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.png
new file mode 100644
index 000000000..5b259058b
--- /dev/null
+++ b/doc/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.png
Binary files differ
diff --git a/doc/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.png b/doc/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.png
new file mode 100644
index 000000000..c03ffd18d
--- /dev/null
+++ b/doc/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.png
Binary files differ
diff --git a/doc/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.png b/doc/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.png
new file mode 100644
index 000000000..65d4c5f0a
--- /dev/null
+++ b/doc/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.png
Binary files differ
diff --git a/doc/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.png b/doc/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.png
new file mode 100644
index 000000000..45609a7bb
--- /dev/null
+++ b/doc/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.png
Binary files differ
diff --git a/doc/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.png b/doc/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.png
new file mode 100644
index 000000000..d239d6965
--- /dev/null
+++ b/doc/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.png
Binary files differ
diff --git a/doc/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.png b/doc/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.png
new file mode 100644
index 000000000..45ed64d00
--- /dev/null
+++ b/doc/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.png
Binary files differ
diff --git a/doc/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.png b/doc/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.png
new file mode 100644
index 000000000..fcaed8bef
--- /dev/null
+++ b/doc/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.png
Binary files differ
diff --git a/doc/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.png b/doc/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.png
new file mode 100644
index 000000000..0ccfc8995
--- /dev/null
+++ b/doc/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.png
Binary files differ
diff --git a/doc/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.png b/doc/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.png
new file mode 100644
index 000000000..1cb4d2d22
--- /dev/null
+++ b/doc/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.png
Binary files differ
diff --git a/doc/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.png b/doc/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.png
new file mode 100644
index 000000000..22e4cb5d5
--- /dev/null
+++ b/doc/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.png
Binary files differ
diff --git a/doc/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.png b/doc/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.png
new file mode 100644
index 000000000..5674f5207
--- /dev/null
+++ b/doc/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.png
Binary files differ
diff --git a/doc/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.png b/doc/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.png
new file mode 100644
index 000000000..e6b4a9974
--- /dev/null
+++ b/doc/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.png
Binary files differ
diff --git a/doc/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.png b/doc/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.png
new file mode 100644
index 000000000..8de042ae4
--- /dev/null
+++ b/doc/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.png
Binary files differ
diff --git a/doc/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.png b/doc/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.png
new file mode 100644
index 000000000..cec391fb4
--- /dev/null
+++ b/doc/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.png
Binary files differ
diff --git a/doc/tutorials/personal_channel.html b/doc/tutorials/personal_channel.html
new file mode 100644
index 000000000..f2ad87077
--- /dev/null
+++ b/doc/tutorials/personal_channel.html
@@ -0,0 +1,163 @@
+
+<p>This tutorial is intended to be followed in sequence as if you were setting up a
+channel for the first time. It introduces some of the tools and features related
+to a personal channel in a natural way.</p>
+
+<h3 id="Create_a_new_channel">Create a new channel</h3>
+
+<p>When you log in for the first time after registering, you must create a channel.
+(Alternatively you can load https://grid.reticu.li/new_channel)</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.png" alt="image"></p>
+
+<p>Enter your name and a nickname for the channel address, and select a "role".
+Typically if this is a personal channel that represents you, select a <strong>Social</strong> role
+with a level of default privacy that you are comfortable with. If you are unsure,
+select <strong>Social - Restricted</strong>.</p>
+
+<h3 id="Configure_your_channel_features">Configure your channel features</h3>
+
+<p>When your new channel is created you are directed to the channel settings page.
+Take the time to look around at all the settings pages to familiarize yourself with
+your options, even if you don't understand everything you see right now.</p>
+
+<p>Navigate to the <strong>Additional Features</strong> settings and follow the screenshots below to
+enable various features. Remember to press the Submit button when you are done with
+your selections.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/3656a67dce40a1fc2515e9089217f2e136d4fcf8babe77bac00ecaad43ce.png" alt="image"><img class="img-responsive" src="/help/tutorials/assets/4aaaf1e124514c8d6999a5fe1d07be5af460cda4ba6cde9106ebc1564bb0.png" alt="image"><img class="img-responsive" src="/help/tutorials/assets/99a6efda4df631dfb2d2a849412044cc6a0f8aebeac289d28786f2649d24.png" alt="image"><img class="img-responsive" src="/help/tutorials/assets/e5d5674a34e848e2cce90a60fc416415271d9c51b81ad2a950fb0157222a.png" alt="image"></p>
+
+<h3 id="Add_a_profile_photo">Add a profile photo</h3>
+
+<p>Navigate to your channel home by clicking the "Home" icon on the left side of the
+navbar, and then select the <strong>About</strong> tab to view your profile.</p>
+
+<p>Press the <strong>Edit</strong> button on the right to edit your profile information.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/2243e48ccea25bd907cce3dbd6fc9f7cd832a4c91a4c5dd294b7b219e7d8.png" alt="image"></p>
+
+<p>From the <strong>Profile Tools</strong> dropdown menu, select the <strong>Change profile photo</strong></p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/31f42a02bdbae095e0329db6c3814e2975979aff12f873f43d81724c5e61.png" alt="image"></p>
+
+<p>Upload your photo and size as necessary using the image editor.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/458a842c2ea0fbe3b7869bb14dfffe1e5be098d1cd6e590bbead25b4cc05.png" alt="image"></p>
+
+<p>When you press <strong>Submit</strong> you will be redirected back to the profile editor.
+(You might need to clear your browser cache if you have trouble seeing the new photo.)</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/d080e92d797af5e863fa39b2084c16a8410de1f7a6559633435817444aef.png" alt="image"></p>
+
+<p>Returning to your channel home page you will see that a post notifying others of your new
+profile pic has been automatically posted.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/1ebe02c205962dd25035c441631745d16acdb7a44e50d148256c8ad26a67.png" alt="image"></p>
+
+<h3 id="Compose_a_post">Compose a post</h3>
+
+<p>Go to your channel home and open the post editor by pressing the <strong>Share</strong> textbox
+at the top of the channel "wall". Enter a message, and then drag-and-drop an image
+file into the post editor text area (alternatively you can use the <strong>Attach file</strong>
+tool at the bottom).</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/b0bfdf02aef3710a37bb6092c3240b291eca8afa73133b3ac03b86f3302d.png" alt="image"></p>
+
+<p>Your image file will be automatically uploaded and stored in your cloud files, and
+a link will appear in the post window. Pressing the post preview button will allow you to preview your post before publishing it.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/7c976a06662a1357b3da8ed0680d1a721c85f2ae2bdd5739a8def466010e.png" alt="image"></p>
+
+<p>Pressing the lock button near the Submit button will open the <strong>Access Control List</strong>
+so you can specify exactly who can access this post.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/2b539d5a8474d6ec6dc91155b628d9be5f99ab04a78108ec404f53ec7bb5.png" alt="image"></p>
+
+<h3 id="Use_an_uploaded_image_as_a_channel_cover_photo">Use an uploaded image as a channel cover photo</h3>
+
+<p>One way to add some pizzazz your channel is to add a cover photo that visitors will
+see when they load your channel page. Hubzilla's integrated cloud file system
+allows you to choose an existing photo for this purpose.</p>
+
+<p>Visit your photos in the <strong>Photos</strong> app</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/0965ace945f0c95ae38aa5bfedd230d2a7233d3915ac15d629f9dd845854.png" alt="image"></p>
+
+<p>Select the photo you wish to use and select <strong>Use as cover photo</strong> from the <strong>Photo Tools</strong>
+dropdown menu.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/9eae9fad774a4cd29e665961d35affbd053368056f562c58200fb41027b0.png" alt="image"></p>
+
+<p>Crop the image using the photo editor and save your changes.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/b3eece28e8db67f1024af42055f0f24ed5e81ba622aca8cac576ccf5930e.png" alt="image"></p>
+
+<p>When you load your channel home page, you will first see the cover photo, and your
+channel page will fade in as you scroll down.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/4cf326152797a8ecdf5630e921756f825ee00f8ee464d3ef9fed971d2852.png" alt="image"></p>
+
+<h3 id="Make_a_connection">Make a connection</h3>
+
+<p>Making connections between channels to share things is what Hubzilla is all about.
+Making a connection is simple. If you do not already know how to reach a channel's home
+page, you might try a directory search by opening the <strong>Directory</strong> link on the right
+side of the top navbar.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.png" alt="image"></p>
+
+<p>You can connect directly from the directory entry using the <strong>Connect</strong> button there,
+or you can open the channel page first and press the <strong>Connect</strong> button below the
+profile photo.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/75d2927b7ad0d2043d4d3b6ba1364fac8ead173edd39340adaf78be11c9d.png" alt="image"></p>
+
+<p>After you connect you are immediately taken to the connection editor page, where
+you make some important decisions about what you plan to share with this channel.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/b334915c03a665493915598c69c17a87c910a39db2cd3b5292e4623ea4c4.png" alt="image"></p>
+
+<p>The two important settings are</p>
+
+<ul><li>The individual permissions for the newly connected channel</li>
+<li>The privacy group(s) the connection is a member of</li>
+</ul><p>The individual permissions are mostly straightforward, but they can be slightly
+unclear at first. For example, <strong>Can view my file storage and photos</strong> does <em>not</em>
+mean that the connected channel will be able to view <em>all</em> of your photos and files!
+It means that you will have the <em>option</em> to share photos and files with that
+channel. It is perfectly possible for you to allow someone to read your posts but
+disallow them from seeing photos in that post. This kind of unusual situation is,
+as they say, not a bug; it is a feature.</p>
+
+<p>Privacy groups allow you to conveniently share items with groups of people. You can
+create whatever groups fit your needs by opening the <strong>Add privacy group</strong> link.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/facb0bdfdecb4c779de9048cd14b417c0d76de17af476be5f296b78d70e9.png" alt="image"></p>
+
+<p>In this editor, you can switch between the existing privacy groups and see at a
+glance what channels are and are not members of the group. Selecting the icon of
+a channel in either box will move it to the in or out of the group.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/25eaad2435200f72a1dd3a00ba17a76ca6db4c246b3c4fa286b390cae7c8.png" alt="image"></p>
+
+<p>When editing an individual channel's settings, you can set their privacy group
+membership using the widget on the left:</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/bdbcf0ffd9004657237f6b7b7863da5a8e39a5bc17d2c67fa160efef2056.png" alt="image"></p>
+
+<p>Connections are a mutual engagement. The channel you connect can <em>choose</em> to approve your
+connection. They will receive a notification that you connected</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/324247680b605fd214fd61aecd8f216fa8f5dfa0f16a04c8e968fdbc43d0.png" alt="image"></p>
+
+<p>which takes them to their <a href="https://grid.reticu.li/connections"><strong>Connections</strong></a> editor page where
+they can choose to approve the connection or not.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/e05248fdc5688d6d24bde52432fdc7b39692a094559aa504de99352940b1.png" alt="image"></p>
+
+<p>After you approve a connection, it is a good idea to open the individual connection
+editor by pressing the edit button beside the <strong>Delete</strong> button.</p>
+
+<p><img class="img-responsive" src="/help/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.png" alt="image"></p>
+
+ \ No newline at end of file
diff --git a/images/beer_mug.gif b/images/emoticons/beer_mug.gif
index 9a3e05192..9a3e05192 100644
--- a/images/beer_mug.gif
+++ b/images/emoticons/beer_mug.gif
Binary files differ
diff --git a/images/coffee.gif b/images/emoticons/coffee.gif
index 7e2037174..7e2037174 100644
--- a/images/coffee.gif
+++ b/images/emoticons/coffee.gif
Binary files differ
diff --git a/images/dislike.gif b/images/emoticons/dislike.gif
index 77779423c..77779423c 100644
--- a/images/dislike.gif
+++ b/images/emoticons/dislike.gif
Binary files differ
diff --git a/images/like.gif b/images/emoticons/like.gif
index f71d0324d..f71d0324d 100644
--- a/images/like.gif
+++ b/images/emoticons/like.gif
Binary files differ
diff --git a/images/smiley-Oo.gif b/images/emoticons/smiley-Oo.gif
index a15d97427..a15d97427 100644
--- a/images/smiley-Oo.gif
+++ b/images/emoticons/smiley-Oo.gif
Binary files differ
diff --git a/images/smiley-bangheaddesk.gif b/images/emoticons/smiley-bangheaddesk.gif
index 91ccb8bb4..91ccb8bb4 100644
--- a/images/smiley-bangheaddesk.gif
+++ b/images/emoticons/smiley-bangheaddesk.gif
Binary files differ
diff --git a/images/smiley-beard.png b/images/emoticons/smiley-beard.png
index 5d4b28463..5d4b28463 100644
--- a/images/smiley-beard.png
+++ b/images/emoticons/smiley-beard.png
Binary files differ
diff --git a/images/smiley-brokenheart.gif b/images/emoticons/smiley-brokenheart.gif
index 971b57fd9..971b57fd9 100644
--- a/images/smiley-brokenheart.gif
+++ b/images/emoticons/smiley-brokenheart.gif
Binary files differ
diff --git a/images/smiley-cool.gif b/images/emoticons/smiley-cool.gif
index cee1c1aa3..cee1c1aa3 100644
--- a/images/smiley-cool.gif
+++ b/images/emoticons/smiley-cool.gif
Binary files differ
diff --git a/images/smiley-cry.gif b/images/emoticons/smiley-cry.gif
index 06e6ca2c2..06e6ca2c2 100644
--- a/images/smiley-cry.gif
+++ b/images/emoticons/smiley-cry.gif
Binary files differ
diff --git a/images/smiley-embarassed.gif b/images/emoticons/smiley-embarassed.gif
index adc12e7c5..adc12e7c5 100644
--- a/images/smiley-embarassed.gif
+++ b/images/emoticons/smiley-embarassed.gif
Binary files differ
diff --git a/images/smiley-facepalm.gif b/images/emoticons/smiley-facepalm.gif
index 724370369..724370369 100644
--- a/images/smiley-facepalm.gif
+++ b/images/emoticons/smiley-facepalm.gif
Binary files differ
diff --git a/images/smiley-foot-in-mouth.gif b/images/emoticons/smiley-foot-in-mouth.gif
index b444e5781..b444e5781 100644
--- a/images/smiley-foot-in-mouth.gif
+++ b/images/emoticons/smiley-foot-in-mouth.gif
Binary files differ
diff --git a/images/smiley-frown.gif b/images/emoticons/smiley-frown.gif
index 9ff19850d..9ff19850d 100644
--- a/images/smiley-frown.gif
+++ b/images/emoticons/smiley-frown.gif
Binary files differ
diff --git a/images/smiley-heart.gif b/images/emoticons/smiley-heart.gif
index 6a11e7065..6a11e7065 100644
--- a/images/smiley-heart.gif
+++ b/images/emoticons/smiley-heart.gif
Binary files differ
diff --git a/images/smiley-innocent.gif b/images/emoticons/smiley-innocent.gif
index 9d747140e..9d747140e 100644
--- a/images/smiley-innocent.gif
+++ b/images/emoticons/smiley-innocent.gif
Binary files differ
diff --git a/images/smiley-kiss.gif b/images/emoticons/smiley-kiss.gif
index cc356611e..cc356611e 100644
--- a/images/smiley-kiss.gif
+++ b/images/emoticons/smiley-kiss.gif
Binary files differ
diff --git a/images/smiley-laughing.gif b/images/emoticons/smiley-laughing.gif
index 1bf29de79..1bf29de79 100644
--- a/images/smiley-laughing.gif
+++ b/images/emoticons/smiley-laughing.gif
Binary files differ
diff --git a/images/smiley-money-mouth.gif b/images/emoticons/smiley-money-mouth.gif
index 1e8ccd0f3..1e8ccd0f3 100644
--- a/images/smiley-money-mouth.gif
+++ b/images/emoticons/smiley-money-mouth.gif
Binary files differ
diff --git a/images/smiley-sealed.gif b/images/emoticons/smiley-sealed.gif
index 98186742d..98186742d 100644
--- a/images/smiley-sealed.gif
+++ b/images/emoticons/smiley-sealed.gif
Binary files differ
diff --git a/images/smiley-shaka.gif b/images/emoticons/smiley-shaka.gif
index 336fe3bcd..336fe3bcd 100644
--- a/images/smiley-shaka.gif
+++ b/images/emoticons/smiley-shaka.gif
Binary files differ
diff --git a/images/smiley-smile.gif b/images/emoticons/smiley-smile.gif
index b9bff40a4..b9bff40a4 100644
--- a/images/smiley-smile.gif
+++ b/images/emoticons/smiley-smile.gif
Binary files differ
diff --git a/images/smiley-surprised.gif b/images/emoticons/smiley-surprised.gif
index b07465326..b07465326 100644
--- a/images/smiley-surprised.gif
+++ b/images/emoticons/smiley-surprised.gif
Binary files differ
diff --git a/images/smiley-thumbsup.gif b/images/emoticons/smiley-thumbsup.gif
index 1bc6b124e..1bc6b124e 100644
--- a/images/smiley-thumbsup.gif
+++ b/images/emoticons/smiley-thumbsup.gif
Binary files differ
diff --git a/images/smiley-tongue-out.gif b/images/emoticons/smiley-tongue-out.gif
index 48867dc26..48867dc26 100644
--- a/images/smiley-tongue-out.gif
+++ b/images/emoticons/smiley-tongue-out.gif
Binary files differ
diff --git a/images/smiley-undecided.gif b/images/emoticons/smiley-undecided.gif
index 28029794f..28029794f 100644
--- a/images/smiley-undecided.gif
+++ b/images/emoticons/smiley-undecided.gif
Binary files differ
diff --git a/images/smiley-whitebeard.png b/images/emoticons/smiley-whitebeard.png
index 2a1fccbb7..2a1fccbb7 100644
--- a/images/smiley-whitebeard.png
+++ b/images/emoticons/smiley-whitebeard.png
Binary files differ
diff --git a/images/smiley-wink.gif b/images/emoticons/smiley-wink.gif
index e1cefb05c..e1cefb05c 100644
--- a/images/smiley-wink.gif
+++ b/images/emoticons/smiley-wink.gif
Binary files differ
diff --git a/images/smiley-yell.gif b/images/emoticons/smiley-yell.gif
index 5296c8836..5296c8836 100644
--- a/images/smiley-yell.gif
+++ b/images/emoticons/smiley-yell.gif
Binary files differ
diff --git a/include/Import/Importer.php b/include/Import/Importer.php
index cddfac7b5..1fa677db0 100644
--- a/include/Import/Importer.php
+++ b/include/Import/Importer.php
@@ -5,7 +5,6 @@ namespace Hubzilla\Import;
/**
* @brief Class Import
*
- * @package Hubzilla\Import
*/
class Import {
diff --git a/include/Import/import_diaspora.php b/include/Import/import_diaspora.php
index b664badf1..c6dae0117 100644
--- a/include/Import/import_diaspora.php
+++ b/include/Import/import_diaspora.php
@@ -89,7 +89,7 @@ function import_diaspora($data) {
}
$gender = escape_tags($data['user']['profile']['gender']);
- $about = diaspora2bb($data['user']['profile']['bio']);
+ $about = markdown_to_bb($data['user']['profile']['bio']);
$publish = intval($data['user']['profile']['searchable']);
if($data['user']['profile']['birthday'])
$dob = datetime_convert('UTC','UTC',$data['user']['profile']['birthday'],'Y-m-d');
diff --git a/include/account.php b/include/account.php
index b78c3e56d..5e57d53a8 100644
--- a/include/account.php
+++ b/include/account.php
@@ -74,7 +74,7 @@ function check_account_invite($invite_code) {
if(! $invite_code) {
$result['message'] .= t('An invitation is required.') . EOL;
}
- $r = q("select * from register where `hash` = '%s' limit 1", dbesc($invite_code));
+ $r = q("select * from register where hash = '%s' limit 1", dbesc($invite_code));
if(! $r) {
$result['message'] .= t('Invitation could not be verified.') . EOL;
}
@@ -373,7 +373,7 @@ function account_allow($hash) {
$ret = array('success' => false);
- $register = q("SELECT * FROM `register` WHERE `hash` = '%s' LIMIT 1",
+ $register = q("SELECT * FROM register WHERE hash = '%s' LIMIT 1",
dbesc($hash)
);
@@ -465,7 +465,7 @@ function account_deny($hash) {
intval($register[0]['uid'])
);
- $r = q("DELETE FROM `register` WHERE id = %d",
+ $r = q("DELETE FROM register WHERE id = %d",
dbesc($register[0]['id'])
);
notice( sprintf(t('Registration revoked for %s'), $account[0]['account_email']) . EOL);
@@ -482,7 +482,7 @@ function account_approve($hash) {
// Note: when the password in the register table is 'verify', the uid actually contains the account_id
- $register = q("SELECT * FROM `register` WHERE `hash` = '%s' and password = 'verify' LIMIT 1",
+ $register = q("SELECT * FROM register WHERE hash = '%s' and password = 'verify' LIMIT 1",
dbesc($hash)
);
diff --git a/include/acl_selectors.php b/include/acl_selectors.php
index 63867823f..dcf0fe9a2 100644
--- a/include/acl_selectors.php
+++ b/include/acl_selectors.php
@@ -1,17 +1,24 @@
-<?php /** @file */
+<?php
/**
- *
+ * @file include/acl_selectors.php
+ *
+ * @package acl_selectors
*/
/**
- * @package acl_selectors
+ * @brief
+ *
+ * @param string $selname
+ * @param string $selclass
+ * @param mixed $preselected
+ * @param number $size
+ * @return string
*/
-
-function group_select($selname,$selclass,$preselected = false,$size = 4) {
+function group_select($selname, $selclass, $preselected = false, $size = 4) {
$o = '';
- $o .= "<select name=\"{$selname}[]\" id=\"$selclass\" class=\"$selclass\" multiple=\"multiple\" size=\"$size\" >\r\n";
+ $o .= "<select name=\"{$selname}[]\" id=\"$selclass\" class=\"$selclass\" multiple=\"multiple\" size=\"$size\">\r\n";
$r = q("SELECT * FROM groups WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
intval(local_channel())
@@ -34,19 +41,17 @@ function group_select($selname,$selclass,$preselected = false,$size = 4) {
$o .= "<option value=\"{$rr['id']}\" $selected title=\"{$rr['name']}\" >$trimmed</option>\r\n";
}
-
+
}
$o .= "</select>\r\n";
call_hooks(App::$module . '_post_' . $selname, $o);
-
return $o;
}
function contact_select($selname, $selclass, $preselected = false, $size = 4, $privmail = false, $celeb = false, $privatenet = false, $tabindex = null) {
-
$o = '';
// When used for private messages, we limit correspondence to mutual DFRN/Friendica friends and the selector
@@ -54,17 +59,17 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
$sql_extra = '';
- $tabindex = ($tabindex > 0 ? "tabindex=\"$tabindex\"" : "");
+ $tabindex = ($tabindex > 0 ? 'tabindex="$tabindex"' : '');
if($privmail)
$o .= "<select name=\"$selname\" id=\"$selclass\" class=\"$selclass\" size=\"$size\" $tabindex >\r\n";
- else
- $o .= "<select name=\"{$selname}[]\" id=\"$selclass\" class=\"$selclass\" multiple=\"multiple\" size=\"$size\" $tabindex >\r\n";
+ else
+ $o .= "<select name=\"{$selname}[]\" id=\"$selclass\" class=\"$selclass\" multiple=\"multiple\" size=\"$size\" $tabindex>\r\n";
$r = q("SELECT abook_id, xchan_name, xchan_url, xchan_photo_s from abook left join xchan on abook_xchan = xchan_hash
where abook_self = 0 and abook_channel = %d
$sql_extra
- ORDER BY xchan_name ASC ",
+ ORDER BY xchan_name ASC",
intval(local_channel())
);
@@ -78,15 +83,14 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
if($r) {
foreach($r as $rr) {
if((is_array($preselected)) && in_array($rr['id'], $preselected))
- $selected = " selected=\"selected\" ";
+ $selected = ' selected="selected" ';
else
$selected = '';
- $trimmed = mb_substr($rr['xchan_name'],0,20);
+ $trimmed = mb_substr($rr['xchan_name'], 0, 20);
$o .= "<option value=\"{$rr['abook_id']}\" $selected title=\"{$rr['xchan_name']}|{$rr['xchan_url']}\" >$trimmed</option>\r\n";
}
-
}
$o .= "</select>\r\n";
@@ -98,13 +102,13 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
function fixacl(&$item) {
- $item = str_replace(array('<','>'),array('',''),$item);
+ $item = str_replace(array('<', '>'), array('', ''), $item);
}
/**
* Builds a modal dialog for editing permissions, using acl_selector.tpl as the template.
*
-* @param array $default Optional access control list for the initial state of the dialog.
+* @param array $defaults Optional access control list for the initial state of the dialog.
* @param boolean $show_jotnets Whether plugins for federated networks should be included in the permissions dialog
* @param PermissionDescription $emptyACL_description - An optional description for the permission implied by selecting an empty ACL. Preferably an instance of PermissionDescription.
* @param string $dialog_description Optional message to include at the top of the dialog. E.g. "Warning: Post permissions cannot be changed once sent".
@@ -118,16 +122,15 @@ function populate_acl($defaults = null,$show_jotnets = true, $emptyACL_descripti
$allow_cid = $allow_gid = $deny_cid = $deny_gid = false;
$showall_origin = '';
$showall_icon = 'fa-globe';
- $role = get_pconfig(local_channel(),'system','permissions_role');
+ $role = get_pconfig(local_channel(), 'system', 'permissions_role');
if(! $emptyACL_description) {
$showall_caption = t('Visible to your default audience');
- } else if (is_a($emptyACL_description, '\\Zotlabs\\Lib\\PermissionDescription')) {
+ } else if(is_a($emptyACL_description, '\\Zotlabs\\Lib\\PermissionDescription')) {
$showall_caption = $emptyACL_description->get_permission_description();
$showall_origin = (($role === 'custom') ? $emptyACL_description->get_permission_origin_description() : '');
$showall_icon = $emptyACL_description->get_permission_icon();
-
} else {
// For backwards compatibility we still accept a string... for now!
$showall_caption = $emptyACL_description;
@@ -135,7 +138,7 @@ function populate_acl($defaults = null,$show_jotnets = true, $emptyACL_descripti
if(is_array($defaults)) {
- $allow_cid = ((strlen($defaults['allow_cid']))
+ $allow_cid = ((strlen($defaults['allow_cid']))
? explode('><', $defaults['allow_cid']) : array() );
$allow_gid = ((strlen($defaults['allow_gid']))
? explode('><', $defaults['allow_gid']) : array() );
@@ -195,9 +198,9 @@ function populate_acl($defaults = null,$show_jotnets = true, $emptyACL_descripti
'$select_label' => t('Who can see this?'),
'$custom' => t('Custom selection'),
'$showlimitedDesc' => t('Select "Show" to allow viewing. "Don\'t show" lets you override and limit the scope of "Show".'),
- '$show' => t("Show"),
+ '$show' => t('Show'),
'$hide' => t("Don't show"),
- '$search' => t("Search"),
+ '$search' => t('Search'),
'$allowcid' => json_encode($allow_cid),
'$allowgid' => json_encode($allow_gid),
'$denycid' => json_encode($deny_cid),
@@ -209,20 +212,19 @@ function populate_acl($defaults = null,$show_jotnets = true, $emptyACL_descripti
));
return $o;
-
}
/**
-* Returns a string that's suitable for passing as the $dialog_description argument to a
-* populate_acl() call for wall posts or network posts.
-*
-* This string is needed in 3 different files, and our .po translation system currently
-* cannot be used as a string table (because the value is always the key in english) so
-* I've centralized the value here (making this function name the "key") until we have a
-* better way.
-*
-* @return string Description to present to user in modal permissions dialog
-*/
+ * Returns a string that's suitable for passing as the $dialog_description argument to a
+ * populate_acl() call for wall posts or network posts.
+ *
+ * This string is needed in 3 different files, and our .po translation system currently
+ * cannot be used as a string table (because the value is always the key in english) so
+ * I've centralized the value here (making this function name the "key") until we have a
+ * better way.
+ *
+ * @return string Description to present to user in modal permissions dialog
+ */
function get_post_aclDialogDescription() {
// I'm trying to make two points in this description text - warn about finality of wall
@@ -238,4 +240,3 @@ function get_post_aclDialogDescription() {
return sprintf($description, $emphasisOpen, $emphasisClose);
}
-
diff --git a/include/api.php b/include/api.php
index 692baf563..693967696 100644
--- a/include/api.php
+++ b/include/api.php
@@ -10,25 +10,22 @@ require_once('include/photos.php');
require_once('include/items.php');
require_once('include/attach.php');
require_once('include/api_auth.php');
+require_once('include/api_zot.php');
/*
*
- * Hubzilla API. Loosely based on and possibly compatible with Twitter-Like (v1.0) API but all similarities end there.
+ * Hubzilla API.
*
*/
- /**
- ** TWITTER API
- */
-
$API = array();
$called_api = Null;
// All commands which require authentication accept a "channel" parameter
// which is the left hand side of the channel address/nickname.
- // If provided, the desired channel is selected before caarying out the command.
+ // If provided, the desired channel is selected before carrying out the command.
// If not provided, the default channel associated with the account is used.
// If channel selection fails, the API command requiring login will fail.
@@ -49,7 +46,7 @@ require_once('include/api_auth.php');
return false;
}
}
- if ($_SESSION["allow_api"])
+ if ($_SESSION['allow_api'])
return local_channel();
return false;
}
@@ -57,11 +54,11 @@ require_once('include/api_auth.php');
function api_date($str){
//Wed May 23 06:01:13 +0000 2007
- return datetime_convert('UTC', 'UTC', $str, "D M d H:i:s +0000 Y" );
+ return datetime_convert('UTC', 'UTC', $str, 'D M d H:i:s +0000 Y' );
}
- function api_register_func($path, $func, $auth=false) {
+ function api_register_func($path, $func, $auth = false) {
\Zotlabs\Lib\Api_router::register($path,$func,$auth);
}
@@ -90,7 +87,12 @@ require_once('include/api_auth.php');
$info = \Zotlabs\Lib\Api_router::find($p);
- logger('info: ' . $p . ' type: ' . $type . ' ' . print_r($info,true));
+ if(in_array($type, [ 'rss', 'atom', 'as' ])) {
+ // These types no longer supported.
+ $info = false;
+ }
+
+ logger('API info: ' . $p . ' type: ' . $type . ' ' . print_r($info,true), LOGGER_DEBUG,LOG_INFO);
if($info) {
@@ -111,247 +113,73 @@ require_once('include/api_auth.php');
return;
switch($type) {
- case "xml":
- $r = mb_convert_encoding($r, "UTF-8",mb_detect_encoding($r));
- header ("Content-Type: text/xml");
- return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
+ case 'xml':
+ header ('Content-Type: text/xml');
+ return $r;
break;
- case "json":
- header ("Content-Type: application/json");
- if($r) {
- foreach($r as $rv) {
- $json = json_encode($rv);
- }
- }
+ case 'json':
+ header ('Content-Type: application/json');
// Lookup JSONP to understand these lines. They provide cross-domain AJAX ability.
if ($_GET['callback'])
- $json = $_GET['callback'] . '(' . $json . ')' ;
- return $json;
+ $r = $_GET['callback'] . '(' . $r . ')' ;
+ return $r;
break;
- case "rss":
- header ("Content-Type: application/rss+xml");
- return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
- break;
- case "atom":
- header ("Content-Type: application/atom+xml");
- return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
- break;
- case "as":
- if($r) {
- foreach($r as $rv) {
- $json = json_encode($rv);
- }
- }
- return $json;
- break;
-
}
}
- header("HTTP/1.1 404 Not Found");
+ header('HTTP/1.1 404 Not Found');
logger('API call not implemented: ' . App::$query_string . ' - ' . print_r($_REQUEST,true));
$r = '<status><error>not implemented</error></status>';
switch($type){
- case "xml":
- header ("Content-Type: text/xml");
- return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
+ case 'xml':
+ header ('Content-Type: text/xml');
+ return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r;
break;
case "json":
- header ("Content-Type: application/json");
+ header ('Content-Type: application/json');
return json_encode(array('error' => 'not implemented'));
break;
case "rss":
- header ("Content-Type: application/rss+xml");
- return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
+ header ('Content-Type: application/rss+xml');
+ return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r;
break;
case "atom":
- header ("Content-Type: application/atom+xml");
- return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
+ header ('Content-Type: application/atom+xml');
+ return '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $r;
break;
}
}
/**
- * RSS extra info
- */
-
- function api_rss_extra( $arr, $user_info){
- if (is_null($user_info)) $user_info = api_get_user($a);
- $arr['$user'] = $user_info;
- $arr['$rss'] = array(
- 'alternate' => $user_info['url'],
- 'self' => z_root(). "/". App::$query_string,
- 'base' => z_root(),
- 'updated' => api_date(null),
- 'atom_updated' => datetime_convert('UTC','UTC','now',ATOM_TIME),
- 'language' => $user_info['language'],
- 'logo' => z_root()."/images/rm-64.png",
- );
-
- return $arr;
- }
-
- /**
- * Returns user info array.
+ * load api $templatename for $type and replace $data array
*/
- function api_get_user( $contact_id = null, $contact_xchan = null){
-
- $user = null;
- $extra_query = "";
-
-
- if(! is_null($contact_xchan)) {
- $user = local_channel();
- $extra_query = " and abook_xchan = '" . dbesc($contact_xchan) . "' ";
- }
- else {
- if(!is_null($contact_id)){
- $user=$contact_id;
- $extra_query = " AND abook_id = %d ";
- }
-
- if(is_null($user) && x($_GET, 'user_id')) {
- $user = intval($_GET['user_id']);
- $extra_query = " AND abook_id = %d ";
- }
- if(is_null($user) && x($_GET, 'screen_name')) {
- $user = dbesc($_GET['screen_name']);
- $extra_query = " AND xchan_addr like '%s@%%' ";
- if (api_user()!==false)
- $extra_query .= " AND abook_channel = ".intval(api_user());
- }
- }
-
- if (! $user) {
- if (api_user() === false) {
- api_login($a);
- return false;
- } else {
- $user = local_channel();
- $extra_query = " AND abook_channel = %d AND abook_self = 1 ";
- }
-
- }
-
- logger('api_user: ' . $extra_query . ', user: ' . $user, LOGGER_DATA, LOG_INFO);
-
- // user info
-
- $uinfo = q("SELECT * from abook left join xchan on abook_xchan = xchan_hash
- WHERE 1
- $extra_query",
- $user
- );
-
- if (count($uinfo)==0) {
- return False;
- }
- $following = false;
-
- if(intval($uinfo[0]['abook_self'])) {
- $usr = q("select * from channel where channel_id = %d limit 1",
- intval(api_user())
- );
- $profile = q("select * from profile where uid = %d and `is_default` = 1 limit 1",
- intval(api_user())
- );
-
- $item_normal = item_normal();
-
- // count public wall messages
- $r = q("SELECT COUNT(`id`) as `count` FROM `item`
- WHERE `uid` = %d
- AND item_wall = 1 $item_normal
- AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''
- AND item_private = 0 ",
- intval($usr[0]['channel_id'])
- );
- $countitms = $r[0]['count'];
- $following = true;
- }
- else {
- $r = q("SELECT COUNT(`id`) as `count` FROM `item`
- WHERE author_xchan = '%s'
- AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''
- AND item_private = 0 ",
- intval($uinfo[0]['xchan_hash'])
- );
- $countitms = $r[0]['count'];
-
- $following = ((get_abconfig($uinfo[0]['abook_channel'],$uinfo[0]['abook_xchan'],'my_perms','view_stream')) ? true : false );
- }
-
+ function api_apply_template($templatename, $type, $data){
- // count friends
- if($usr) {
- $r = q("SELECT COUNT(abook_id) as `count` FROM abook
- WHERE abook_channel = %d AND abook_self = 0 ",
- intval($usr[0]['channel_id'])
- );
- $countfriends = $r[0]['count'];
- $countfollowers = $r[0]['count'];
+ switch($type){
+ case 'xml':
+ if($data) {
+ foreach($data as $k => $v)
+ $ret = arrtoxml(str_replace('$','',$k),$v);
+ }
+ break;
+ case 'json':
+ default:
+ if($data) {
+ foreach($data as $rv) {
+ $ret = json_encode($rv);
+ }
+ }
+ break;
}
- $r = q("SELECT count(`id`) as `count` FROM item where item_starred = 1 and uid = %d " . item_normal(),
- intval($uinfo[0]['channel_id'])
- );
- $starred = $r[0]['count'];
+ return $ret;
+ }
- if(! intval($uinfo[0]['abook_self'])) {
- $countfriends = 0;
- $countfollowers = 0;
- $starred = 0;
- }
-
- $ret = Array(
- 'id' => intval($uinfo[0]['abook_id']),
- 'self' => (intval($uinfo[0]['abook_self']) ? 1 : 0),
- 'uid' => intval($uinfo[0]['abook_channel']),
- 'guid' => $uinfo[0]['xchan_hash'],
- 'name' => (($uinfo[0]['xchan_name']) ? $uinfo[0]['xchan_name'] : substr($uinfo[0]['xchan_addr'],0,strpos($uinfo[0]['xchan_addr'],'@'))),
- 'screen_name' => substr($uinfo[0]['xchan_addr'],0,strpos($uinfo[0]['xchan_addr'],'@')),
- 'location' => ($usr) ? $usr[0]['channel_location'] : '',
- 'profile_image_url' => $uinfo[0]['xchan_photo_l'],
- 'url' => $uinfo[0]['xchan_url'],
- 'contact_url' => z_root() . "/connections/".$uinfo[0]['abook_id'],
- 'protected' => false,
- 'friends_count' => intval($countfriends),
- 'created_at' => api_date($uinfo[0]['abook_created']),
- 'utc_offset' => "+00:00",
- 'time_zone' => 'UTC', //$uinfo[0]['timezone'],
- 'geo_enabled' => false,
- 'statuses_count' => intval($countitms), //#XXX: fix me
- 'lang' => App::$language,
- 'description' => (($profile) ? $profile[0]['pdesc'] : ''),
- 'followers_count' => intval($countfollowers),
- 'favourites_count' => intval($starred),
- 'contributors_enabled' => false,
- 'follow_request_sent' => true,
- 'profile_background_color' => 'cfe8f6',
- 'profile_text_color' => '000000',
- 'profile_link_color' => 'FF8500',
- 'profile_sidebar_fill_color' =>'AD0066',
- 'profile_sidebar_border_color' => 'AD0066',
- 'profile_background_image_url' => '',
- 'profile_background_tile' => false,
- 'profile_use_background_image' => false,
- 'notifications' => false,
- 'following' => $following,
- 'verified' => true // #XXX: fix me
- );
- $x = api_get_status($uinfo[0]['xchan_hash']);
- if($x)
- $ret['status'] = $x;
-// logger('api_get_user: ' . print_r($ret,true));
-
- return $ret;
-
- }
function api_client_register($type) {
@@ -382,1969 +210,6 @@ require_once('include/api_auth.php');
json_return_and_die($ret);
}
- api_register_func('api/client/register','api_client_register', false);
-
-
-
- function api_item_get_user( $item) {
-
- // The author is our direct contact, in a conversation with us.
-
- if($item['author']['abook_id']) {
- return api_get_user($item['author']['abook_id']);
- }
-
- // We don't know this person directly.
-
- $nick = substr($item['author']['xchan_addr'],0,strpos($item['author']['xchan_addr'],'@'));
- $name = $item['author']['xchan_name'];
-
- // Generating a random ID
- if (! $nick)
- $nick = mt_rand(2000000, 2100000);
-
- $ret = array(
- 'id' => $nick,
- 'name' => $name,
- 'screen_name' => $nick,
- 'location' => '', //$uinfo[0]['default-location'],
- 'description' => '',
- 'profile_image_url' => $item['author']['xchan_photo_m'],
- 'url' => $item['author']['xchan_url'],
- 'protected' => false,
- 'followers_count' => 0,
- 'friends_count' => 0,
- 'created_at' => '',
- 'favourites_count' => 0,
- 'utc_offset' => 0, // #XXX: fix me
- 'time_zone' => '', //$uinfo[0]['timezone'],
- 'statuses_count' => 0,
- 'following' => false,
- 'statusnet_blocking' => false,
- 'notifications' => false,
- 'uid' => 0,
- 'contact_url' => 0,
- 'geo_enabled' => false,
- 'lang' => 'en', // #XXX: fix me
- 'contributors_enabled' => false,
- 'follow_request_sent' => false,
- 'profile_background_color' => 'cfe8f6',
- 'profile_text_color' => '000000',
- 'profile_link_color' => 'FF8500',
- 'profile_sidebar_fill_color' =>'AD0066',
- 'profile_sidebar_border_color' => 'AD0066',
- 'profile_background_image_url' => '',
- 'profile_background_tile' => false,
- 'profile_use_background_image' => false,
- 'verified' => true, // #XXX: fix me
- 'followers' => '' // #XXX: fix me
- );
-
- return $ret;
- }
-
-
- /**
- * load api $templatename for $type and replace $data array
- */
- function api_apply_template($templatename, $type, $data){
-
- switch($type){
- case "atom":
- case "rss":
- case "xml":
- $data = array_xmlify($data);
- $tpl = get_markup_template("api_".$templatename."_".$type.".tpl");
- $ret = replace_macros($tpl, $data);
- break;
- case "json":
- default:
- $ret = $data;
- break;
- }
-
- return $ret;
- }
-
-
- /**
- * Returns an HTTP 200 OK response code and a representation of the requesting user if authentication was successful;
- * returns a 401 status code and an error message if not.
- * http://developer.twitter.com/doc/get/account/verify_credentials
- */
- function api_account_verify_credentials( $type){
- if (api_user()===false) return false;
- $user_info = api_get_user($a);
- return api_apply_template("user", $type, array('$user' => $user_info));
-
- }
- api_register_func('api/account/verify_credentials','api_account_verify_credentials', true);
-
-
- function api_account_logout( $type){
- require_once('include/auth.php');
- App::$session->nuke();
- return api_apply_template("user", $type, array('$user' => null));
-
- }
- api_register_func('api/account/logout','api_account_logout', false);
-
-
-
- /**
- * get data from $_REQUEST ( e.g. $_POST or $_GET )
- */
- function requestdata($k) {
- if(array_key_exists($k,$_REQUEST))
- return $_REQUEST[$k];
- return null;
- }
-
-
- /*
- * Red basic channel export
- */
-
- function api_export_basic( $type) {
- if(api_user() === false) {
- logger('api_export_basic: no user');
- return false;
- }
-
- require_once('include/channel.php');
-
- json_return_and_die(identity_basic_export(api_user(),(($_REQUEST['posts']) ? intval($_REQUEST['posts']) : 0 )));
- }
- api_register_func('api/export/basic','api_export_basic', true);
- api_register_func('api/red/channel/export/basic','api_export_basic', true);
- api_register_func('api/hz/1.0/channel/export/basic','api_export_basic', true);
-
-
- function api_channel_stream( $type) {
- if(api_user() === false) {
- logger('api_channel_stream: no user');
- return false;
- }
-
- if($_SERVER['REQUEST_METHOD'] == 'POST') {
- json_return_and_die(post_activity_item($_REQUEST));
- }
- else {
- // fetch stream
-
- }
- }
- api_register_func('api/red/channel/stream','api_channel_stream', true);
- api_register_func('api/hz/1.0/channel/stream','api_channel_stream', true);
-
- function api_attach_list($type) {
- logger('api_user: ' . api_user());
- json_return_and_die(attach_list_files(api_user(),get_observer_hash(),'','','','created asc'));
- }
- api_register_func('api/red/files','api_attach_list', true);
- api_register_func('api/hz/1.0/files','api_attach_list', true);
-
-
-
-
-
- function api_file_meta($type) {
- if (api_user()===false) return false;
- if(! $_REQUEST['file_id']) return false;
- $r = q("select * from attach where uid = %d and hash = '%s' limit 1",
- intval(api_user()),
- dbesc($_REQUEST['file_id'])
- );
- if($r) {
- unset($r[0]['content']);
- $ret = array('attach' => $r[0]);
- json_return_and_die($ret);
- }
- killme();
- }
-
- api_register_func('api/red/filemeta', 'api_file_meta', true);
- api_register_func('api/hz/1.0/filemeta', 'api_file_meta', true);
-
-
- function api_file_data($type) {
- if (api_user()===false) return false;
- if(! $_REQUEST['file_id']) return false;
- $start = (($_REQUEST['start']) ? intval($_REQUEST['start']) : 0);
- $length = (($_REQUEST['length']) ? intval($_REQUEST['length']) : 0);
-
- $r = q("select * from attach where uid = %d and hash = '%s' limit 1",
- intval(api_user()),
- dbesc($_REQUEST['file_id'])
- );
- if($r) {
- $ptr = $r[0];
- if($length === 0)
- $length = intval($ptr['filesize']);
-
- if($ptr['is_dir'])
- $ptr['content'] = '';
- elseif(! intval($r[0]['os_storage'])) {
- $ptr['start'] = $start;
- $x = substr(dbunescbin($ptr['content'],$start,$length));
- $ptr['length'] = strlen($x);
- $ptr['content'] = base64_encode($x);
- }
- else {
- $fp = fopen(dbunescbin($ptr['content']),'r');
- if($fp) {
- $seek = fseek($fp,$start,SEEK_SET);
- $x = fread($fp,$length);
- $ptr['start'] = $start;
- $ptr['length'] = strlen($x);
- $ptr['content'] = base64_encode($x);
- }
- }
-
- $ret = array('attach' => $ptr);
- json_return_and_die($ret);
- }
- killme();
- }
-
- api_register_func('api/red/filedata', 'api_file_data', true);
- api_register_func('api/hz/1.0/filedata', 'api_file_data', true);
-
-
-
- function api_file_detail($type) {
- if (api_user()===false) return false;
- if(! $_REQUEST['file_id']) return false;
- $r = q("select * from attach where uid = %d and hash = '%s' limit 1",
- intval(api_user()),
- dbesc($_REQUEST['file_id'])
- );
- if($r) {
- if($r[0]['is_dir'])
- $r[0]['content'] = '';
- elseif(intval($r[0]['os_storage']))
- $r[0]['content'] = base64_encode(file_get_contents(dbunescbin($r[0]['content'])));
- else
- $r[0]['content'] = base64_encode(dbunescbin($r[0]['content']));
-
- $ret = array('attach' => $r[0]);
- json_return_and_die($ret);
- }
- killme();
- }
-
- api_register_func('api/red/file', 'api_file_detail', true);
- api_register_func('api/hz/1.0/file', 'api_file_detail', true);
-
-
- function api_albums($type) {
- json_return_and_die(photos_albums_list(App::get_channel(),App::get_observer()));
- }
- api_register_func('api/red/albums','api_albums', true);
- api_register_func('api/hz/1.0/albums','api_albums', true);
-
- function api_photos($type) {
- $album = $_REQUEST['album'];
- json_return_and_die(photos_list_photos(App::get_channel(),App::get_observer(),$album));
- }
- api_register_func('api/red/photos','api_photos', true);
- api_register_func('api/hz/1.0/photos','api_photos', true);
-
- function api_photo_detail($type) {
- if (api_user()===false) return false;
- if(! $_REQUEST['photo_id']) return false;
- $scale = ((array_key_exists('scale',$_REQUEST)) ? intval($_REQUEST['scale']) : 0);
- $r = q("select * from photo where uid = %d and resource_id = '%s' and imgscale = %d limit 1",
- intval(local_channel()),
- dbesc($_REQUEST['photo_id']),
- intval($scale)
- );
- if($r) {
- $data = dbunescbin($r[0]['content']);
- if(array_key_exists('os_storage',$r[0]) && intval($r[0]['os_storage']))
- $data = file_get_contents($data);
- $r[0]['content'] = base64_encode($data);
- $ret = array('photo' => $r[0]);
- $i = q("select id from item where uid = %d and resource_type = 'photo' and resource_id = '%s' limit 1",
- intval(local_channel()),
- dbesc($_REQUEST['photo_id'])
- );
- if($i) {
- $ii = q("select * from item where parent = %d order by id",
- intval($i[0]['id'])
- );
- if($ii) {
- xchan_query($ii,true,0);
- $ii = fetch_post_tags($ii,true);
- if($ii) {
- $ret['item'] = array();
- foreach($ii as $iii)
- $ret['item'][] = encode_item($iii,true);
- }
- }
- }
-
- json_return_and_die($ret);
- }
- killme();
- }
-
- api_register_func('api/red/photo', 'api_photo_detail', true);
- api_register_func('api/hz/1.0/photo', 'api_photo_detail', true);
-
-
- function api_group_members($type) {
- if(api_user() === false)
- return false;
-
- if($_REQUEST['group_id']) {
- $r = q("select * from groups where uid = %d and id = %d limit 1",
- intval(api_user()),
- intval($_REQUEST['group_id'])
- );
- if($r) {
- $x = q("select * from group_member left join xchan on group_member.xchan = xchan.xchan_hash
- left join abook on abook_xchan = xchan_hash where gid = %d",
- intval($_REQUEST['group_id'])
- );
- json_return_and_die($x);
- }
- }
- }
-
- api_register_func('api/red/group_members','api_group_members', true);
- api_register_func('api/hz/1.0/group_members','api_group_members', true);
-
-
-
-
- function api_group($type) {
- if(api_user() === false)
- return false;
-
- $r = q("select * from groups where uid = %d",
- intval(api_user())
- );
- json_return_and_die($r);
- }
- api_register_func('api/red/group','api_group', true);
- api_register_func('api/hz/1.0/group','api_group', true);
-
-
- function api_red_xchan($type) {
- logger('api_xchan');
-
- if(api_user() === false)
- return false;
- logger('api_xchan');
- require_once('include/hubloc.php');
-
- if($_SERVER['REQUEST_METHOD'] === 'POST') {
- $r = xchan_store($_REQUEST);
- }
- $r = xchan_fetch($_REQUEST);
- json_return_and_die($r);
- };
-
- api_register_func('api/red/xchan','api_red_xchan',true);
- api_register_func('api/hz/1.0/xchan','api_red_xchan',true);
-
-
- function api_statuses_mediap( $type) {
- if (api_user() === false) {
- logger('api_statuses_update: no user');
- return false;
- }
- $user_info = api_get_user($a);
-
-// logger('status_with_media: ' . print_r($_REQUEST,true), LOGGER_DEBUG);
-
- $_REQUEST['type'] = 'wall';
- $_REQUEST['profile_uid'] = api_user();
- $_REQUEST['api_source'] = true;
-
- $txt = requestdata('status');
-
- require_once('library/HTMLPurifier.auto.php');
- require_once('include/html2bbcode.php');
-
- if((strpos($txt,'<') !== false) || (strpos($txt,'>') !== false)) {
- $txt = html2bb_video($txt);
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Cache.DefinitionImpl', null);
- $purifier = new HTMLPurifier($config);
- $txt = $purifier->purify($txt);
- }
- $txt = html2bbcode($txt);
-
- App::$argv[1] = $user_info['screen_name'];
-
- $_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
- $_FILES['userfile'] = $_FILES['media'];
-
- $mod = new Zotlabs\Module\Wall_attach();
- $mod->post();
-
-
- $_REQUEST['body']=$txt."\n\n".$posted;
-
- $mod = new Zotlabs\Module\Item();
- $mod->post();
-
- // this should output the last post (the one we just posted).
- return api_status_show($type);
- }
- api_register_func('api/statuses/mediap','api_statuses_mediap', true);
-
- function api_statuses_update( $type) {
- if (api_user() === false) {
- logger('api_statuses_update: no user');
- return false;
- }
-
- logger('api_statuses_update: REQUEST ' . print_r($_REQUEST,true));
- logger('api_statuses_update: FILES ' . print_r($_FILES,true));
-
-
- // set this so that the item_post() function is quiet and doesn't redirect or emit json
-
- $_REQUEST['api_source'] = true;
-
-
- $user_info = api_get_user($a);
-
- // convert $_POST array items to the form we use for web posts.
-
- // logger('api_post: ' . print_r($_POST,true));
-
- if(requestdata('htmlstatus')) {
- require_once('library/HTMLPurifier.auto.php');
- require_once('include/html2bbcode.php');
-
- $txt = requestdata('htmlstatus');
-
- if((strpos($txt,'<') !== false) || (strpos($txt,'>') !== false)) {
-
- $txt = html2bb_video($txt);
-
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Cache.DefinitionImpl', null);
-
-
- $purifier = new HTMLPurifier($config);
- $txt = $purifier->purify($txt);
-
- }
-
- $_REQUEST['body'] = html2bbcode($txt);
-
- }
- else
- $_REQUEST['body'] = requestdata('status');
-
- $parent = requestdata('in_reply_to_status_id');
-
- if(ctype_digit($parent))
- $_REQUEST['parent'] = $parent;
- else
- $_REQUEST['parent_mid'] = $parent;
-
- if($_REQUEST['namespace'] && $parent) {
- $x = q("select iid from iconfig where cat = 'system' and k = '%s' and v = '%s' limit 1",
- dbesc($_REQUEST['namespace']),
- dbesc($parent)
- );
- if($x) {
- $_REQUEST['parent'] = $x[0]['iid'];
- }
- }
-
- if(requestdata('lat') && requestdata('long'))
- $_REQUEST['coord'] = sprintf("%s %s",requestdata('lat'),requestdata('long'));
-
- $_REQUEST['profile_uid'] = api_user();
-
- if($parent)
- $_REQUEST['type'] = 'net-comment';
- else {
- $_REQUEST['type'] = 'wall';
-
- if(x($_FILES,'media')) {
- if(is_array($_FILES['media']['name'])) {
- $num_uploads = count($_FILES['media']['name']);
- for($x = 0; $x < $num_uploads; $x ++) {
- $_FILES['userfile'] = array();
- $_FILES['userfile']['name'] = $_FILES['media']['name'][$x];
- $_FILES['userfile']['type'] = $_FILES['media']['type'][$x];
- $_FILES['userfile']['tmp_name'] = $_FILES['media']['tmp_name'][$x];
- $_FILES['userfile']['error'] = $_FILES['media']['error'][$x];
- $_FILES['userfile']['size'] = $_FILES['media']['size'][$x];
-
- // upload each image if we have any
- $_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
- $mod = new Zotlabs\Module\Wall_attach();
- App::$data['api_info'] = $user_info;
- $media = $mod->post();
-
- if(strlen($media)>0)
- $_REQUEST['body'] .= "\n\n" . $media;
- }
- }
- else {
- // AndStatus doesn't present media as an array
- $_FILES['userfile'] = $_FILES['media'];
- // upload each image if we have any
- $_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
- $mod = new Zotlabs\Module\Wall_attach();
- App::$data['api_info'] = $user_info;
- $media = $mod->post();
-
- if(strlen($media)>0)
- $_REQUEST['body'] .= "\n\n" . $media;
- }
- }
- }
-
- // call out normal post function
-
- $mod = new Zotlabs\Module\Item();
- $mod->post();
-
- // this should output the last post (the one we just posted).
- return api_status_show($type);
- }
- api_register_func('api/statuses/update_with_media','api_statuses_update', true);
- api_register_func('api/statuses/update','api_statuses_update', true);
-
-
- function red_item_new( $type) {
-
- if (api_user() === false) {
- logger('api_red_item_new: no user');
- return false;
- }
-
- logger('api_red_item_new: REQUEST ' . print_r($_REQUEST,true));
- logger('api_red_item_new: FILES ' . print_r($_FILES,true));
-
-
- // set this so that the item_post() function is quiet and doesn't redirect or emit json
-
- $_REQUEST['api_source'] = true;
- $_REQUEST['profile_uid'] = api_user();
-
- if(x($_FILES,'media')) {
- $_FILES['userfile'] = $_FILES['media'];
- // upload the image if we have one
- $_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
- $mod = new Zotlabs\Module\Wall_upload();
- $media = $mod->post();
- if(strlen($media)>0)
- $_REQUEST['body'] .= "\n\n".$media;
- }
-
- $mod = new Zotlabs\Module\Item();
- $x = $mod->post();
- json_return_and_die($x);
- }
-
- api_register_func('api/red/item/new','red_item_new', true);
- api_register_func('api/hz/1.0/item/new','red_item_new', true);
-
-
- function red_item( $type) {
-
- if (api_user() === false) {
- logger('api_red_item_full: no user');
- return false;
- }
-
- if($_REQUEST['mid']) {
- $arr = array('mid' => $_REQUEST['mid']);
- }
- elseif($_REQUEST['item_id']) {
- $arr = array('item_id' => $_REQUEST['item_id']);
- }
- else
- json_return_and_die(array());
-
- $arr['start'] = 0;
- $arr['records'] = 999999;
- $arr['item_type'] = '*';
-
- $i = items_fetch($arr,App::get_channel(),get_observer_hash());
-
- if(! $i)
- json_return_and_die(array());
-
- $ret = array();
- $tmp = array();
- foreach($i as $ii) {
- $tmp[] = encode_item($ii,true);
- }
- $ret['item'] = $tmp;
-
- json_return_and_die($ret);
- }
-
- api_register_func('api/red/item/full','red_item', true);
- api_register_func('api/hz/1.0/item/full','red_item', true);
-
-
-
- function api_get_status($xchan_hash) {
- require_once('include/security.php');
-
- $item_normal = item_normal();
-
- $lastwall = q("SELECT * from item where
- item_private = 0 $item_normal
- and author_xchan = '%s'
- and allow_cid = '' and allow_gid = '' and deny_cid = '' and deny_gid = ''
- and verb = '%s'
- order by created desc limit 1",
- dbesc($xchan_hash),
- dbesc(ACTIVITY_POST)
- );
-
- if($lastwall){
- $lastwall = $lastwall[0];
-
- $in_reply_to_status_id = '';
- $in_reply_to_user_id = '';
- $in_reply_to_screen_name = '';
-
- if($lastwall['author_xchan'] != $lastwall['owner_xchan']) {
- $w = q("select * from abook left join xchan on abook_xchan = xchan_hash where
- xchan_hash = '%s' limit 1",
- dbesc($lastwall['owner_xchan'])
- );
- if($w) {
- $in_reply_to_user_id = $w[0]['abook_id'];
- $in_reply_to_screen_name = substr($w[0]['xchan_addr'],0,strpos($w[0]['xchan_addr'],'@'));
- }
- }
-
- if ($lastwall['parent']!=$lastwall['id']) {
- $in_reply_to_status_id=$lastwall['thr_parent'];
- if(! $in_reply_to_user_id) {
- $in_reply_to_user_id = $user_info['id'];
- $in_reply_to_screen_name = $user_info['screen_name'];
- }
- }
- unobscure($lastwall);
- $status_info = array(
- 'text' => html2plain(prepare_text($lastwall['body'],$lastwall['mimetype']), 0),
- 'truncated' => false,
- 'created_at' => api_date($lastwall['created']),
- 'in_reply_to_status_id' => $in_reply_to_status_id,
- 'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'),
- 'id' => ($lastwall['id']),
- 'in_reply_to_user_id' => $in_reply_to_user_id,
- 'in_reply_to_screen_name' => $in_reply_to_screen_name,
- 'geo' => '',
- 'favorited' => false,
- 'coordinates' => $lastwall['coord'],
- 'place' => $lastwall['location'],
- 'contributors' => ''
- );
-
- }
-
- return $status_info;
- }
-
- function api_status_show( $type){
- $user_info = api_get_user($a);
-
- // get last public message
-
- require_once('include/security.php');
- $item_normal = item_normal();
-
- $lastwall = q("SELECT * from item where
- item_private = 0 $item_normal
- and author_xchan = '%s'
- and allow_cid = '' and allow_gid = '' and deny_cid = '' and deny_gid = ''
- and verb = '%s'
- order by created desc limit 1",
- dbesc($user_info['guid']),
- dbesc(ACTIVITY_POST)
- );
-
- if($lastwall){
- $lastwall = $lastwall[0];
-
- $in_reply_to_status_id = '';
- $in_reply_to_user_id = '';
- $in_reply_to_screen_name = '';
-
- if($lastwall['author_xchan'] != $lastwall['owner_xchan']) {
- $w = q("select * from abook left join xchan on abook_xchan = xchan_hash where
- xchan_hash = '%s' limit 1",
- dbesc($lastwall['owner_xchan'])
- );
- if($w) {
- $in_reply_to_user_id = $w[0]['abook_id'];
- $in_reply_to_screen_name = substr($w[0]['xchan_addr'],0,strpos($w[0]['xchan_addr'],'@'));
- }
- }
-
- if ($lastwall['parent']!=$lastwall['id']) {
- $in_reply_to_status_id=$lastwall['thr_parent'];
- if(! $in_reply_to_user_id) {
- $in_reply_to_user_id = $user_info['id'];
- $in_reply_to_screen_name = $user_info['screen_name'];
- }
- }
- unobscure($lastwall);
- $status_info = array(
- 'text' => html2plain(prepare_text($lastwall['body'],$lastwall['mimetype']), 0),
- 'truncated' => false,
- 'created_at' => api_date($lastwall['created']),
- 'in_reply_to_status_id' => $in_reply_to_status_id,
- 'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'),
- 'id' => ($lastwall['id']),
- 'in_reply_to_user_id' => $in_reply_to_user_id,
- 'in_reply_to_screen_name' => $in_reply_to_screen_name,
- 'geo' => '',
- 'favorited' => false,
- 'coordinates' => $lastwall['coord'],
- 'place' => $lastwall['location'],
- 'contributors' => ''
- );
- $status_info['user'] = $user_info;
- if(array_key_exists('status',$status_info['user']))
- unset($status_info['user']['status']);
- }
-
- return api_apply_template("status", $type, array('$status' => $status_info));
-
- }
-
-
- /**
- * Returns extended information of a given user, specified by ID or screen name as per the required id parameter.
- * The author's most recent status will be returned inline.
- * http://developer.twitter.com/doc/get/users/show
- */
-
-// FIXME - this is essentially the same as api_status_show except for the template formatting at the end. Consolidate.
-
-
- function api_users_show( $type){
- $user_info = api_get_user($a);
-
- require_once('include/security.php');
- $item_normal = item_normal();
-
- $lastwall = q("SELECT * from item where 1
- and item_private != 0 $item_normal
- and author_xchan = '%s'
- and allow_cid = '' and allow_gid = '' and deny_cid = '' and deny_gid = ''
- and verb = '%s'
- order by created desc limit 1",
- dbesc($user_info['guid']),
- dbesc(ACTIVITY_POST)
- );
-
- if($lastwall){
- $lastwall = $lastwall[0];
-
- $in_reply_to_status_id = '';
- $in_reply_to_user_id = '';
- $in_reply_to_screen_name = '';
-
- if($lastwall['author_xchan'] != $lastwall['owner_xchan']) {
- $w = q("select * from abook left join xchan on abook_xchan = xchan_hash where
- xchan_hash = '%s' limit 1",
- dbesc($lastwall['owner_xchan'])
- );
- if($w) {
- $in_reply_to_user_id = $w[0]['abook_id'];
- $in_reply_to_screen_name = substr($w[0]['xchan_addr'],0,strpos($w[0]['xchan_addr'],'@'));
- }
- }
-
- if ($lastwall['parent']!=$lastwall['id']) {
- $in_reply_to_status_id=$lastwall['thr_parent'];
- if(! $in_reply_to_user_id) {
- $in_reply_to_user_id = $user_info['id'];
- $in_reply_to_screen_name = $user_info['screen_name'];
- }
- }
- unobscure($lastwall);
- $user_info['status'] = array(
- 'text' => html2plain(prepare_text($lastwall['body'],$lastwall['mimetype']), 0),
- 'truncated' => false,
- 'created_at' => api_date($lastwall['created']),
- 'in_reply_to_status_id' => $in_reply_to_status_id,
- 'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'),
- 'id' => (($w) ? $w[0]['abook_id'] : $user_info['id']),
- 'in_reply_to_user_id' => $in_reply_to_user_id,
- 'in_reply_to_screen_name' => $in_reply_to_screen_name,
- 'geo' => '',
- 'favorited' => false,
- 'coordinates' => $lastwall['coord'],
- 'place' => $lastwall['location'],
- 'contributors' => ''
- );
-
- }
- return api_apply_template("user", $type, array('$user' => $user_info));
-
- }
- api_register_func('api/users/show','api_users_show');
-
- /**
- *
- * http://developer.twitter.com/doc/get/statuses/home_timeline
- *
- * TODO: Optional parameters
- * TODO: Add reply info
- */
-
- function api_statuses_home_timeline( $type){
- if (api_user() === false)
- return false;
-
- $user_info = api_get_user($a);
- // get last network messages
-
-
- // params
- $count = (x($_REQUEST,'count')?$_REQUEST['count']:20);
- $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
- if($page < 0)
- $page = 0;
- $since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
- $max_id = (x($_REQUEST,'max_id')?$_REQUEST['max_id']:0);
- $exclude_replies = (x($_REQUEST,'exclude_replies')?1:0);
- //$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
-
- $start = $page*$count;
-
- //$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
-
- $sql_extra = '';
- if ($max_id > 0)
- $sql_extra .= ' AND `item`.`id` <= '.intval($max_id);
- if ($exclude_replies > 0)
- $sql_extra .= ' AND `item`.`parent` = `item`.`id`';
-
- if (api_user() != $user_info['uid']) {
- $observer = App::get_observer();
- require_once('include/permissions.php');
- if(! perm_is_allowed($user_info['uid'],(($observer) ? $observer['xchan_hash'] : ''),'view_stream'))
- return '';
- $sql_extra .= " and item_private = 0 ";
- }
-
- $item_normal = item_normal();
-
- $r = q("SELECT * from item WHERE uid = %d $item_normal
- $sql_extra
- AND id > %d
- ORDER BY received DESC LIMIT %d ,%d ",
- intval($user_info['uid']),
- intval($since_id),
- intval($start),
- intval($count)
- );
-
- xchan_query($r,true);
-
- $ret = api_format_items($r,$user_info);
-
- // We aren't going to try to figure out at the item, group, and page
- // level which items you've seen and which you haven't. If you're looking
- // at the network timeline just mark everything seen.
-
- if (api_user() == $user_info['uid']) {
- $r = q("UPDATE item SET item_unseen = 0 WHERE item_unseen = 1 and uid = %d",
- intval($user_info['uid'])
- );
- }
-
-
- $data = array('$statuses' => $ret);
- switch($type){
- case "atom":
- case "rss":
- $data = api_rss_extra( $data, $user_info);
- break;
- case "as":
- $as = api_format_as( $ret, $user_info);
- $as['title'] = App::$config['sitename']." Home Timeline";
- $as['link']['url'] = z_root()."/".$user_info["screen_name"]."/all";
- return($as);
- break;
- }
-
- return api_apply_template("timeline", $type, $data);
- }
- api_register_func('api/statuses/home_timeline','api_statuses_home_timeline', true);
- api_register_func('api/statuses/friends_timeline','api_statuses_home_timeline', true);
-
- function api_statuses_public_timeline( $type){
- if (api_user()===false) return false;
-
- $user_info = api_get_user($a);
-
- $sys = get_sys_channel();
-
- // params
- $count = (x($_REQUEST,'count')?$_REQUEST['count']:20);
- $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
- if ($page<0) $page=0;
- $since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
- $max_id = (x($_REQUEST,'max_id')?$_REQUEST['max_id']:0);
- //$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
-
- $start = $page*$count;
-
- //$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
-
- if ($max_id > 0)
- $sql_extra = 'AND `item`.`id` <= '.intval($max_id);
- require_once('include/security.php');
- $item_normal = item_normal();
-
- $r = q("select * from item where allow_cid = '' and allow_gid = ''
- and deny_cid = '' and deny_gid = ''
- and item_private = 0
- $item_normal
- and uid = " . $sys['channel_id'] . "
- $sql_extra
- AND id > %d group by mid
- order by received desc LIMIT %d OFFSET %d ",
- intval($since_id),
- intval($count),
- intval($start)
- );
-
- xchan_query($r,true);
-
- $ret = api_format_items($r,$user_info);
-
-
- $data = array('$statuses' => $ret);
- switch($type){
- case "atom":
- case "rss":
- $data = api_rss_extra( $data, $user_info);
- break;
- case "as":
- $as = api_format_as( $ret, $user_info);
- $as['title'] = App::$config['sitename']. " " . t('Public Timeline');
- $as['link']['url'] = z_root()."/";
- return($as);
- break;
- }
-
- return api_apply_template("timeline", $type, $data);
- }
- api_register_func('api/statuses/public_timeline','api_statuses_public_timeline', true);
-
- /**
- *
-
- */
- function api_statuses_show( $type){
- if (api_user()===false) return false;
-
- $user_info = api_get_user($a);
-
- // params
- $id = intval(argv(3));
- if(! $id)
- $id = $_REQUEST['id'];
-
- logger('API: api_statuses_show: '.$id);
-
- //$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
- $conversation = (x($_REQUEST,'conversation')?1:0);
-
- $sql_extra = '';
- if ($conversation)
- $sql_extra .= " AND `item`.`parent` = %d ORDER BY `received` ASC ";
- else
- $sql_extra .= " AND `item`.`id` = %d";
-
- $item_normal = item_normal();
- $r = q("select * from item where true $item_normal $sql_extra",
- intval($id)
- );
-
- xchan_query($r,true);
-
- $ret = api_format_items($r,$user_info);
-
-
- if ($conversation) {
- $data = array('$statuses' => $ret);
- return api_apply_template("timeline", $type, $data);
- } else {
- $data = array('$status' => $ret[0]);
- /*switch($type){
- case "atom":
- case "rss":
- $data = api_rss_extra( $data, $user_info);
- }*/
- return api_apply_template("status", $type, $data);
- }
- }
- api_register_func('api/statuses/show','api_statuses_show', true);
-
-
- /**
- *
- */
- function api_statuses_repeat( $type){
- if (api_user()===false) return false;
-
- $user_info = api_get_user($a);
-
- // params
- $id = intval(argv(3));
-
- logger('API: api_statuses_repeat: '.$id);
-
- //$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
-
- $observer = App::get_observer();
-
- $item_normal = item_normal();
-
- $r = q("SELECT * from item where and id = %d $item_normal limit 1",
- intval($id)
- );
-
- if(perm_is_allowed($r[0]['uid'],$observer['xchan_hash'],'view_stream')) {
- if ($r[0]['body'] != "") {
- $_REQUEST['body'] = html_entity_decode("&#x2672; ", ENT_QUOTES, 'UTF-8')."[zrl=".$r[0]['reply_url']."]".$r[0]['reply_author']."[/zrl] \n".$r[0]['body'];
- $_REQUEST['profile_uid'] = api_user();
- $_REQUEST['type'] = 'wall';
- $_REQUEST['api_source'] = true;
- $mod = new Zotlabs\Module\Item();
- $mod->post();
- }
- }
- else
- return false;
-
- if ($type == 'xml')
- $ok = "true";
- else
- $ok = "ok";
-
- return api_apply_template('test', $type, array('$ok' => $ok));
- }
- api_register_func('api/statuses/retweet','api_statuses_repeat', true);
-
- /**
- *
- */
-
- function api_statuses_destroy( $type){
- if (api_user()===false) return false;
-
- $user_info = api_get_user($a);
-
- // params
- $id = intval(argv(3));
- if($id) {
- // first prove that we own the item
-
- $r = q("select * from item where id = %d and uid = %d limit 1",
- intval($id),
- intval($user_info['uid'])
- );
- if(! $r)
- return false;
- }
- else {
- if($_REQUEST['namespace'] && $_REQUEST['remote_id']) {
- $r = q("select * from iconfig left join item on iconfig.iid = item.id
- where cat = 'system' and k = '%s' and v = '%s' and item.uid = %d limit 1",
- dbesc($_REQUEST['namespace']),
- dbesc($_REQUEST['remote_id']),
- intval($user_info['uid'])
- );
- if(! $r)
- return false;
- $id = $r[0]['iid'];
- }
- if($_REQUEST['namespace'] && $_REQUEST['comment_id']) {
- $r = q("select * from iconfig left join item on item.id = iconfig.iid where cat = 'system' and k = '%s' and v = '%s' and uid = %d and item.id != item.parent limit 1",
- dbesc($_REQUEST['namespace']),
- dbesc($_REQUEST['comment_id']),
- intval($user_info['uid'])
- );
- if(! $r)
- return false;
- $id = $r[0]['iid'];
- }
- }
- if(! $id)
- return false;
-
- logger('API: api_statuses_destroy: '.$id);
- require_once('include/items.php');
- drop_item($id, false);
-
-
- if ($type == 'xml')
- $ok = "true";
- else
- $ok = "ok";
-
- return api_apply_template('test', $type, array('$ok' => $ok));
- }
- api_register_func('api/statuses/destroy','api_statuses_destroy', true);
-
- /**
- *
- * http://developer.twitter.com/doc/get/statuses/mentions
- *
- */
-
-
- function api_statuses_mentions( $type){
- if (api_user()===false) return false;
-
- $user_info = api_get_user($a);
- // get last network messages
-
-
- // params
- $count = (x($_REQUEST,'count')?$_REQUEST['count']:20);
- $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
- if ($page<0) $page=0;
- $since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
- $max_id = (x($_REQUEST,'max_id')?$_REQUEST['max_id']:0);
- //$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
-
- $start = $page*$count;
-
- //$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
-
- $myurl = z_root() . '/channel/'. App::$user['nickname'];
- $myurl = substr($myurl,strpos($myurl,'://')+3);
- $myurl = str_replace(array('www.','.'),array('','\\.'),$myurl);
- $diasp_url = str_replace('/channel/','/u/',$myurl);
-
- $sql_extra .= " AND item_mentionsme = 1 ";
- if ($max_id > 0)
- $sql_extra .= " AND item.id <= " . intval($max_id) . " ";
-
- require_once('include/security.php');
- $item_normal = item_normal();
-
- $r = q("select * from item where uid = " . intval(api_user()) . "
- $item_normal $sql_extra
- AND id > %d group by mid
- order by received desc LIMIT %d OFFSET %d ",
- intval($since_id),
- intval($count),
- intval($start)
- );
-
- xchan_query($r,true);
-
-
- $ret = api_format_items($r,$user_info);
-
-
- $data = array('$statuses' => $ret);
- switch($type){
- case "atom":
- case "rss":
- $data = api_rss_extra( $data, $user_info);
- break;
- case "as":
- $as = api_format_as( $ret, $user_info);
- $as["title"] = App::$config['sitename']." Mentions";
- $as['link']['url'] = z_root()."/";
- return($as);
- break;
- }
-
- return api_apply_template("timeline", $type, $data);
- }
- api_register_func('api/statuses/mentions','api_statuses_mentions', true);
- // FIXME?? I don't think mentions and replies are congruent in this case
- api_register_func('api/statuses/replies','api_statuses_mentions', true);
-
-
- function api_statuses_user_timeline( $type){
- if (api_user()===false) return false;
-
- $user_info = api_get_user($a);
- // get last network messages
-
-
- logger("api_statuses_user_timeline: api_user: ". api_user() .
- "\nuser_info: ".print_r($user_info, true) .
- "\n_REQUEST: ".print_r($_REQUEST, true),
- LOGGER_DEBUG);
-
- // params
- $count = (x($_REQUEST,'count')?$_REQUEST['count']:20);
- $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
- if ($page<0) $page=0;
- $since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
- $exclude_replies = (x($_REQUEST,'exclude_replies')?1:0);
- //$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
-
- $start = $page*$count;
-
- $sql_extra = '';
- if ($user_info['self']==1) $sql_extra .= " AND `item`.`wall` = 1 ";
-
-//FIXME - this isn't yet implemented
- if ($exclude_replies > 0) $sql_extra .= ' AND `item`.`parent` = `item`.`id`';
-
-// $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
-// `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
-// `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn_id`, `contact`.`self`,
-// `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
-// FROM `item`, `contact`
-// WHERE `item`.`uid` = %d
-// AND `item`.`contact-id` = %d
-// AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0
-// AND `contact`.`id` = `item`.`contact-id`
-// AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
-// $sql_extra
-// AND `item`.`id`>%d
-// ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
-// intval(api_user()),
-// intval($user_info['id']),
-// intval($since_id),
-// intval($start), intval($count)
-// );
-
- $arr = array(
- 'uid' => api_user(),
- 'since_id' => $since_id,
- 'start' => $start,
- 'records' => $count);
-
- if ($user_info['self']==1)
- $arr['wall'] = 1;
- else
- $arr['cid'] = $user_info['id'];
-
-
- $r = items_fetch($arr,App::get_channel(),get_observer_hash());
-
- $ret = api_format_items($r,$user_info);
-
-
- $data = array('$statuses' => $ret);
- switch($type){
- case "atom":
- case "rss":
- $data = api_rss_extra( $data, $user_info);
- }
-
- return api_apply_template("timeline", $type, $data);
- }
-
- api_register_func('api/statuses/user_timeline','api_statuses_user_timeline', true);
-
-
-
- /**
- * Star/unstar an item
- * param: id : id of the item
- *
- * api v1 : https://web.archive.org/web/20131019055350/https://dev.twitter.com/docs/api/1/post/favorites/create/%3Aid
- */
- function api_favorites_create_destroy( $type){
-
- logger('favorites_create_destroy');
-
- if (api_user()===false)
- return false;
-
- $action = str_replace(".".$type,"",argv(2));
- if (argc() > 3) {
- $itemid = intval(argv(3));
- } else {
- $itemid = intval($_REQUEST['id']);
- }
-
- $item = q("SELECT * FROM item WHERE id = %d AND uid = %d",
- intval($itemid),
- intval(api_user())
- );
-
- if (! $item)
- return false;
-
- switch($action){
- case "create":
- $flags = $item[0]['item_starred'] = 1;
- break;
- case "destroy":
- $flags = $item[0]['item_starred'] = 0;
- break;
- default:
- return false;
- }
-
- $r = q("UPDATE item SET item_starred = %d where id = %d and uid = %d",
- intval($flags),
- intval($itemid),
- intval(api_user())
- );
- if(! $r)
- return false;
-
- $item = q("SELECT * FROM item WHERE id = %d AND uid = %d",
- intval($itemid),
- intval(api_user())
- );
-
- xchan_query($item,true);
-
-
- $user_info = api_get_user($a);
- $rets = api_format_items($item,$user_info);
- $ret = $rets[0];
-
- $data = array('$status' => $ret);
- switch($type){
- case "atom":
- case "rss":
- $data = api_rss_extra( $data, $user_info);
- }
-
- return api_apply_template("status", $type, $data);
- }
-
- api_register_func('api/favorites/create', 'api_favorites_create_destroy', true);
- api_register_func('api/favorites/destroy', 'api_favorites_create_destroy', true);
-
-
-
- function api_favorites( $type){
- if (api_user()===false)
- return false;
-
- $user_info = api_get_user($a);
-
- // params
- $count = (x($_REQUEST,'count')?$_REQUEST['count']:20);
- $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
- if($page < 0)
- $page = 0;
- $since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
- $max_id = (x($_REQUEST,'max_id')?$_REQUEST['max_id']:0);
- $exclude_replies = (x($_REQUEST,'exclude_replies')?1:0);
-
- $start = $page*$count;
-
- //$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
-
- $sql_extra = '';
- if ($max_id > 0)
- $sql_extra .= ' AND `item`.`id` <= '.intval($max_id);
- if ($exclude_replies > 0)
- $sql_extra .= ' AND `item`.`parent` = `item`.`id`';
-
- if (api_user() != $user_info['uid']) {
- $observer = App::get_observer();
- require_once('include/permissions.php');
- if(! perm_is_allowed($user_info['uid'],(($observer) ? $observer['xchan_hash'] : ''),'view_stream'))
- return '';
- $sql_extra .= " and item_private = 0 ";
- }
-
- $item_normal = item_normal();
-
- $r = q("SELECT * from item WHERE uid = %d $item_normal
- and item_starred = 1 $sql_extra
- AND id > %d
- ORDER BY received DESC LIMIT %d ,%d ",
- intval($user_info['uid']),
- intval($since_id),
- intval($start),
- intval($count)
- );
-
- xchan_query($r,true);
-
- $ret = api_format_items($r,$user_info);
-
- $data = array('$statuses' => $ret);
- switch($type){
- case "atom":
- case "rss":
- $data = api_rss_extra( $data, $user_info);
- break;
- case "as":
- $as = api_format_as( $ret, $user_info);
- $as['title'] = App::$config['sitename']." Home Timeline";
- $as['link']['url'] = z_root()."/".$user_info["screen_name"]."/all";
- return($as);
- break;
- }
-
- return api_apply_template("timeline", $type, $data);
-
- }
-
- api_register_func('api/favorites','api_favorites', true);
-
-
-
-
- function api_format_as( $ret, $user_info) {
-
- $as = array();
- $as['title'] = App::$config['sitename']." Public Timeline";
- $items = array();
- foreach ($ret as $item) {
- $singleitem["actor"]["displayName"] = $item["user"]["name"];
- $singleitem["actor"]["id"] = $item["user"]["contact_url"];
- $avatar[0]["url"] = $item["user"]["profile_image_url"];
- $avatar[0]["rel"] = "avatar";
- $avatar[0]["type"] = "";
- $avatar[0]["width"] = 96;
- $avatar[0]["height"] = 96;
- $avatar[1]["url"] = $item["user"]["profile_image_url"];
- $avatar[1]["rel"] = "avatar";
- $avatar[1]["type"] = "";
- $avatar[1]["width"] = 48;
- $avatar[1]["height"] = 48;
- $avatar[2]["url"] = $item["user"]["profile_image_url"];
- $avatar[2]["rel"] = "avatar";
- $avatar[2]["type"] = "";
- $avatar[2]["width"] = 24;
- $avatar[2]["height"] = 24;
- $singleitem["actor"]["avatarLinks"] = $avatar;
-
- $singleitem["actor"]["image"]["url"] = $item["user"]["profile_image_url"];
- $singleitem["actor"]["image"]["rel"] = "avatar";
- $singleitem["actor"]["image"]["type"] = "";
- $singleitem["actor"]["image"]["width"] = 96;
- $singleitem["actor"]["image"]["height"] = 96;
- $singleitem["actor"]["type"] = "person";
- $singleitem["actor"]["url"] = $item["person"]["contact_url"];
- $singleitem["actor"]["statusnet:profile_info"]["local_id"] = $item["user"]["id"];
- $singleitem["actor"]["statusnet:profile_info"]["following"] = $item["user"]["following"] ? "true" : "false";
- $singleitem["actor"]["statusnet:profile_info"]["blocking"] = "false";
- $singleitem["actor"]["contact"]["preferredUsername"] = $item["user"]["screen_name"];
- $singleitem["actor"]["contact"]["displayName"] = $item["user"]["name"];
- $singleitem["actor"]["contact"]["addresses"] = "";
-
- $singleitem["body"] = $item["text"];
- $singleitem["object"]["displayName"] = $item["text"];
- $singleitem["object"]["id"] = $item["url"];
- $singleitem["object"]["type"] = "note";
- $singleitem["object"]["url"] = $item["url"];
- //$singleitem["context"] =;
- $singleitem["postedTime"] = date("c", strtotime($item["published"]));
- $singleitem["provider"]["objectType"] = "service";
- $singleitem["provider"]["displayName"] = "Test";
- $singleitem["provider"]["url"] = "http://test.tld";
- $singleitem["title"] = $item["text"];
- $singleitem["verb"] = "post";
- $singleitem["statusnet:notice_info"]["local_id"] = $item["id"];
- $singleitem["statusnet:notice_info"]["source"] = $item["source"];
- $singleitem["statusnet:notice_info"]["favorite"] = "false";
- $singleitem["statusnet:notice_info"]["repeated"] = "false";
- //$singleitem["original"] = $item;
- $items[] = $singleitem;
- }
- $as['items'] = $items;
- $as['link']['url'] = z_root()."/".$user_info["screen_name"]."/all";
- $as['link']['rel'] = "alternate";
- $as['link']['type'] = "text/html";
- return($as);
- }
-
- function api_format_message($item, $recipient, $sender) {
- // standard meta information
- $ret = array(
- 'id' => $item['id'],
- 'created_at' => api_date($item['created']),
- 'sender_id' => $sender['id'] ,
- 'sender_screen_name' => $sender['screen_name'],
- 'sender' => $sender,
- 'recipient_id' => $recipient['id'],
- 'recipient_screen_name' => $recipient['screen_name'],
- 'recipient' => $recipient,
- );
- unobscure_mail($item);
- //don't send title to regular StatusNET requests to avoid confusing these apps
- if (x($_GET, 'getText')) {
- $ret['title'] = $item['title'] ;
- if ($_GET["getText"] == "html") {
- $ret['text'] = prepare_text($item['body'],$item['mimetype']);
- }
- elseif ($_GET["getText"] == "plain") {
- $ret['text'] = html2plain(prepare_text($item['body'],$item['mimetype']), 0);
- }
- }
- else {
- $ret['text'] = $item['title']."\n".html2plain(prepare_text($item['body'],$item['mimetype']), 0);
- }
- if (isset($_GET["getUserObjects"]) && $_GET["getUserObjects"] == "false") {
- unset($ret['sender']);
- unset($ret['recipient']);
- }
-
- return $ret;
- }
-
- function api_format_items($r,$user_info) {
-
- //logger('api_format_items: ' . print_r($r,true));
-
- //logger('api_format_items: ' . print_r($user_info,true));
-
- $ret = array();
-
- $x = array('items' => $r,'api_user' => api_user(),'user_info' => $user_info);
- call_hooks('api_format_items',$x);
- $r = $x['items'];
-
- if(! $r)
- return $ret;
-
- foreach($r as $item) {
-
- localize_item($item);
-
- $status_user = (($item['author_xchan']==$user_info['guid'])?$user_info: api_item_get_user($item));
- if(array_key_exists('status',$status_user))
- unset($status_user['status']);
-
- if($item['parent'] != $item['id']) {
- $r = q("select id from item where parent= %d and id < %d order by id desc limit 1",
- intval($item['parent']),
- intval($item['id'])
- );
- if ($r)
- $in_reply_to_status_id = $r[0]['id'];
- else
- $in_reply_to_status_id = $item['parent'];
-
- xchan_query($r,true);
-
- $in_reply_to_screen_name = $r[0]['author']['xchan_name'];
- $in_reply_to_user_id = $r[0]['author']['abook_id'];
-
- } else {
- $in_reply_to_screen_name = '';
- $in_reply_to_user_id = 0;
- $in_reply_to_status_id = 0;
- }
- unobscure($item);
- // Workaround for ostatus messages where the title is identically to the body
- $statusbody = trim(html2plain(prepare_text($item['body'],$item['mimetype']), 0));
- $statustitle = trim($item['title']);
-
- if (($statustitle != '') and (strpos($statusbody, $statustitle) !== false))
- $statustext = trim($statusbody);
- else
- $statustext = trim($statustitle."\n\n".$statusbody);
-
-
- $status = array(
- 'text' => $statustext,
- 'truncated' => False,
- 'created_at' => api_date($item['created']),
- 'in_reply_to_status_id' => $in_reply_to_status_id,
- 'source' => (($item['app']) ? $item['app'] : 'web'),
- 'id' => intval($item['id']),
- 'in_reply_to_user_id' => $in_reply_to_user_id,
- 'in_reply_to_screen_name' => $in_reply_to_screen_name,
- 'geo' => '',
- 'favorited' => (intval($item['item_starred']) ? true : false),
- 'user' => $status_user ,
- 'statusnet_html' => trim(prepare_text($item['body'],$item['mimetype'])),
-
- 'statusnet_conversation_id' => $item['parent'],
- );
-
- // Seesmic doesn't like the following content
- if ($_SERVER['HTTP_USER_AGENT'] != 'Seesmic') {
- $status2 = array(
- 'updated' => api_date($item['edited']),
- 'published' => api_date($item['created']),
- 'message_id' => $item['mid'],
- 'url' => $item['plink'],
- 'coordinates' => $item['coord'],
- 'place' => $item['location'],
- 'contributors' => '',
- 'annotations' => '',
- 'entities' => '',
- 'objecttype' => (($item['obj_type']) ? $item['obj_type'] : ACTIVITY_OBJ_NOTE),
- 'verb' => (($item['verb']) ? $item['verb'] : ACTIVITY_POST),
- 'self' => z_root()."/api/statuses/show/".$item['id'].".".$type,
- 'edit' => z_root()."/api/statuses/show/".$item['id'].".".$type,
- );
-
- $status = array_merge($status, $status2);
- }
-
- $ret[]=$status;
- };
- return $ret;
- }
-
-
- function api_account_rate_limit_status($type) {
-
- $hash = array(
- 'reset_time_in_seconds' => strtotime('now + 1 hour'),
- 'remaining_hits' => (string) 150,
- 'hourly_limit' => (string) 150,
- 'reset_time' => datetime_convert('UTC','UTC','now + 1 hour',ATOM_TIME),
- );
- if ($type == "xml")
- $hash['resettime_in_seconds'] = $hash['reset_time_in_seconds'];
-
- return api_apply_template('ratelimit', $type, array('$hash' => $hash));
-
- }
- api_register_func('api/account/rate_limit_status','api_account_rate_limit_status',true);
-
- function api_help_test($type) {
-
- if ($type == 'xml')
- $ok = "true";
- else
- $ok = "ok";
-
- return api_apply_template('test', $type, array('$ok' => $ok));
-
- }
- api_register_func('api/help/test','api_help_test',false);
-
- /**
- * https://dev.twitter.com/docs/api/1/get/statuses/friends
- * This function is deprecated by Twitter
- * returns: json, xml
- **/
- function api_statuses_f( $type, $qtype) {
- if (api_user()===false) return false;
- $user_info = api_get_user($a);
-
-
- // friends and followers only for self
- if ($user_info['self']==0){
- return false;
- }
-
- if (x($_GET,'cursor') && $_GET['cursor']=='undefined'){
- /* this is to stop Hotot to load friends multiple times
- * I'm not sure if I'm missing return something or
- * is a bug in hotot. Workaround, meantime
- */
-
- /*$ret=Array();
- return array('$users' => $ret);*/
- return false;
- }
-
-// @fixme - update for hubzilla extensible perms using abconfig or find a better way to do it
- // For Red, the closest thing we can do to figure out if you're friends is if both of you are sending each other your streams.
- // This won't work if either of you send your stream to everybody on the network
- if($qtype == 'friends')
- $sql_extra = sprintf(" AND ( abook_their_perms & %d )>0 and ( abook_my_perms & %d )>0 ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
- if($qtype == 'followers')
- $sql_extra = sprintf(" AND ( abook_my_perms & %d )>0 and not ( abook_their_perms & %d )>0 ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
-
- $r = q("SELECT abook_id FROM abook where abook_self = 0 and abook_channel = %d $sql_extra",
- intval(api_user())
- );
-
- $ret = array();
- foreach($r as $cid){
- $ret[] = api_get_user( $cid['abook_id']);
- }
-
-
- return array('$users' => $ret);
-
- }
- function api_statuses_friends( $type){
- $data = api_statuses_f($type,"friends");
- if ($data===false) return false;
- return api_apply_template("friends", $type, $data);
- }
- function api_statuses_followers( $type){
- $data = api_statuses_f($type,"followers");
- if ($data===false) return false;
- return api_apply_template("friends", $type, $data);
- }
- api_register_func('api/statuses/friends','api_statuses_friends',true);
- api_register_func('api/statuses/followers','api_statuses_followers',true);
-
-
-
-
-
-
- function api_statusnet_config($type) {
-
- load_config('system');
-
- $name = get_config('system','sitename');
- $server = App::get_hostname();
- $logo = z_root() . '/images/rm-64.png';
- $email = get_config('system','admin_email');
- $closed = ((get_config('system','register_policy') == REGISTER_CLOSED) ? 'true' : 'false');
- $private = ((get_config('system','block_public')) ? 'true' : 'false');
- $textlimit = (string) ((get_config('system','max_import_size')) ? get_config('system','max_import_size') : 200000);
- if(get_config('system','api_import_size'))
- $texlimit = string(get_config('system','api_import_size'));
- $ssl = ((get_config('system','have_ssl')) ? 'true' : 'false');
- $sslserver = (($ssl === 'true') ? str_replace('http:','https:',z_root()) : '');
-
- $config = array(
- 'site' => array('name' => $name,'server' => $server, 'theme' => 'default', 'path' => '',
- 'logo' => $logo, 'fancy' => 'true', 'language' => 'en', 'email' => $email, 'broughtby' => '',
- 'broughtbyurl' => '', 'timezone' => 'UTC', 'closed' => $closed, 'inviteonly' => 'false',
- 'private' => $private, 'textlimit' => $textlimit, 'sslserver' => $sslserver, 'ssl' => $ssl,
- 'shorturllength' => '30',
- 'hubzilla' => array(
- 'PLATFORM_NAME' => Zotlabs\Lib\System::get_platform_name(),
- 'STD_VERSION' => Zotlabs\Lib\System::get_project_version(),
- 'ZOT_REVISION' => ZOT_REVISION,
- 'DB_UPDATE_VERSION' => Zotlabs\Lib\System::get_update_version()
- )
- ));
-
- return api_apply_template('config', $type, array('$config' => $config));
-
- }
- api_register_func('api/statusnet/config','api_statusnet_config',false);
- api_register_func('api/friendica/config','api_statusnet_config',false);
- api_register_func('api/red/config','api_statusnet_config',false);
- api_register_func('api/hz/1.0/config','api_statusnet_config',false);
-
- function api_statusnet_version($type) {
-
- // liar
-
- if($type === 'xml') {
- header("Content-type: application/xml");
- echo '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n" . '<version>0.9.7</version>' . "\r\n";
- killme();
- }
- elseif($type === 'json') {
- header("Content-type: application/json");
- echo '"0.9.7"';
- killme();
- }
- }
- api_register_func('api/statusnet/version','api_statusnet_version',false);
-
-
- function api_friendica_version($type) {
-
- if($type === 'xml') {
- header("Content-type: application/xml");
- echo '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n" . '<version>' . Zotlabs\Lib\System::get_project_version() . '</version>' . "\r\n";
- killme();
- }
- elseif($type === 'json') {
- header("Content-type: application/json");
- echo '"' . Zotlabs\Lib\System::get_project_version() . '"';
- killme();
- }
- }
- api_register_func('api/friendica/version','api_friendica_version',false);
- api_register_func('api/red/version','api_friendica_version',false);
- api_register_func('api/hz/1.0/version','api_friendica_version',false);
-
-
- function api_ff_ids($type,$qtype) {
- if(! api_user())
- return false;
-
-
- // For Red, the closest thing we can do to figure out if you're friends is if both of you are sending each other your streams.
- // This won't work if either of you send your stream to everybody on the network
-
- if($qtype == 'friends')
- $sql_extra = sprintf(" AND ( abook_their_perms & %d )>0 and ( abook_my_perms & %d )>0 ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
- if($qtype == 'followers')
- $sql_extra = sprintf(" AND ( abook_my_perms & %d )>0 and not ( abook_their_perms & %d )>0 ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
-
- $r = q("SELECT abook_id FROM abook where abook_self = 0 and abook_channel = %d $sql_extra",
- intval(api_user())
- );
-
- if(is_array($r)) {
- if($type === 'xml') {
- header("Content-type: application/xml");
- echo '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n" . '<ids>' . "\r\n";
- foreach($r as $rr)
- echo '<id>' . $rr['abook_id'] . '</id>' . "\r\n";
- echo '</ids>' . "\r\n";
- killme();
- }
- elseif($type === 'json') {
- $ret = array();
- header("Content-type: application/json");
- foreach($r as $rr) $ret[] = $rr['abook_id'];
- echo json_encode($ret);
- killme();
- }
- }
- }
-
- function api_friends_ids($type) {
- api_ff_ids($type,'friends');
- }
- function api_followers_ids($type) {
- api_ff_ids($type,'followers');
- }
- api_register_func('api/friends/ids','api_friends_ids',true);
- api_register_func('api/followers/ids','api_followers_ids',true);
-
-
- function api_direct_messages_new( $type) {
- if (api_user()===false) return false;
-
- if (!x($_POST, "text") || !x($_POST,"screen_name")) return;
-
- $sender = api_get_user($a);
-
- require_once("include/message.php");
-
- // in a decentralised world the screen name is ambiguous
-
- $r = q("SELECT `abook_id` FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE `abook_channel`=%d and xchan_addr like '%s'",
- intval(api_user()),
- dbesc($_POST['screen_name'] . '@%')
- );
-
- $recipient = api_get_user( $r[0]['abook_id']);
- $replyto = '';
- $sub = '';
- if (x($_REQUEST,'replyto')) {
- $r = q('SELECT `parent_mid`, `title` FROM `mail` WHERE `uid`=%d AND `id`=%d',
- intval(api_user()),
- intval($_REQUEST['replyto']));
- $replyto = $r[0]['parent_mid'];
- $sub = $r[0]['title'];
- }
- else {
- if (x($_REQUEST,'title')) {
- $sub = $_REQUEST['title'];
- }
- else {
- $sub = ((strlen($_POST['text'])>10)?substr($_POST['text'],0,10)."...":$_POST['text']);
- }
- }
-
- $id = send_message(api_user(),$recipient['guid'], $_POST['text'], $sub, $replyto);
-
- if ($id>-1) {
- $r = q("SELECT * FROM `mail` WHERE id=%d", intval($id));
- $ret = api_format_message($r[0], $recipient, $sender);
-
- } else {
- $ret = array("error"=>$id);
- }
-
- $data = Array('$messages'=>$ret);
-
- switch($type){
- case "atom":
- case "rss":
- $data = api_rss_extra( $data, $user_info);
- }
-
- return api_apply_template("direct_messages", $type, $data);
-
- }
- api_register_func('api/direct_messages/new','api_direct_messages_new',true);
-
- function api_direct_messages_box( $type, $box) {
- if (api_user()===false) return false;
-
- $user_info = api_get_user($a);
-
- // params
- $count = (x($_GET,'count')?$_GET['count']:20);
- $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
- if ($page<0) $page=0;
-
- $start = $page*$count;
- $channel = App::get_channel();
-
- $profile_url = z_root() . '/channel/' . $channel['channel_address'];
- if ($box=="sentbox") {
- $sql_extra = "`from_xchan`='".dbesc( $channel['channel_hash'] )."'";
- }
- elseif ($box=="conversation") {
- $sql_extra = "`parent_mid`='".dbesc( $_GET["uri"] ) ."'";
- }
- elseif ($box=="all") {
- $sql_extra = "true";
- }
- elseif ($box=="inbox") {
- $sql_extra = "`from_xchan`!='".dbesc( $channel['channel_hash'] )."'";
- }
-
- $r = q("SELECT * FROM `mail` WHERE channel_id = %d AND $sql_extra ORDER BY created DESC LIMIT %d OFFSET %d",
- intval(api_user()),
- intval($count), intval($start)
- );
-
- $ret = Array();
- if($r) {
- foreach($r as $item) {
- if ($item['from_xchan'] == $channel['channel_hash']) {
- $sender = $user_info;
- $recipient = api_get_user( null, $item['to_xchan']);
- }
- else {
- $sender = api_get_user( null, $item['from_xchan']);
- $recipient = $user_info;
- }
-
- $ret[]=api_format_message($item, $recipient, $sender);
- }
- }
-
-
- $data = array('$messages' => $ret);
- switch($type){
- case "atom":
- case "rss":
- $data = api_rss_extra( $data, $user_info);
- }
-
- return api_apply_template("direct_messages", $type, $data);
-
- }
-
- function api_direct_messages_sentbox( $type){
- return api_direct_messages_box( $type, "sentbox");
- }
- function api_direct_messages_inbox( $type){
- return api_direct_messages_box( $type, "inbox");
- }
- function api_direct_messages_all( $type){
- return api_direct_messages_box( $type, "all");
- }
- function api_direct_messages_conversation( $type){
- return api_direct_messages_box( $type, "conversation");
- }
- api_register_func('api/direct_messages/conversation','api_direct_messages_conversation',true);
- api_register_func('api/direct_messages/all','api_direct_messages_all',true);
- api_register_func('api/direct_messages/sent','api_direct_messages_sentbox',true);
- api_register_func('api/direct_messages','api_direct_messages_inbox',true);
function api_oauth_request_token( $type){
@@ -2355,7 +220,7 @@ require_once('include/api_auth.php');
$r = $oauth->fetch_request_token($req);
}catch(Exception $e){
logger('oauth_exception: ' . print_r($e->getMessage(),true));
- echo "error=". OAuth1Util::urlencode_rfc3986($e->getMessage());
+ echo 'error=' . OAuth1Util::urlencode_rfc3986($e->getMessage());
killme();
}
echo $r;
@@ -2365,42 +230,15 @@ require_once('include/api_auth.php');
function api_oauth_access_token( $type){
try{
$oauth = new ZotOAuth1();
- $req = OAuth1Request::from_request();
- $r = $oauth->fetch_access_token($req);
- }catch(Exception $e){
- echo "error=". OAuth1Util::urlencode_rfc3986($e->getMessage()); killme();
+ $req = OAuth1Request::from_request();
+ $r = $oauth->fetch_access_token($req);
+ }
+ catch(Exception $e) {
+ echo 'error=' . OAuth1Util::urlencode_rfc3986($e->getMessage());
+ killme();
}
echo $r;
killme();
}
- api_register_func('api/oauth/request_token', 'api_oauth_request_token', false);
- api_register_func('api/oauth/access_token', 'api_oauth_access_token', false);
-
-
-/*
-Not implemented by now:
-statuses/retweets_of_me
-friendships/create
-friendships/destroy
-friendships/exists
-friendships/show
-account/update_location
-account/update_profile_background_image
-account/update_profile_image
-blocks/create
-blocks/destroy
-
-Not implemented in status.net:
-statuses/retweeted_to_me
-statuses/retweeted_by_me
-direct_messages/destroy
-account/end_session
-account/update_delivery_device
-notifications/follow
-notifications/leave
-blocks/exists
-blocks/blocking
-lists
-*/
diff --git a/include/api_zot.php b/include/api_zot.php
new file mode 100644
index 000000000..d1979c3ae
--- /dev/null
+++ b/include/api_zot.php
@@ -0,0 +1,481 @@
+<?php
+
+ function zot_api_init() {
+ api_register_func('api/export/basic','api_export_basic', true);
+ api_register_func('api/red/channel/export/basic','api_export_basic', true);
+ api_register_func('api/z/1.0/channel/export/basic','api_export_basic', true);
+ api_register_func('api/red/channel/stream','api_channel_stream', true);
+ api_register_func('api/z/1.0/channel/stream','api_channel_stream', true);
+ api_register_func('api/red/files','api_attach_list', true);
+ api_register_func('api/z/1.0/files','api_attach_list', true);
+ api_register_func('api/red/filemeta', 'api_file_meta', true);
+ api_register_func('api/z/1.0/filemeta', 'api_file_meta', true);
+ api_register_func('api/red/filedata', 'api_file_data', true);
+ api_register_func('api/z/1.0/filedata', 'api_file_data', true);
+ api_register_func('api/red/file/export', 'api_file_export', true);
+ api_register_func('api/z/1.0/file/export', 'api_file_export', true);
+ api_register_func('api/red/file', 'api_file_detail', true);
+ api_register_func('api/z/1.0/file', 'api_file_detail', true);
+ api_register_func('api/red/albums','api_albums', true);
+ api_register_func('api/z/1.0/albums','api_albums', true);
+ api_register_func('api/red/photos','api_photos', true);
+ api_register_func('api/z/1.0/photos','api_photos', true);
+ api_register_func('api/red/photo', 'api_photo_detail', true);
+ api_register_func('api/z/1.0/photo', 'api_photo_detail', true);
+ api_register_func('api/red/group_members','api_group_members', true);
+ api_register_func('api/z/1.0/group_members','api_group_members', true);
+ api_register_func('api/red/group','api_group', true);
+ api_register_func('api/z/1.0/group','api_group', true);
+ api_register_func('api/red/xchan','api_red_xchan',true);
+ api_register_func('api/z/1.0/xchan','api_red_xchan',true);
+ api_register_func('api/red/item/update','zot_item_update', true);
+ api_register_func('api/z/1.0/item/update','zot_item_update', true);
+ api_register_func('api/red/item/full','red_item', true);
+ api_register_func('api/z/1.0/item/full','red_item', true);
+
+ api_register_func('api/z/1.0/network/stream','api_network_stream', true);
+ api_register_func('api/z/1.0/abook','api_zot_abook_xchan',true);
+ api_register_func('api/z/1.0/abconfig','api_zot_abconfig',true);
+ api_register_func('api/z/1.0/perm_allowed','api_zot_perm_allowed',true);
+
+ return;
+ }
+
+
+ /*
+ * Red basic channel export
+ */
+
+ function api_export_basic($type) {
+ if(api_user() === false) {
+ logger('api_export_basic: no user');
+ return false;
+ }
+
+ json_return_and_die(identity_basic_export(api_user(),(($_REQUEST['posts']) ? intval($_REQUEST['posts']) : 0 )));
+ }
+
+
+ function api_network_stream($type) {
+ if(api_user() === false) {
+ logger('api_channel_stream: no user');
+ return false;
+ }
+
+ $channel = channelx_by_n(api_user());
+ if(! $channel)
+ return false;
+
+
+ if($_SERVER['REQUEST_METHOD'] == 'POST') {
+ // json_return_and_die(post_activity_item($_REQUEST));
+ }
+ else {
+ $mindate = (($_REQUEST['mindate']) ? datetime_convert('UTC','UTC',$_REQUEST['mindate']) : '');
+ if(! $mindate)
+ $mindate = datetime_convert('UTC','UTC', 'now - 14 days');
+
+ $arr = $_REQUEST;
+ $ret = [];
+ $i = items_fetch($arr,App::get_channel(),get_observer_hash());
+ if($i) {
+ foreach($i as $iv) {
+ $ret[] = encode_item($iv);
+ }
+ }
+
+ json_return_and_die($ret);
+ }
+ }
+
+
+
+
+
+
+ function api_channel_stream($type) {
+ if(api_user() === false) {
+ logger('api_channel_stream: no user');
+ return false;
+ }
+
+ $channel = channelx_by_n(api_user());
+ if(! $channel)
+ return false;
+
+
+ if($_SERVER['REQUEST_METHOD'] == 'POST') {
+ json_return_and_die(post_activity_item($_REQUEST));
+ }
+ else {
+ $mindate = (($_REQUEST['mindate']) ? datetime_convert('UTC','UTC',$_REQUEST['mindate']) : '');
+ if(! $mindate)
+ $mindate = datetime_convert('UTC','UTC', 'now - 14 days');
+
+ json_return_and_die(zot_feed($channel['channel_id'],$channel['channel_hash'],[ 'mindate' => $mindate ]));
+ }
+ }
+
+ function api_attach_list($type) {
+ if(api_user() === false)
+ return false;
+
+ logger('api_user: ' . api_user());
+ $hash = ((array_key_exists('filehash',$_REQUEST)) ? $_REQUEST['filehash'] : '');
+ $filename = ((array_key_exists('filename',$_REQUEST)) ? $_REQUEST['filename'] : '');
+ $filetype = ((array_key_exists('filetype',$_REQUEST)) ? $_REQUEST['filetype'] : '');
+ $start = ((array_key_exists('start',$_REQUEST)) ? intval($_REQUEST['start']) : 0);
+ $records = ((array_key_exists('records',$_REQUEST)) ? intval($_REQUEST['records']) : 0);
+
+ $x = attach_list_files(api_user(),get_observer_hash(),$hash,$filename,$filetype,'created asc',$start,$records);
+ if($start || $records) {
+ $x['start'] = $start;
+ $x['records'] = count($x['results']);
+ }
+
+ json_return_and_die($x);
+ }
+
+
+ function api_file_meta($type) {
+ if(api_user() === false)
+ return false;
+ if(! $_REQUEST['file_id']) return false;
+ $r = q("select * from attach where uid = %d and hash = '%s' limit 1",
+ intval(api_user()),
+ dbesc($_REQUEST['file_id'])
+ );
+ if($r) {
+ unset($r[0]['content']);
+ $ret = array('attach' => $r[0]);
+ json_return_and_die($ret);
+ }
+ killme();
+ }
+
+
+
+ function api_file_data($type) {
+ if(api_user() === false)
+ return false;
+ if(! $_REQUEST['file_id']) return false;
+ $start = (($_REQUEST['start']) ? intval($_REQUEST['start']) : 0);
+ $length = (($_REQUEST['length']) ? intval($_REQUEST['length']) : 0);
+
+ $r = q("select * from attach where uid = %d and hash like '%s' limit 1",
+ intval(api_user()),
+ dbesc($_REQUEST['file_id'] . '%')
+ );
+ if($r) {
+ $ptr = $r[0];
+ if($length === 0)
+ $length = intval($ptr['filesize']);
+
+ if($ptr['is_dir'])
+ $ptr['content'] = '';
+ elseif(! intval($r[0]['os_storage'])) {
+ $ptr['start'] = $start;
+ $x = substr(dbunescbin($ptr['content']),$start,$length);
+ $ptr['length'] = strlen($x);
+ $ptr['content'] = base64_encode($x);
+ }
+ else {
+ $fp = fopen(dbunescbin($ptr['content']),'r');
+ if($fp) {
+ $seek = fseek($fp,$start,SEEK_SET);
+ $x = fread($fp,$length);
+ $ptr['start'] = $start;
+ $ptr['length'] = strlen($x);
+ $ptr['content'] = base64_encode($x);
+ }
+ }
+
+ $ret = array('attach' => $ptr);
+ json_return_and_die($ret);
+ }
+ killme();
+ }
+
+
+ function api_file_export($type) {
+ if(api_user() === false)
+ return false;
+ if(! $_REQUEST['file_id'])
+ return false;
+
+ $ret = attach_export_data(api_user(),$_REQUEST['file_id']);
+ if($ret) {
+ json_return_and_die($ret);
+ }
+ killme();
+ }
+
+
+ function api_file_detail($type) {
+ if(api_user() === false)
+ return false;
+ if(! $_REQUEST['file_id']) return false;
+ $r = q("select * from attach where uid = %d and hash = '%s' limit 1",
+ intval(api_user()),
+ dbesc($_REQUEST['file_id'])
+ );
+ if($r) {
+ if($r[0]['is_dir'])
+ $r[0]['content'] = '';
+ elseif(intval($r[0]['os_storage']))
+ $r[0]['content'] = base64_encode(file_get_contents(dbunescbin($r[0]['content'])));
+ else
+ $r[0]['content'] = base64_encode(dbunescbin($r[0]['content']));
+
+ $ret = array('attach' => $r[0]);
+ json_return_and_die($ret);
+ }
+ killme();
+ }
+
+
+
+ function api_albums($type) {
+ if(api_user() === false)
+ return false;
+ json_return_and_die(photos_albums_list(App::get_channel(),App::get_observer()));
+ }
+
+ function api_photos($type) {
+ if(api_user() === false)
+ return false;
+ $album = $_REQUEST['album'];
+ json_return_and_die(photos_list_photos(App::get_channel(),App::get_observer(),$album));
+ }
+
+ function api_photo_detail($type) {
+ if(api_user() === false)
+ return false;
+ if(! $_REQUEST['photo_id']) return false;
+ $scale = ((array_key_exists('scale',$_REQUEST)) ? intval($_REQUEST['scale']) : 0);
+ $r = q("select * from photo where uid = %d and resource_id = '%s' and imgscale = %d limit 1",
+ intval(local_channel()),
+ dbesc($_REQUEST['photo_id']),
+ intval($scale)
+ );
+ if($r) {
+ $data = dbunescbin($r[0]['content']);
+ if(array_key_exists('os_storage',$r[0]) && intval($r[0]['os_storage']))
+ $data = file_get_contents($data);
+ $r[0]['content'] = base64_encode($data);
+ $ret = array('photo' => $r[0]);
+ $i = q("select id from item where uid = %d and resource_type = 'photo' and resource_id = '%s' limit 1",
+ intval(local_channel()),
+ dbesc($_REQUEST['photo_id'])
+ );
+ if($i) {
+ $ii = q("select * from item where parent = %d order by id",
+ intval($i[0]['id'])
+ );
+ if($ii) {
+ xchan_query($ii,true,0);
+ $ii = fetch_post_tags($ii,true);
+ if($ii) {
+ $ret['item'] = array();
+ foreach($ii as $iii)
+ $ret['item'][] = encode_item($iii,true);
+ }
+ }
+ }
+
+ json_return_and_die($ret);
+ }
+ killme();
+ }
+
+ function api_group_members($type) {
+ if(api_user() === false)
+ return false;
+
+ $r = null;
+
+ if($_REQUEST['group_id']) {
+ $r = q("select * from groups where uid = %d and id = %d limit 1",
+ intval(api_user()),
+ intval($_REQUEST['group_id'])
+ );
+ }
+ elseif($_REQUEST['group_name']) {
+ $r = q("select * from groups where uid = %d and gname = '%s' limit 1",
+ intval(api_user()),
+ dbesc($_REQUEST['group_name'])
+ );
+ }
+
+ if($r) {
+ $x = q("select * from group_member left join abook on abook_xchan = xchan and abook_channel = group_member.uid left join xchan on group_member.xchan = xchan.xchan_hash
+ where gid = %d",
+ intval($r[0]['id'])
+ );
+ json_return_and_die($x);
+ }
+
+ }
+
+ function api_group($type) {
+ if(api_user() === false)
+ return false;
+
+ $r = q("select * from groups where uid = %d",
+ intval(api_user())
+ );
+ json_return_and_die($r);
+ }
+
+
+ function api_red_xchan($type) {
+ if(api_user() === false)
+ return false;
+ logger('api_xchan');
+ require_once('include/hubloc.php');
+
+ if($_SERVER['REQUEST_METHOD'] === 'POST') {
+ // $r = xchan_store($_REQUEST);
+ }
+ $r = xchan_fetch($_REQUEST);
+ json_return_and_die($r);
+ };
+
+ function api_zot_abook_xchan($type) {
+ logger('api_abook_xchan');
+
+ if(api_user() === false)
+ return false;
+
+ $sql_extra = ((array_key_exists('abook_id',$_REQUEST) && intval($_REQUEST['abook_id'])) ? ' and abook_id = ' . intval($_REQUEST['abook_id']) . ' ' : '');
+ if($_SERVER['REQUEST_METHOD'] === 'POST') {
+ // update
+ }
+ $r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d $sql_extra ",
+ intval(api_user())
+ );
+
+ json_return_and_die($r);
+ };
+
+ function api_zot_abconfig($type) {
+
+ if(api_user() === false)
+ return false;
+
+ $sql_extra = ((array_key_exists('abook_id',$_REQUEST) && intval($_REQUEST['abook_id'])) ? ' and abook_id = ' . intval($_REQUEST['abook_id']) . ' ' : '');
+ if($_SERVER['REQUEST_METHOD'] === 'POST') {
+ // update
+ }
+ $r = q("select abconfig.* from abconfig left join abook on abook_xchan = abconfig.xchan and abook_channel = abconfig.chan where abconfig.chan = %d $sql_extra ",
+ intval(api_user())
+ );
+
+ json_return_and_die($r);
+
+ }
+
+ function api_zot_perm_allowed($type) {
+ if(api_user() === false)
+ return false;
+
+ $perm = ((array_key_exists('perm',$_REQUEST)) ? $_REQUEST['perm'] : '');
+
+ if(array_key_exists('abook_id',$_REQUEST) && intval($_REQUEST['abook_id'])) {
+ $r = q("select abook_xchan as hash from abook where abook_id = %d and abook_channel = %d limit 1",
+ intval($_REQUEST['abook_id']),
+ intval(api_user())
+ );
+ }
+ else {
+ $r = xchan_fetch($_REQUEST);
+ }
+
+ $x = false;
+
+ if($r) {
+ if($perm)
+ $x = [ [ 'perm' => $perm, 'allowed' => perm_is_allowed(api_user(), $r[0]['hash'], $perm)] ];
+ else {
+ $x = [];
+ $p = get_all_perms(api_user(),$r[0]['hash']);
+ if($p) {
+ foreach($p as $k => $v)
+ $x[] = [ 'perm' => $k, 'allowed' => $v ];
+ }
+ }
+ }
+
+ json_return_and_die($x);
+
+ }
+
+ function zot_item_update($type) {
+
+ if (api_user() === false) {
+ logger('api_red_item_store: no user');
+ return false;
+ }
+
+ logger('api_red_item_store: REQUEST ' . print_r($_REQUEST,true));
+ logger('api_red_item_store: FILES ' . print_r($_FILES,true));
+
+
+ // set this so that the item_post() function is quiet and doesn't redirect or emit json
+
+ $_REQUEST['api_source'] = true;
+ $_REQUEST['profile_uid'] = api_user();
+
+ if(x($_FILES,'media')) {
+ $_FILES['userfile'] = $_FILES['media'];
+ // upload the image if we have one
+ $mod = new Zotlabs\Module\Wall_attach();
+ $media = $mod->post();
+ if($media)
+ $_REQUEST['body'] .= "\n\n" . $media;
+ }
+
+ $mod = new Zotlabs\Module\Item();
+ $x = $mod->post();
+ json_return_and_die($x);
+ }
+
+
+
+ function red_item($type) {
+
+ if (api_user() === false) {
+ logger('api_red_item_full: no user');
+ return false;
+ }
+
+ if($_REQUEST['mid']) {
+ $arr = array('mid' => $_REQUEST['mid']);
+ }
+ elseif($_REQUEST['item_id']) {
+ $arr = array('item_id' => $_REQUEST['item_id']);
+ }
+ else
+ json_return_and_die(array());
+
+ $arr['start'] = 0;
+ $arr['records'] = 999999;
+ $arr['item_type'] = '*';
+
+ $i = items_fetch($arr,App::get_channel(),get_observer_hash());
+
+ if(! $i)
+ json_return_and_die(array());
+
+ $ret = array();
+ $tmp = array();
+ foreach($i as $ii) {
+ $tmp[] = encode_item($ii,true);
+ }
+ $ret['item'] = $tmp;
+
+ json_return_and_die($ret);
+ }
+
+
+
diff --git a/include/attach.php b/include/attach.php
index b5c334d3e..ba2f60a90 100644
--- a/include/attach.php
+++ b/include/attach.php
@@ -159,7 +159,6 @@ function attach_count_files($channel_id, $observer, $hash = '', $filename = '',
intval($channel_id)
);
-
$ret['success'] = ((is_array($r)) ? true : false);
$ret['results'] = ((is_array($r)) ? count($r) : false);
@@ -198,13 +197,13 @@ function attach_list_files($channel_id, $observer, $hash = '', $filename = '', $
$sql_extra .= protect_sprintf(" and hash = '" . dbesc($hash) . "' ");
if($filename)
- $sql_extra .= protect_sprintf(" and filename like '@" . dbesc($filename) . "@' ");
+ $sql_extra .= protect_sprintf(" and filename like '%" . dbesc($filename) . "%' ");
if($filetype)
- $sql_extra .= protect_sprintf(" and filetype like '@" . dbesc($filetype) . "@' ");
+ $sql_extra .= protect_sprintf(" and filetype like '%" . dbesc($filetype) . "%' ");
if($entries)
- $limit = " limit " . intval($start) . ", " . intval(entries) . " ";
+ $limit = " limit " . intval($start) . ", " . intval($entries) . " ";
// Retrieve all columns except 'data'
@@ -226,7 +225,8 @@ function attach_list_files($channel_id, $observer, $hash = '', $filename = '', $
* This could exhaust memory so most useful only when immediately sending the data.
*
* @param string $hash
- * @param int $rev Revision
+ * @param string $observer_hash
+ * @param int $rev (optional) Revision default 0
* @return array
*/
function attach_by_hash($hash, $observer_hash, $rev = 0) {
@@ -285,7 +285,7 @@ function attach_by_hash($hash, $observer_hash, $rev = 0) {
function attach_can_view_folder($uid,$ob_hash,$folder_hash) {
$sql_extra = permissions_sql($uid,$ob_hash);
- $hash = $folder_hash;
+ $hash = $folder_hash;
$result = false;
do {
@@ -295,9 +295,10 @@ function attach_can_view_folder($uid,$ob_hash,$folder_hash) {
);
if(! $r)
return false;
+
$hash = $r[0]['folder'];
- }
- while($hash);
+ } while($hash);
+
return true;
}
@@ -308,8 +309,9 @@ function attach_can_view_folder($uid,$ob_hash,$folder_hash) {
* Returns the entire attach structure excluding data.
*
* @see attach_by_hash()
- * @param $hash
- * @param $rev revision default 0
+ * @param string $hash
+ * @param string $observer_hash
+ * @param int $rev (optional) revision default 0
* @return associative array with everything except data
* * \e boolean \b success boolean true or false
* * \e string \b message (optional) only when success is false
@@ -335,12 +337,12 @@ function attach_by_hash_nodata($hash, $observer_hash, $rev = 0) {
return $ret;
}
- if(! perm_is_allowed($r[0]['uid'],$observer_hash,'view_storage')) {
+ if(! perm_is_allowed($r[0]['uid'], $observer_hash, 'view_storage')) {
$ret['message'] = t('Permission denied.');
return $ret;
}
- $sql_extra = permissions_sql($r[0]['uid'],$observer_hash);
+ $sql_extra = permissions_sql($r[0]['uid'], $observer_hash);
// Now we'll see if we can access the attachment
@@ -355,14 +357,13 @@ function attach_by_hash_nodata($hash, $observer_hash, $rev = 0) {
}
if($r[0]['folder']) {
- $x = attach_can_view_folder($r[0]['uid'],$observer_hash,$r[0]['folder']);
+ $x = attach_can_view_folder($r[0]['uid'], $observer_hash, $r[0]['folder']);
if(! $x) {
$ret['message'] = t('Permission denied.');
return $ret;
}
}
-
$ret['success'] = true;
$ret['data'] = $r[0];
@@ -378,25 +379,18 @@ function attach_by_hash_nodata($hash, $observer_hash, $rev = 0) {
* @note Requires an input field \e userfile and does not accept multiple files
* in one request.
*
- * @param array $channel channel array of owner
- * @param string $observer_hash hash of current observer
- * @param string $options (optional) one of update, replace, revision
- * @param array $arr (optional) associative array
- */
-
-/**
- * A lot going on in this function, and some of it is old cruft and some is new cruft
+ * @note A lot going on in this function, and some of it is old cruft and some is new cruft
* and the entire thing probably needs to be refactored. It started out just storing
- * files, before we had DAV. It was made extensible to do extra stuff like edit an
+ * files, before we had DAV. It was made extensible to do extra stuff like edit an
* existing file or optionally store a separate revision using $options to choose between different
* storage models. Along the way we moved from
- * DB data storage to file system storage.
- * Then DAV came along and used different upload methods depending on whether the
- * file was stored as a DAV directory object or updated as a file object. One of these
+ * DB data storage to file system storage.
+ * Then DAV came along and used different upload methods depending on whether the
+ * file was stored as a DAV directory object or updated as a file object. One of these
* is essentially an update and the other is basically an upload, but doesn't use the traditional PHP
- * upload workflow.
+ * upload workflow.
* Then came hubzilla and we tried to merge photo functionality with the file storage. Most of
- * that integration occurs within this function.
+ * that integration occurs within this function.
* This required overlap with the old photo_upload stuff and photo albums were
* completely different concepts from directories which needed to be reconciled somehow.
* The old revision stuff is kind of orphaned currently. There's new revision stuff for photos
@@ -404,13 +398,18 @@ function attach_by_hash_nodata($hash, $observer_hash, $rev = 0) {
* That's where it sits currently. I repeat it needs to be refactored, and this note is here
* for future explorers and those who may be doing that work to understand where it came
* from and got to be the monstrosity of tangled unrelated code that it currently is.
+ *
+ * @param array $channel channel array of owner
+ * @param string $observer_hash hash of current observer
+ * @param string $options (optional) one of update, replace, revision
+ * @param array $arr (optional) associative array
+ * @return void|array
*/
-
function attach_store($channel, $observer_hash, $options = '', $arr = null) {
require_once('include/photos.php');
- call_hooks('photo_upload_begin',$arr);
+ call_hooks('photo_upload_begin', $arr);
$ret = array('success' => false);
$channel_id = $channel['channel_id'];
@@ -441,7 +440,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
return $ret;
}
- $str_group_allow = perms2str($arr['group_allow']);
+ $str_group_allow = perms2str($arr['group_allow']);
$str_contact_allow = perms2str($arr['contact_allow']);
$str_group_deny = perms2str($arr['group_deny']);
$str_contact_deny = perms2str($arr['contact_deny']);
@@ -458,7 +457,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
$remove_when_processed = true;
- if($options === 'import') {
+ if($options === 'import') {
$src = $arr['src'];
$filename = $arr['filename'];
$filesize = @filesize($src);
@@ -485,17 +484,15 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
elseif($options !== 'update') {
$f = array('src' => '', 'filename' => '', 'filesize' => 0, 'type' => '');
- call_hooks('photo_upload_file',$f);
+ call_hooks('photo_upload_file',$f);
call_hooks('attach_upload_file',$f);
- if (x($f,'src') && x($f,'filesize')) {
- $src = $f['src'];
- $filename = $f['filename'];
- $filesize = $f['filesize'];
- $type = $f['type'];
-
- } else {
-
+ if (x($f,'src') && x($f,'filesize')) {
+ $src = $f['src'];
+ $filename = $f['filename'];
+ $filesize = $f['filesize'];
+ $type = $f['type'];
+ } else {
if(! x($_FILES,'userfile')) {
$ret['message'] = t('No source file.');
return $ret;
@@ -543,12 +540,10 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
$hash = $x[0]['hash'];
}
-
-
$def_extension = '';
$is_photo = 0;
$gis = @getimagesize($src);
- logger('getimagesize: ' . print_r($gis,true), LOGGER_DATA);
+ logger('getimagesize: ' . print_r($gis,true), LOGGER_DATA);
if(($gis) && ($gis[2] === IMAGETYPE_GIF || $gis[2] === IMAGETYPE_JPEG || $gis[2] === IMAGETYPE_PNG)) {
$is_photo = 1;
if($gis[2] === IMAGETYPE_GIF)
@@ -557,7 +552,6 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
$def_extension = '.jpg';
if($gis[2] === IMAGETYPE_PNG)
$def_extension = '.png';
-
}
$pathname = '';
@@ -607,7 +601,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
}
else {
$folder_hash = ((($arr) && array_key_exists('folder',$arr)) ? $arr['folder'] : '');
- }
+ }
if((! $options) || ($options === 'import')) {
@@ -654,8 +648,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
}
if($found)
$x++;
- }
- while($found);
+ } while($found);
$filename = $basename . '(' . $x . ')' . $ext;
}
else
@@ -702,7 +695,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
if($folder_hash) {
$curr = find_folder_hash_by_attach_hash($channel_id,$folder_hash,true);
- if($curr)
+ if($curr)
$os_relpath .= $curr . '/';
$os_relpath .= $folder_hash . '/';
}
@@ -711,6 +704,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
// not yet used
$os_path = '';
+ $display_path = '';
if($src)
@file_put_contents($os_basepath . $os_relpath,@file_get_contents($src));
@@ -726,23 +720,24 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
$edited = $created;
if($options === 'replace') {
- $r = q("update attach set filename = '%s', filetype = '%s', folder = '%s', filesize = %d, os_storage = %d, is_photo = %d, content = '%s', edited = '%s', os_path = '%s' where id = %d and uid = %d",
+ $r = q("update attach set filename = '%s', filetype = '%s', folder = '%s', filesize = %d, os_storage = %d, is_photo = %d, content = '%s', edited = '%s', os_path = '%s', display_path = '%s' where id = %d and uid = %d",
dbesc($filename),
dbesc($mimetype),
dbesc($folder_hash),
intval($filesize),
intval(1),
intval($is_photo),
- dbesc($os_basepath . $os_relpath),
+ dbescbin($os_basepath . $os_relpath),
dbesc($created),
dbesc($os_path),
+ dbesc($display_path),
intval($existing_id),
intval($channel_id)
);
}
elseif($options === 'revise') {
- $r = q("insert into attach ( aid, uid, hash, creator, filename, filetype, folder, filesize, revision, os_storage, is_photo, content, created, edited, os_path, allow_cid, allow_gid, deny_cid, deny_gid )
- VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+ $r = q("insert into attach ( aid, uid, hash, creator, filename, filetype, folder, filesize, revision, os_storage, is_photo, content, created, edited, os_path, display_path, allow_cid, allow_gid, deny_cid, deny_gid )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
intval($x[0]['aid']),
intval($channel_id),
dbesc($x[0]['hash']),
@@ -754,10 +749,11 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
intval($x[0]['revision'] + 1),
intval(1),
intval($is_photo),
- dbesc($os_basepath . $os_relpath),
+ dbescbin($os_basepath . $os_relpath),
dbesc($created),
dbesc($created),
dbesc($os_path),
+ dbesc($display_path),
dbesc($x[0]['allow_cid']),
dbesc($x[0]['allow_gid']),
dbesc($x[0]['deny_cid']),
@@ -766,7 +762,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
}
elseif($options === 'update') {
$r = q("update attach set filename = '%s', filetype = '%s', folder = '%s', edited = '%s', os_storage = %d, is_photo = %d, os_path = '%s',
- allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' where id = %d and uid = %d",
+ display_path = '%s', allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' where id = %d and uid = %d",
dbesc((array_key_exists('filename',$arr)) ? $arr['filename'] : $x[0]['filename']),
dbesc((array_key_exists('filetype',$arr)) ? $arr['filetype'] : $x[0]['filetype']),
dbesc(($folder_hash) ? $folder_hash : $x[0]['folder']),
@@ -774,6 +770,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
dbesc((array_key_exists('os_storage',$arr)) ? $arr['os_storage'] : $x[0]['os_storage']),
dbesc((array_key_exists('is_photo',$arr)) ? $arr['is_photo'] : $x[0]['is_photo']),
dbesc((array_key_exists('os_path',$arr)) ? $arr['os_path'] : $x[0]['os_path']),
+ dbesc((array_key_exists('display_path',$arr)) ? $arr['display_path'] : $x[0]['display_path']),
dbesc((array_key_exists('allow_cid',$arr)) ? $arr['allow_cid'] : $x[0]['allow_cid']),
dbesc((array_key_exists('allow_gid',$arr)) ? $arr['allow_gid'] : $x[0]['allow_gid']),
dbesc((array_key_exists('deny_cid',$arr)) ? $arr['deny_cid'] : $x[0]['deny_cid']),
@@ -784,8 +781,8 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
}
else {
- $r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, filetype, folder, filesize, revision, os_storage, is_photo, content, created, edited, os_path, allow_cid, allow_gid,deny_cid, deny_gid )
- VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+ $r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, filetype, folder, filesize, revision, os_storage, is_photo, content, created, edited, os_path, display_path, allow_cid, allow_gid,deny_cid, deny_gid )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
intval($channel['channel_account_id']),
intval($channel_id),
dbesc($hash),
@@ -797,10 +794,11 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
intval(0),
intval(1),
intval($is_photo),
- dbesc($os_basepath . $os_relpath),
+ dbescbin($os_basepath . $os_relpath),
dbesc($created),
dbesc($created),
dbesc($os_path),
+ dbesc($display_path),
dbesc(($arr && array_key_exists('allow_cid',$arr)) ? $arr['allow_cid'] : $str_contact_allow),
dbesc(($arr && array_key_exists('allow_gid',$arr)) ? $arr['allow_gid'] : $str_group_allow),
dbesc(($arr && array_key_exists('deny_cid',$arr)) ? $arr['deny_cid'] : $str_contact_deny),
@@ -869,7 +867,6 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
return $ret;
}
-
$ret['success'] = true;
$ret['data'] = $r[0];
if(! $is_photo) {
@@ -880,7 +877,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
if($dosync) {
$sync = attach_export_data($channel,$hash);
- if($sync)
+ if($sync)
build_sync_packet($channel['channel_id'],array('file' => array($sync)));
}
@@ -998,7 +995,7 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
intval($channel['channel_id'])
);
if($r) {
- if(array_key_exists('force',$arr) && intval($arr['force'])
+ if(array_key_exists('force',$arr) && intval($arr['force'])
&& (intval($r[0]['is_dir']))) {
$ret['success'] = true;
$r = q("select * from attach where id = %d limit 1",
@@ -1046,8 +1043,12 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
$created = datetime_convert();
- $r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, filetype, filesize, revision, folder, os_storage, is_dir, content, created, edited, allow_cid, allow_gid, deny_cid, deny_gid )
- VALUES ( %d, %d, '%s', '%s', '%s', '%s', %d, %d, '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+ // not yet used
+ $os_path = '';
+ $display_path = '';
+
+ $r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, filetype, filesize, revision, folder, os_storage, is_dir, content, created, edited, os_path, display_path, allow_cid, allow_gid, deny_cid, deny_gid )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', %d, %d, '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
intval($channel['channel_account_id']),
intval($channel_id),
dbesc($arr['hash']),
@@ -1059,9 +1060,11 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
dbesc($arr['folder']),
intval(1),
intval(1),
- dbesc($path),
+ dbescbin($path),
dbesc($created),
dbesc($created),
+ dbesc($os_path),
+ dbesc($display_path),
dbesc(($arr && array_key_exists('allow_cid',$arr)) ? $arr['allow_cid'] : $channel['channel_allow_cid']),
dbesc(($arr && array_key_exists('allow_gid',$arr)) ? $arr['allow_gid'] : $channel['channel_allow_gid']),
dbesc(($arr && array_key_exists('deny_cid',$arr)) ? $arr['deny_cid'] : $channel['channel_deny_cid']),
@@ -1150,7 +1153,7 @@ function attach_mkdirp($channel, $observer_hash, $arr = null) {
if(! $p)
continue;
$arx = array(
- 'filename' => $p,
+ 'filename' => $p,
'folder' => $current_parent,
'force' => 1
);
@@ -1163,7 +1166,7 @@ function attach_mkdirp($channel, $observer_hash, $arr = null) {
if(array_key_exists('deny_gid',$arr))
$arx['deny_gid'] = $arr['deny_gid'];
- $x = attach_mkdir($channel, $observer_hash, $arx);
+ $x = attach_mkdir($channel, $observer_hash, $arx);
if($x['success']) {
$current_parent = $x['data']['hash'];
}
@@ -1177,26 +1180,22 @@ function attach_mkdirp($channel, $observer_hash, $arr = null) {
$ret['data'] = $x['data'];
}
- return $ret;
-
+ return $ret;
}
-
-
-
-
/**
* @brief Changes permissions of a file.
*
- * @param int $channel_id
+ * @param int $channel_id The id of the channel
* @param array $resource
* @param string $allow_cid
* @param string $allow_gid
* @param string $deny_cid
* @param string $deny_gid
* @param boolean $recurse (optional) default false
+ * @param boolean $sync (optional) default false
*/
function attach_change_permissions($channel_id, $resource, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $recurse = false, $sync = false) {
@@ -1248,7 +1247,7 @@ function attach_change_permissions($channel_id, $resource, $allow_cid, $allow_gi
if($sync) {
$data = attach_export_data($channel,$resource);
- if($data)
+ if($data)
build_sync_packet($channel['channel_id'],array('file' => array($data)));
}
}
@@ -1263,6 +1262,7 @@ function attach_change_permissions($channel_id, $resource, $allow_cid, $allow_gi
* The id of the channel
* @param string $resource
* The hash to delete
+ * @param int $is_photo (optional) default 0
* @return void
*/
function attach_delete($channel_id, $resource, $is_photo = 0) {
@@ -1306,6 +1306,7 @@ function attach_delete($channel_id, $resource, $is_photo = 0) {
);
if($y) {
+ $y[0]['content'] = dbunescbin($y[0]['content']);
if(strpos($y[0]['content'],'store') === false)
$f = 'store/' . $channel_address . '/' . $y[0]['content'];
else
@@ -1337,7 +1338,7 @@ function attach_delete($channel_id, $resource, $is_photo = 0) {
dbesc($resource)
);
}
-
+
// update the parent folder's lastmodified timestamp
$e = q("UPDATE attach SET edited = '%s' WHERE hash = '%s' AND uid = %d",
dbesc(datetime_convert()),
@@ -1425,6 +1426,7 @@ function get_parent_cloudpath($channel_id, $channel_name, $attachHash) {
$parentFullPath = $parentName . '/' . $parentFullPath;
}
} while ($parentHash);
+
$parentFullPath = z_root() . '/cloud/' . $channel_name . '/' . $parentFullPath;
return $parentFullPath;
@@ -1437,11 +1439,14 @@ function get_parent_cloudpath($channel_id, $channel_name, $attachHash) {
* The id of the channel
* @param string $attachHash
* The hash of the attachment
+ * @param boolean $recurse
+ * (optional) default false
* @return string
*/
function find_folder_hash_by_attach_hash($channel_id, $attachHash, $recurse = false) {
-logger('attach_hash: ' . $attachHash);
+ logger('attach_hash: ' . $attachHash);
+
$r = q("SELECT folder FROM attach WHERE uid = %d AND hash = '%s' LIMIT 1",
intval($channel_id),
dbesc($attachHash)
@@ -1449,10 +1454,11 @@ logger('attach_hash: ' . $attachHash);
$hash = '';
if($r && $r[0]['folder']) {
if($recurse)
- $hash = find_folder_hash_by_attach_hash($channel_id,$r[0]['folder'],true) . '/' . $r[0]['folder'];
+ $hash = find_folder_hash_by_attach_hash($channel_id,$r[0]['folder'],true) . '/' . $r[0]['folder'];
else
$hash = $r[0]['folder'];
}
+
return $hash;
}
@@ -1569,13 +1575,13 @@ function file_activity($channel_id, $object, $allow_cid, $allow_gid, $deny_cid,
$arr = array();
$arr['aid'] = get_account_id();
$arr['uid'] = $channel_id;
- $arr['item_wall'] = 1;
+ $arr['item_wall'] = 1;
$arr['item_origin'] = 1;
$arr['item_unseen'] = 1;
$arr['author_xchan'] = $poster['xchan_hash'];
$arr['owner_xchan'] = $poster['xchan_hash'];
$arr['title'] = '';
- $arr['item_hidden'] = 1;
+ $arr['item_notshown'] = 1;
$arr['obj_type'] = $objtype;
$arr['resource_id'] = $object['hash'];
$arr['resource_type'] = 'attach';
@@ -1732,11 +1738,11 @@ function get_file_activity_object($channel_id, $hash, $cloudpath) {
/**
* @brief Returns array of channels which have recursive permission for a file
*
- * @param $arr_allow_cid
- * @param $arr_allow_gid
- * @param $arr_deny_cid
- * @param $arr_deny_gid
- * @param $folder_hash
+ * @param array $arr_allow_cid
+ * @param array $arr_allow_gid
+ * @param array $arr_deny_cid
+ * @param array $arr_deny_gid
+ * @param string $folder_hash
*/
function recursive_activity_recipients($arr_allow_cid, $arr_allow_gid, $arr_deny_cid, $arr_deny_gid, $folder_hash) {
@@ -1907,7 +1913,7 @@ function attach_export_data($channel, $resource_id, $deleted = false) {
);
if($r) {
for($x = 0; $x < count($r); $x ++) {
- $r[$x]['content'] = base64_encode($r[$x]['content']);
+ $r[$x]['content'] = base64_encode(dbunescbin($r[$x]['content']));
}
$ret['photo'] = $r;
}
@@ -1931,50 +1937,53 @@ function attach_export_data($channel, $resource_id, $deleted = false) {
}
return $ret;
-
}
-/* strip off 'store/nickname/' from the provided path */
-
+/**
+ * @brief Strip off 'store/nickname/' from the provided path
+ *
+ * @param string $s
+ * @return string
+ */
function get_attach_binname($s) {
$p = $s;
- if(strpos($s,'store/') === 0) {
- $p = substr($s,6);
- $p = substr($p,strpos($p,'/')+1);
+ if(strpos($s, 'store/') === 0) {
+ $p = substr($s, 6);
+ $p = substr($p, strpos($p, '/')+1);
}
+
return $p;
}
function get_dirpath_by_cloudpath($channel, $path) {
-
- // Warning: Do not edit the following line. The first symbol is UTF-8 &#65312;
- $path = str_replace('@','@',notags(trim($path)));
+
+ $path = notags(trim($path));
$h = @parse_url($path);
if(! $h || !x($h, 'path')) {
return null;
}
- if(substr($h['path'],-1,1) === '/') {
- $h['path'] = substr($h['path'],0,-1);
+ if(substr($h['path'], -1, 1) === '/') {
+ $h['path'] = substr($h['path'], 0, -1);
}
if(substr($h['path'],0,1) === '/') {
- $h['path'] = substr($h['path'],1);
+ $h['path'] = substr($h['path'], 1);
}
$folders = explode('/', $h['path']);
$f = array_shift($folders);
-
+
$nick = $channel['channel_address'];
//check to see if the absolute path was provided (/cloud/channelname/path/to/folder)
- if($f === 'cloud' ) {
+ if($f === 'cloud' ) {
$g = array_shift($folders);
if( $g !== $nick) {
// if nick does not follow "cloud", then the top level folder must be called "cloud"
- // and the given path must be relative to "/cloud/channelname/".
+ // and the given path must be relative to "/cloud/channelname/".
$folders = array_unshift(array_unshift($folders, $g), $f);
- }
+ }
} else {
array_unshift($folders, $f);
}
@@ -1998,8 +2007,6 @@ function get_dirpath_by_cloudpath($channel, $path) {
} else {
return $clouddir . $subdir;
}
-
-
}
function get_filename_by_cloudname($cloudname, $channel, $storepath) {
@@ -2013,66 +2020,74 @@ function get_filename_by_cloudname($cloudname, $channel, $storepath) {
return null;
}
-
-// recursively copy a directory into cloud files
-function copy_folder_to_cloudfiles($channel, $observer_hash, $srcpath, $cloudpath)
-{
- if (!is_dir($srcpath) || !is_readable($srcpath)) {
- logger('Error reading source path: ' . $srcpath, LOGGER_NORMAL);
+/**
+ * @brief recursively copy a directory into cloud files
+ *
+ * @param array $channel
+ * @param string $observer_hash
+ * @param string $srcpath
+ * @param string $cloudpath
+ * @return boolean
+ */
+function copy_folder_to_cloudfiles($channel, $observer_hash, $srcpath, $cloudpath) {
+ if (!is_dir($srcpath) || !is_readable($srcpath)) {
+ logger('Error reading source path: ' . $srcpath, LOGGER_NORMAL);
+ return false;
+ }
+ $nodes = array_diff(scandir($srcpath), array('.', '..'));
+ foreach ($nodes as $node) {
+ $clouddir = $cloudpath . '/' . $node; // Sub-folder in cloud files destination
+ $nodepath = $srcpath . '/' . $node; // Sub-folder in source path
+ if(is_dir($nodepath)) {
+ $x = attach_mkdirp($channel, $observer_hash, array('pathname' => $clouddir));
+ if(!$x['success']) {
+ logger('Error creating cloud path: ' . $clouddir, LOGGER_NORMAL);
return false;
+ }
+ // Recursively call this function where the source and destination are the subfolders
+ $success = copy_folder_to_cloudfiles($channel, $observer_hash, $nodepath, $clouddir);
+ if(!$success) {
+ logger('Error copying contents of folder: ' . $nodepath, LOGGER_NORMAL);
+ return false;
+ }
+ } elseif(is_file($nodepath) && is_readable($nodepath)) {
+ $x = attach_store($channel, $observer_hash, 'import', array(
+ 'directory' => $cloudpath,
+ 'src' => $nodepath,
+ 'filename' => $node,
+ 'filesize' => @filesize($nodepath),
+ 'preserve_original' => true
+ ));
+ if(!$x['success']) {
+ logger('Error copying file: ' . $nodepath, LOGGER_NORMAL);
+ logger('Return value: ' . json_encode($x), LOGGER_NORMAL);
+ return false;
+ }
+ } else {
+ logger('Error scanning source path', LOGGER_NORMAL);
+ return false;
}
- $nodes = array_diff(scandir($srcpath), array('.', '..'));
- foreach ($nodes as $node) {
- $clouddir = $cloudpath . '/' . $node; // Sub-folder in cloud files destination
- $nodepath = $srcpath . '/' . $node; // Sub-folder in source path
- if(is_dir($nodepath)) {
- $x = attach_mkdirp($channel, $observer_hash, array('pathname' => $clouddir));
- if(!$x['success']) {
- logger('Error creating cloud path: ' . $clouddir, LOGGER_NORMAL);
- return false;
- }
- // Recursively call this function where the source and destination are the subfolders
- $success = copy_folder_to_cloudfiles($channel, $observer_hash, $nodepath, $clouddir);
- if(!$success) {
- logger('Error copying contents of folder: ' . $nodepath, LOGGER_NORMAL);
- return false;
- }
- } elseif (is_file($nodepath) && is_readable($nodepath)) {
- $x = attach_store($channel, $observer_hash, 'import',
- array(
- 'directory' => $cloudpath,
- 'src' => $nodepath,
- 'filename' => $node,
- 'filesize' => @filesize($nodepath),
- 'preserve_original' => true)
- );
- if(!$x['success']) {
- logger('Error copying file: ' . $nodepath , LOGGER_NORMAL);
- logger('Return value: ' . json_encode($x), LOGGER_NORMAL);
- return false;
- }
- } else {
- logger('Error scanning source path', LOGGER_NORMAL);
- return false;
- }
- }
+ }
- return true;
+ return true;
}
/**
- * attach_move()
* This function performs an in place directory-to-directory move of a stored attachment or photo.
* The data is physically moved in the store/nickname storage location and the paths adjusted
* in the attach structure (and if applicable the photo table). The new 'album name' is recorded
* for photos and will show up immediately there.
* This takes a channel_id, attach.hash of the file to move (this is the same as a photo resource_id), and
* the attach.hash of the new parent folder, which must already exist. If $new_folder_hash is blank or empty,
- * the file is relocated to the root of the channel's storage area.
+ * the file is relocated to the root of the channel's storage area.
*
* @fixme: this operation is currently not synced to clones !!
+ *
+ * @param int $channel_id
+ * @param int $resource_id
+ * @param string $new_folder_hash
+ * @return void|boolean
*/
-
-function attach_move($channel_id,$resource_id,$new_folder_hash) {
+function attach_move($channel_id, $resource_id, $new_folder_hash) {
$c = channelx_by_n($channel_id);
if(! $c)
@@ -2085,8 +2100,8 @@ function attach_move($channel_id,$resource_id,$new_folder_hash) {
if(! $r)
return false;
- $oldstorepath = $r[0]['content'];
-
+ $oldstorepath = dbunescbin($r[0]['content']);
+
if($new_folder_hash) {
$n = q("select * from attach where hash = '%s' and uid = %d limit 1",
dbesc($new_folder_hash),
@@ -2094,8 +2109,9 @@ function attach_move($channel_id,$resource_id,$new_folder_hash) {
);
if(! $n)
return;
+
$newdirname = $n[0]['filename'];
- $newstorepath = $n[0]['content'] . '/' . $resource_id;
+ $newstorepath = dbunescbin($n[0]['content']) . '/' . $resource_id;
}
else {
$newstorepath = 'store/' . $c['channel_address'] . '/' . $resource_id;
@@ -2115,7 +2131,7 @@ function attach_move($channel_id,$resource_id,$new_folder_hash) {
if($s) {
$overwrite = get_pconfig($channel_id,'system','overwrite_dup_files');
if($overwrite) {
- // @fixme
+ /// @fixme
return;
}
else {
@@ -2128,6 +2144,10 @@ function attach_move($channel_id,$resource_id,$new_folder_hash) {
$ext = '';
}
+ $matches = false;
+ if(preg_match('/(.*?)\([0-9]{1,}\)$/',$basename,$matches))
+ $basename = $matches[1];
+
$v = q("select filename from attach where ( filename = '%s' OR filename like '%s' ) and folder = '%s' ",
dbesc($basename . $ext),
dbesc($basename . '(%)' . $ext),
@@ -2147,7 +2167,7 @@ function attach_move($channel_id,$resource_id,$new_folder_hash) {
}
if($found)
$x++;
- }
+ }
while($found);
$filename = $basename . '(' . $x . ')' . $ext;
}
@@ -2157,7 +2177,7 @@ function attach_move($channel_id,$resource_id,$new_folder_hash) {
}
$t = q("update attach set content = '%s', folder = '%s', filename = '%s' where id = %d",
- dbesc($newstorepath),
+ dbescbin($newstorepath),
dbesc($new_folder_hash),
dbesc($filename),
intval($r[0]['id'])
@@ -2172,14 +2192,13 @@ function attach_move($channel_id,$resource_id,$new_folder_hash) {
);
$t = q("update photo set content = '%s' where resource_id = '%s' and uid = %d and imgscale = 0",
- dbesc($newstorepath),
+ dbescbin($newstorepath),
dbesc($resource_id),
intval($channel_id)
);
}
return true;
-
}
@@ -2191,7 +2210,7 @@ function attach_folder_select_list($channel_id) {
$out = [];
$out[''] = '/';
-
+
if($r) {
foreach($r as $rv) {
$x = attach_folder_rpaths($r,$rv);
@@ -2199,6 +2218,7 @@ function attach_folder_select_list($channel_id) {
$out[$x[0]] = $x[1];
}
}
+
return $out;
}
@@ -2223,11 +2243,11 @@ function attach_folder_rpaths($all_folders,$that_folder) {
break;
}
}
- if(! $found)
+ if(! $found)
$error = true;
}
while((! $found) && (! $error) && ($parent_hash != ''));
}
- return (($error) ? false : [ $current_hash , $path ]);
-} \ No newline at end of file
+ return (($error) ? false : [ $current_hash , $path ]);
+}
diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php
index d3f88e17c..87a8551ae 100644
--- a/include/bb2diaspora.php
+++ b/include/bb2diaspora.php
@@ -123,13 +123,16 @@ function diaspora_mention_callback($matches) {
* @param boolean $use_zrl default false
* @return string
*/
-function diaspora2bb($s, $use_zrl = false) {
+function markdown_to_bb($s, $use_zrl = false) {
$s = str_replace("&#xD;","\r",$s);
$s = str_replace("&#xD;\n&gt;","",$s);
$s = html_entity_decode($s,ENT_COMPAT,'UTF-8');
+ // if empty link text replace with the url
+ $s = preg_replace("/\[\]\((.*?)\)/ism",'[$1]($1)',$s);
+
// first try plustags
$s = preg_replace_callback('/\@\{(.+?)\; (.+?)\@(.+?)\}\+/','diaspora_mention_callback',$s);
@@ -155,23 +158,20 @@ function diaspora2bb($s, $use_zrl = false) {
// Convert everything that looks like a link to a link
if($use_zrl) {
$s = str_replace(array('[img','/img]'),array('[zmg','/zmg]'),$s);
- $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[zrl=$2$3]$2$3[/zrl]',$s);
+ $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\(\)]+)/ism", '$1[zrl=$2$3]$2$3[/zrl]',$s);
}
else {
- $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3]$2$3[/url]',$s);
+ $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,\(\)]+)/ism", '$1[url=$2$3]$2$3[/url]',$s);
}
- //$s = preg_replace("/([^\]\=]|^)(https?\:\/\/)(vimeo|youtu|www\.youtube|soundcloud)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3$4]$2$3$4[/url]',$s);
- $s = bb_tag_preg_replace("/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism",'[embed]https://www.youtube.com/watch?v=$2[/embed]','url',$s);
- $s = bb_tag_preg_replace("/\[url\=https?:\/\/www.youtube.com\/watch\?v\=(.*?)\].*?\[\/url\]/ism",'[embed]https://www.youtube.com/watch?v=$1[/embed]','url',$s);
- $s = bb_tag_preg_replace("/\[url\=?(.*?)\]https?:\/ \/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism",'[embed]https://vimeo.com/$2[/embed]','url',$s);
- $s = bb_tag_preg_replace("/\[url\=https?:\/\/vimeo.com\/([0-9]+)\](.*?)\[\/url\]/ism",'[embed]https://vimeo.com/$1[/embed]','url',$s);
// remove duplicate adjacent code tags
$s = preg_replace("/(\[code\])+(.*?)(\[\/code\])+/ism","[code]$2[/code]", $s);
// Don't show link to full picture (until it is fixed)
$s = scale_external_images($s, false);
+ call_hooks('markdown_to_bb',$s);
+
return $s;
}
@@ -324,7 +324,7 @@ function bb2diaspora_itemwallwall(&$item,$uplink = false) {
}
-function bb2diaspora_itembody($item, $force_update = false, $have_channel = false, $uplink) {
+function bb2diaspora_itembody($item, $force_update = false, $have_channel = false, $uplink = false) {
if(! get_iconfig($item,'diaspora','fields')) {
@@ -430,6 +430,12 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) {
$Text = preg_replace_callback('/\@\!?\[([zu])rl\=(\w+.*?)\](\w+.*?)\[\/([zu])rl\]/i', 'bb2dmention_callback', $Text);
+ // strip map tags, as the rendering is performed in bbcode() and the resulting output
+ // is not compatible with Diaspora (at least in the case of openstreetmap and probably
+ // due to the inclusion of an html iframe)
+
+ $Text = preg_replace("/\[map\=(.*?)\]/ism", '$1', $Text);
+ $Text = preg_replace("/\[map\](.*?)\[\/map\]/ism", '$1', $Text);
// Converting images with size parameters to simple images. Markdown doesn't know it.
$Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $Text);
@@ -452,6 +458,8 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) {
$md = new Markdownify(false, false, false);
$Text = $md->parseString($Text);
+
+
// It also adds backslashes to our attempt at getting around the html entity preservation for some weird reason.
$Text = str_replace(array('&\\_lt\\_;','&\\_gt\\_;','&\\_amp\\_;'),array('&lt;','&gt;','&amp;'),$Text);
diff --git a/include/bbcode.php b/include/bbcode.php
index a82b658b1..32354aeda 100644
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -403,6 +403,15 @@ function bb_definitionList_unescapeBraces($match) {
return '<dt>' . str_replace('\]', ']', $match[1]) . '</dt>';
}
+
+function bb_checklist($match) {
+ $str = $match[1];
+ $str = str_replace("[]", "<li><input type=\"checkbox\" disabled=\"disabled\">", $str);
+ $str = str_replace("[x]", "<li><input type=\"checkbox\" checked=\"checked\" disabled=\"disabled\">", $str);
+ return '<ul class="checklist" style="list-style-type: none;">' . $str . '</ul>';
+}
+
+
/**
* @brief Sanitize style properties from BBCode to HTML.
*
@@ -503,10 +512,10 @@ function bb_code($match) {
}
function bb_highlight($match) {
- if(in_array(strtolower($match[1]),['php','css','mysql','sql','abap','diff','html','perl','ruby',
+ $lang = ((in_array(strtolower($match[1]),['php','css','mysql','sql','abap','diff','html','perl','ruby',
'vbscript','avrc','dtd','java','xml','cpp','python','javascript','js','json','sh']))
- return text_highlight($match[2],strtolower($match[1]));
- return $match[0];
+ ? strtolower($match[1]) : 'php' );
+ return text_highlight($match[2],$lang);
}
function bb_fixtable_lf($match) {
@@ -520,7 +529,49 @@ function bb_fixtable_lf($match) {
}
+function parseIdentityAwareHTML($Text) {
+
+ // process [observer] tags before we do anything else because we might
+ // be stripping away stuff that then doesn't need to be worked on anymore
+
+ $observer = App::get_observer();
+ if ((strpos($Text,'[/observer]') !== false) || (strpos($Text,'[/rpost]') !== false)) {
+ if ($observer) {
+ $Text = preg_replace("/\[observer\=1\](.*?)\[\/observer\]/ism", '$1', $Text);
+ $Text = preg_replace("/\[observer\=0\].*?\[\/observer\]/ism", '', $Text);
+ $Text = preg_replace_callback("/\[rpost(=(.*?))?\](.*?)\[\/rpost\]/ism", 'rpost_callback', $Text);
+ } else {
+ $Text = preg_replace("/\[observer\=1\].*?\[\/observer\]/ism", '', $Text);
+ $Text = preg_replace("/\[observer\=0\](.*?)\[\/observer\]/ism", '$1', $Text);
+ $Text = preg_replace("/\[rpost(=.*?)?\](.*?)\[\/rpost\]/ism", '', $Text);
+ }
+ }
+ // replace [observer.baseurl]
+ if ($observer) {
+ $s1 = '<span class="bb_observer" title="' . t('Different viewers will see this text differently') . '">';
+ $s2 = '</span>';
+ $obsBaseURL = $observer['xchan_connurl'];
+ $obsBaseURL = preg_replace("/\/poco\/.*$/", '', $obsBaseURL);
+ $Text = str_replace('[observer.baseurl]', $obsBaseURL, $Text);
+ $Text = str_replace('[observer.url]',$observer['xchan_url'], $Text);
+ $Text = str_replace('[observer.name]',$s1 . $observer['xchan_name'] . $s2, $Text);
+ $Text = str_replace('[observer.address]',$s1 . $observer['xchan_addr'] . $s2, $Text);
+ $Text = str_replace('[observer.webname]', substr($observer['xchan_addr'],0,strpos($observer['xchan_addr'],'@')), $Text);
+ $Text = str_replace('[observer.photo]',$s1 . '[zmg]'.$observer['xchan_photo_l'].'[/zmg]' . $s2, $Text);
+ } else {
+ $Text = str_replace('[observer.baseurl]', '', $Text);
+ $Text = str_replace('[observer.url]','', $Text);
+ $Text = str_replace('[observer.name]','', $Text);
+ $Text = str_replace('[observer.address]','', $Text);
+ $Text = str_replace('[observer.webname]','',$Text);
+ $Text = str_replace('[observer.photo]','', $Text);
+ }
+
+ $Text = str_replace(array('[baseurl]','[sitename]'),array(z_root(),get_config('system','sitename')),$Text);
+
+ return $Text;
+}
// BBcode 2 HTML was written by WAY2WEB.net
// extended to work with Mistpark/Friendica/Redmatrix/Hubzilla - Mike Macgirvin
@@ -550,7 +601,6 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
// process [observer] tags before we do anything else because we might
// be stripping away stuff that then doesn't need to be worked on anymore
-
if($cache)
$observer = false;
else
@@ -653,7 +703,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
// Perform URL Search
- $urlchars = '[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,\@]';
+ $urlchars = '[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,\@\(\)]';
if (strpos($Text,'http') !== false) {
if($tryoembed) {
@@ -737,6 +787,12 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
if (strpos($Text,'[/color]') !== false) {
$Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])ism", "<span style=\"color: $1;\">$2</span>", $Text);
}
+ // Check for colored text
+ if (strpos($Text,'[/hl]') !== false) {
+ $Text = preg_replace("(\[hl\](.*?)\[\/hl\])ism", "<span style=\"background-color: yellow;\">$1</span>", $Text);
+ $Text = preg_replace("(\[hl=(.*?)\](.*?)\[\/hl\])ism", "<span style=\"background-color: $1;\">$2</span>", $Text);
+ }
+
// Check for sized text
// [size=50] --> font-size: 50px (with the unit).
if (strpos($Text,'[/size]') !== false) {
@@ -768,12 +824,14 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
$Text = preg_replace("(\[h6\](.*?)\[\/h6\])ism",'<h6>$1</h6>',$Text);
}
// Check for table of content without params
- if (strpos($Text,'[toc]') !== false) {
- $Text = preg_replace("/\[toc\]/ism",'<ul id="toc"></ul>',$Text);
+ while(strpos($Text,'[toc]') !== false) {
+ $toc_id = 'toc-' . random_string(10);
+ $Text = preg_replace("/\[toc\]/ism", '<ul id="' . $toc_id . '" class="toc" data-toc=".section-content-wrapper"></ul><script>$("#' . $toc_id . '").toc();</script>', $Text, 1);
}
// Check for table of content with params
- if (strpos($Text,'[toc') !== false) {
- $Text = preg_replace("/\[toc([^\]]+?)\]/ism",'<ul$1></ul>',$Text);
+ while(strpos($Text,'[toc') !== false) {
+ $toc_id = 'toc-' . random_string(10);
+ $Text = preg_replace("/\[toc([^\]]+?)\]/ism", '<ul id="' . $toc_id . '" class="toc"$1></ul><script>$("#' . $toc_id . '").toc();</script>', $Text, 1);
}
// Check for centered text
if (strpos($Text,'[/center]') !== false) {
@@ -784,15 +842,15 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
$Text = preg_replace("(\[footer\](.*?)\[\/footer\])ism", "<div class=\"wall-item-footer\">$1</div>", $Text);
}
// Check for list text
+
+ $Text = preg_replace("/<br \/>\[\*\]/ism",'[*]',$Text);
+
$Text = str_replace("[*]", "<li>", $Text);
- $Text = str_replace("[]", "<li><input type=\"checkbox\" disabled=\"disabled\">", $Text);
- $Text = str_replace("[x]", "<li><input type=\"checkbox\" checked=\"checked\" disabled=\"disabled\">", $Text);
// handle nested lists
$endlessloop = 0;
while ((((strpos($Text, "[/list]") !== false) && (strpos($Text, "[list") !== false)) ||
- ((strpos($Text, "[/checklist]") !== false) && (strpos($Text, "[checklist]") !== false)) ||
((strpos($Text, "[/ol]") !== false) && (strpos($Text, "[ol]") !== false)) ||
((strpos($Text, "[/ul]") !== false) && (strpos($Text, "[ul]") !== false)) ||
((strpos($Text, "[/dl]") !== false) && (strpos($Text, "[dl") !== false)) ||
@@ -804,9 +862,9 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
$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("/\[checklist\](.*?)\[\/checklist\]/ism", '<ul class="checklist" style="list-style-type: none;">$1</ul>', $Text);
$Text = preg_replace("/\[ul\](.*?)\[\/ul\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>', $Text);
$Text = preg_replace("/\[ol\](.*?)\[\/ol\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>', $Text);
+ $Text = preg_replace("/\[\/li\]<br \/>\[li\]/ism",'[/li][li]',$Text);
$Text = preg_replace("/\[li\](.*?)\[\/li\]/ism", '<li>$1</li>', $Text);
// [dl] tags have an optional [dl terms="bi"] form where bold/italic/underline/mono/large
@@ -815,7 +873,13 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
// "[dl" <optional-whitespace> <optional-termStyles> "]" <matchGroup2> "[/dl]"
// where optional-termStyles are: "terms=" <optional-quote> <matchGroup1> <optional-quote>
$Text = preg_replace_callback('/\[dl[[:space:]]*(?:terms=(?:&quot;|")?([a-zA-Z]+)(?:&quot;|")?)?\](.*?)\[\/dl\]/ism', 'bb_definitionList', $Text);
+
}
+
+ if (strpos($Text,'[checklist]') !== false) {
+ $Text = preg_replace_callback("/\[checklist\](.*?)\[\/checklist\]/ism", 'bb_checklist', $Text);
+ }
+
if (strpos($Text,'[th]') !== false) {
$Text = preg_replace("/\[th\](.*?)\[\/th\]/sm", '<th>$1</th>', $Text);
}
@@ -1003,15 +1067,15 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
$Text = preg_replace("/\[zaudio\](.*?)\[\/zaudio\]/", '<a class="zid" href="$1" target="_blank" >$1</a>', $Text);
}
- if ($tryoembed){
- if (strpos($Text,'[/iframe]') !== false) {
- $Text = preg_replace_callback("/\[iframe\](.*?)\[\/iframe\]/ism", 'bb_iframe', $Text);
- }
- } else {
- if (strpos($Text,'[/iframe]') !== false) {
- $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<a href="$1" target="_blank" >$1</a>', $Text);
- }
- }
+// if ($tryoembed){
+// if (strpos($Text,'[/iframe]') !== false) {
+// $Text = preg_replace_callback("/\[iframe\](.*?)\[\/iframe\]/ism", 'bb_iframe', $Text);
+// }
+// } else {
+// if (strpos($Text,'[/iframe]') !== false) {
+// $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<a href="$1" target="_blank" >$1</a>', $Text);
+// }
+// }
// oembed tag
$Text = oembed_bbcode2html($Text);
@@ -1024,7 +1088,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
// Summary (e.g. title) is required, earlier revisions only required description (in addition to
// start which is always required). Allow desc with a missing summary for compatibility.
- if ((x($ev,'desc') || x($ev,'summary')) && x($ev,'start')) {
+ if ((x($ev,'desc') || x($ev,'summary')) && x($ev,'dtstart')) {
$sub = format_event_html($ev);
diff --git a/include/channel.php b/include/channel.php
index 88e59830f..4fc873402 100644
--- a/include/channel.php
+++ b/include/channel.php
@@ -162,7 +162,7 @@ function channel_total() {
* Also creates the related xchan, hubloc, profile, and "self" abook records,
* and an empty "Friends" group/collection for the new channel.
*
- * @param array $arr assoziative array with:
+ * @param array $arr associative array with:
* * \e string \b name full name of channel
* * \e string \b nickname "email/url-compliant" nickname
* * \e int \b account_id to attach with this channel
@@ -182,7 +182,7 @@ function create_identity($arr) {
return $ret;
}
$ret = identity_check_service_class($arr['account_id']);
- if (!$ret['success']) {
+ if (!$ret['success']) {
return $ret;
}
// save this for auto_friending
@@ -236,13 +236,13 @@ function create_identity($arr) {
$publish = intval($role_permissions['directory_publish']);
$primary = true;
-
+
if(array_key_exists('primary', $arr))
$primary = intval($arr['primary']);
$expire = 0;
- $r = q("insert into channel ( channel_account_id, channel_primary,
+ $r = q("insert into channel ( channel_account_id, channel_primary,
channel_name, channel_address, channel_guid, channel_guid_sig,
channel_hash, channel_prvkey, channel_pubkey, channel_pageflags, channel_system, channel_expire_days, channel_timezone )
values ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, '%s' ) ",
@@ -262,7 +262,7 @@ function create_identity($arr) {
dbesc(App::$timezone)
);
- $r = q("select * from channel where channel_account_id = %d
+ $r = q("select * from channel where channel_account_id = %d
and channel_guid = '%s' limit 1",
intval($arr['account_id']),
dbesc($guid)
@@ -291,7 +291,7 @@ function create_identity($arr) {
// Create a verified hub location pointing to this site.
- $r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_primary,
+ $r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_primary,
hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey, hubloc_network )
values ( '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s' )",
dbesc($guid),
@@ -392,11 +392,11 @@ function create_identity($arr) {
intval($newuid)
);
}
- }
+ }
}
- // Create a group with yourself as a member. This allows somebody to use it
- // right away as a default group for new contacts.
+ // Create a group with yourself as a member. This allows somebody to use it
+ // right away as a default group for new contacts.
require_once('include/group.php');
group_add($newuid, t('Friends'));
@@ -422,7 +422,7 @@ function create_identity($arr) {
set_pconfig($ret['channel']['channel_id'],'system','photo_path', '%Y-%m');
set_pconfig($ret['channel']['channel_id'],'system','attach_path','%Y-%m');
}
-
+
// auto-follow any of the hub's pre-configured channel choices.
// Only do this if it's the first channel for this account;
// otherwise it could get annoying. Don't make this list too big
@@ -494,7 +494,7 @@ function identity_basic_export($channel_id, $items = false) {
$ret = array();
- // use constants here as otherwise we will have no idea if we can import from a site
+ // use constants here as otherwise we will have no idea if we can import from a site
// with a non-standard platform and version.
$ret['compatibility'] = array('project' => PLATFORM_NAME, 'version' => STD_VERSION, 'database' => DB_UPDATE_VERSION, 'server_role' => Zotlabs\Lib\System::get_server_role());
@@ -503,7 +503,7 @@ function identity_basic_export($channel_id, $items = false) {
);
if($r) {
translate_channel_perms_outbound($r[0]);
- $ret['channel'] = $r[0];
+ $ret['channel'] = $r[0];
$ret['relocate'] = [ 'channel_address' => $r[0]['channel_address'], 'url' => z_root()];
}
@@ -526,7 +526,7 @@ function identity_basic_export($channel_id, $items = false) {
if($abconfig)
$ret['abook'][$x]['abconfig'] = $abconfig;
translate_abook_perms_outbound($ret['abook'][$x]);
- }
+ }
stringify_array_elms($xchans);
}
@@ -534,13 +534,13 @@ function identity_basic_export($channel_id, $items = false) {
$r = q("select * from xchan where xchan_hash in ( " . implode(',',$xchans) . " ) ");
if($r)
$ret['xchan'] = $r;
-
+
$r = q("select * from hubloc where hubloc_hash in ( " . implode(',',$xchans) . " ) ");
if($r)
$ret['hubloc'] = $r;
}
- $r = q("select * from `groups` where uid = %d ",
+ $r = q("select * from groups where uid = %d ",
intval($channel_id)
);
@@ -578,7 +578,6 @@ function identity_basic_export($channel_id, $items = false) {
if($r)
$ret['term'] = $r;
-
// add psuedo-column obj_baseurl to aid in relocations
$r = q("select obj.*, '%s' as obj_baseurl from obj where obj_channel = %d",
@@ -608,7 +607,6 @@ function identity_basic_export($channel_id, $items = false) {
if($r)
$ret['chatroom'] = $r;
-
$r = q("select * from event where uid = %d",
intval($channel_id)
);
@@ -625,7 +623,7 @@ function identity_basic_export($channel_id, $items = false) {
foreach($r as $rr)
$ret['event_item'][] = encode_item($rr,true);
}
-
+
$x = menu_list($channel_id);
if($x) {
$ret['menu'] = array();
@@ -636,12 +634,10 @@ function identity_basic_export($channel_id, $items = false) {
}
}
-
$addon = array('channel_id' => $channel_id,'data' => $ret);
call_hooks('identity_basic_export',$addon);
$ret = $addon['data'];
-
if(! $items)
return $ret;
@@ -659,11 +655,10 @@ function identity_basic_export($channel_id, $items = false) {
if($r) {
for($x = 0; $x < count($r); $x ++) {
$r[$x]['subject'] = base64url_decode(str_rot47($r[$x]['subject']));
- }
+ }
$ret['conv'] = $r;
}
-
$r = q("select * from mail where mail.uid = %d",
intval($channel_id)
);
@@ -680,15 +675,15 @@ function identity_basic_export($channel_id, $items = false) {
/** @warning this may run into memory limits on smaller systems */
- /** export three months of posts. If you want to export and import all posts you have to start with
- * the first year and export/import them in ascending order.
+ /** export three months of posts. If you want to export and import all posts you have to start with
+ * the first year and export/import them in ascending order.
*
* Don't export linked resource items. we'll have to pull those out separately.
*/
$r = q("select * from item where item_wall = 1 and item_deleted = 0 and uid = %d and created > %s - INTERVAL %s and resource_type = '' order by created",
intval($channel_id),
- db_utcnow(),
+ db_utcnow(),
db_quoteinterval('3 MONTH')
);
if($r) {
@@ -730,7 +725,7 @@ function identity_export_year($channel_id,$year,$month = 0) {
$r = q("select * from item where ( item_wall = 1 or item_type != %d ) and item_deleted = 0 and uid = %d and created >= '%s' and created < '%s' and resource_type = '' order by created",
intval(ITEM_TYPE_POST),
intval($channel_id),
- dbesc($mindate),
+ dbesc($mindate),
dbesc($maxdate)
);
@@ -745,16 +740,24 @@ function identity_export_year($channel_id,$year,$month = 0) {
return $ret;
}
-// export items within an arbitrary date range. Date/time is in UTC.
-
-function channel_export_items($channel_id,$start,$finish) {
+/**
+ * @brief Export items within an arbitrary date range.
+ *
+ * Date/time is in UTC.
+ *
+ * @param int $channel_id The channel ID
+ * @param string $start
+ * @param string $finish
+ * @return array
+ */
+function channel_export_items($channel_id, $start, $finish) {
if(! $start)
return array();
else
- $start = datetime_convert('UTC','UTC',$start);
+ $start = datetime_convert('UTC', 'UTC', $start);
- $finish = datetime_convert('UTC','UTC',(($finish) ? $finish : 'now'));
+ $finish = datetime_convert('UTC', 'UTC', (($finish) ? $finish : 'now'));
if($finish < $start)
return array();
@@ -768,16 +771,16 @@ function channel_export_items($channel_id,$start,$finish) {
$r = q("select * from item where ( item_wall = 1 or item_type != %d ) and item_deleted = 0 and uid = %d and created >= '%s' and created < '%s' and resource_type = '' order by created",
intval(ITEM_TYPE_POST),
intval($channel_id),
- dbesc($start),
+ dbesc($start),
dbesc($finish)
);
if($r) {
$ret['item'] = array();
xchan_query($r);
- $r = fetch_post_tags($r,true);
+ $r = fetch_post_tags($r, true);
foreach($r as $rr)
- $ret['item'][] = encode_item($rr,true);
+ $ret['item'][] = encode_item($rr, true);
}
return $ret;
@@ -792,7 +795,7 @@ function channel_export_items($channel_id,$start,$finish) {
*
* Permissions of the current observer are checked. If a restricted profile is available
* to the current observer, that will be loaded instead of the channel default profile.
- *
+ *
* The channel owner can set $profile to a valid profile_guid to preview that profile.
*
* The channel default theme is also selected for use, unless over-riden elsewhere.
@@ -866,7 +869,6 @@ function profile_load($nickname, $profile = '') {
intval($p[0]['profile_uid'])
);
if($q) {
-
$extra_fields = array();
require_once('include/channel.php');
@@ -903,7 +905,7 @@ function profile_load($nickname, $profile = '') {
// fetch user tags if this isn't the default profile
if(! $p[0]['is_default']) {
- $x = q("select `keywords` from `profile` where uid = %d and `is_default` = 1 limit 1",
+ $x = q("select keywords from profile where uid = %d and is_default = 1 limit 1",
intval($p[0]['profile_uid'])
);
if($x && $can_view_profile)
@@ -985,7 +987,6 @@ function profile_edit_menu($uid) {
}
return $ret;
-
}
/**
@@ -997,6 +998,7 @@ function profile_edit_menu($uid) {
* @param array $profile
* @param int $block
* @param boolean $show_connect
+ * @param mixed $zcard
*
* @return HTML string suitable for sidebar inclusion
* Exceptions: Returns empty string if passed $profile is wrong type or not populated
@@ -1032,7 +1034,7 @@ function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = fa
$connect_url = rconnect_url($profile['uid'],get_observer_hash());
$connect = (($connect_url) ? t('Connect') : '');
- if($connect_url)
+ if($connect_url)
$connect_url = sprintf($connect_url,urlencode(channel_reddress($profile)));
// premium channel - over-ride
@@ -1066,19 +1068,26 @@ function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = fa
? trim(substr($profile['channel_name'],0,strpos($profile['channel_name'],' '))) : $profile['channel_name']);
$lastname = (($firstname === $profile['channel_name']) ? '' : trim(substr($profile['channel_name'],strlen($firstname))));
- $diaspora = array(
- 'podloc' => z_root(),
- 'guid' => $profile['channel_guid'] . str_replace('.','',App::get_hostname()),
- 'pubkey' => pemtorsa($profile['channel_pubkey']),
- 'searchable' => (($block) ? 'false' : 'true'),
- 'nickname' => $profile['channel_address'],
- 'fullname' => $profile['channel_name'],
- 'firstname' => $firstname,
- 'lastname' => $lastname,
- 'photo300' => z_root() . '/photo/profile/300/' . $profile['uid'] . '.jpg',
- 'photo100' => z_root() . '/photo/profile/100/' . $profile['uid'] . '.jpg',
- 'photo50' => z_root() . '/photo/profile/50/' . $profile['uid'] . '.jpg',
- );
+ // @fixme move this to the diaspora plugin itself
+
+ if(plugin_is_installed('diaspora')) {
+ $diaspora = array(
+ 'podloc' => z_root(),
+ 'guid' => $profile['channel_guid'] . str_replace('.','',App::get_hostname()),
+ 'pubkey' => pemtorsa($profile['channel_pubkey']),
+ 'searchable' => (($block) ? 'false' : 'true'),
+ 'nickname' => $profile['channel_address'],
+ 'fullname' => $profile['channel_name'],
+ 'firstname' => $firstname,
+ 'lastname' => $lastname,
+ 'photo300' => z_root() . '/photo/profile/300/' . $profile['uid'] . '.jpg',
+ 'photo100' => z_root() . '/photo/profile/100/' . $profile['uid'] . '.jpg',
+ 'photo50' => z_root() . '/photo/profile/50/' . $profile['uid'] . '.jpg',
+ );
+ }
+ else
+ $diaspora = '';
+
$contact_block = contact_block();
@@ -1124,7 +1133,7 @@ function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = fa
'$editmenu' => profile_edit_menu($profile['uid'])
));
- $arr = array('profile' => &$profile, 'entry' => &$o);
+ $arr = array('profile' => $profile, 'entry' => $o);
call_hooks('profile_sidebar', $arr);
@@ -1156,7 +1165,6 @@ function advanced_profile(&$a) {
}
-
$tpl = get_markup_template('profile_advanced.tpl');
$profile = array();
@@ -1191,12 +1199,12 @@ function advanced_profile(&$a) {
if((substr(App::$profile['dob'],5,2) === '00') || (substr(App::$profile['dob'],8,2) === '00'))
$val = substr(App::$profile['dob'],0,4);
-
+
$year_bd_format = t('j F, Y');
$short_bd_format = t('j F');
if(! $val) {
- $val = ((intval(App::$profile['dob']))
+ $val = ((intval(App::$profile['dob']))
? day_translate(datetime_convert('UTC','UTC',App::$profile['dob'] . ' 00:00 +00:00',$year_bd_format))
: day_translate(datetime_convert('UTC','UTC','2001-' . substr(App::$profile['dob'],5) . ' 00:00 +00:00',$short_bd_format)));
}
@@ -1241,7 +1249,7 @@ function advanced_profile(&$a) {
if($txt = prepare_text(App::$profile['channels'])) $profile['channels'] = array( t('My other channels:'), $txt);
if($txt = prepare_text(App::$profile['music'])) $profile['music'] = array( t('Musical interests:'), $txt);
-
+
if($txt = prepare_text(App::$profile['book'])) $profile['book'] = array( t('Books, literature:'), $txt);
if($txt = prepare_text(App::$profile['tv'])) $profile['tv'] = array( t('Television:'), $txt);
@@ -1249,7 +1257,7 @@ function advanced_profile(&$a) {
if($txt = prepare_text(App::$profile['film'])) $profile['film'] = array( t('Film/dance/culture/entertainment:'), $txt);
if($txt = prepare_text(App::$profile['romance'])) $profile['romance'] = array( t('Love/Romance:'), $txt);
-
+
if($txt = prepare_text(App::$profile['employment'])) $profile['employment'] = array( t('Work/employment:'), $txt);
if($txt = prepare_text(App::$profile['education'])) $profile['education'] = array( t('School/education:'), $txt );
@@ -1268,7 +1276,7 @@ function advanced_profile(&$a) {
$things = get_things(App::$profile['profile_guid'],App::$profile['profile_uid']);
-// logger('mod_profile: things: ' . print_r($things,true), LOGGER_DATA);
+// logger('mod_profile: things: ' . print_r($things,true), LOGGER_DATA);
return replace_macros($tpl, array(
'$title' => t('Profile'),
@@ -1363,64 +1371,11 @@ function zat_init() {
-/**
- * @brief Adds a zid parameter to a url.
- *
- * @param string $s
- * The url to accept the zid
- * @param boolean $address
- * $address to use instead of session environment
- * @return string
- *
- * @hooks 'zid'
- * string url - url to accept zid
- * string zid - urlencoded zid
- * string result - the return string we calculated, change it if you want to return something else
- */
-function zid($s,$address = '') {
- if (! strlen($s) || strpos($s,'zid='))
- return $s;
-
- $m = parse_url($s);
- $fragment = ((array_key_exists('fragment',$m) && $m['fragment']) ? $m['fragment'] : false);
- if($fragment !== false)
- $s = str_replace('#' . $fragment,'',$s);
-
- $has_params = ((strpos($s,'?')) ? true : false);
- $num_slashes = substr_count($s, '/');
- if (! $has_params)
- $has_params = ((strpos($s, '&')) ? true : false);
-
- $achar = strpos($s,'?') ? '&' : '?';
-
- $mine = get_my_url();
- $myaddr = (($address) ? $address : get_my_address());
-
- /** @FIXME checking against our own channel url is no longer reliable. We may have a lot
- * of urls attached to out channel. Should probably match against our site, since we
- * will not need to remote authenticate on our own site anyway.
- */
-
- if ($mine && $myaddr && (! link_compare($mine,$s)))
- $zurl = $s . (($num_slashes >= 3) ? '' : '/') . $achar . 'zid=' . urlencode($myaddr);
- else
- $zurl = $s;
-
- // put fragment at the end
-
- if($fragment)
- $zurl .= '#' . $fragment;
-
- $arr = array('url' => $s, 'zid' => urlencode($myaddr), 'result' => $zurl);
- call_hooks('zid', $arr);
-
- return $arr['result'];
-}
// Used from within PCSS themes to set theme parameters. If there's a
// puid request variable, that is the "page owner" and normally their theme
-// settings take precedence; unless a local user sets the "always_my_theme"
-// system pconfig, which means they don't want to see anybody else's theme
+// settings take precedence; unless a local user sets the "always_my_theme"
+// system pconfig, which means they don't want to see anybody else's theme
// settings except their own while on this site.
function get_theme_uid() {
@@ -1523,25 +1478,18 @@ function remote_online_status($webbie) {
}
-function get_channel_by_nick($nick) {
- $r = q("select * from channel where channel_address = '%s' limit 1",
- dbesc($nick)
- );
- return(($r) ? $r[0] : false);
-
-}
-
/**
* @brief
*
* @return string
*/
+
function identity_selector() {
- if (local_channel()) {
+ if(local_channel()) {
$r = q("select channel.*, xchan.* from channel left join xchan on channel.channel_hash = xchan.xchan_hash where channel.channel_account_id = %d and channel_removed = 0 order by channel_name ",
intval(get_account_id())
);
- if (count($r) > 1) {
+ if($r && count($r) > 1) {
//$account = App::get_account();
$o = replace_macros(get_markup_template('channel_id_select.tpl'), array(
'$channels' => $r,
@@ -1612,7 +1560,7 @@ function get_profile_fields_advanced($filter = 0) {
* The channel to disable notifications for
* @returns int
* Current notification flag value. Send this to notifications_on() to restore the channel settings when finished
- * with the activity requiring notifications_off();
+ * with the activity requiring notifications_off();
*/
function notifications_off($channel_id) {
$r = q("select channel_notifyflags from channel where channel_id = %d limit 1",
@@ -1626,18 +1574,18 @@ function notifications_off($channel_id) {
}
-function notifications_on($channel_id,$value) {
+function notifications_on($channel_id, $value) {
$x = q("update channel set channel_notifyflags = %d where channel_id = %d",
intval($value),
intval($channel_id)
);
+
return $x;
}
function get_channel_default_perms($uid) {
-
$ret = [];
$r = q("select abook_xchan from abook where abook_channel = %d and abook_self = 1 limit 1",
@@ -1659,7 +1607,6 @@ function get_channel_default_perms($uid) {
function profiles_build_sync($channel_id) {
-
$r = q("select * from profile where uid = %d",
intval($channel_id)
);
@@ -1706,7 +1653,6 @@ function auto_channel_create($account_id) {
$arr['nickname'] = check_webbie(array($arr['nickname'], $arr['nickname'] . mt_rand(1000,9999)));
return create_identity($arr);
-
}
function get_cover_photo($channel_id,$format = 'bbcode', $res = PHOTO_RES_COVER_1200) {
@@ -1741,18 +1687,24 @@ function get_cover_photo($channel_id,$format = 'bbcode', $res = PHOTO_RES_COVER_
break;
}
- return $output;
-
+ return $output;
}
-function get_zcard($channel,$observer_hash = '',$args = array()) {
+/**
+ * @brief
+ *
+ * @param array $channel
+ * @param string $observer_hash
+ * @param array $args
+ * @return string
+ */
+function get_zcard($channel, $observer_hash = '', $args = array()) {
logger('get_zcard');
$maxwidth = (($args['width']) ? intval($args['width']) : 0);
$maxheight = (($args['height']) ? intval($args['height']) : 0);
-
if(($maxwidth > 1200) || ($maxwidth < 1))
$maxwidth = 1200;
@@ -1760,25 +1712,22 @@ function get_zcard($channel,$observer_hash = '',$args = array()) {
$width = 425;
$size = 'hz_small';
$cover_size = PHOTO_RES_COVER_425;
- $pphoto = array('mimetype' => $channel['xchan_photo_mimetype'], 'width' => 80 , 'height' => 80, 'href' => $channel['xchan_photo_m']);
- }
- elseif($maxwidth <= 900) {
+ $pphoto = array('mimetype' => $channel['xchan_photo_mimetype'], 'width' => 80 , 'height' => 80, 'href' => $channel['xchan_photo_m']);
+ } elseif($maxwidth <= 900) {
$width = 900;
$size = 'hz_medium';
$cover_size = PHOTO_RES_COVER_850;
- $pphoto = array('mimetype' => $channel['xchan_photo_mimetype'], 'width' => 160 , 'height' => 160, 'href' => $channel['xchan_photo_l']);
- }
- elseif($maxwidth <= 1200) {
+ $pphoto = array('mimetype' => $channel['xchan_photo_mimetype'], 'width' => 160 , 'height' => 160, 'href' => $channel['xchan_photo_l']);
+ } elseif($maxwidth <= 1200) {
$width = 1200;
$size = 'hz_large';
$cover_size = PHOTO_RES_COVER_1200;
- $pphoto = array('mimetype' => $channel['xchan_photo_mimetype'], 'width' => 300 , 'height' => 300, 'href' => $channel['xchan_photo_l']);
+ $pphoto = array('mimetype' => $channel['xchan_photo_mimetype'], 'width' => 300 , 'height' => 300, 'href' => $channel['xchan_photo_l']);
}
// $scale = (float) $maxwidth / $width;
// $translate = intval(($scale / 1.0) * 100);
-
$channel['channel_addr'] = channel_reddress($channel);
$zcard = array('chan' => $channel);
@@ -1791,12 +1740,11 @@ function get_zcard($channel,$observer_hash = '',$args = array()) {
if($r) {
$cover = $r[0];
$cover['href'] = z_root() . '/photo/' . $r[0]['resource_id'] . '-' . $r[0]['imgscale'];
- }
- else {
+ } else {
$cover = $pphoto;
}
-
- $o .= replace_macros(get_markup_template('zcard.tpl'),array(
+
+ $o .= replace_macros(get_markup_template('zcard.tpl'), array(
'$maxwidth' => $maxwidth,
'$scale' => $scale,
'$translate' => $translate,
@@ -1804,21 +1752,19 @@ function get_zcard($channel,$observer_hash = '',$args = array()) {
'$cover' => $cover,
'$pphoto' => $pphoto,
'$zcard' => $zcard
- ));
-
+ ));
+
return $o;
-
}
-function get_zcard_embed($channel,$observer_hash = '',$args = array()) {
+function get_zcard_embed($channel, $observer_hash = '', $args = array()) {
logger('get_zcard_embed');
$maxwidth = (($args['width']) ? intval($args['width']) : 0);
$maxheight = (($args['height']) ? intval($args['height']) : 0);
-
if(($maxwidth > 1200) || ($maxwidth < 1))
$maxwidth = 1200;
@@ -1853,11 +1799,10 @@ function get_zcard_embed($channel,$observer_hash = '',$args = array()) {
if($r) {
$cover = $r[0];
$cover['href'] = z_root() . '/photo/' . $r[0]['resource_id'] . '-' . $r[0]['imgscale'];
- }
- else {
+ } else {
$cover = $pphoto;
}
-
+
$o .= replace_macros(get_markup_template('zcard_embed.tpl'),array(
'$maxwidth' => $maxwidth,
'$scale' => $scale,
@@ -1866,36 +1811,73 @@ function get_zcard_embed($channel,$observer_hash = '',$args = array()) {
'$cover' => $cover,
'$pphoto' => $pphoto,
'$zcard' => $zcard
- ));
-
+ ));
+
return $o;
-
}
-
+/**
+ * @brief
+ *
+ * @param string $nick
+ * @return mixed
+ */
function channelx_by_nick($nick) {
$r = q("SELECT * FROM channel left join xchan on channel_hash = xchan_hash WHERE channel_address = '%s' and channel_removed = 0 LIMIT 1",
dbesc($nick)
);
+
return(($r) ? $r[0] : false);
}
+/**
+ * @brief
+ *
+ * @param string $hash
+ * @return mixed
+ */
function channelx_by_hash($hash) {
- $r = q("SELECT * FROM channel left join xchan on channel_hash = xchan_hash WHERE channel_hash = '%s' and channel_removed = 0 LIMIT 1",
+ $r = q("SELECT * FROM channel left join xchan on channel_hash = xchan_hash WHERE channel_hash = '%s' and channel_removed = 0 LIMIT 1",
dbesc($hash)
);
+
return(($r) ? $r[0] : false);
}
+/**
+ * @brief
+ *
+ * @param int $id
+ * @return mixed
+ */
function channelx_by_n($id) {
- $r = q("SELECT * FROM channel left join xchan on channel_hash = xchan_hash WHERE channel_id = %d and channel_removed = 0 LIMIT 1",
+ $r = q("SELECT * FROM channel left join xchan on channel_hash = xchan_hash WHERE channel_id = %d and channel_removed = 0 LIMIT 1",
dbesc($id)
);
+
return(($r) ? $r[0] : false);
}
+/**
+ * @brief
+ *
+ * @param string $channel
+ * @return string
+ */
function channel_reddress($channel) {
- if(! ($channel && array_key_exists('channel_address',$channel)))
+ if(! ($channel && array_key_exists('channel_address', $channel)))
return '';
+
return strtolower($channel['channel_address'] . '@' . App::get_hostname());
+}
+
+
+function channel_manual_conv_update($channel_id) {
+
+ $x = get_pconfig($channel_id, 'system','manual_conversation_update');
+ if($x === false)
+ $x = get_config('system','manual_conversation_update');
+
+ return intval($x);
+
} \ No newline at end of file
diff --git a/include/config.php b/include/config.php
index 8c0469392..0b0e639ab 100644
--- a/include/config.php
+++ b/include/config.php
@@ -1,5 +1,4 @@
<?php
-
/**
* @file include/config.php
* @brief Arbitrary configuration storage.
@@ -7,7 +6,6 @@
* Arrays get stored as serialized strings.
* Booleans are stored as integer 0/1.
*
-
* - <b>config</b> is used for hub specific configurations. It overrides the
* configurations from .htconfig file. The storage is of size TEXT.
* - <b>pconfig</b> is used for channel specific configurations and takes a
@@ -26,7 +24,7 @@
* - get_config() and set_config() can also be done through the command line tool
* @ref util/config.md "util/config"
* - get_pconfig() and set_pconfig() can also be done through the command line tool
- * @ref util/pconfig.md "util/pconfig" and takes a channel_id as first argument.
+ * @ref util/pconfig.md "util/pconfig" and takes a channel_id as first argument.
*
*/
@@ -37,8 +35,8 @@ function load_config($family) {
Zlib\Config::Load($family);
}
-function get_config($family, $key) {
- return Zlib\Config::Get($family,$key);
+function get_config($family, $key, $default = false) {
+ return Zlib\Config::Get($family,$key,$default);
}
function set_config($family, $key, $value) {
@@ -53,8 +51,8 @@ function load_pconfig($uid) {
Zlib\PConfig::Load($uid);
}
-function get_pconfig($uid, $family, $key, $instore = false) {
- return Zlib\PConfig::Get($uid,$family,$key,$instore = false);
+function get_pconfig($uid, $family, $key, $default = false) {
+ return Zlib\PConfig::Get($uid,$family,$key,$default);
}
function set_pconfig($uid, $family, $key, $value) {
@@ -69,8 +67,8 @@ function load_xconfig($xchan) {
Zlib\XConfig::Load($xchan);
}
-function get_xconfig($xchan, $family, $key) {
- return Zlib\XConfig::Get($xchan,$family,$key);
+function get_xconfig($xchan, $family, $key, $default = false) {
+ return Zlib\XConfig::Get($xchan,$family,$key, $default);
}
function set_xconfig($xchan, $family, $key, $value) {
@@ -85,8 +83,8 @@ function load_aconfig($account_id) {
Zlib\AConfig::Load($account_id);
}
-function get_aconfig($account_id, $family, $key) {
- return Zlib\AConfig::Get($account_id, $family, $key);
+function get_aconfig($account_id, $family, $key, $default = false) {
+ return Zlib\AConfig::Get($account_id, $family, $key, $default);
}
function set_aconfig($account_id, $family, $key, $value) {
@@ -101,8 +99,8 @@ function load_abconfig($chan, $xhash, $family = '') {
return Zlib\AbConfig::Load($chan,$xhash,$family);
}
-function get_abconfig($chan,$xhash,$family,$key) {
- return Zlib\AbConfig::Get($chan,$xhash,$family,$key);
+function get_abconfig($chan,$xhash,$family,$key, $default = false) {
+ return Zlib\AbConfig::Get($chan,$xhash,$family,$key, $default);
}
function set_abconfig($chan,$xhash,$family,$key,$value) {
@@ -117,8 +115,8 @@ function load_iconfig(&$item) {
Zlib\IConfig::Load($item);
}
-function get_iconfig(&$item, $family, $key) {
- return Zlib\IConfig::Get($item, $family, $key);
+function get_iconfig(&$item, $family, $key, $default = false) {
+ return Zlib\IConfig::Get($item, $family, $key, $default);
}
function set_iconfig(&$item, $family, $key, $value, $sharing = false) {
diff --git a/include/connections.php b/include/connections.php
index 017117dda..b08d046b3 100644
--- a/include/connections.php
+++ b/include/connections.php
@@ -297,16 +297,16 @@ function channel_remove($channel_id, $local = true, $unset_session=false) {
}
- q("DELETE FROM `groups` WHERE `uid` = %d", intval($channel_id));
- q("DELETE FROM `group_member` WHERE `uid` = %d", intval($channel_id));
- q("DELETE FROM `event` WHERE `uid` = %d", intval($channel_id));
- q("DELETE FROM `item` WHERE `uid` = %d", intval($channel_id));
- q("DELETE FROM `mail` WHERE `channel_id` = %d", intval($channel_id));
- q("DELETE FROM `notify` WHERE `uid` = %d", intval($channel_id));
- q("DELETE FROM `photo` WHERE `uid` = %d", intval($channel_id));
- q("DELETE FROM `attach` WHERE `uid` = %d", intval($channel_id));
- q("DELETE FROM `profile` WHERE `uid` = %d", intval($channel_id));
- q("DELETE FROM `pconfig` WHERE `uid` = %d", intval($channel_id));
+ q("DELETE FROM groups WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM group_member WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM event WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM item WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM mail WHERE channel_id = %d", intval($channel_id));
+ q("DELETE FROM notify WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM photo WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM attach WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM profile WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM pconfig WHERE uid = %d", intval($channel_id));
// @FIXME At this stage we need to remove the file resources located under /store/$nickname
diff --git a/include/conversation.php b/include/conversation.php
index 287dd4983..d367c27a6 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -146,7 +146,7 @@ function localize_item(&$item){
case ACTIVITY_OBJ_NOTE:
default:
$post_type = t('status');
- if($obj['mid'] != $obj['parent_mid'])
+ if($obj['id'] != $obj['parent'])
$post_type = t('comment');
break;
}
@@ -269,8 +269,8 @@ function localize_item(&$item){
// (and update to json storage)
if (activity_match($item['verb'],ACTIVITY_TAG)) {
- $r = q("SELECT * from `item`,`contact` WHERE
- `item`.`contact-id`=`contact`.`id` AND `item`.`mid`='%s';",
+ $r = q("SELECT * from item,contact WHERE
+ item.contact-id=contact.id AND item.mid='%s';",
dbesc($item['parent_mid']));
if(count($r)==0) return;
$obj=$r[0];
@@ -363,7 +363,7 @@ function localize_item(&$item){
if(intval($item['item_obscured'])
&& strlen($item['body']) && (! strpos($item['body'],'data'))) {
- $item['body'] = json_encode(crypto_encapsulate($item['body'],get_config('system','pubkey')));
+ $item['body'] = z_obscure($item['body']);
}
}
@@ -405,8 +405,6 @@ function count_descendants($item) {
function visible_activity($item) {
$hidden_activities = [ ACTIVITY_LIKE, ACTIVITY_DISLIKE, ACTIVITY_AGREE, ACTIVITY_DISAGREE, ACTIVITY_ABSTAIN, ACTIVITY_ATTEND, ACTIVITY_ATTENDNO, ACTIVITY_ATTENDMAYBE ];
- $post_types = [ ACTIVITY_OBJ_NOTE, ACTIVITY_OBJ_COMMENT, basename(ACTIVITY_OBJ_NOTE), basename(ACTIVITY_OBJ_COMMENT)];
-
if(intval($item['item_notshown']))
return false;
@@ -416,14 +414,32 @@ function visible_activity($item) {
}
}
+ if(is_edit_activity($item))
+ return false;
+
+ return true;
+}
+
+/**
+ * @brief Check if a given activity is an edit activity
+ *
+ *
+ * @param array $item
+ * @return boolean
+ */
+
+function is_edit_activity($item) {
+
+ $post_types = [ ACTIVITY_OBJ_NOTE, ACTIVITY_OBJ_COMMENT, basename(ACTIVITY_OBJ_NOTE), basename(ACTIVITY_OBJ_COMMENT)];
+
// In order to share edits with networks which have no concept of editing, we'll create
// separate activities to indicate the edit. Our network will not require them, since our
// edits are automatically applied and the activity indicated.
if(($item['verb'] === ACTIVITY_UPDATE) && (in_array($item['obj_type'],$post_types)))
- return false;
+ return true;
- return true;
+ return false;
}
/**
@@ -457,22 +473,6 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
if (local_channel())
load_pconfig(local_channel(),'');
- $arr_blocked = null;
-
- if (local_channel())
- $str_blocked = get_pconfig(local_channel(),'system','blocked');
- if (! local_channel() && ($mode == 'network')) {
- $sys = get_sys_channel();
- $id = $sys['channel_id'];
- $str_blocked = get_pconfig($id,'system','blocked');
- }
-
- if ($str_blocked) {
- $arr_blocked = explode(',',$str_blocked);
- for ($x = 0; $x < count($arr_blocked); $x ++)
- $arr_blocked[$x] = trim($arr_blocked[$x]);
- }
-
$profile_owner = 0;
$page_writeable = false;
$live_update_div = '';
@@ -599,17 +599,13 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
foreach($items as $item) {
- if($arr_blocked) {
- $blocked = false;
- foreach($arr_blocked as $b) {
- if(($b) && (($item['author_xchan'] == $b) || ($item['owner_xchan'] == $b))) {
- $blocked = true;
- break;
- }
- }
- if($blocked)
- continue;
- }
+ $x = [ 'mode' => $mode, 'item' => $item ];
+ call_hooks('stream_item',$x);
+
+ if($x['item']['blocked'])
+ continue;
+
+ $item = $x['item'];
$threadsid++;
@@ -771,28 +767,14 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
// Check for any blocked authors
- if($arr_blocked) {
- $blocked = false;
- foreach($arr_blocked as $b) {
- if(($b) && ($item['author_xchan'] == $b)) {
- $blocked = true;
- break;
- }
- }
- if($blocked)
- continue;
- }
- // Check all the kids too
+ $x = [ 'mode' => $mode, 'item' => $item ];
+ call_hooks('stream_item',$x);
+
+ if($x['item']['blocked'])
+ continue;
- if($arr_blocked && $item['children']) {
- for($d = 0; $d < count($item['children']); $d ++) {
- foreach($arr_blocked as $b) {
- if(($b) && ($item['children'][$d]['author_xchan'] == $b))
- $item['children'][$d]['author_blocked'] = true;
- }
- }
- }
+ $item = $x['item'];
builtin_activity_puller($item, $conv_responses);
@@ -1296,7 +1278,8 @@ function status_editor($a, $x, $popup = false) {
'$expiryModalOK' => t('OK'),
'$expiryModalCANCEL' => t('Cancel'),
'$expanded' => ((x($x, 'expanded')) ? $x['expanded'] : false),
- '$bbcode' => ((x($x, 'bbcode')) ? $x['bbcode'] : false)
+ '$bbcode' => ((x($x, 'bbcode')) ? $x['bbcode'] : false),
+ '$parent' => ((array_key_exists('parent',$x) && $x['parent']) ? $x['parent'] : 0)
));
if ($popup === true) {
@@ -1536,7 +1519,11 @@ function network_tabs() {
// tabs
$tabs = array();
- if(! get_config('system','disable_discover_tab')) {
+ $d = get_config('system','disable_discover_tab');
+ if($d === false)
+ $d = 1;
+
+ if(! $d) {
$tabs[] = array(
'label' => t('Discover'),
'url' => z_root() . '/' . $cmd . '?f=&fh=1' ,
@@ -1628,7 +1615,6 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
$uid = ((App::$profile['profile_uid']) ? App::$profile['profile_uid'] : local_channel());
$account_id = ((App::$profile['profile_uid']) ? App::$profile['channel_account_id'] : App::$channel['channel_account_id']);
-
if($uid == local_channel()) {
$cal_link = '';
}
@@ -1732,7 +1718,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
if(feature_enabled($uid,'wiki') && (get_account_techlevel($account_id) > 3)) {
$tabs[] = array(
- 'label' => t('Wiki'),
+ 'label' => t('Wikis'),
'url' => z_root() . '/wiki/' . $nickname,
'sel' => ((argv(0) == 'wiki') ? 'active' : ''),
'title' => t('Wiki'),
diff --git a/include/crypto.php b/include/crypto.php
index bc798d919..f75390985 100644
--- a/include/crypto.php
+++ b/include/crypto.php
@@ -48,27 +48,122 @@ function pkcs5_unpad($text)
function AES256CBC_encrypt($data,$key,$iv) {
return openssl_encrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
-
}
function AES256CBC_decrypt($data,$key,$iv) {
return openssl_decrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
+}
+
+function AES128CBC_encrypt($data,$key,$iv) {
+ $key = substr($key,0,16);
+ $iv = substr($iv,0,16);
+ return openssl_encrypt($data,'aes-128-cbc',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
+}
+
+function AES128CBC_decrypt($data,$key,$iv) {
+ $key = substr($key,0,16);
+ $iv = substr($iv,0,16);
+ return openssl_decrypt($data,'aes-128-cbc',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
+}
+
+function STD_encrypt($data,$key,$iv) {
+ $key = substr($key,0,32);
+ $iv = substr($iv,0,16);
+ return openssl_encrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
+}
+
+function STD_decrypt($data,$key,$iv) {
+ $key = substr($key,0,32);
+ $iv = substr($iv,0,16);
+ return openssl_decrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
+}
+function CAST5CBC_encrypt($data,$key,$iv) {
+ $key = substr($key,0,16);
+ $iv = substr($iv,0,8);
+ return openssl_encrypt($data,'cast5-cbc',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,8,"\0"));
+}
+
+function CAST5CBC_decrypt($data,$key,$iv) {
+ $key = substr($key,0,16);
+ $iv = substr($iv,0,8);
+ return openssl_decrypt($data,'cast5-cbc',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,8,"\0"));
}
function crypto_encapsulate($data,$pubkey,$alg='aes256cbc') {
+ $fn = strtoupper($alg) . '_encrypt';
+
if($alg === 'aes256cbc')
return aes_encapsulate($data,$pubkey);
+ return other_encapsulate($data,$pubkey,$alg);
+
+}
+
+function other_encapsulate($data,$pubkey,$alg) {
+ if(! $pubkey)
+ logger('no key. data: ' . $data);
+
+ $fn = strtoupper($alg) . '_encrypt';
+ if(function_exists($fn)) {
+
+ // A bit hesitant to use openssl_random_pseudo_bytes() as we know
+ // it has been historically targeted by US agencies for 'weakening'.
+ // It is still arguably better than trying to come up with an
+ // alternative cryptographically secure random generator.
+ // There is little point in using the optional second arg to flag the
+ // assurance of security since it is meaningless if the source algorithms
+ // have been compromised. Also none of this matters if RSA has been
+ // compromised by state actors and evidence is mounting that this has
+ // already happened.
+
+ $key = openssl_random_pseudo_bytes(256);
+ $iv = openssl_random_pseudo_bytes(256);
+ $result['data'] = base64url_encode($fn($data,$key,$iv),true);
+ // log the offending call so we can track it down
+ if(! openssl_public_encrypt($key,$k,$pubkey)) {
+ $x = debug_backtrace();
+ logger('RSA failed. ' . print_r($x[0],true));
+ }
+
+ $result['alg'] = $alg;
+ $result['key'] = base64url_encode($k,true);
+ openssl_public_encrypt($iv,$i,$pubkey);
+ $result['iv'] = base64url_encode($i,true);
+ return $result;
+ }
+ else {
+ $x = [ 'data' => $data, 'pubkey' => $pubkey, 'alg' => $alg, 'result' => $data ];
+ call_hooks('other_encapsulate', $x);
+ return $x['result'];
+ }
+}
+
+function crypto_methods() {
+
+ if(\Zotlabs\Lib\System::get_server_role() !== 'pro')
+ return [ 'aes256cbc' ];
+
+ // 'std' is the new project standard which is aes256cbc but transmits/receives 256-byte key and iv.
+ // aes256cbc is provided for compatibility with earlier zot implementations which assume 32-byte key and 16-byte iv.
+ // other_encapsulate() now produces these longer keys/ivs by default so that it is difficult to guess a
+ // particular implementation or choice of underlying implementations based on the key/iv length.
+ // The actual methods are responsible for deriving the actual key/iv from the provided parameters;
+ // possibly by truncation or segmentation - though many other methods could be used.
+
+ $r = [ 'std', 'aes256cbc', 'aes128cbc', 'cast5cbc' ];
+ call_hooks('crypto_methods',$r);
+ return $r;
+
}
function aes_encapsulate($data,$pubkey) {
if(! $pubkey)
logger('aes_encapsulate: no key. data: ' . $data);
- $key = random_string(32,RANDOM_STRING_TEXT);
- $iv = random_string(16,RANDOM_STRING_TEXT);
+ $key = openssl_random_pseudo_bytes(32);
+ $iv = openssl_random_pseudo_bytes(16);
$result['data'] = base64url_encode(AES256CBC_encrypt($data,$key,$iv),true);
// log the offending call so we can track it down
if(! openssl_public_encrypt($key,$k,$pubkey)) {
@@ -89,6 +184,22 @@ function crypto_unencapsulate($data,$prvkey) {
if($alg === 'aes256cbc')
return aes_unencapsulate($data,$prvkey);
+ return other_unencapsulate($data,$prvkey,$alg);
+
+}
+
+function other_unencapsulate($data,$prvkey,$alg) {
+ $fn = strtoupper($alg) . '_decrypt';
+ if(function_exists($fn)) {
+ openssl_private_decrypt(base64url_decode($data['key']),$k,$prvkey);
+ openssl_private_decrypt(base64url_decode($data['iv']),$i,$prvkey);
+ return $fn(base64url_decode($data['data']),$k,$i);
+ }
+ else {
+ $x = [ 'data' => $data, 'prvkey' => $prvkey, 'alg' => $alg, 'result' => $data ];
+ call_hooks('other_unencapsulate',$x);
+ return $x['result'];
+ }
}
diff --git a/include/datetime.php b/include/datetime.php
index cd08ab367..85e87848b 100644
--- a/include/datetime.php
+++ b/include/datetime.php
@@ -92,8 +92,8 @@ function datetime_convert($from = 'UTC', $to = 'UTC', $s = 'now', $fmt = "Y-m-d
// Slight hackish adjustment so that 'zero' datetime actually returns what is intended
// otherwise we end up with -0001-11-30 ...
- // add 32 days so that we at least get year 00, and then hack around the fact that
- // months and days always start with 1.
+ // add 32 days so that we at least get year 00, and then hack around the fact that
+ // months and days always start with 1.
// if(substr($s,0,10) == '0000-00-00') {
// $d = new DateTime($s . ' + 32 days', new DateTimeZone('UTC'));
@@ -195,7 +195,7 @@ function timesel($format, $h, $m, $id='timepicker') {
/**
* @brief Returns a datetime selector.
*
- * @param $format
+ * @param string $format
* format string, e.g. 'ymd' or 'mdy'. Not currently supported
* @param $min
* unix timestamp of minimum date
@@ -203,6 +203,7 @@ function timesel($format, $h, $m, $id='timepicker') {
* unix timestap of maximum date
* @param $default
* unix timestamp of default date
+ * @param string $label
* @param string $id
* id and name of datetimepicker (defaults to "datetimepicker")
* @param boolean $pickdate
@@ -214,8 +215,9 @@ function timesel($format, $h, $m, $id='timepicker') {
* @param $maxfrom
* set maximum date from picker with id $maxfrom (none by default)
* @param boolean $required default false
+ * @param int $first_day (optional) default 0
* @return string Parsed HTML output.
- *
+ *
* @todo Once browser support is better this could probably be replaced with
* native HTML5 date picker.
*/
@@ -239,10 +241,10 @@ function datetimesel($format, $min, $max, $default, $label, $id = 'datetimepicke
if(!$picktime) $pickers .= ',timepicker: false, closeOnDateSelect:true';
$extra_js = '';
- if($minfrom != '')
+ if($minfrom != '')
$extra_js .= "\$('#id_$minfrom').data('xdsoft_datetimepicker').setOptions({onChangeDateTime: function (currentDateTime) { \$('#id_$id').data('xdsoft_datetimepicker').setOptions({minDate: currentDateTime})}})";
- if($maxfrom != '')
+ if($maxfrom != '')
$extra_js .= "\$('#id_$maxfrom').data('xdsoft_datetimepicker').setOptions({onChangeDateTime: function (currentDateTime) { \$('#id_$id').data('xdsoft_datetimepicker').setOptions({maxDate: currentDateTime})}})";
$readable_format = $dateformat;
@@ -276,7 +278,7 @@ function datetimesel($format, $min, $max, $default, $label, $id = 'datetimepicke
*/
function relative_date($posted_date, $format = null) {
- $localtime = datetime_convert('UTC', date_default_timezone_get(), $posted_date);
+ $localtime = datetime_convert('UTC', date_default_timezone_get(), $posted_date);
$abs = strtotime($localtime);
@@ -340,7 +342,7 @@ function plural_dates($k,$n) {
return;
}
}
-
+
@@ -512,7 +514,7 @@ function cal($y = 0, $m = 0, $links = false, $class='') {
/**
* @brief Return the next birthday, converted from the owner's timezone to UTC.
- *
+ *
* This makes it globally portable.
* If the provided birthday lacks a month and or day, return an empty string.
* A missing year is acceptable.
@@ -554,7 +556,7 @@ function update_birthdays() {
require_once('include/event.php');
require_once('include/permissions.php');
- $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_dob > %s + interval %s and abook_dob < %s + interval %s",
db_utcnow(), db_quoteinterval('7 day'),
db_utcnow(), db_quoteinterval('14 day')
@@ -572,7 +574,7 @@ function update_birthdays() {
$ev['dtend'] = datetime_convert('UTC', 'UTC', $rr['abook_dob'] . ' + 1 day ');
$ev['adjust'] = intval(feature_enabled($rr['abook_channel'],'smart_birthdays'));
$ev['summary'] = sprintf( t('%1$s\'s birthday'), $rr['xchan_name']);
- $ev['description'] = sprintf( t('Happy Birthday %1$s'),
+ $ev['description'] = sprintf( t('Happy Birthday %1$s'),
'[zrl=' . $rr['xchan_url'] . ']' . $rr['xchan_name'] . '[/zrl]') ;
$ev['etype'] = 'birthday';
diff --git a/include/dba/dba_driver.php b/include/dba/dba_driver.php
index 852dc16af..81a3bd590 100755
--- a/include/dba/dba_driver.php
+++ b/include/dba/dba_driver.php
@@ -12,66 +12,78 @@ class DBA {
static public $dba = null;
static public $dbtype = null;
+ static public $scheme = 'mysql';
static public $logging = false;
+ static public $install_script = 'install/schema_mysql.sql';
+ static public $null_date = '0001-01-01 00:00:00';
+ static public $utc_now = 'UTC_TIMESTAMP()';
+ static public $tquot = "`";
+
+
+
/**
* @brief Returns the database driver object.
*
- * If available it will use PHP's mysqli otherwise mysql driver.
- *
- * @param string $server DB server name
+ * @param string $server DB server name (or PDO dsn - e.g. mysqli:foobar.com;)
* @param string $port DB port
* @param string $user DB username
* @param string $pass DB password
* @param string $db database name
* @param string $dbtype 0 for mysql, 1 for postgres
* @param bool $install Defaults to false
- * @return null|dba_driver A database driver object (dba_mysql|dba_mysqli) or null if no driver found.
+ * @return null|dba_driver A database driver object (dba_pdo) or null if no driver found.
*/
- static public function dba_factory($server, $port,$user,$pass,$db,$dbtype,$install = false) {
+ static public function dba_factory($server,$port,$user,$pass,$db,$dbtype,$install = false) {
self::$dba = null;
self::$dbtype = intval($dbtype);
- $set_port = $port;
+
if(self::$dbtype == DBTYPE_POSTGRES) {
- require_once('include/dba/dba_postgres.php');
- if(is_null($port)) $set_port = 5432;
- self::$dba = new dba_postgres($server, $set_port, $user, $pass, $db, $install);
+ if(!($port))
+ $port = 5432;
+
+ self::$install_script = 'install/schema_postgres.sql';
+ self::$utc_now = "now() at time zone 'UTC'";
+ self::$tquot = '"';
+ self::$scheme = 'pgsql';
+
}
else {
-// Highly experimental at the present time.
-// require_once('include/dba/dba_pdo.php');
-// self::$dba = new dba_pdo($server, $set_port,$user,$pass,$db,$install);
-// }
+ // attempt to use the pdo driver compiled-in mysqli socket
+ // if using 'localhost' with no port configured.
+ // If this is wrong you'll need to set the socket path specifically
+ // using a server name of 'mysql:unix_socket=/socket/path', setting /socket/path
+ // as needed for your platform
- if(class_exists('mysqli')) {
- if (is_null($port)) $set_port = ini_get("mysqli.default_port");
- require_once('include/dba/dba_mysqli.php');
- self::$dba = new dba_mysqli($server, $set_port,$user,$pass,$db,$install);
- }
+ if((!($port)) && ($server !== 'localhost'))
+ $port = 3306;
}
- // Until we have a proper PDO driver, store the DB connection parameters for
- // plugins/addons which use PDO natively (such as cdav). This is wasteful as
- // it opens a separate connection to the DB, but saves a lot of effort re-writing
- // third-party interfaces that are working and well tested.
-
-
+ require_once('include/dba/dba_pdo.php');
+ self::$dba = new dba_pdo($server,self::$scheme,$port,$user,$pass,$db,$install);
+
if(is_object(self::$dba) && self::$dba->connected) {
- if($server === 'localhost')
- $port = $set_port;
- $dns = ((self::$dbtype == DBTYPE_POSTGRES) ? 'postgres' : 'mysql')
- . ':host=' . $server . (is_null($port) ? '' : ';port=' . $port)
- . ';dbname=' . $db;
- self::$dba->pdo_set(array($dns,$user,$pass));
+
+ if(strpbrk($server,':;')) {
+ $dsn = $server;
+ }
+ else {
+ $dsn = self::$scheme . ':host=' . $server . (intval($port) ? '' : ';port=' . $port);
+ }
+ $dsn .= ';dbname=' . $db;
+
+
+ self::$dba->pdo_set(array($dsn,$user,$pass));
}
- define('NULL_DATE', self::$dba->get_null_date());
+ define('NULL_DATE', self::$null_date);
define('ACTIVE_DBTYPE', self::$dbtype);
+ define('TQUOT', self::$tquot);
return self::$dba;
}
@@ -85,11 +97,8 @@ class DBA {
*/
abstract class dba_driver {
// legacy behavior
- const INSTALL_SCRIPT='install/schema_mysql.sql';
- const NULL_DATE = '0001-01-01 00:00:00';
- const UTC_NOW = 'UTC_TIMESTAMP()';
- protected $db;
+ public $db;
protected $pdo = array();
public $debug = 0;
@@ -108,7 +117,7 @@ abstract class dba_driver {
* @param string $db database name
* @return bool
*/
- abstract function connect($server, $port, $user, $pass, $db);
+ abstract function connect($server, $scheme, $port, $user, $pass, $db);
/**
* @brief Perform a DB query with the SQL statement $sql.
@@ -142,34 +151,39 @@ abstract class dba_driver {
*/
abstract function getdriver();
- function __construct($server, $port, $user,$pass,$db,$install = false) {
- if(($install) && (! $this->install($server, $port, $user, $pass, $db))) {
+ function __construct($server, $scheme, $port, $user,$pass,$db,$install = false) {
+ if(($install) && (! $this->install($server, $scheme, $port, $user, $pass, $db))) {
return;
}
- $this->connect($server, $port, $user, $pass, $db);
+ $this->connect($server, $scheme, $port, $user, $pass, $db);
}
function get_null_date() {
- return static::NULL_DATE;
+ return \DBA::$null_date;
}
function get_install_script() {
- return static::INSTALL_SCRIPT;
+ return \DBA::$install_script;
+ }
+
+ function get_table_quote() {
+ return \DBA::$tquot;
}
+
function utcnow() {
- return static::UTC_NOW;
+ return \DBA::$utc_now;
}
- function install($server,$user,$pass,$db) {
+ function install($server,$scheme,$port,$user,$pass,$db) {
if (!(strlen($server) && strlen($user))){
$this->connected = false;
$this->db = null;
return false;
}
- if(strlen($server) && ($server !== 'localhost') && ($server !== '127.0.0.1')) {
- if((! dns_get_record($server, DNS_A + DNS_CNAME + DNS_PTR)) && (! filter_var($server, FILTER_VALIDATE_IP))) {
+ if(strlen($server) && ($server !== 'localhost') && ($server !== '127.0.0.1') && (! strpbrk($server,':;'))) {
+ if(! z_dns_check($server)) {
$this->error = sprintf( t('Cannot locate DNS info for database server \'%s\''), $server);
$this->connected = false;
$this->db = null;
@@ -313,7 +327,7 @@ function db_concat($fld, $sep) {
* queries return true if the command was successful or false if it wasn't.
*
* Example:
- * $r = q("SELECT * FROM `%s` WHERE `uid` = %d",
+ * $r = q("SELECT * FROM %s WHERE `uid` = %d",
* 'user', 1);
*
* @param string $sql The SQL query to execute
@@ -384,9 +398,22 @@ function dbesc_array_cb(&$item, $key) {
function dbesc_array(&$arr) {
+ $bogus_key = false;
if(is_array($arr) && count($arr)) {
+ $matches = false;
+ foreach($arr as $k => $v) {
+ if(preg_match('/([^a-zA-Z0-9\-\_\.])/',$k,$matches)) {
+ logger('bogus key: ' . $k);
+ $bogus_key = true;
+ }
+ }
array_walk($arr,'dbesc_array_cb');
+ if($bogus_key) {
+ $arr['BOGUS.KEY'] = 1;
+ return false;
+ }
}
+ return true;
}
function db_getfunc($f) {
diff --git a/include/dba/dba_mysql.php b/include/dba/dba_mysql.php
index 3cadad6dc..8b51cf578 100755
--- a/include/dba/dba_mysql.php
+++ b/include/dba/dba_mysql.php
@@ -5,7 +5,7 @@ require_once('include/dba/dba_driver.php');
class dba_mysql extends dba_driver {
- function connect($server, $port, $user,$pass,$db) {
+ function connect($server, $scheme, $port, $user,$pass,$db) {
$this->db = mysql_connect($server.":".$port,$user,$pass);
if($this->db && mysql_select_db($db,$this->db)) {
$this->connected = true;
diff --git a/include/dba/dba_mysqli.php b/include/dba/dba_mysqli.php
index afd2aa642..165c8e969 100755
--- a/include/dba/dba_mysqli.php
+++ b/include/dba/dba_mysqli.php
@@ -4,7 +4,7 @@ require_once('include/dba/dba_driver.php');
class dba_mysqli extends dba_driver {
- function connect($server,$port,$user,$pass,$db) {
+ function connect($server,$scheme,$port,$user,$pass,$db) {
if($port)
$this->db = new mysqli($server,$user,$pass,$db, $port);
else
diff --git a/include/dba/dba_pdo.php b/include/dba/dba_pdo.php
index 7255a2b66..f76e6cdd7 100755
--- a/include/dba/dba_pdo.php
+++ b/include/dba/dba_pdo.php
@@ -7,16 +7,21 @@ class dba_pdo extends dba_driver {
public $driver_dbtype = null;
- function connect($server,$port,$user,$pass,$db) {
+ function connect($server,$scheme,$port,$user,$pass,$db) {
- $this->driver_dbtype = 'mysql'; // (($dbtype == DBTYPE_POSTGRES) ? 'postgres' : 'mysql');
- $dns = $this->driver_dbtype
- . ':host=' . $server . (is_null($port) ? '' : ';port=' . $port)
- . ';dbname=' . $db;
+ $this->driver_dbtype = $scheme;
+ if(strpbrk($server,':;')) {
+ $dsn = $server;
+ }
+ else {
+ $dsn = $this->driver_dbtype . ':host=' . $server . (intval($port) ? '' : ';port=' . $port);
+ }
+
+ $dsn .= ';dbname=' . $db;
try {
- $this->db = new PDO($dns,$user,$pass);
+ $this->db = new PDO($dsn,$user,$pass);
$this->db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
@@ -27,6 +32,9 @@ class dba_pdo extends dba_driver {
return false;
}
+ if($this->driver_dbtype === 'pgsql')
+ $this->q("SET standard_conforming_strings = 'off'; SET backslash_quote = 'on';");
+
$this->connected = true;
return true;
@@ -36,17 +44,23 @@ class dba_pdo extends dba_driver {
if((! $this->db) || (! $this->connected))
return false;
+ if($this->driver_dbtype === 'pgsql') {
+ if(substr(rtrim($sql),-1,1) !== ';') {
+ $sql .= ';';
+ }
+ }
+
$this->error = '';
$select = ((stripos($sql,'select') === 0) ? true : false);
try {
- $result = $this->db->query($sql);
+ $result = $this->db->query($sql, PDO::FETCH_ASSOC);
}
catch(PDOException $e) {
$this->error = $e->getMessage();
if($this->error) {
- db_logger('dba_mysqli: ERROR: ' . printable($sql) . "\n" . $this->error, LOGGER_NORMAL, LOG_ERR);
+ db_logger('dba_pdo: ERROR: ' . printable($sql) . "\n" . $this->error, LOGGER_NORMAL, LOG_ERR);
if(file_exists('dbfail.out')) {
file_put_contents('dbfail.out', datetime_convert() . "\n" . printable($sql) . "\n" . $this->error . "\n", FILE_APPEND);
}
@@ -55,13 +69,13 @@ class dba_pdo extends dba_driver {
if(!($select)) {
if($this->debug) {
- db_logger('dba_mysqli: DEBUG: ' . printable($sql) . ' returns ' . (($result) ? 'true' : 'false'), LOGGER_NORMAL,(($result) ? LOG_INFO : LOG_ERR));
+ db_logger('dba_pdo: DEBUG: ' . printable($sql) . ' returns ' . (($result) ? 'true' : 'false'), LOGGER_NORMAL,(($result) ? LOG_INFO : LOG_ERR));
}
return $result;
}
if($this->debug) {
- db_logger('dba_mysqli: DEBUG: ' . printable($sql) . ' returned ' . count($result) . ' results.', LOGGER_NORMAL, LOG_INFO);
+ db_logger('dba_pdo: DEBUG: ' . printable($sql) . ' returned ' . count($result) . ' results.', LOGGER_NORMAL, LOG_INFO);
}
$r = array();
@@ -73,7 +87,7 @@ class dba_pdo extends dba_driver {
db_logger('dba_pdo: ' . printable(print_r($r,true)), LOGGER_NORMAL, LOG_INFO);
}
}
- return $r;
+ return (($this->error) ? false : $r);
}
function escape($str) {
@@ -88,6 +102,54 @@ class dba_pdo extends dba_driver {
$this->connected = false;
}
+ function concat($fld,$sep) {
+ if($this->driver_dbtype === 'pgsql') {
+ return 'string_agg(' . $fld . ',\'' . $sep . '\')';
+ }
+ else {
+ return 'GROUP_CONCAT(DISTINCT ' . $fld . ' SEPARATOR \'' . $sep . '\')';
+ }
+ }
+
+ function quote_interval($txt) {
+ if($this->driver_dbtype === 'pgsql') {
+ return "'$txt'";
+ }
+ else {
+ return $txt;
+ }
+ }
+
+ // These two functions assume that postgres standard_conforming_strings is set to off;
+ // which we perform during DB open.
+
+ function escapebin($str) {
+ if($this->driver_dbtype === 'pgsql') {
+ return "\\\\x" . bin2hex($str);
+ }
+ else {
+ return $this->escape($str);
+ }
+ }
+
+ function unescapebin($str) {
+ if($this->driver_dbtype === 'pgsql' && (! is_null($str))) {
+ $x = '';
+ while(! feof($str)) {
+ $x .= fread($str,8192);
+ }
+ if(substr($x,0,2) === '\\x') {
+ $x = hex2bin(substr($x,2));
+ }
+ return $x;
+
+ }
+ else {
+ return $str;
+ }
+ }
+
+
function getdriver() {
return 'pdo';
}
diff --git a/include/dba/dba_postgres.php b/include/dba/dba_postgres.php
index 03b29d703..560d8da60 100644
--- a/include/dba/dba_postgres.php
+++ b/include/dba/dba_postgres.php
@@ -7,8 +7,9 @@ class dba_postgres extends dba_driver {
const INSTALL_SCRIPT='install/schema_postgres.sql';
const NULL_DATE = '0001-01-01 00:00:00';
const UTC_NOW = "now() at time zone 'UTC'";
+ const TQUOT = '"';
- function connect($server,$port,$user,$pass,$db) {
+ function connect($server,$scheme,$port,$user,$pass,$db) {
if(!$port) $port = 5432;
$connstr = 'host=' . $server . ' port='.$port . ' user=' . $user . ' password=' . $pass . ' dbname='. $db;
$this->db = pg_connect($connstr);
diff --git a/include/dir_fns.php b/include/dir_fns.php
index 03cc2706a..3922730fc 100644
--- a/include/dir_fns.php
+++ b/include/dir_fns.php
@@ -192,17 +192,19 @@ function sync_directories($dirmode) {
'site_update' => NULL_DATE,
'site_directory' => DIRECTORY_FALLBACK_MASTER . '/dirsearch',
'site_realm' => DIRECTORY_REALM,
- 'site_valid' => 1
+ 'site_valid' => 1,
+ 'site_crypto' => 'aes256cbc'
);
- $x = q("insert into site ( site_url, site_flags, site_update, site_directory, site_realm, site_valid )
- values ( '%s', %d, '%s', '%s', '%s', %d ) ",
+ $x = q("insert into site ( site_url, site_flags, site_update, site_directory, site_realm, site_valid, site_crypto )
+ values ( '%s', %d, '%s', '%s', '%s', %d, '%s' ) ",
dbesc($r[0]['site_url']),
intval($r[0]['site_flags']),
dbesc($r[0]['site_update']),
dbesc($r[0]['site_directory']),
dbesc($r[0]['site_realm']),
- intval($r[0]['site_valid'])
+ intval($r[0]['site_valid']),
+ dbesc($r[0]['site_crypto'])
);
$r = q("select * from site where site_flags in (%d, %d) and site_url != '%s' and site_type = %d ",
diff --git a/include/event.php b/include/event.php
index 153654120..cbee2b759 100644
--- a/include/event.php
+++ b/include/event.php
@@ -362,28 +362,28 @@ function event_store_event($arr) {
// The event changed. Update it.
- $r = q("UPDATE `event` SET
- `edited` = '%s',
- `dtstart` = '%s',
- `dtend` = '%s',
- `summary` = '%s',
- `description` = '%s',
- `location` = '%s',
- `etype` = '%s',
- `adjust` = %d,
- `nofinish` = %d,
- `event_status` = '%s',
- `event_status_date` = '%s',
- `event_percent` = %d,
- `event_repeat` = '%s',
- `event_sequence` = %d,
- `event_priority` = %d,
- `event_vdata` = '%s',
- `allow_cid` = '%s',
- `allow_gid` = '%s',
- `deny_cid` = '%s',
- `deny_gid` = '%s'
- WHERE `id` = %d AND `uid` = %d",
+ $r = q("UPDATE event SET
+ edited = '%s',
+ dtstart = '%s',
+ dtend = '%s',
+ summary = '%s',
+ description = '%s',
+ location = '%s',
+ etype = '%s',
+ adjust = %d,
+ nofinish = %d,
+ event_status = '%s',
+ event_status_date = '%s',
+ event_percent = %d,
+ event_repeat = '%s',
+ event_sequence = %d,
+ event_priority = %d,
+ event_vdata = '%s',
+ allow_cid = '%s',
+ allow_gid = '%s',
+ deny_cid = '%s',
+ deny_gid = '%s'
+ WHERE id = %d AND uid = %d",
dbesc($arr['edited']),
dbesc($arr['dtstart']),
diff --git a/include/follow.php b/include/follow.php
index 5f63687f8..fa198e402 100644
--- a/include/follow.php
+++ b/include/follow.php
@@ -211,7 +211,7 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false)
return $result;
}
- $r = q("select abook_xchan, abook_instance from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
+ $r = q("select abook_id, abook_xchan, abook_pending, abook_instance from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
dbesc($xchan_hash),
intval($uid)
);
@@ -237,7 +237,28 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false)
$x = q("update abook set abook_instance = '%s' where abook_id = %d",
dbesc($abook_instance),
intval($r[0]['abook_id'])
- );
+ );
+
+ if(intval($r[0]['abook_pending'])) {
+
+ $abook_my_perms = get_channel_default_perms($uid);
+ $role = get_pconfig($uid,'system','permissions_role');
+ if($role) {
+ $x = \Zotlabs\Access\PermissionRoles::role_perms($role);
+ if($x['perms_connect']) {
+ $abook_my_perms = $x['perms_connect'];
+ }
+ }
+
+ $filled_perms = \Zotlabs\Access\Permissions::FilledPerms($abook_my_perms);
+ foreach($filled_perms as $k => $v) {
+ set_abconfig($uid,$r[0]['abook_xchan'],'my_perms',$k,$v);
+ }
+
+ $x = q("update abook set abook_pending = 0 where abook_id = %d",
+ intval($r[0]['abook_id'])
+ );
+ }
}
else {
$closeness = get_pconfig($uid,'system','new_abook_closeness');
diff --git a/include/group.php b/include/group.php
index 10853ff6b..38d9d190f 100644
--- a/include/group.php
+++ b/include/group.php
@@ -14,11 +14,11 @@ function group_add($uid,$name,$public = 0) {
// access lists. What we're doing here is reviving the dead group, but old content which
// was restricted to this group may now be seen by the new group members.
- $z = q("SELECT * FROM `groups` WHERE `id` = %d LIMIT 1",
+ $z = q("SELECT * FROM groups WHERE id = %d LIMIT 1",
intval($r)
);
if(($z) && $z[0]['deleted']) {
- /*$r = q("UPDATE `groups` SET `deleted` = 0 WHERE `uid` = %d AND `gname` = '%s' LIMIT 1",
+ /*$r = q("UPDATE groups SET deleted = 0 WHERE uid = %d AND gname = '%s'",
intval($uid),
dbesc($name)
);*/
@@ -32,13 +32,13 @@ function group_add($uid,$name,$public = 0) {
$dups = false;
$hash = random_string() . $name;
- $r = q("SELECT id FROM `groups` WHERE hash = '%s' LIMIT 1", dbesc($hash));
+ $r = q("SELECT id FROM groups WHERE hash = '%s' LIMIT 1", dbesc($hash));
if($r)
$dups = true;
} while($dups == true);
- $r = q("INSERT INTO `groups` ( hash, uid, visible, gname )
+ $r = q("INSERT INTO groups ( hash, uid, visible, gname )
VALUES( '%s', %d, %d, '%s' ) ",
dbesc($hash),
intval($uid),
@@ -57,7 +57,7 @@ function group_add($uid,$name,$public = 0) {
function group_rmv($uid,$name) {
$ret = false;
if(x($uid) && x($name)) {
- $r = q("SELECT id, hash FROM `groups` WHERE `uid` = %d AND `gname` = '%s' LIMIT 1",
+ $r = q("SELECT id, hash FROM groups WHERE uid = %d AND gname = '%s' LIMIT 1",
intval($uid),
dbesc($name)
);
@@ -102,13 +102,13 @@ function group_rmv($uid,$name) {
}
// remove all members
- $r = q("DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d ",
+ $r = q("DELETE FROM group_member WHERE uid = %d AND gid = %d ",
intval($uid),
intval($group_id)
);
// remove group
- $r = q("UPDATE `groups` SET `deleted` = 1 WHERE `uid` = %d AND `gname` = '%s'",
+ $r = q("UPDATE groups SET deleted = 1 WHERE uid = %d AND gname = '%s'",
intval($uid),
dbesc($name)
);
@@ -125,7 +125,7 @@ function group_rmv($uid,$name) {
function group_byname($uid,$name) {
if((! $uid) || (! strlen($name)))
return false;
- $r = q("SELECT * FROM `groups` WHERE `uid` = %d AND `gname` = '%s' LIMIT 1",
+ $r = q("SELECT * FROM groups WHERE uid = %d AND gname = '%s' LIMIT 1",
intval($uid),
dbesc($name)
);
@@ -138,7 +138,7 @@ function group_byname($uid,$name) {
function group_rec_byhash($uid,$hash) {
if((! $uid) || (! strlen($hash)))
return false;
- $r = q("SELECT * FROM `groups` WHERE `uid` = %d AND `hash` = '%s' LIMIT 1",
+ $r = q("SELECT * FROM groups WHERE uid = %d AND hash = '%s' LIMIT 1",
intval($uid),
dbesc($hash)
);
@@ -153,7 +153,7 @@ function group_rmv_member($uid,$name,$member) {
return false;
if(! ( $uid && $gid && $member))
return false;
- $r = q("DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND xchan = '%s' ",
+ $r = q("DELETE FROM group_member WHERE uid = %d AND gid = %d AND xchan = '%s' ",
intval($uid),
intval($gid),
dbesc($member)
@@ -173,7 +173,7 @@ function group_add_member($uid,$name,$member,$gid = 0) {
if((! $gid) || (! $uid) || (! $member))
return false;
- $r = q("SELECT * FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND `xchan` = '%s' LIMIT 1",
+ $r = q("SELECT * FROM group_member WHERE uid = %d AND gid = %d AND xchan = '%s' LIMIT 1",
intval($uid),
intval($gid),
dbesc($member)
@@ -183,7 +183,7 @@ function group_add_member($uid,$name,$member,$gid = 0) {
// we indicate success because the group member was in fact created
// -- It was just created at another time
if(! $r)
- $r = q("INSERT INTO `group_member` (`uid`, `gid`, `xchan`)
+ $r = q("INSERT INTO group_member (uid, gid, xchan)
VALUES( %d, %d, '%s' ) ",
intval($uid),
intval($gid),
@@ -198,9 +198,9 @@ function group_add_member($uid,$name,$member,$gid = 0) {
function group_get_members($gid) {
$ret = array();
if(intval($gid)) {
- $r = q("SELECT * FROM `group_member`
- LEFT JOIN abook ON abook_xchan = `group_member`.`xchan` left join xchan on xchan_hash = abook_xchan
- WHERE `gid` = %d AND abook_channel = %d and `group_member`.`uid` = %d and xchan_deleted = 0 and abook_self = 0 and abook_blocked = 0 and abook_pending = 0 ORDER BY xchan_name ASC ",
+ $r = q("SELECT * FROM group_member
+ LEFT JOIN abook ON abook_xchan = group_member.xchan left join xchan on xchan_hash = abook_xchan
+ WHERE gid = %d AND abook_channel = %d and group_member.uid = %d and xchan_deleted = 0 and abook_self = 0 and abook_blocked = 0 and abook_pending = 0 ORDER BY xchan_name ASC ",
intval($gid),
intval(local_channel()),
intval(local_channel())
@@ -232,7 +232,7 @@ function mini_group_select($uid,$group = '') {
$grps = array();
$o = '';
- $r = q("SELECT * FROM `groups` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `gname` ASC",
+ $r = q("SELECT * FROM groups WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
intval($uid)
);
$grps[] = array('name' => '', 'hash' => '0', 'selected' => '');
@@ -271,7 +271,7 @@ function group_side($every="connections",$each="group",$edit = false, $group_id
);
- $r = q("SELECT * FROM `groups` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `gname` ASC",
+ $r = q("SELECT * FROM groups WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
intval($_SESSION['uid'])
);
$member_of = array();
@@ -328,7 +328,7 @@ function expand_groups($a) {
$groups = implode(',', $x);
if($groups)
- $r = q("SELECT xchan FROM group_member WHERE gid IN ( select id from `groups` where hash in ( $groups ))");
+ $r = q("SELECT xchan FROM group_member WHERE gid IN ( select id from groups where hash in ( $groups ))");
$ret = array();
if($r)
@@ -340,7 +340,7 @@ function expand_groups($a) {
function member_of($c) {
- $r = q("SELECT `groups`.`gname`, `groups`.`id` FROM `groups` LEFT JOIN `group_member` ON `group_member`.`gid` = `groups`.`id` WHERE `group_member`.`xchan` = '%s' AND `groups`.`deleted` = 0 ORDER BY `groups`.`gname` ASC ",
+ $r = q("SELECT groups.gname, groups.id FROM groups LEFT JOIN group_member ON group_member.gid = groups.id WHERE group_member.xchan = '%s' AND groups.deleted = 0 ORDER BY groups.gname ASC ",
dbesc($c)
);
@@ -350,7 +350,7 @@ function member_of($c) {
function groups_containing($uid,$c) {
- $r = q("SELECT `gid` FROM `group_member` WHERE `uid` = %d AND `group_member`.`xchan` = '%s' ",
+ $r = q("SELECT gid FROM group_member WHERE uid = %d AND group_member.xchan = '%s' ",
intval($uid),
dbesc($c)
);
diff --git a/include/help.php b/include/help.php
index 3081ae41f..03d01d1a1 100644
--- a/include/help.php
+++ b/include/help.php
@@ -1,15 +1,21 @@
<?php
+/**
+ * @brief
+ *
+ * @param string $tocpath
+ * @return string|unknown
+ */
function get_help_content($tocpath = false) {
-
+
global $lang;
-
+
$doctype = 'markdown';
-
+
$text = '';
$path = (($tocpath !== false) ? $tocpath : '');
-
+
if($tocpath === false && argc() > 1) {
$path = '';
for($x = 1; $x < argc(); $x ++) {
@@ -25,7 +31,7 @@ function get_help_content($tocpath = false) {
\App::$page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags($title)));
$text = load_doc_file('doc/' . $path . '.md');
-
+
if(! $text) {
$text = load_doc_file('doc/' . $path . '.bb');
if($text)
@@ -49,20 +55,21 @@ function get_help_content($tocpath = false) {
if(! $text) {
$doctype = 'bbcode';
$text = load_doc_file('doc/main.bb');
+ goaway('/help/about/about_hubzilla');
\App::$page['title'] = t('Help');
}
-
+
if(! $text) {
header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . t('Not Found'));
$tpl = get_markup_template("404.tpl");
return replace_macros($tpl, array(
- '$message' => t('Page not found.' )
+ '$message' => t('Page not found.')
));
}
}
-
+
if($doctype === 'html')
- $content = $text;
+ $content = parseIdentityAwareHTML($text);
if($doctype === 'markdown') {
require_once('library/markdown.php');
# escape #include tags
@@ -74,30 +81,30 @@ function get_help_content($tocpath = false) {
require_once('include/bbcode.php');
$content = bbcode($text);
// bbcode retargets external content to new windows. This content is internal.
- $content = str_replace(' target="_blank"','',$content);
- }
-
+ $content = str_replace(' target="_blank"', '', $content);
+ }
+
$content = preg_replace_callback("/#include (.*?)\;/ism", 'preg_callback_help_include', $content);
+
return translate_projectname($content);
-
}
function preg_callback_help_include($matches) {
-
+
if($matches[1]) {
$include = str_replace($matches[0],load_doc_file($matches[1]),$matches[0]);
if(preg_match('/\.bb$/', $matches[1]) || preg_match('/\.txt$/', $matches[1])) {
require_once('include/bbcode.php');
$include = bbcode($include);
- $include = str_replace(' target="_blank"','',$include);
- }
+ $include = str_replace(' target="_blank"','',$include);
+ }
elseif(preg_match('/\.md$/', $matches[1])) {
require_once('library/markdown.php');
$include = Markdown($include);
}
return $include;
}
-
+
}
@@ -110,10 +117,10 @@ function load_doc_file($s) {
$d = dirname($s);
$c = find_doc_file("$d/$lang/$b");
- if($c)
+ if($c)
return $c;
$c = find_doc_file($s);
- if($c)
+ if($c)
return $c;
return '';
}
@@ -125,6 +132,12 @@ function find_doc_file($s) {
return '';
}
+/**
+ * @brief
+ *
+ * @param string $s
+ * @return number|mixed|unknown|boolean
+ */
function search_doc_files($s) {
$itemspage = get_pconfig(local_channel(),'system','itemspage');
@@ -133,21 +146,21 @@ function search_doc_files($s) {
$regexop = db_getfunc('REGEXP');
- $r = q("select iconfig.v, item.* from item left join iconfig on item.id = iconfig.iid
+ $r = q("select iconfig.v, item.* from item left join iconfig on item.id = iconfig.iid
where iconfig.cat = 'system' and iconfig.k = 'docfile' and
body $regexop '%s' and item_type = %d $pager_sql",
dbesc($s),
intval(ITEM_TYPE_DOC)
);
-
- $r = fetch_post_tags($r,true);
+
+ $r = fetch_post_tags($r, true);
for($x = 0; $x < count($r); $x ++) {
$position = stripos($r[$x]['body'], $s);
$dislen = 300;
$start = $position-floor($dislen/2);
if ( $start < 0) {
- $start = 0;
+ $start = 0;
}
$r[$x]['text'] = substr($r[$x]['body'], $start, $dislen);
@@ -159,43 +172,50 @@ function search_doc_files($s) {
}
}
}
- if(stristr($r[$x]['v'],$s))
+ if(stristr($r[$x]['v'], $s))
$r[$x]['rank'] ++;
- $r[$x]['rank'] += substr_count(strtolower($r[$x]['text']),strtolower($s));
+ $r[$x]['rank'] += substr_count(strtolower($r[$x]['text']), strtolower($s));
// bias the results to the observer's native language
if($r[$x]['lang'] === \App::$language)
$r[$x]['rank'] = $r[$x]['rank'] + 10;
}
usort($r,'doc_rank_sort');
+
return $r;
}
-function doc_rank_sort($s1,$s2) {
+function doc_rank_sort($s1, $s2) {
if($s1['rank'] == $s2['rank'])
return 0;
+
return (($s1['rank'] < $s2['rank']) ? 1 : (-1));
}
-
+/**
+ * @brief
+ *
+ * @return string
+ */
function load_context_help() {
-
+
$path = App::$cmd;
$args = App::$argv;
$lang = App::$language;
-
+
if(! isset($lang) || !is_dir('doc/context/' . $lang . '/')) {
- $lang = 'en';
- }
+ $lang = 'en';
+ }
while($path) {
$context_help = load_doc_file('doc/context/' . $lang . '/' . $path . '/help.html');
- if(!$context_help) {
- // Fallback to English if the translation is absent
- $context_help = load_doc_file('doc/context/en/' . $path . '/help.html');
- }
+ if(!$context_help) {
+ // Fallback to English if the translation is absent
+ $context_help = load_doc_file('doc/context/en/' . $path . '/help.html');
+ }
if($context_help)
break;
+
array_pop($args);
$path = implode($args,'/');
}
@@ -203,7 +223,12 @@ function load_context_help() {
return $context_help;
}
-
+/**
+ * @brief
+ *
+ * @param string $s
+ * @return void|boolean[]|number[]|string[]|unknown[]
+ */
function store_doc_file($s) {
if(is_dir($s))
@@ -215,10 +240,9 @@ function store_doc_file($s) {
$item['aid'] = 0;
$item['uid'] = $sys['channel_id'];
-
- if(strpos($s,'.md'))
+ if(strpos($s, '.md'))
$mimetype = 'text/markdown';
- elseif(strpos($s,'.html'))
+ elseif(strpos($s, '.html'))
$mimetype = 'text/html';
else
$mimetype = 'text/bbcode';
@@ -227,12 +251,12 @@ function store_doc_file($s) {
$item['body'] = html2plain(prepare_text(file_get_contents($s),$mimetype, true));
$item['mimetype'] = 'text/plain';
-
+
$item['plink'] = z_root() . '/' . str_replace('doc','help',$s);
$item['owner_xchan'] = $item['author_xchan'] = $sys['channel_hash'];
$item['item_type'] = ITEM_TYPE_DOC;
- $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
+ $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
where iconfig.cat = 'system' and iconfig.k = 'docfile' and
iconfig.v = '%s' and item_type = %d limit 1",
dbesc($s),
@@ -252,6 +276,4 @@ function store_doc_file($s) {
}
return $x;
-
}
-
diff --git a/include/hubloc.php b/include/hubloc.php
index 397646449..17f921f67 100644
--- a/include/hubloc.php
+++ b/include/hubloc.php
@@ -1,19 +1,5 @@
<?php /** @file */
-function is_matrix_url($url) {
- $m = @parse_url($url);
- if($m['host']) {
- $r = q("select hubloc_url from hubloc where hubloc_host = '%s' limit 1",
- dbesc($m['host'])
- );
- if($r)
- return true;
- }
- return false;
-}
-
-
-
function prune_hub_reinstalls() {
$r = q("select site_url from site where site_type = %d",
diff --git a/include/import.php b/include/import.php
index 479e45cc2..0d8398acb 100644
--- a/include/import.php
+++ b/include/import.php
@@ -82,14 +82,7 @@ function import_channel($channel, $account_id, $seize) {
}
if($clean) {
- dbesc_array($clean);
-
- $r = dbq("INSERT INTO channel (`"
- . implode("`, `", array_keys($clean))
- . "`) VALUES ('"
- . implode("', '", array_values($clean))
- . "')"
- );
+ create_table_from_array('channel',$clean);
}
if(! $r) {
@@ -131,12 +124,7 @@ function import_config($channel,$configs) {
foreach($configs as $config) {
unset($config['id']);
$config['uid'] = $channel['channel_id'];
- dbesc_array($config);
- $r = dbq("INSERT INTO pconfig (`"
- . implode("`, `", array_keys($config))
- . "`) VALUES ('"
- . implode("', '", array_values($config))
- . "')" );
+ create_table_from_array('pconfig',$config);
}
load_pconfig($channel['channel_id']);
}
@@ -161,14 +149,7 @@ function import_profiles($channel,$profiles) {
$profile['photo'] = z_root() . '/photo/profile/l/' . $channel['channel_id'];
$profile['thumb'] = z_root() . '/photo/profile/m/' . $channel['channel_id'];
-
- dbesc_array($profile);
- $r = dbq("INSERT INTO profile (`"
- . implode("`, `", array_keys($profile))
- . "`) VALUES ('"
- . implode("', '", array_values($profile))
- . "')"
- );
+ create_table_from_array('profile',$profile);
}
}
}
@@ -203,14 +184,7 @@ function import_hublocs($channel,$hublocs,$seize) {
if(! zot_gethub($arr)) {
unset($hubloc['hubloc_id']);
- dbesc_array($hubloc);
-
- $r = dbq("INSERT INTO hubloc (`"
- . implode("`, `", array_keys($hubloc))
- . "`) VALUES ('"
- . implode("', '", array_values($hubloc))
- . "')"
- );
+ create_table_from_array('hubloc',$hubloc);
}
}
}
@@ -242,14 +216,7 @@ function import_objs($channel,$objs) {
$obj['obj_imgurl'] = $x[0];
}
- dbesc_array($obj);
-
- $r = dbq("INSERT INTO obj (`"
- . implode("`, `", array_keys($obj))
- . "`) VALUES ('"
- . implode("', '", array_values($obj))
- . "')"
- );
+ create_table_from_array('obj',$obj);
}
}
}
@@ -260,7 +227,7 @@ function sync_objs($channel,$objs) {
foreach($objs as $obj) {
if(array_key_exists('obj_deleted',$obj) && $obj['obj_deleted'] && $obj['obj_obj']) {
- q("delete from obj where obj_obj = '%s' and obj_channel = %d limit 1",
+ q("delete from obj where obj_obj = '%s' and obj_channel = %d",
dbesc($obj['obj_obj']),
intval($channel['channel_id'])
);
@@ -304,7 +271,7 @@ function sync_objs($channel,$objs) {
if($exists) {
unset($obj['obj_obj']);
foreach($obj as $k => $v) {
- $r = q("UPDATE obj SET `%s` = '%s' WHERE obj_obj = '%s' AND obj_channel = %d",
+ $r = q("UPDATE obj SET " . TQUOT . "%s" . TQUOT . " = '%s' WHERE obj_obj = '%s' AND obj_channel = %d",
dbesc($k),
dbesc($v),
dbesc($hash),
@@ -313,15 +280,7 @@ function sync_objs($channel,$objs) {
}
}
else {
-
- dbesc_array($obj);
-
- $r = dbq("INSERT INTO obj (`"
- . implode("`, `", array_keys($obj))
- . "`) VALUES ('"
- . implode("', '", array_values($obj))
- . "')"
- );
+ create_table_from_array('obj',$obj);
}
}
}
@@ -351,13 +310,7 @@ function import_apps($channel,$apps) {
$hash = $app['app_id'];
- dbesc_array($app);
- $r = dbq("INSERT INTO app (`"
- . implode("`, `", array_keys($app))
- . "`) VALUES ('"
- . implode("', '", array_values($app))
- . "')"
- );
+ create_table_from_array('app',$app);
if($term) {
$x = q("select * from app where app_id = '%s' and app_channel = %d limit 1",
@@ -398,7 +351,7 @@ function sync_apps($channel,$apps) {
}
if(array_key_exists('app_deleted',$app) && $app['app_deleted'] && $app['app_id']) {
- q("delete from app where app_id = '%s' and app_channel = %d limit 1",
+ q("delete from app where app_id = '%s' and app_channel = %d",
dbesc($app['app_id']),
intval($channel['channel_id'])
);
@@ -451,7 +404,7 @@ function sync_apps($channel,$apps) {
if($exists) {
unset($app['app_id']);
foreach($app as $k => $v) {
- $r = q("UPDATE app SET `%s` = '%s' WHERE app_id = '%s' AND app_channel = %d",
+ $r = q("UPDATE app SET " . TQUOT . "%s" . TQUOT . " = '%s' WHERE app_id = '%s' AND app_channel = %d",
dbesc($k),
dbesc($v),
dbesc($hash),
@@ -460,15 +413,10 @@ function sync_apps($channel,$apps) {
}
}
else {
- dbesc_array($app);
- $r = dbq("INSERT INTO app (`"
- . implode("`, `", array_keys($app))
- . "`) VALUES ('"
- . implode("', '", array_values($app))
- . "')"
- );
+ create_table_from_array('app',$app);
+
if($term) {
- $x = q("select * from app where app_id = '%s' and app_channel = %d limit 1",
+ $x = q("select * from app where app_id = '%s' and app_channel = %d",
dbesc($hash),
intval($channel['channel_id'])
);
@@ -502,13 +450,7 @@ function import_chatrooms($channel,$chatrooms) {
$chatroom['cr_aid'] = $channel['channel_account_id'];
$chatroom['cr_uid'] = $channel['channel_id'];
- dbesc_array($chatroom);
- $r = dbq("INSERT INTO chatroom (`"
- . implode("`, `", array_keys($chatroom))
- . "`) VALUES ('"
- . implode("', '", array_values($chatroom))
- . "')"
- );
+ create_table_from_array('chatroom',$chatroom);
}
}
}
@@ -524,7 +466,7 @@ function sync_chatrooms($channel,$chatrooms) {
continue;
if(array_key_exists('cr_deleted',$chatroom) && $chatroom['cr_deleted']) {
- q("delete from chatroom where cr_name = '%s' and cr_uid = %d limit 1",
+ q("delete from chatroom where cr_name = '%s' and cr_uid = %d",
dbesc($chatroom['cr_name']),
intval($channel['channel_id'])
);
@@ -559,7 +501,7 @@ function sync_chatrooms($channel,$chatrooms) {
if($exists) {
foreach($chatroom as $k => $v) {
- $r = q("UPDATE chatroom SET `%s` = '%s' WHERE cr_name = '%s' AND cr_uid = %d",
+ $r = q("UPDATE chatroom SET " . TQUOT . "%s" . TQUOT . " = '%s' WHERE cr_name = '%s' AND cr_uid = %d",
dbesc($k),
dbesc($v),
dbesc($name),
@@ -568,13 +510,7 @@ function sync_chatrooms($channel,$chatrooms) {
}
}
else {
- dbesc_array($chatroom);
- $r = dbq("INSERT INTO chatroom (`"
- . implode("`, `", array_keys($chatroom))
- . "`) VALUES ('"
- . implode("', '", array_values($chatroom))
- . "')"
- );
+ create_table_from_array('chatroom',$chatroom);
}
}
}
@@ -684,13 +620,7 @@ function import_events($channel,$events) {
convert_oldfields($event,'type','etype');
convert_oldfields($event,'ignore','dismissed');
- dbesc_array($event);
- $r = dbq("INSERT INTO event (`"
- . implode("`, `", array_keys($event))
- . "`) VALUES ('"
- . implode("', '", array_values($event))
- . "')"
- );
+ create_table_from_array('event',$event);
}
}
}
@@ -705,7 +635,7 @@ function sync_events($channel,$events) {
continue;
if($event['event_deleted']) {
- $r = q("delete from event where event_hash = '%s' and uid = %d limit 1",
+ $r = q("delete from event where event_hash = '%s' and uid = %d",
dbesc($event['event_hash']),
intval($channel['channel_id'])
);
@@ -736,7 +666,7 @@ function sync_events($channel,$events) {
if($exists) {
foreach($event as $k => $v) {
- $r = q("UPDATE event SET `%s` = '%s' WHERE event_hash = '%s' AND uid = %d",
+ $r = q("UPDATE event SET " . TQUOT . "%s" . TQUOT . " = '%s' WHERE event_hash = '%s' AND uid = %d",
dbesc($k),
dbesc($v),
dbesc($event['event_hash']),
@@ -745,13 +675,7 @@ function sync_events($channel,$events) {
}
}
else {
- dbesc_array($event);
- $r = dbq("INSERT INTO event (`"
- . implode("`, `", array_keys($event))
- . "`) VALUES ('"
- . implode("', '", array_values($event))
- . "')"
- );
+ create_table_from_array('event',$event);
}
}
}
@@ -927,12 +851,7 @@ function import_likes($channel,$likes) {
if($r)
continue;
- dbesc_array($like);
- $r = dbq("INSERT INTO likes (`"
- . implode("`, `", array_keys($like))
- . "`) VALUES ('"
- . implode("', '", array_values($like))
- . "')" );
+ create_table_from_array('likes',$like);
}
}
}
@@ -941,7 +860,7 @@ function import_conv($channel,$convs) {
if($channel && $convs) {
foreach($convs as $conv) {
if($conv['deleted']) {
- q("delete from conv where guid = '%s' and uid = %d limit 1",
+ q("delete from conv where guid = '%s' and uid = %d",
dbesc($conv['guid']),
intval($channel['channel_id'])
);
@@ -959,13 +878,7 @@ function import_conv($channel,$convs) {
);
if($r)
continue;
-
- dbesc_array($conv);
- $r = dbq("INSERT INTO conv (`"
- . implode("`, `", array_keys($conv))
- . "`) VALUES ('"
- . implode("', '", array_values($conv))
- . "')" );
+ create_table_from_array('conv',$conv);
}
}
}
@@ -976,14 +889,14 @@ function import_mail($channel,$mails,$sync = false) {
if($channel && $mails) {
foreach($mails as $mail) {
if(array_key_exists('flags',$mail) && in_array('deleted',$mail['flags'])) {
- q("delete from mail where mid = '%s' and uid = %d limit 1",
+ q("delete from mail where mid = '%s' and uid = %d",
dbesc($mail['message_id']),
intval($channel['channel_id'])
);
continue;
}
if(array_key_exists('flags',$mail) && in_array('recalled',$mail['flags'])) {
- q("update mail set mail_recalled = 1 where mid = '%s' and uid = %d limit 1",
+ q("update mail set mail_recalled = 1 where mid = '%s' and uid = %d",
dbesc($mail['message_id']),
intval($channel['channel_id'])
);
@@ -1110,25 +1023,22 @@ function sync_files($channel,$files) {
if(!isset($att['os_path']))
$att['os_path'] = '';
- dbesc_array($att);
if($attach_exists) {
logger('sync_files attach exists: ' . print_r($att,true), LOGGER_DEBUG);
+ if(! dbesc_array($att))
+ continue;
$str = '';
- foreach($att as $k => $v) {
- if($str)
- $str .= ",";
- $str .= " `" . $k . "` = '" . $v . "' ";
- }
- $r = dbq("update `attach` set " . $str . " where id = " . intval($attach_id) );
+ foreach($att as $k => $v) {
+ if($str)
+ $str .= ",";
+ $str .= " " . TQUOT . $k . TQUOT . " = '" . $v . "' ";
+ }
+ $r = dbq("update attach set " . $str . " where id = " . intval($attach_id) );
}
else {
logger('sync_files attach does not exists: ' . print_r($att,true), LOGGER_DEBUG);
- $r = dbq("INSERT INTO attach (`"
- . implode("`, `", array_keys($att))
- . "`) VALUES ('"
- . implode("', '", array_values($att))
- . "')" );
+ create_table_from_array('attach',$att);
}
@@ -1229,23 +1139,20 @@ function sync_files($channel,$files) {
intval($channel['channel_id'])
);
- dbesc_array($p);
if($exists) {
+ if(! dbesc_array($p))
+ continue;
$str = '';
foreach($p as $k => $v) {
if($str)
$str .= ",";
- $str .= " `" . $k . "` = '" . $v . "' ";
+ $str .= " " . TQUOT . $k . TQUOT . " = '" . $v . "' ";
}
- $r = dbq("update `photo` set " . $str . " where id = " . intval($exists[0]['id']) );
+ $r = dbq("update photo set " . $str . " where id = " . intval($exists[0]['id']) );
}
else {
- $r = dbq("INSERT INTO photo (`"
- . implode("`, `", array_keys($p))
- . "`) VALUES ('"
- . implode("', '", array_values($p))
- . "')" );
+ create_attach_from_array('photo',$p);
}
}
}
diff --git a/include/items.php b/include/items.php
index c62d53c3e..9bd256d58 100755
--- a/include/items.php
+++ b/include/items.php
@@ -3,9 +3,6 @@
* @file include/items.php
*/
-// uncertain if this line is needed and why
-use Sabre\HTTP\URLUtil;
-
use Zotlabs\Lib as Zlib;
require_once('include/bbcode.php');
@@ -66,6 +63,7 @@ function collect_recipients($item, &$private_envelope) {
if($recipients && $deny)
$recipients = array_diff($recipients,$deny);
+
$private_envelope = true;
}
else {
@@ -116,7 +114,7 @@ function collect_recipients($item, &$private_envelope) {
// Add the authors of any posts in this thread, if they are known to us.
// This is specifically designed to forward wall-to-wall posts to the original author,
- // in case they aren't a connection but have permission to write on our wall.
+ // in case they aren't a connection but have permission to write on our wall.
// This is important for issue tracker channels. It should be a no-op for most channels.
// Whether or not they will accept the delivery is not determined here, but should
// be taken into account by zot:process_delivery()
@@ -131,7 +129,6 @@ function collect_recipients($item, &$private_envelope) {
}
}
}
-
}
@@ -173,19 +170,19 @@ function comments_are_now_closed($item) {
}
function item_normal() {
- return " and item.item_hidden = 0 and item.item_type = 0 and item.item_deleted = 0
- and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_pending_remove = 0
+ return " and item.item_hidden = 0 and item.item_type = 0 and item.item_deleted = 0
+ and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_pending_remove = 0
and item.item_blocked = 0 ";
}
/**
* @brief
- *
- * This is a compatibility function primarily for plugins, because
+ *
+ * This is a compatibility function primarily for plugins, because
* in earlier DB schemas this was a much simpler single integer compare
*
+ * @param array $item
*/
-
function is_item_normal($item) {
if(intval($item['item_hidden']) || intval($item['item_type']) || intval($item['item_deleted'])
@@ -193,8 +190,7 @@ function is_item_normal($item) {
|| intval($item['item_blocked']))
return false;
- return true;
-
+ return true;
}
/**
@@ -236,7 +232,7 @@ function can_comment_on_post($observer_xchan, $item) {
case 'public':
// We don't really allow or support public comments yet, but anonymous
// folks won't ever reach this point (as $observer_xchan will be empty).
- // This means the viewer has an xchan and we can identify them.
+ // This means the viewer has an xchan and we can identify them.
return true;
break;
case 'any connections':
@@ -295,78 +291,6 @@ function add_source_route($iid, $hash) {
/**
- * @brief preg_match function when fixing 'naked' links in mod item.php.
- *
- * Check if we've got a hubloc for the site and use a zrl if we do, a url if we don't.
- * Remove any existing zid= param which may have been pasted by mistake - and will have
- * the author's credentials. zid's are dynamic and can't really be passed around like
- * that.
- *
- * @param array $matches
- * @return string
- */
-function red_zrl_callback($matches) {
- require_once('include/hubloc.php');
- $zrl = is_matrix_url($matches[2]);
-
- $t = strip_zids($matches[2]);
- if($t !== $matches[2]) {
- $zrl = true;
- $matches[2] = $t;
- }
-
- if($matches[1] === '#^')
- $matches[1] = '';
- if($zrl)
- return $matches[1] . '#^[zrl=' . $matches[2] . ']' . $matches[2] . '[/zrl]';
-
- return $matches[1] . '#^[url=' . $matches[2] . ']' . $matches[2] . '[/url]';
-}
-
-/**
- * If we've got a url or zrl tag with a naked url somewhere in the link text,
- * escape it with quotes unless the naked url is a linked photo.
- *
- * @param array $matches
- * @return string
- */
-function red_escape_zrl_callback($matches) {
-
- // Uncertain why the url/zrl forms weren't picked up by the non-greedy regex.
-
- if((strpos($matches[3], 'zmg') !== false) || (strpos($matches[3], 'img') !== false) || (strpos($matches[3],'zrl') !== false) || (strpos($matches[3],'url') !== false))
- return $matches[0];
-
- return '[' . $matches[1] . 'rl' . $matches[2] . ']' . $matches[3] . '"' . $matches[4] . '"' . $matches[5] . '[/' . $matches[6] . 'rl]';
-}
-
-function red_escape_codeblock($m) {
- return '[$b64' . $m[2] . base64_encode($m[1]) . '[/' . $m[2] . ']';
-}
-
-function red_unescape_codeblock($m) {
- return '[' . $m[2] . base64_decode($m[1]) . '[/' . $m[2] . ']';
-}
-
-
-function red_zrlify_img_callback($matches) {
- require_once('include/hubloc.php');
- $zrl = is_matrix_url($matches[2]);
-
- $t = strip_zids($matches[2]);
- if($t !== $matches[2]) {
- $zrl = true;
- $matches[2] = $t;
- }
-
- if($zrl)
- return '[zmg' . $matches[1] . ']' . $matches[2] . '[/zmg]';
-
- return $matches[0];
-}
-
-
-/**
* @brief Post an activity.
*
* In its simplest form one needs only to set $arr['body'] to post a note to the logged in channel's wall.
@@ -481,7 +405,7 @@ function validate_item_elements($message,$arr) {
if(! array_key_exists('created',$arr))
$result['message'] = 'missing created, possible author/owner lookup failure';
- if((! $arr['mid']) || (! $arr['parent_mid']))
+ if((! $arr['mid']) || (! $arr['parent_mid']))
$result['message'] = 'missing message-id or parent message-id';
if(array_key_exists('flags',$message) && in_array('relay',$message['flags']) && $arr['mid'] === $arr['parent_mid'])
@@ -495,10 +419,6 @@ function validate_item_elements($message,$arr) {
}
-
-
-
-
/**
* @brief Limit lenght on imported system messages.
*
@@ -652,7 +572,6 @@ function get_item_elements($x,$allow_code = false) {
if(mb_strlen($arr['title']) > 255)
$arr['title'] = mb_substr($arr['title'],0,255);
-
$arr['app'] = (($x['app']) ? htmlspecialchars($x['app'], ENT_COMPAT,'UTF-8',false) : '');
$arr['route'] = (($x['route']) ? htmlspecialchars($x['route'], ENT_COMPAT,'UTF-8',false) : '');
$arr['mid'] = (($x['message_id']) ? htmlspecialchars($x['message_id'], ENT_COMPAT,'UTF-8',false) : '');
@@ -714,7 +633,7 @@ function get_item_elements($x,$allow_code = false) {
// hub and verify that they are legit - or else we're going to toss the post. We only need to do this
// once, and after that your hub knows them. Sure some info is in the post, but it's only a transit identifier
// and not enough info to be able to look you up from your hash - which is the only thing stored with the post.
-
+
$xchan_hash = import_author_xchan($x['author']);
if($xchan_hash)
$arr['author_xchan'] = $xchan_hash;
@@ -1057,7 +976,6 @@ function encode_item($item,$mirror = false) {
$x['item_blocked'] = $item['item_blocked'];
}
-
$x['message_id'] = $item['mid'];
$x['message_top'] = $item['parent_mid'];
$x['message_parent'] = $item['thr_parent'];
@@ -1078,9 +996,9 @@ function encode_item($item,$mirror = false) {
$x['longlat'] = $item['coord'];
$x['signature'] = $item['sig'];
$x['route'] = $item['route'];
-
$x['owner'] = encode_item_xchan($item['owner']);
$x['author'] = encode_item_xchan($item['author']);
+
if($item['obj'])
$x['object'] = json_decode($item['obj'],true);
if($item['target'])
@@ -1237,7 +1155,7 @@ function decode_item_meta($meta) {
$ret[] = array('cat' => escape_tags($m['family']),'k' => escape_tags($m['key']),'v' => $m['value'],'sharing' => $m['sharing']);
}
}
- return $ret;
+ return $ret;
}
/**
@@ -1530,6 +1448,8 @@ function get_profile_elements($x) {
*
* @param array $arr
* @param boolean $allow_exec (optional) default false
+ * @param boolean $deliver (optional) default true
+ *
* @return array
* * \e boolean \b success
* * \e int \b item_id
@@ -1543,6 +1463,11 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
$ret = array('success' => false, 'item_id' => 0);
+ if(array_key_exists('cancel',$arr) && $arr['cancel']) {
+ logger('cancelled by plugin');
+ return $ret;
+ }
+
if(! $arr['uid']) {
logger('item_store: no uid');
$ret['message'] = 'No uid.';
@@ -1662,7 +1587,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
// otherwise, just preserve the original timestamp.
$arr['received'] = ((x($arr,'received') !== false) ? datetime_convert('UTC','UTC',$arr['received']) : datetime_convert());
- $arr['changed'] = ((x($arr,'changed') !== false) ? datetime_convert('UTC','UTC',$arr['changed']) : datetime_convert());
+ $arr['changed'] = ((x($arr,'changed') !== false) ? datetime_convert('UTC','UTC',$arr['changed']) : datetime_convert());
}
$arr['location'] = ((x($arr,'location')) ? notags(trim($arr['location'])) : '');
@@ -1681,7 +1606,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
$arr['public_policy'] = ((x($arr,'public_policy')) ? notags(trim($arr['public_policy'])) : '' );
$arr['comment_policy'] = ((x($arr,'comment_policy')) ? notags(trim($arr['comment_policy'])) : 'contacts' );
-
+
if(! array_key_exists('item_unseen',$arr))
$arr['item_unseen'] = 1;
@@ -1717,7 +1642,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
// find the parent and snarf the item id and ACL's
// and anything else we need to inherit
- $r = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `uid` = %d ORDER BY `id` ASC LIMIT 1",
+ $r = q("SELECT * FROM item WHERE mid = '%s' AND uid = %d ORDER BY id ASC LIMIT 1",
dbesc($arr['parent_mid']),
intval($arr['uid'])
);
@@ -1749,8 +1674,8 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
if($r[0]['mid'] != $r[0]['parent_mid']) {
$arr['parent_mid'] = $r[0]['parent_mid'];
- $z = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `parent_mid` = '%s' AND `uid` = %d
- ORDER BY `id` ASC LIMIT 1",
+ $z = q("SELECT * FROM item WHERE mid = '%s' AND parent_mid = '%s' AND uid = %d
+ ORDER BY id ASC LIMIT 1",
dbesc($r[0]['parent_mid']),
dbesc($r[0]['parent_mid']),
intval($arr['uid'])
@@ -1801,7 +1726,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
if($parent_deleted)
$arr['item_deleted'] = 1;
- $r = q("SELECT `id` FROM `item` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("SELECT id FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
dbesc($arr['mid']),
intval($arr['uid'])
);
@@ -1853,17 +1778,12 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
logger('item_store: ' . print_r($arr,true), LOGGER_DATA);
- dbesc_array($arr);
- $r = dbq("INSERT INTO `item` (`"
- . implode("`, `", array_keys($arr))
- . "`) VALUES ('"
- . implode("', '", array_values($arr))
- . "')" );
+ create_table_from_array('item',$arr);
// find the item we just created
- $r = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `uid` = %d ORDER BY `id` ASC ",
+ $r = q("SELECT * FROM item WHERE mid = '%s' AND uid = %d ORDER BY id ASC ",
$arr['mid'], // already dbesc'd
intval($arr['uid'])
);
@@ -1880,7 +1800,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
}
if(count($r) > 1) {
logger('item_store: duplicated post occurred. Removing duplicates.');
- q("DELETE FROM `item` WHERE `mid` = '%s' AND `uid` = %d AND `id` != %d ",
+ q("DELETE FROM item WHERE mid = '%s' AND uid = %d AND id != %d ",
$arr['mid'],
intval($arr['uid']),
intval($current_post)
@@ -1893,6 +1813,7 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
$x = q("update item set parent = id where id = %d",
intval($r[0]['id'])
);
+ $arr['parent'] = $r[0]['id'];
}
@@ -1926,18 +1847,22 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
call_hooks('post_remote_end',$arr);
- // update the commented timestamp on the parent
+ // update the commented timestamp on the parent - unless this is potentially a clone of an older item
+ // which we don't wish to bring to the surface. As the queue only holds deliveries for 3 days, it's
+ // suspected of being an older cloned item if the creation time is older than that.
- $z = q("select max(created) as commented from item where parent_mid = '%s' and uid = %d and item_delayed = 0 ",
- dbesc($arr['parent_mid']),
- intval($arr['uid'])
- );
+ if($arr['created'] > datetime_convert('','','now - 4 days')) {
+ $z = q("select max(created) as commented from item where parent_mid = '%s' and uid = %d and item_delayed = 0 ",
+ dbesc($arr['parent_mid']),
+ intval($arr['uid'])
+ );
- q("UPDATE item set commented = '%s', changed = '%s' WHERE id = %d",
- dbesc(($z) ? $z[0]['commented'] : (datetime_convert())),
- dbesc(datetime_convert()),
- intval($parent_id)
- );
+ q("UPDATE item set commented = '%s', changed = '%s' WHERE id = %d",
+ dbesc(($z) ? $z[0]['commented'] : (datetime_convert())),
+ dbesc(datetime_convert()),
+ intval($parent_id)
+ );
+ }
// If _creating_ a deleted item, don't propagate it further or send out notifications.
@@ -1966,6 +1891,12 @@ function item_store_update($arr,$allow_exec = false, $deliver = true) {
$allow_exec = $d['allow_exec'];
$ret = array('success' => false, 'item_id' => 0);
+
+ if(array_key_exists('cancel',$arr) && $arr['cancel']) {
+ logger('cancelled by plugin');
+ return $ret;
+ }
+
if(! intval($arr['uid'])) {
logger('item_store_update: no uid');
$ret['message'] = 'no uid.';
@@ -2072,20 +2003,8 @@ function item_store_update($arr,$allow_exec = false, $deliver = true) {
$arr['commented'] = $orig[0]['commented'];
- if($deliver) {
- $arr['received'] = datetime_convert();
- $arr['changed'] = datetime_convert();
- }
- else {
-
- // When deliver flag is false, we are *probably* performing an import or bulk migration.
- // If one updates the changed timestamp it will be made available to zotfeed and delivery
- // will still take place through backdoor methods. Since these fields are rarely used
- // otherwise, just preserve the original timestamp.
-
- $arr['received'] = $orig[0]['received'];
- $arr['changed'] = $orig[0]['changed'];
- }
+ $arr['received'] = $orig[0]['received'];
+ $arr['changed'] = $orig[0]['changed'];
$arr['route'] = ((array_key_exists('route',$arr)) ? trim($arr['route']) : $orig[0]['route']);
$arr['diaspora_meta'] = ((x($arr,'diaspora_meta')) ? $arr['diaspora_meta'] : $orig[0]['diaspora_meta']);
@@ -2166,7 +2085,10 @@ function item_store_update($arr,$allow_exec = false, $deliver = true) {
}
- dbesc_array($arr);
+ if(! dbesc_array($arr)) {
+ $ret['message'] = 'DB array malformed';
+ return $ret;
+ }
logger('item_store_update: ' . print_r($arr,true), LOGGER_DATA);
@@ -2174,10 +2096,10 @@ function item_store_update($arr,$allow_exec = false, $deliver = true) {
foreach($arr as $k => $v) {
if($str)
$str .= ",";
- $str .= " `" . $k . "` = '" . $v . "' ";
+ $str .= " " . TQUOT . $k . TQUOT . " = '" . $v . "' ";
}
- $r = dbq("update `item` set " . $str . " where id = " . $orig_post_id );
+ $r = dbq("update item set " . $str . " where id = " . $orig_post_id );
if($r)
logger('item_store_update: updated item ' . $orig_post_id, LOGGER_DEBUG);
@@ -2336,10 +2258,10 @@ function send_status_notifications($post_id,$item) {
// check for an unfollow thread activity - we should probably decode the obj and check the id
// but it will be extremely rare for this to be wrong.
- if(($xx['verb'] === ACTIVITY_UNFOLLOW)
- && ($xx['obj_type'] === ACTIVITY_OBJ_NOTE || $xx['obj_type'] === ACTIVITY_OBJ_PHOTO)
+ if(($xx['verb'] === ACTIVITY_UNFOLLOW)
+ && ($xx['obj_type'] === ACTIVITY_OBJ_NOTE || $xx['obj_type'] === ACTIVITY_OBJ_PHOTO)
&& ($xx['parent'] != $xx['id']))
- $unfollowed = true;
+ $unfollowed = true;
}
if($xx['id'] == $xx['parent']) {
$parent = $xx['parent'];
@@ -2562,7 +2484,7 @@ function tag_deliver($uid, $item_id) {
if($mention) {
logger('tag_deliver: mention found for ' . $u[0]['channel_name']);
-
+
$r = q("update item set item_mentionsme = 1 where id = %d",
intval($item_id)
);
@@ -2851,7 +2773,7 @@ function start_delivery_chain($channel, $item, $item_id, $parent) {
$title = $item['title'];
$body = $item['body'];
- $r = q("update item set item_uplink = %d, item_nocomment = %d, item_obscured = %d, item_flags = %d, owner_xchan = '%s', allow_cid = '%s', allow_gid = '%s',
+ $r = q("update item set item_uplink = %d, item_nocomment = %d, item_obscured = %d, item_flags = %d, owner_xchan = '%s', allow_cid = '%s', allow_gid = '%s',
deny_cid = '%s', deny_gid = '%s', item_private = %d, public_policy = '%s', comment_policy = '%s', title = '%s', body = '%s', item_wall = %d, item_origin = %d where id = %d",
intval($item_uplink),
intval($item_nocomment),
@@ -3066,7 +2988,7 @@ function mail_store($arr) {
$arr['parent_mid'] = $arr['mid'];
}
- $r = q("SELECT `id` FROM mail WHERE `mid` = '%s' AND channel_id = %d LIMIT 1",
+ $r = q("SELECT id FROM mail WHERE mid = '%s' AND channel_id = %d LIMIT 1",
dbesc($arr['mid']),
intval($arr['channel_id'])
);
@@ -3088,19 +3010,13 @@ function mail_store($arr) {
return 0;
}
- dbesc_array($arr);
-
logger('mail_store: ' . print_r($arr,true), LOGGER_DATA);
- $r = dbq("INSERT INTO mail (`"
- . implode("`, `", array_keys($arr))
- . "`) VALUES ('"
- . implode("', '", array_values($arr))
- . "')" );
+ create_table_from_array('mail', $arr);
// find the item we just created
- $r = q("SELECT `id` FROM mail WHERE `mid` = '%s' AND `channel_id` = %d ORDER BY `id` ASC ",
+ $r = q("SELECT id FROM mail WHERE mid = '%s' AND channel_id = %d ORDER BY id ASC ",
$arr['mid'], // already dbesc'd
intval($arr['channel_id'])
);
@@ -3116,7 +3032,7 @@ function mail_store($arr) {
}
if(count($r) > 1) {
logger('mail_store: duplicated post occurred. Removing duplicates.');
- q("DELETE FROM mail WHERE `mid` = '%s' AND `channel_id` = %d AND `id` != %d ",
+ q("DELETE FROM mail WHERE mid = '%s' AND channel_id = %d AND id != %d ",
$arr['mid'],
intval($arr['channel_id']),
intval($current_post)
@@ -3168,7 +3084,7 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
if($x) {
$res = substr($i,$x+1);
$i = substr($i,0,$x);
- $r = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `imgscale` = %d AND `uid` = %d",
+ $r = q("SELECT * FROM photo WHERE resource_id = '%s' AND imgscale = %d AND uid = %d",
dbesc($i),
intval($res),
intval($uid)
@@ -3352,7 +3268,7 @@ function item_expire($uid,$days) {
AND item_starred = 0
$sql_extra $item_normal LIMIT $expire_limit ",
intval($uid),
- db_utcnow(),
+ db_utcnow(),
db_quoteinterval(intval($days).' DAY')
);
@@ -3745,7 +3661,7 @@ function fetch_post_tags($items,$link = false) {
);
$imeta = q("select * from iconfig where iid in ( %s )",
dbesc($tag_finder_str)
- );
+ );
}
@@ -3878,13 +3794,13 @@ function zot_feed($uid,$observer_hash,$arr) {
unset($r[$x]);
}
}
-
+
$parents_str = ids_to_querystr($r,'parent');
$sys_query = ((is_sys_channel($uid)) ? $sql_extra : '');
$item_normal = item_normal();
- $items = q("SELECT `item`.*, `item`.`id` AS `item_id` FROM `item`
- WHERE `item`.`parent` IN ( %s ) $item_normal $sys_query ",
+ $items = q("SELECT item.*, item.id AS item_id FROM item
+ WHERE item.parent IN ( %s ) $item_normal $sys_query ",
dbesc($parents_str)
);
}
@@ -3942,9 +3858,9 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C
if($arr['mid'])
$sql_options .= " and parent_mid = '" . dbesc($arr['mid']) . "' ";
-
+
$sql_extra = " AND item.parent IN ( SELECT parent FROM item WHERE item_thread_top = 1 $sql_options $item_normal ) ";
-
+
if($arr['since_id'])
$sql_extra .= " and item.id > " . $since_id . " ";
@@ -3952,7 +3868,7 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C
$sql_extra .= protect_sprintf(term_query('item', $arr['cat'], TERM_CATEGORY));
if($arr['gid'] && $uid) {
- $r = q("SELECT * FROM `groups` WHERE id = %d AND uid = %d LIMIT 1",
+ $r = q("SELECT * FROM groups WHERE id = %d AND uid = %d LIMIT 1",
intval($arr['group']),
intval($uid)
);
@@ -4056,8 +3972,8 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C
$sql_nets .= "( abook.abook_closeness >= " . intval($arr['cmin']) . " ";
$sql_nets .= " AND abook.abook_closeness <= " . intval($arr['cmax']) . " ) ";
- /** @fixme dead code, $cmax is undefined */
- if ($cmax == 99)
+
+ if ($arr['cmax'] == 99)
$sql_nets .= " OR abook.abook_closeness IS NULL ) ";
}
}
@@ -4192,25 +4108,21 @@ function webpage_to_namespace($webpage) {
function update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid) {
- $page_type = '';
-
if(! $post_id)
return;
-
- if($webpage == ITEM_TYPE_WEBPAGE)
- $page_type = 'WEBPAGE';
- elseif($webpage == ITEM_TYPE_BLOCK)
- $page_type = 'BUILDBLOCK';
- elseif($webpage == ITEM_TYPE_PDL)
- $page_type = 'PDL';
- elseif($webpage == ITEM_TYPE_DOC)
- $page_type = 'docfile';
- elseif($namespace && $remote_id) {
+
+ $page_type = webpage_to_namespace($webpage);
+
+ if($page_type == 'unknown' && $namespace && $remote_id) {
$page_type = $namespace;
$pagetitle = $remote_id;
}
+ else {
+ $page_type = '';
+ }
if($page_type) {
+
// store page info as an alternate message_id so we can access it via
// https://sitename/page/$channelname/$pagetitle
// if no pagetitle was given or it couldn't be transliterated into a url, use the first
@@ -4347,7 +4259,7 @@ function send_profile_photo_activity($channel,$photo,$profile) {
$ptext = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo['resource_id'] . ']' . t('profile photo') . '[/zrl]';
- $ltext = '[zrl=' . z_root() . '/profile/' . $channel['channel_address'] . ']' . '[zmg=150x150]' . z_root() . '/photo/' . $photo['resource_id'] . '-4[/zmg][/zrl]';
+ $ltext = '[zrl=' . z_root() . '/profile/' . $channel['channel_address'] . ']' . '[zmg=150x150]' . z_root() . '/photo/' . $photo['resource_id'] . '-4[/zmg][/zrl]';
$arr['body'] = sprintf($t,$channel['channel_name'],$ptext) . "\n\n" . $ltext;
@@ -4389,11 +4301,11 @@ function sync_an_item($channel_id,$item_id) {
function fix_attached_photo_permissions($uid,$xchan_hash,$body,
$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny) {
-
+
if(get_pconfig($uid,'system','force_public_uploads')) {
$str_contact_allow = $str_group_allow = $str_contact_deny = $str_group_deny = '';
}
-
+
$match = null;
// match img and zmg image links
if(preg_match_all("/\[[zi]mg(.*?)\](.*?)\[\/[zi]mg\]/",$body,$match)) {
@@ -4410,7 +4322,7 @@ function fix_attached_photo_permissions($uid,$xchan_hash,$body,
if(! strlen($image_uri))
continue;
$srch = '<' . $xchan_hash . '>';
-
+
$r = q("select folder from attach where hash = '%s' and uid = %d limit 1",
dbesc($image_uri),
intval($uid)
@@ -4427,15 +4339,15 @@ function fix_attached_photo_permissions($uid,$xchan_hash,$body,
$str_group_deny = $f[0]['deny_gid'];
}
}
-
- $r = q("SELECT id FROM photo
+
+ $r = q("SELECT id FROM photo
WHERE allow_cid = '%s' AND allow_gid = '' AND deny_cid = '' AND deny_gid = ''
AND resource_id = '%s' AND uid = %d LIMIT 1",
dbesc($srch),
dbesc($image_uri),
intval($uid)
);
-
+
if($r) {
$r = q("UPDATE photo SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s'
WHERE resource_id = '%s' AND uid = %d ",
@@ -4446,9 +4358,9 @@ function fix_attached_photo_permissions($uid,$xchan_hash,$body,
dbesc($image_uri),
intval($uid)
);
-
+
// also update the linked item (which is probably invisible)
-
+
$r = q("select id from item
WHERE allow_cid = '%s' AND allow_gid = '' AND deny_cid = '' AND deny_gid = ''
AND resource_id = '%s' and resource_type = 'photo' AND uid = %d LIMIT 1",
@@ -4458,7 +4370,7 @@ function fix_attached_photo_permissions($uid,$xchan_hash,$body,
);
if($r) {
$private = (($str_contact_allow || $str_group_allow || $str_contact_deny || $str_group_deny) ? true : false);
-
+
$r = q("UPDATE item SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', item_private = %d
WHERE id = %d AND uid = %d",
dbesc($str_contact_allow),
@@ -4484,23 +4396,23 @@ function fix_attached_photo_permissions($uid,$xchan_hash,$body,
intval($r[0]['id']),
intval($uid)
);
- }
+ }
}
}
}
}
}
-
-
+
+
function fix_attached_file_permissions($channel,$observer_hash,$body,
$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny) {
-
+
if(get_pconfig($channel['channel_id'],'system','force_public_uploads')) {
$str_contact_allow = $str_group_allow = $str_contact_deny = $str_group_deny = '';
}
-
+
$match = false;
-
+
if(preg_match_all("/\[attachment\](.*?)\[\/attachment\]/",$body,$match)) {
$attaches = $match[1];
if($attaches) {
@@ -4519,3 +4431,75 @@ function fix_attached_file_permissions($channel,$observer_hash,$body,
}
}
}
+
+
+function item_create_edit_activity($post) {
+
+ if((! $post) || (! $post['item']) || ($post['item']['item_type'] != ITEM_TYPE_POST))
+ return;
+
+ $update_item = $post['item'];
+
+ $new_item = $update_item;
+
+ $author = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($new_item['author_xchan'])
+ );
+ if($author)
+ $item_author = $author[0];
+
+
+ $new_item['id'] = 0;
+ $new_item['parent'] = 0;
+ $new_item['mid'] = item_message_id();
+
+ $new_item['body'] = sprintf( t('[Edited %s]'), (($update_item['item_thread_top']) ? t('Post','edit_activity') : t('Comment','edit_activity')));
+
+ $new_item['body'] .= "\n\n";
+ $new_item['body'] .= $update_item['body'];
+
+ $new_item['sig'] = '';
+
+ $new_item['verb'] = ACTIVITY_UPDATE;
+ $new_item['item_thread_top'] = 0;
+ $new_item['created'] = $new_item['edited'] = datetime_convert();
+
+ $new_item['obj'] = json_encode(array(
+ 'type' => (($update_item['item_thread_top']) ? ACTIVITY_OBJ_NOTE : ACTIVITY_OBJ_COMMENT),
+ 'id' => $update_item['mid'],
+ 'parent' => $update_item['parent_mid'],
+ 'link' => array(array('rel' => 'alternate','type' => 'text/html', 'href' => $update_item['plink'])),
+ 'title' => $update_item['title'],
+ 'content' => $update_item['body'],
+ 'created' => $update_item['created'],
+ 'edited' => $update_item['edited'],
+ 'author' => array(
+ 'name' => $item_author['xchan_name'],
+ 'address' => $item_author['xchan_addr'],
+ 'guid' => $item_author['xchan_guid'],
+ 'guid_sig' => $item_author['xchan_guid_sig'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item_author['xchan_url']),
+ array('rel' => 'photo', 'type' => $item_author['xchan_photo_mimetype'], 'href' => $item_author['xchan_photo_m'])),
+ ),
+ ));
+
+
+
+ $x = post_activity_item($new_item);
+
+ $post_id = $x['id'];
+ if($post_id) {
+ $r = q("select * from item where id = %d",
+ intval($post_id)
+ );
+ if($r) {
+ xchan_query($r);
+ $sync_item = fetch_post_tags($r);
+ build_sync_packet($new_item['uid'],array('item' => array(encode_item($sync_item[0],true))));
+ }
+ }
+
+ \Zotlabs\Daemon\Master::Summon(array('Notifier', 'edit_activity', $post_id));
+
+}
diff --git a/include/language.php b/include/language.php
index 96d3e48a9..efe9397fb 100644
--- a/include/language.php
+++ b/include/language.php
@@ -327,3 +327,61 @@ function get_language_name($s, $l = null) {
return $language->getName();
}
+
+
+
+function language_list() {
+
+ $langs = glob('view/*/hstrings.php');
+
+ $lang_options = array();
+ $selected = "";
+
+ if(is_array($langs) && count($langs)) {
+ if(! in_array('view/en/hstrings.php',$langs))
+ $langs[] = 'view/en/';
+ asort($langs);
+ foreach($langs as $l) {
+ $ll = substr($l,5);
+ $ll = substr($ll,0,strrpos($ll,'/'));
+ $lang_options[$ll] = get_language_name($ll, $ll) . " ($ll)";
+ }
+ }
+ return $lang_options;
+}
+
+function lang_selector() {
+
+ $langs = glob('view/*/hstrings.php');
+
+ $lang_options = array();
+ $selected = "";
+
+ if(is_array($langs) && count($langs)) {
+ $langs[] = '';
+ if(! in_array('view/en/hstrings.php',$langs))
+ $langs[] = 'view/en/';
+ asort($langs);
+ foreach($langs as $l) {
+ if($l == '') {
+ $lang_options[""] = t('default');
+ continue;
+ }
+ $ll = substr($l,5);
+ $ll = substr($ll,0,strrpos($ll,'/'));
+ $selected = (($ll === App::$language && (x($_SESSION, 'language'))) ? $ll : $selected);
+ $lang_options[$ll] = get_language_name($ll, $ll) . " ($ll)";
+ }
+ }
+
+ $tpl = get_markup_template('lang_selector.tpl');
+
+ $o = replace_macros($tpl, array(
+ '$title' => t('Select an alternate language'),
+ '$langs' => array($lang_options, $selected),
+
+ ));
+
+ return $o;
+}
+
diff --git a/include/menu.php b/include/menu.php
index 3b0180d37..b54ff7f9e 100644
--- a/include/menu.php
+++ b/include/menu.php
@@ -284,7 +284,7 @@ function menu_delete_id($menu_id, $uid) {
intval($menu_id),
intval($uid)
);
- return q("delete from menu where menu_id = %d and menu_channel_id = %d limit 1",
+ return q("delete from menu where menu_id = %d and menu_channel_id = %d",
intval($menu_id),
intval($uid)
);
diff --git a/include/message.php b/include/message.php
index 748689206..7cbea3c6b 100644
--- a/include/message.php
+++ b/include/message.php
@@ -187,10 +187,10 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto='
if($body)
$body = str_rot47(base64url_encode($body));
+ $sig = ''; // placeholder
-
- $r = q("INSERT INTO mail ( account_id, conv_guid, mail_obscured, channel_id, from_xchan, to_xchan, title, body, attach, mid, parent_mid, created, expires, mail_isreply )
- VALUES ( %d, '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d )",
+ $r = q("INSERT INTO mail ( account_id, conv_guid, mail_obscured, channel_id, from_xchan, to_xchan, title, body, sig, attach, mid, parent_mid, created, expires, mail_isreply )
+ VALUES ( %d, '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d )",
intval($channel['channel_account_id']),
dbesc($conv_guid),
intval(1),
@@ -199,6 +199,7 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto='
dbesc($recipient),
dbesc($subject),
dbesc($body),
+ dbesc($sig),
dbesc($jattach),
dbesc($mid),
dbesc($replyto),
@@ -392,7 +393,7 @@ function private_messages_fetch_message($channel_id, $messageitem_id, $updatesee
if($updateseen) {
- $r = q("UPDATE `mail` SET mail_seen = 1 where mail_seen = 0 and id = %d AND channel_id = %d",
+ $r = q("UPDATE mail SET mail_seen = 1 where mail_seen = 0 and id = %d AND channel_id = %d",
dbesc($messageitem_id),
intval($channel_id)
);
@@ -436,7 +437,7 @@ function private_messages_drop($channel_id, $messageitem_id, $drop_conversation
intval($channel_id)
);
if($z) {
- q("delete from conv where guid = '%s' and uid = %d limit 1",
+ q("delete from conv where guid = '%s' and uid = %d",
dbesc($x[0]['conv_guid']),
intval($channel_id)
);
@@ -516,7 +517,7 @@ function private_messages_fetch_conversation($channel_id, $messageitem_id, $upda
if($updateseen) {
- $r = q("UPDATE `mail` SET mail_seen = 1 where mail_seen = 0 and parent_mid = '%s' AND channel_id = %d",
+ $r = q("UPDATE mail SET mail_seen = 1 where mail_seen = 0 and parent_mid = '%s' AND channel_id = %d",
dbesc($r[0]['parent_mid']),
intval($channel_id)
);
diff --git a/include/nav.php b/include/nav.php
index c2a058457..2762e2a14 100644
--- a/include/nav.php
+++ b/include/nav.php
@@ -108,7 +108,7 @@ EOT;
if(feature_enabled($channel['channel_id'],'webpages') && (! $basic))
$nav['usermenu'][] = Array('webpages/' . $channel['channel_address'],t('Webpages'),"",t('Your webpages'),'webpages_nav_btn');
if(feature_enabled($channel['channel_id'],'wiki') && (! $basic))
- $nav['usermenu'][] = Array('wiki/' . $channel['channel_address'],t('Wiki'),"",t('Your wiki'),'wiki_nav_btn');
+ $nav['usermenu'][] = Array('wiki/' . $channel['channel_address'],t('Wikis'),"",t('Your wikis'),'wiki_nav_btn');
}
else {
if(! get_account_id()) {
@@ -127,26 +127,24 @@ EOT;
);
}
- if($observer) {
- $nav['lock'] = array('logout','','lock',
- sprintf( t('%s - click to logout'), $observer['xchan_addr']));
- }
elseif(! $_SESSION['authenticated']) {
$nav['loginmenu'][] = Array('rmagic',t('Remote authentication'),'',t('Click to authenticate to your home hub'),'rmagic_nav_btn');
}
- /**
- * "Home" should also take you home from an authenticated remote profile connection
- */
-
$homelink = get_my_url();
if(! $homelink) {
$observer = App::get_observer();
$homelink = (($observer) ? $observer['xchan_url'] : '');
}
- if(! local_channel())
- $nav['home'] = array($homelink, t('Home'), "", t('Home Page'),'home_nav_btn');
+ if(! local_channel()) {
+ $nav['rusermenu'] = array(
+ $homelink,
+ t('Get me home'),
+ 'logout',
+ t('Log me out of this site')
+ );
+ }
if(((get_config('system','register_policy') == REGISTER_OPEN) || (get_config('system','register_policy') == REGISTER_APPROVE)) && (! $_SESSION['authenticated']))
$nav['register'] = array('register',t('Register'), "", t('Create an account'),'register_nav_btn');
diff --git a/include/network.php b/include/network.php
index 7851f8976..451ce12a1 100644
--- a/include/network.php
+++ b/include/network.php
@@ -30,12 +30,12 @@ function get_capath() {
* * \b filep => stream resource to write body to. header and body are not returned when using this option.
* * \b custom => custom request method: e.g. 'PUT', 'DELETE'
* * \b cookiejar => cookie file (write)
- * * \B cookiefile => cookie file (read)
+ * * \b cookiefile => cookie file (read)
*
* @return array an associative array with:
* * \e int \b return_code => HTTP return code or 0 if timeout or failure
* * \e boolean \b success => boolean true (if HTTP 2xx result) or false
- * * \e string \b header => HTTP headers
+ * * \e string \b header => HTTP headers
* * \e string \b body => fetched content
*/
function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
@@ -43,7 +43,7 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
$ret = array('return_code' => 0, 'success' => false, 'header' => "", 'body' => "");
$ch = @curl_init($url);
- if(($redirects > 8) || (! $ch))
+ if(($redirects > 8) || (! $ch))
return $ret;
@curl_setopt($ch, CURLOPT_HEADER, true);
@@ -59,12 +59,12 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
if(x($opts,'filep')) {
@curl_setopt($ch, CURLOPT_FILE, $opts['filep']);
- @curl_setopt($ch, CURLOPT_HEADER, $false);
+ @curl_setopt($ch, CURLOPT_HEADER, false);
}
if(x($opts,'upload'))
@curl_setopt($ch, CURLOPT_UPLOAD, $opts['upload']);
-
+
if(x($opts,'infile'))
@curl_setopt($ch, CURLOPT_INFILE, $opts['infile']);
@@ -87,7 +87,7 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
@curl_setopt($ch, CURLOPT_TIMEOUT, $opts['timeout']);
}
else {
- $curl_time = intval(get_config('system','curl_timeout'));
+ $curl_time = intval(@get_config('system','curl_timeout'));
@curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
}
@@ -104,10 +104,10 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
if(x($opts,'cookie'))
@curl_setopt($ch, CURLOPT_COOKIE, $opts['cookie']);
- @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,
+ @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,
((x($opts,'novalidate') && intval($opts['novalidate'])) ? false : true));
- $prx = get_config('system','proxy');
+ $prx = @get_config('system','proxy');
if(strlen($prx)) {
@curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
@curl_setopt($ch, CURLOPT_PROXY, $prx);
@@ -179,10 +179,10 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
* @param string $url
* URL to post
* @param mixed $params
- * The full data to post in a HTTP "POST" operation. This parameter can
- * either be passed as a urlencoded string like 'para1=val1&para2=val2&...'
- * or as an array with the field name as key and field data as value. If value
- * is an array, the Content-Type header will be set to multipart/form-data.
+ * The full data to post in a HTTP "POST" operation. This parameter can
+ * either be passed as a urlencoded string like 'para1=val1&para2=val2&...'
+ * or as an array with the field name as key and field data as value. If value
+ * is an array, the Content-Type header will be set to multipart/form-data.
* @param int $redirects = 0
* internal use, recursion counter
* @param array $opts (optional parameters)
@@ -209,7 +209,7 @@ function z_post_url($url,$params, $redirects = 0, $opts = array()) {
$ret = array('return_code' => 0, 'success' => false, 'header' => "", 'body' => "");
$ch = curl_init($url);
- if(($redirects > 8) || (! $ch))
+ if(($redirects > 8) || (! $ch))
return $ret;
@curl_setopt($ch, CURLOPT_HEADER, true);
@@ -226,13 +226,13 @@ function z_post_url($url,$params, $redirects = 0, $opts = array()) {
if(x($opts,'filep')) {
@curl_setopt($ch, CURLOPT_FILE, $opts['filep']);
- @curl_setopt($ch, CURLOPT_HEADER, $false);
+ @curl_setopt($ch, CURLOPT_HEADER, false);
}
if(x($opts,'headers')) {
@curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['headers']);
}
-
+
if(x($opts,'nobody'))
@curl_setopt($ch, CURLOPT_NOBODY, $opts['nobody']);
@@ -246,7 +246,7 @@ function z_post_url($url,$params, $redirects = 0, $opts = array()) {
@curl_setopt($ch, CURLOPT_TIMEOUT, $opts['timeout']);
}
else {
- $curl_time = intval(get_config('system','curl_timeout'));
+ $curl_time = intval(@get_config('system','curl_timeout'));
@curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
}
@@ -265,7 +265,7 @@ function z_post_url($url,$params, $redirects = 0, $opts = array()) {
if(x($opts,'cookie'))
@curl_setopt($ch, CURLOPT_COOKIE, $opts['cookie']);
- @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,
+ @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,
((x($opts,'novalidate') && intval($opts['novalidate'])) ? false : true));
$prx = get_config('system','proxy');
@@ -379,8 +379,8 @@ function json_return_and_die($x, $content_type = 'application/json') {
// Generic XML return
-// Outputs a basic dfrn XML status structure to STDOUT, with a <status> variable
-// of $st and an optional text <message> of $message and terminates the current process.
+// Outputs a basic dfrn XML status structure to STDOUT, with a <status> variable
+// of $st and an optional text <message> of $message and terminates the current process.
function xml_status($st, $message = '') {
@@ -399,7 +399,7 @@ function xml_status($st, $message = '') {
/**
- * @brief Send HTTP status header
+ * @brief Send HTTP status header
*
* @param int $val
* integer HTTP status result value
@@ -413,7 +413,7 @@ function http_status($val, $msg = '') {
if ($val >= 200 && $val < 300)
$msg = (($msg) ? $msg : 'OK');
- logger('http_status_exit ' . $val . ' ' . $msg);
+ logger('http_status_exit ' . $val . ' ' . $msg);
header($_SERVER['SERVER_PROTOCOL'] . ' ' . $val . ' ' . $msg);
}
@@ -480,21 +480,46 @@ function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
}
}
+
+
+function z_dns_check($h,$check_mx = 0) {
+
+ // dns_get_record() has issues on some platforms
+ // so allow somebody to ignore it completely
+ // Use config values from memory as this can be called during setup
+ // before a database or even any config structure exists.
+
+ if(is_array(\App::$config) && array_key_exists('system',\App::$config)
+ && is_array(\App::$config['system'])
+ && array_key_exists('do_not_check_dns',\App::$config['system'])
+ && \App::$config['system']['do_not_check_dns'])
+ return true;
+
+
+ //$opts = DNS_A + DNS_CNAME + DNS_PTR;
+ //if($check_mx)
+ // $opts += DNS_MX;
+ // Specific record type flags are unreliable on FreeBSD and Mac,
+ // so now we'll ignore these and just check for the existence of any DNS record.
+ return((@dns_get_record($h) || filter_var($h, FILTER_VALIDATE_IP)) ? true : false);
+
+}
+
// Take a URL from the wild, prepend http:// if necessary
// and check DNS to see if it's real (or check if is a valid IP address)
// return true if it's OK, false if something is wrong with it
function validate_url(&$url) {
-
+
// no naked subdomains (allow localhost for tests)
if(strpos($url,'.') === false && strpos($url,'/localhost/') === false)
return false;
if(substr($url,0,4) != 'http')
$url = 'http://' . $url;
$h = @parse_url($url);
-
- if(($h) && (@dns_get_record($h['host'], DNS_A + DNS_CNAME + DNS_PTR) || filter_var($h['host'], FILTER_VALIDATE_IP) )) {
+
+ if(($h) && z_dns_check($h['host'])) {
return true;
}
return false;
@@ -512,7 +537,7 @@ function validate_email($addr) {
return false;
$h = substr($addr,strpos($addr,'@') + 1);
- if(($h) && (@dns_get_record($h, DNS_A + DNS_CNAME + DNS_PTR + DNS_MX) || filter_var($h, FILTER_VALIDATE_IP) )) {
+ if(($h) && z_dns_check($h,true)) {
return true;
}
return false;
@@ -552,7 +577,7 @@ function allowed_url($url) {
foreach($allowed as $a) {
$pat = strtolower(trim($a));
if(($fnmatch && fnmatch($pat,$host)) || ($pat == $host)) {
- $found = true;
+ $found = true;
break;
}
}
@@ -575,14 +600,14 @@ function allowed_email($email) {
$str_allowed = get_config('system','allowed_email');
$str_not_allowed = get_config('system','not_allowed_email');
-
+
if(! $str_allowed && ! $str_not_allowed)
return true;
$return = false;
- $found_allowed = false;
+ $found_allowed = false;
$found_not_allowed = false;
-
+
$fnmatch = function_exists('fnmatch');
$allowed = explode(',',$str_allowed);
@@ -591,7 +616,7 @@ function allowed_email($email) {
foreach($allowed as $a) {
$pat = strtolower(trim($a));
if(($fnmatch && fnmatch($pat,$email)) || ($pat == $domain)) {
- $found_allowed = true;
+ $found_allowed = true;
break;
}
}
@@ -603,16 +628,16 @@ function allowed_email($email) {
foreach($not_allowed as $na) {
$pat = strtolower(trim($na));
if(($fnmatch && fnmatch($pat,$email)) || ($pat == $domain)) {
- $found_not_allowed = true;
+ $found_not_allowed = true;
break;
}
}
- }
-
+ }
+
if ($found_allowed) {
- $return = true;
+ $return = true;
} elseif (!$str_allowed && !$found_not_allowed) {
- $return = true;
+ $return = true;
}
return $return;
}
@@ -652,7 +677,7 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
foreach($matches as $mtch) {
logger('scale_external_image: ' . $mtch[2] . ' ' . $mtch[3]);
-
+
if(substr($mtch[1],0,1) == '=') {
$owidth = intval(substr($mtch[2],1));
if(intval($owidth) > 0 && intval($owidth) < 1024)
@@ -686,7 +711,7 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
$type = guess_image_type($mtch[3],$i['header']);
if(strpos($type,'image') === false)
continue;
-
+
if($i['success']) {
$ph = photo_factory($i['body'], $type);
if($ph->is_valid()) {
@@ -700,7 +725,7 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
$new_height = $ph->getHeight();
logger('scale_external_images: ' . $orig_width . '->' . $new_width . 'w ' . $orig_height . '->' . $new_height . 'h' . ' match: ' . $mtch[0], LOGGER_DEBUG);
$s = str_replace($mtch[0],'[' . $tag . '=' . $new_width . 'x' . $new_height. ']' . $scaled . '[/' . $tag . ']'
- . "\n" . (($include_link)
+ . "\n" . (($include_link)
? '[zrl=' . $mtch[2] . ']' . t('view full size') . '[/zrl]' . "\n"
: ''),$s);
logger('scale_external_images: new string: ' . $s, LOGGER_DEBUG);
@@ -728,7 +753,7 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
* Return: The parsed XML in an array form. Use print_r() to see the resulting array structure.
* Examples: $array = xml2array(file_get_contents('feed.xml'));
* $array = xml2array(file_get_contents('feed.xml', true, 1, 'attribute'));
- */
+ */
function xml2array($contents, $namespaces = true, $get_attributes=1, $priority = 'attribute') {
if(!$contents) return array();
@@ -752,7 +777,7 @@ function xml2array($contents, $namespaces = true, $get_attributes=1, $priority =
return array();
}
- xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
+ xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
// http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
@@ -786,7 +811,7 @@ function xml2array($contents, $namespaces = true, $get_attributes=1, $priority =
$result = array();
$attributes_data = array();
-
+
if(isset($value)) {
if($priority == 'tag') $result = $value;
else $result['value'] = $value; // Put the value in a assoc array if we are in the 'Attribute' mode
@@ -802,7 +827,7 @@ function xml2array($contents, $namespaces = true, $get_attributes=1, $priority =
// See tag status and do the needed.
if($namespaces && strpos($tag,':')) {
- $namespc = substr($tag,0,strrpos($tag,':'));
+ $namespc = substr($tag,0,strrpos($tag,':'));
$tag = strtolower(substr($tag,strlen($namespc)+1));
$result['@namespace'] = $namespc;
}
@@ -825,7 +850,7 @@ function xml2array($contents, $namespaces = true, $get_attributes=1, $priority =
} else { // This section will make the value an array if multiple tags with the same name appear together
$current[$tag] = array($current[$tag],$result); // This will combine the existing item and the new item together to make an array
$repeated_tag_index[$tag.'_'.$level] = 2;
-
+
if(isset($current[$tag.'_attr'])) { // The attribute of the last(0th) tag must be moved as well
$current[$tag]['0_attr'] = $current[$tag.'_attr'];
unset($current[$tag.'_attr']);
@@ -848,7 +873,7 @@ function xml2array($contents, $namespaces = true, $get_attributes=1, $priority =
// ...push the new element into that array.
$current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result;
-
+
if($priority == 'tag' and $get_attributes and $attributes_data) {
$current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
}
@@ -859,11 +884,11 @@ function xml2array($contents, $namespaces = true, $get_attributes=1, $priority =
$repeated_tag_index[$tag.'_'.$level] = 1;
if($priority == 'tag' and $get_attributes) {
if(isset($current[$tag.'_attr'])) { // The attribute of the last(0th) tag must be moved as well
-
+
$current[$tag]['0_attr'] = $current[$tag.'_attr'];
unset($current[$tag.'_attr']);
}
-
+
if($attributes_data) {
$current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data;
}
@@ -876,9 +901,9 @@ function xml2array($contents, $namespaces = true, $get_attributes=1, $priority =
$current = &$parent[$level-1];
}
}
-
+
return($xml_array);
-}
+}
function email_header_encode($in_str, $charset = 'UTF-8') {
@@ -1128,7 +1153,7 @@ function discover_by_webbie($webbie) {
$diaspora = false;
$gnusoc = false;
$dfrn = false;
-
+
$has_salmon = false;
$salmon_key = false;
$atom_feed = false;
@@ -1144,7 +1169,7 @@ function discover_by_webbie($webbie) {
if(array_key_exists('rel',$link)) {
// If we discover zot - don't search further; grab the info and get out of
- // here.
+ // here.
if($link['rel'] === PROTOCOL_ZOT) {
logger('discover_by_webbie: zot found for ' . $webbie, LOGGER_DEBUG);
@@ -1204,11 +1229,11 @@ function discover_by_webbie($webbie) {
$pubkey = '';
if(is_array($x)) {
- if(array_key_exists('address',$x))
+ if(array_key_exists('address',$x))
$address = $x['address'];
- if(array_key_exists('location',$x))
+ if(array_key_exists('location',$x))
$location = $x['location'];
- if(array_key_exists('nickname',$x))
+ if(array_key_exists('nickname',$x))
$nickname = $x['nickname'];
}
@@ -1216,16 +1241,16 @@ function discover_by_webbie($webbie) {
$probe_old = true;
- if((! $dfrn) && (! $has_salmon))
+ if((! $dfrn) && (! $has_salmon))
$probe_old = true;
if($probe_old) {
- $y = old_webfinger($webbie);
+ $y = old_webfinger($webbie);
if($y) {
logger('old_webfinger: ' . print_r($x,true));
foreach($y as $link) {
if($link['@attributes']['rel'] === NAMESPACE_DFRN)
- $dfrn = unamp($link['@attributes']['href']);
+ $dfrn = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === 'salmon')
$notify = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === NAMESPACE_FEED)
@@ -1344,7 +1369,7 @@ function discover_by_webbie($webbie) {
if($vcard['fn'])
$fullname = $vcard['fn'];
if($vcard['photo'] && (strpos($vcard['photo'],'http') !== 0))
- $vcard['photo'] = $diaspora_base . '/' . $vcard['photo'];
+ $vcard['photo'] = $diaspora_base . '/' . $vcard['photo'];
if(($vcard['public_key']) && (! $pubkey)) {
$diaspora_key = $vcard['public_key'];
if(strstr($diaspora_key,'RSA '))
@@ -1358,7 +1383,7 @@ function discover_by_webbie($webbie) {
if(($vcard['uid']) && (! $diaspora_guid))
$diaspora_guid = $vcard['uid'];
if(($vcard['url']) && (! $diaspora_base))
- $diaspora_base = $vcard['url'];
+ $diaspora_base = $vcard['url'];
@@ -1372,7 +1397,7 @@ function discover_by_webbie($webbie) {
if(($profile) && (! $location))
$location = $profile;
- if($location) {
+ if($location) {
$m = parse_url($location);
$base = $m['scheme'] . '://' . $m['host'];
$host = $m['host'];
@@ -1407,12 +1432,12 @@ function discover_by_webbie($webbie) {
// if we have everything we need, let's create the records
- if($network && $address && $fullname && $pubkey && $location) {
+ if($network && $address && $fullname && $pubkey && $location) {
$r = q("select * from xchan where xchan_hash = '%s' limit 1",
dbesc($address)
);
if($r) {
- $r = q("update xchan set xchan_name = '%s', xchan_network = '%s', xchan_name_date = '%s' where xchan_hash = '%s' limit 1",
+ $r = q("update xchan set xchan_name = '%s', xchan_network = '%s', xchan_name_date = '%s' where xchan_hash = '%s'",
dbesc($fullname),
dbesc($network),
dbesc(datetime_convert()),
@@ -1493,7 +1518,7 @@ function webfinger_rfc7033($webbie,$zot = false) {
// We could have a number of URL aliases and webbies
// make an executive decision about the most likely "best" of each
// by comparing against some examples from known networks we're likely to encounter.
- // Otherwise we have to store every alias that we may ever encounter and
+ // Otherwise we have to store every alias that we may ever encounter and
// validate every URL we ever find against every possible alias
// @fixme pump.io is going to be a real bugger since it doesn't return subject or aliases
@@ -1564,7 +1589,7 @@ function match_webfinger_location($s,$h) {
return $s;
return '';
}
-
+
@@ -1935,7 +1960,7 @@ function format_and_send_email($sender,$xchan,$item) {
));
$sender_name = t('Administrator');
-
+
$hostname = App::get_hostname();
if(strpos($hostname,':'))
$hostname = substr($hostname,0,strpos($hostname,':'));
@@ -1964,7 +1989,7 @@ function do_delivery($deliveries) {
if(! (is_array($deliveries) && count($deliveries)))
return;
- $interval = ((get_config('system','delivery_interval') !== false)
+ $interval = ((get_config('system','delivery_interval') !== false)
? intval(get_config('system','delivery_interval')) : 2 );
$deliveries_per_process = intval(get_config('system','delivery_batch_count'));
@@ -1993,7 +2018,7 @@ function do_delivery($deliveries) {
if($deliver)
Zotlabs\Daemon\Master::Summon(array('Deliver',$deliver));
-
+
}
@@ -2002,7 +2027,7 @@ function get_site_info() {
$register_policy = Array('REGISTER_CLOSED', 'REGISTER_APPROVE', 'REGISTER_OPEN');
$directory_mode = Array('DIRECTORY_MODE_NORMAL', 'DIRECTORY_MODE_PRIMARY', 'DIRECTORY_MODE_SECONDARY', 256 => 'DIRECTORY_MODE_STANDALONE');
-
+
$sql_extra = '';
$r = q("select * from channel left join account on account_id = channel_account_id where ( account_roles & 4096 )>0 and account_default_channel = channel_id");
@@ -2053,7 +2078,7 @@ function get_site_info() {
else {
$version = $commit = '';
}
-
+
//Statistics
$channels_total_stat = intval(get_config('system','channels_total_stat'));
$channels_active_halfyear_stat = intval(get_config('system','channels_active_halfyear_stat'));
@@ -2073,7 +2098,7 @@ function get_site_info() {
}
-
+
$data = Array(
'version' => $version,
'version_tag' => $tag,
@@ -2190,7 +2215,7 @@ function deliverable_singleton($channel_id,$xchan) {
function get_repository_version($branch = 'master') {
$path = "https://raw.githubusercontent.com/redmatrix/hubzilla/$branch/boot.php";
-
+
$x = z_fetch_url($path);
if($x['success']) {
$y = preg_match('/define(.*?)STD_VERSION(.*?)([0-9.].*)\'/',$x['body'],$matches);
@@ -2199,7 +2224,7 @@ function get_repository_version($branch = 'master') {
}
return '?.?';
-}
+}
function network_to_name($s) {
@@ -2266,11 +2291,11 @@ function z_mail($params) {
call_hooks('email_send', $params);
if($params['sent']) {
- logger('notification: z_mail returns ' . $params['result'], LOGGER_DEBUG);
+ logger('notification: z_mail returns ' . (($params['result']) ? 'success' : 'failure'), LOGGER_DEBUG);
return $params['result'];
}
- $fromName = email_header_encode(html_entity_decode($params['fromName'],ENT_QUOTES,'UTF-8'),'UTF-8');
+ $fromName = email_header_encode(html_entity_decode($params['fromName'],ENT_QUOTES,'UTF-8'),'UTF-8');
$messageSubject = email_header_encode(html_entity_decode($params['messageSubject'],ENT_QUOTES,'UTF-8'),'UTF-8');
$messageHeader =
@@ -2285,6 +2310,25 @@ function z_mail($params) {
$params['textVersion'],
$messageHeader // message headers
);
- logger('notification: z_mail returns ' . $res, LOGGER_DEBUG);
+ logger('notification: z_mail returns ' . (($res) ? 'success' : 'failure'), LOGGER_DEBUG);
return $res;
}
+
+// discover the best API path available for redmatrix/hubzilla servers
+
+function probe_api_path($host) {
+
+ $schemes = ['https', 'http' ];
+ $paths = ['/api/z/1.0/version', '/api/red/version' ];
+
+ foreach($schemes as $scheme) {
+ foreach($paths as $path) {
+ $curpath = $scheme . '://' . $host . $path;
+ $x = z_fetch_url($curpath);
+ if($x['success'] && ! strlen($x['body'],'not implemented'))
+ return str_replace('version','',$curpath);
+ }
+ }
+
+ return '';
+}
diff --git a/include/oembed.php b/include/oembed.php
index 1780e7046..eb7b76437 100755
--- a/include/oembed.php
+++ b/include/oembed.php
@@ -137,10 +137,6 @@ function oembed_fetch_url($embedurl){
if($action !== 'block') {
$txt = Zlib\Cache::get('[' . App::$videowidth . '] ' . $embedurl);
-
- if(strstr($txt,'youtu') && strstr(z_root(),'https:')) {
- $txt = str_replace('http:','https:',$txt);
- }
}
if(is_null($txt)) {
@@ -272,13 +268,7 @@ function oembed_format_object($j){
$th=120; $tw = $th*$tr;
$tpl=get_markup_template('oembed_video.tpl');
- if(strstr($embedurl,'youtu') && strstr(z_root(),'https:')) {
- $embedurl = str_replace('http:','https:',$embedurl);
- $j['thumbnail_url'] = str_replace('http:','https:', $j['thumbnail_url']);
- $jhtml = str_replace('http:','https:', $jhtml);
- $j['html'] = str_replace('http:','https:', $j['html']);
-
- }
+
$ret.=replace_macros($tpl, array(
'$baseurl' => z_root(),
'$embedurl'=>$embedurl,
@@ -348,7 +338,7 @@ function oembed_iframe($src,$width,$height) {
// Make sure any children are sandboxed within their own iframe.
- return '<iframe ' . $scroll . 'height="' . $height . '" width="' . $width . '" src="' . $s . '" frameborder="no" >'
+ return '<iframe ' . $scroll . 'height="' . $height . '" width="' . $width . '" src="' . $s . '" allowfullscreen frameborder="no" >'
. t('Embedded content') . '</iframe>';
}
diff --git a/include/photo/photo_driver.php b/include/photo/photo_driver.php
index 9b6d38cc1..af4fd0a30 100644
--- a/include/photo/photo_driver.php
+++ b/include/photo/photo_driver.php
@@ -340,31 +340,31 @@ abstract class photo_driver {
intval($p['imgscale'])
);
if($x) {
- $r = q("UPDATE `photo` set
- `aid` = %d,
- `uid` = %d,
- `xchan` = '%s',
- `resource_id` = '%s',
- `created` = '%s',
- `edited` = '%s',
- `filename` = '%s',
- `mimetype` = '%s',
- `album` = '%s',
- `height` = %d,
- `width` = %d,
- `content` = '%s',
- `os_storage` = %d,
- `filesize` = %d,
- `imgscale` = %d,
- `photo_usage` = %d,
- `title` = '%s',
- `description` = '%s',
- `os_path` = '%s',
- `display_path` = '%s',
- `allow_cid` = '%s',
- `allow_gid` = '%s',
- `deny_cid` = '%s',
- `deny_gid` = '%s'
+ $r = q("UPDATE photo set
+ aid = %d,
+ uid = %d,
+ xchan = '%s',
+ resource_id = '%s',
+ created = '%s',
+ edited = '%s',
+ filename = '%s',
+ mimetype = '%s',
+ album = '%s',
+ height = %d,
+ width = %d,
+ content = '%s',
+ os_storage = %d,
+ filesize = %d,
+ imgscale = %d,
+ photo_usage = %d,
+ title = '%s',
+ description = '%s',
+ os_path = '%s',
+ display_path = '%s',
+ allow_cid = '%s',
+ allow_gid = '%s',
+ deny_cid = '%s',
+ deny_gid = '%s'
where id = %d",
intval($p['aid']),
@@ -378,7 +378,7 @@ abstract class photo_driver {
dbesc($p['album']),
intval($this->getHeight()),
intval($this->getWidth()),
- (intval($p['os_storage']) ? dbesc($p['os_path']) : dbescbin($this->imageString())),
+ (intval($p['os_storage']) ? dbescbin($p['os_path']) : dbescbin($this->imageString())),
intval($p['os_storage']),
intval(strlen($this->imageString())),
intval($p['imgscale']),
@@ -395,8 +395,8 @@ abstract class photo_driver {
);
}
else {
- $r = q("INSERT INTO `photo`
- ( `aid`, `uid`, `xchan`, `resource_id`, `created`, `edited`, `filename`, mimetype, `album`, `height`, `width`, `content`, `os_storage`, `filesize`, `imgscale`, `photo_usage`, `title`, `description`, `os_path`, `display_path`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
+ $r = q("INSERT INTO photo
+ ( aid, uid, xchan, resource_id, created, edited, filename, mimetype, album, height, width, content, os_storage, filesize, imgscale, photo_usage, title, description, os_path, display_path, allow_cid, allow_gid, deny_cid, deny_gid )
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )",
intval($p['aid']),
intval($p['uid']),
@@ -409,7 +409,7 @@ abstract class photo_driver {
dbesc($p['album']),
intval($this->getHeight()),
intval($this->getWidth()),
- (intval($p['os_storage']) ? dbesc($p['os_path']) : dbescbin($this->imageString())),
+ (intval($p['os_storage']) ? dbescbin($p['os_path']) : dbescbin($this->imageString())),
intval($p['os_storage']),
intval(strlen($this->imageString())),
intval($p['imgscale']),
@@ -432,33 +432,33 @@ abstract class photo_driver {
public function store($aid, $uid, $xchan, $rid, $filename, $album, $scale, $usage = PHOTO_NORMAL, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '') {
- $x = q("select id from photo where `resource_id` = '%s' and uid = %d and `xchan` = '%s' and `imgscale` = %d limit 1",
+ $x = q("select id from photo where resource_id = '%s' and uid = %d and xchan = '%s' and imgscale = %d limit 1",
dbesc($rid),
intval($uid),
dbesc($xchan),
intval($scale)
);
if(count($x)) {
- $r = q("UPDATE `photo`
- set `aid` = %d,
- `uid` = %d,
- `xchan` = '%s',
- `resource_id` = '%s',
- `created` = '%s',
- `edited` = '%s',
- `filename` = '%s',
- `mimetype` = '%s',
- `album` = '%s',
- `height` = %d,
- `width` = %d,
- `content` = '%s',
- `filesize` = %d,
- `imgscale` = %d,
- `photo_usage` = %d,
- `allow_cid` = '%s',
- `allow_gid` = '%s',
- `deny_cid` = '%s',
- `deny_gid` = '%s'
+ $r = q("UPDATE photo
+ set aid = %d,
+ uid = %d,
+ xchan = '%s',
+ resource_id = '%s',
+ created = '%s',
+ edited = '%s',
+ filename = '%s',
+ mimetype = '%s',
+ album = '%s',
+ height = %d,
+ width = %d,
+ content = '%s',
+ filesize = %d,
+ imgscale = %d,
+ photo_usage = %d,
+ allow_cid = '%s',
+ allow_gid = '%s',
+ deny_cid = '%s',
+ deny_gid = '%s'
where id = %d",
intval($aid),
@@ -484,8 +484,8 @@ abstract class photo_driver {
);
}
else {
- $r = q("INSERT INTO `photo`
- ( `aid`, `uid`, `xchan`, `resource_id`, `created`, `edited`, `filename`, mimetype, `album`, `height`, `width`, `content`, `filesize`, `imgscale`, `photo_usage`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
+ $r = q("INSERT INTO photo
+ ( aid, uid, xchan, resource_id, created, edited, filename, mimetype, album, height, width, content, filesize, imgscale, photo_usage, allow_cid, allow_gid, deny_cid, deny_gid )
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s' )",
intval($aid),
intval($uid),
diff --git a/include/photos.php b/include/photos.php
index a3018816c..5e4d755e3 100644
--- a/include/photos.php
+++ b/include/photos.php
@@ -28,7 +28,8 @@ function photo_upload($channel, $observer, $args) {
return $ret;
}
-// call_hooks('photo_upload_begin', $args);
+
+//call_hooks('photo_upload_begin', $args);
/*
* Determine the album to use
@@ -45,7 +46,7 @@ function photo_upload($channel, $observer, $args) {
if(array_key_exists('deliver',$args))
$deliver = intval($args['deliver']);
- // Set to default channel permissions. If the parent directory (album) has permissions set,
+ // Set to default channel permissions. If the parent directory (album) has permissions set,
// use those instead. If we have specific permissions supplied, they take precedence over
// all other settings. 'allow_cid' being passed from an external source takes priority over channel settings.
// ...messy... needs re-factoring once the photos/files integration stabilises
@@ -55,9 +56,9 @@ function photo_upload($channel, $observer, $args) {
$acl->set($args['directory']);
if(array_key_exists('allow_cid',$args))
$acl->set($args);
- if( (array_key_exists('group_allow',$args))
- || (array_key_exists('contact_allow',$args))
- || (array_key_exists('group_deny',$args))
+ if( (array_key_exists('group_allow',$args))
+ || (array_key_exists('contact_allow',$args))
+ || (array_key_exists('group_deny',$args))
|| (array_key_exists('contact_deny',$args))) {
$acl->set_from_array($args);
}
@@ -103,7 +104,7 @@ function photo_upload($channel, $observer, $args) {
$type = $_FILES['userfile']['type'];
}
- if (! $type)
+ if (! $type)
$type=guess_image_type($filename);
logger('photo_upload: received file: ' . $filename . ' as ' . $src . ' ('. $type . ') ' . $filesize . ' bytes', LOGGER_DEBUG);
@@ -176,7 +177,7 @@ function photo_upload($channel, $observer, $args) {
$errors = false;
$p = array('aid' => $account_id, 'uid' => $channel_id, 'xchan' => $visitor, 'resource_id' => $photo_hash,
- 'filename' => $filename, 'album' => $album, 'imgscale' => 0, 'photo_usage' => PHOTO_NORMAL,
+ 'filename' => $filename, 'album' => $album, 'imgscale' => 0, 'photo_usage' => PHOTO_NORMAL,
'allow_cid' => $ac['allow_cid'], 'allow_gid' => $ac['allow_gid'],
'deny_cid' => $ac['deny_cid'], 'deny_gid' => $ac['deny_gid'],
'os_storage' => $os_storage, 'os_path' => $args['os_path']
@@ -220,8 +221,8 @@ function photo_upload($channel, $observer, $args) {
);
if(! $r1)
$errors = true;
-
- if(($width > 640 || $height > 640) && (! $errors))
+
+ if(($width > 640 || $height > 640) && (! $errors))
$ph->scaleImage(640);
$p['imgscale'] = 2;
@@ -236,7 +237,7 @@ function photo_upload($channel, $observer, $args) {
if(! $r2)
$errors = true;
- if(($width > 320 || $height > 320) && (! $errors))
+ if(($width > 320 || $height > 320) && (! $errors))
$ph->scaleImage(320);
$p['imgscale'] = 3;
@@ -304,8 +305,8 @@ function photo_upload($channel, $observer, $args) {
$summary = (($args['body']) ? $args['body'] : '') . '[footer]' . $activity_format . '[/footer]';
- $obj_body = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo_hash . ']'
- . $tag . z_root() . "/photo/{$photo_hash}-{$scale}." . $ph->getExt() . '[/zmg]'
+ $obj_body = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo_hash . ']'
+ . $tag . z_root() . "/photo/{$photo_hash}-{$scale}." . $ph->getExt() . '[/zmg]'
. '[/zrl]';
// Create item object
@@ -361,7 +362,7 @@ function photo_upload($channel, $observer, $args) {
$item['uid'] = $channel['channel_id'];
item_store_update($item,false,$deliver);
continue;
- }
+ }
}
else {
$item['aid'] = $channel['channel_account_id'];
@@ -381,7 +382,7 @@ function photo_upload($channel, $observer, $args) {
$arr['aid'] = $account_id;
$arr['uid'] = $channel_id;
$arr['mid'] = $mid;
- $arr['parent_mid'] = $mid;
+ $arr['parent_mid'] = $mid;
$arr['item_hidden'] = $item_hidden;
$arr['resource_type'] = 'photo';
$arr['resource_id'] = $photo_hash;
@@ -407,10 +408,10 @@ function photo_upload($channel, $observer, $args) {
// this one is tricky because the item and the photo have the same permissions, those of the photo.
// Use the channel read_stream permissions to get the correct public_policy for the item and recalculate the
- // private flag accordingly. This may cause subtle bugs due to custom permissions roles. We want to use
+ // private flag accordingly. This may cause subtle bugs due to custom permissions roles. We want to use
// public policy when federating items to other sites, but should probably ignore them when accessing the item
// in the photos pages - using the photos permissions instead. We need the public policy to keep the photo
- // linked item from leaking into the feed when somebody has a channel with read_stream restrictions.
+ // linked item from leaking into the feed when somebody has a channel with read_stream restrictions.
$arr['public_policy'] = map_scope(\Zotlabs\Access\PermissionLimits::Get($channel['channel_id'],'view_stream'),true);
if($arr['public_policy'])
@@ -421,7 +422,7 @@ function photo_upload($channel, $observer, $args) {
$result = item_store($arr,false,$deliver);
$item_id = $result['item_id'];
- if($visible && $deliver)
+ if($visible && $deliver)
Zotlabs\Daemon\Master::Summon(array('Notifier', 'wall-new', $item_id));
}
@@ -443,9 +444,12 @@ function photo_upload($channel, $observer, $args) {
*
* @param array $channel
* @param array $observer
+ * @param array $sort_key (optional) default album
+ * @param array $direction (optional) default asc
+ *
* @return bool|array false if no view_storage permission or an array
- * * success (bool)
- * * albums (array)
+ * * \e boolean \b success
+ * * \e array \b albums
*/
function photos_albums_list($channel, $observer, $sort_key = 'album', $direction = 'asc') {
@@ -455,14 +459,11 @@ function photos_albums_list($channel, $observer, $sort_key = 'album', $direction
if(! perm_is_allowed($channel_id, $observer_xchan, 'view_storage'))
return false;
-
$sql_extra = permissions_sql($channel_id,$observer_xchan);
$sort_key = dbesc($sort_key);
$direction = dbesc($direction);
-
-
$albums = q("SELECT count( distinct resource_id ) as total, album from photo where uid = %d and photo_usage IN ( %d, %d ) $sql_extra group by album order by $sort_key $direction",
intval($channel_id),
intval(PHOTO_NORMAL),
@@ -479,8 +480,8 @@ function photos_albums_list($channel, $observer, $sort_key = 'album', $direction
foreach($albums as $k => $album) {
$entry = array(
'text' => (($album['album']) ? $album['album'] : '/'),
- 'total' => $album['total'],
- 'url' => z_root() . '/photos/' . $channel['channel_address'] . '/album/' . bin2hex($album['album']),
+ 'total' => $album['total'],
+ 'url' => z_root() . '/photos/' . $channel['channel_address'] . '/album/' . bin2hex($album['album']),
'urlencode' => urlencode($album['album']),
'bin2hex' => bin2hex($album['album'])
);
@@ -506,7 +507,7 @@ function photos_album_widget($channelx,$observer,$sortkey = 'album',$direction =
'$title' => t('Photo Albums'),
'$albums' => $albums['albums'],
'$baseurl' => z_root(),
- '$upload' => ((perm_is_allowed($channelx['channel_id'],(($observer) ? $observer['xchan_hash'] : ''),'write_storage'))
+ '$upload' => ((perm_is_allowed($channelx['channel_id'],(($observer) ? $observer['xchan_hash'] : ''),'write_storage'))
? t('Upload New Photos') : '')
));
}
@@ -533,7 +534,7 @@ function photos_list_photos($channel, $observer, $album = '') {
$sql_extra = permissions_sql($channel_id);
if($album)
- $sql_extra .= " and album = '" . protect_sprintf(dbesc($album)) . "' ";
+ $sql_extra .= " and album = '" . protect_sprintf(dbesc($album)) . "' ";
$ret = array('success' => false);
@@ -647,7 +648,7 @@ function photos_create_item($channel, $creator_hash, $photo, $visible = false) {
$arr['aid'] = $channel['channel_account_id'];
$arr['uid'] = $channel['channel_id'];
$arr['mid'] = $mid;
- $arr['parent_mid'] = $mid;
+ $arr['parent_mid'] = $mid;
$arr['item_wall'] = 1;
$arr['item_origin'] = 1;
$arr['item_thread_top'] = 1;
@@ -663,9 +664,9 @@ function photos_create_item($channel, $creator_hash, $photo, $visible = false) {
$arr['deny_gid'] = $photo['deny_gid'];
$arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid'];
-
- $arr['body'] = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo['resource_id'] . ']'
- . '[zmg]' . z_root() . '/photo/' . $photo['resource_id'] . '-' . $photo['imgscale'] . '[/zmg]'
+
+ $arr['body'] = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo['resource_id'] . ']'
+ . '[zmg]' . z_root() . '/photo/' . $photo['resource_id'] . '-' . $photo['imgscale'] . '[/zmg]'
. '[/zrl]';
$result = item_store($arr);
@@ -710,39 +711,39 @@ function gps2Num($coordPart) {
}
function profile_photo_set_profile_perms($uid, $profileid = 0) {
-
+
$allowcid = '';
if($profileid) {
$r = q("SELECT photo, profile_guid, id, is_default, uid
- FROM profile WHERE uid = %d and ( profile.id = %d OR profile.profile_guid = '%s') LIMIT 1",
+ FROM profile WHERE uid = %d and ( profile.id = %d OR profile.profile_guid = '%s') LIMIT 1",
intval($uid),
- intval($profileid),
+ intval($profileid),
dbesc($profileid)
);
- }
+ }
else {
logger('Resetting permissions on default-profile-photo for user'.local_channel());
- $r = q("SELECT photo, profile_guid, id, is_default, uid FROM profile
- WHERE profile.uid = %d AND is_default = 1 LIMIT 1",
- intval($uid)
+ $r = q("SELECT photo, profile_guid, id, is_default, uid FROM profile
+ WHERE profile.uid = %d AND is_default = 1 LIMIT 1",
+ intval($uid)
); //If no profile is given, we update the default profile
}
if(! $r)
return;
-
+
$profile = $r[0];
- if($profile['id'] && $profile['photo']) {
+ if($profile['id'] && $profile['photo']) {
preg_match("@\w*(?=-\d*$)@i", $profile['photo'], $resource_id);
$resource_id = $resource_id[0];
-
+
if (! intval($profile['is_default'])) {
- $r0 = q("SELECT channel_hash FROM channel WHERE channel_id = %d LIMIT 1",
- intval($uid)
+ $r0 = q("SELECT channel_hash FROM channel WHERE channel_id = %d LIMIT 1",
+ intval($uid)
);
//Should not be needed in future. Catches old int-profile-ids.
- $r1 = q("SELECT abook.abook_xchan FROM abook WHERE abook_profile = '%d' ",
+ $r1 = q("SELECT abook.abook_xchan FROM abook WHERE abook_profile = '%d' ",
intval($profile['id'])
);
$r2 = q("SELECT abook.abook_xchan FROM abook WHERE abook_profile = '%s'",
@@ -750,27 +751,27 @@ function profile_photo_set_profile_perms($uid, $profileid = 0) {
);
$allowcid = "<" . $r0[0]['channel_hash'] . ">";
foreach ($r1 as $entry) {
- $allowcid .= "<" . $entry['abook_xchan'] . ">";
+ $allowcid .= "<" . $entry['abook_xchan'] . ">";
}
foreach ($r2 as $entry) {
$allowcid .= "<" . $entry['abook_xchan'] . ">";
}
-
+
q("UPDATE photo SET allow_cid = '%s' WHERE resource_id = '%s' AND uid = %d",
dbesc($allowcid),
dbesc($resource_id),
intval($uid)
);
-
- }
+
+ }
else {
//Reset permissions on default profile picture to public
q("UPDATE photo SET allow_cid = '' WHERE photo_usage = %d AND uid = %d",
intval(PHOTO_PROFILE),
intval($uid)
- );
+ );
}
}
-
+
return;
}
diff --git a/include/plugin.php b/include/plugin.php
index 663d17959..80c303b42 100755
--- a/include/plugin.php
+++ b/include/plugin.php
@@ -41,7 +41,7 @@ function uninstall_plugin($plugin) {
$func();
}
- q("DELETE FROM `addon` WHERE `aname` = '%s' ",
+ q("DELETE FROM addon WHERE aname = '%s' ",
dbesc($plugin)
);
}
@@ -66,7 +66,7 @@ function install_plugin($plugin) {
$plugin_admin = (function_exists($plugin . '_plugin_admin') ? 1 : 0);
- q("INSERT INTO `addon` (`aname`, `installed`, `tstamp`, `plugin_admin`) VALUES ( '%s', 1, %d , %d ) ",
+ q("INSERT INTO addon (aname, installed, tstamp, plugin_admin) VALUES ( '%s', 1, %d , %d ) ",
dbesc($plugin),
intval($t),
$plugin_admin
@@ -126,7 +126,7 @@ function plugin_is_installed($name) {
function reload_plugins() {
$plugins = get_config('system', 'addon');
if(strlen($plugins)) {
- $r = q("SELECT * FROM `addon` WHERE `installed` = 1");
+ $r = q("SELECT * FROM addon WHERE installed = 1");
if(count($r))
$installed = $r;
else
@@ -143,7 +143,7 @@ function reload_plugins() {
if(file_exists($fname)) {
$t = @filemtime($fname);
foreach($installed as $i) {
- if(($i['aname'] == $pl) && ($i['tstamp'] != $t)) {
+ if(($i['aname'] == $pl) && ($i['tstamp'] != $t)) {
logger('Reloading plugin: ' . $i['aname']);
@include_once($fname);
@@ -155,7 +155,7 @@ function reload_plugins() {
$func = $pl . '_load';
$func();
}
- q("UPDATE `addon` SET `tstamp` = %d WHERE `id` = %d",
+ q("UPDATE addon SET tstamp = %d WHERE id = %d",
intval($t),
intval($i['id'])
);
@@ -184,7 +184,7 @@ function visible_plugin_list() {
* @return mixed|bool
*/
function register_hook($hook, $file, $function, $priority = 0) {
- $r = q("SELECT * FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `fn` = '%s' LIMIT 1",
+ $r = q("SELECT * FROM hook WHERE hook = '%s' AND file = '%s' AND fn = '%s' LIMIT 1",
dbesc($hook),
dbesc($file),
dbesc($function)
@@ -192,7 +192,7 @@ function register_hook($hook, $file, $function, $priority = 0) {
if($r)
return true;
- $r = q("INSERT INTO `hook` (`hook`, `file`, `fn`, `priority`) VALUES ( '%s', '%s', '%s', '%s' )",
+ $r = q("INSERT INTO hook (hook, file, fn, priority) VALUES ( '%s', '%s', '%s', '%s' )",
dbesc($hook),
dbesc($file),
dbesc($function),
@@ -205,14 +205,14 @@ function register_hook($hook, $file, $function, $priority = 0) {
/**
* @brief unregisters a hook.
- *
+ *
* @param string $hook the name of the hook
* @param string $file the name of the file that hooks into
* @param string $function the name of the function that the hook called
* @return array
*/
function unregister_hook($hook, $file, $function) {
- $r = q("DELETE FROM hook WHERE hook = '%s' AND `file` = '%s' AND `fn` = '%s'",
+ $r = q("DELETE FROM hook WHERE hook = '%s' AND file = '%s' AND fn = '%s'",
dbesc($hook),
dbesc($file),
dbesc($function)
@@ -224,7 +224,7 @@ function unregister_hook($hook, $file, $function) {
//
// It might not be obvious but themes can manually add hooks to the App::$hooks
-// array in their theme_init() and use this to customise the app behaviour.
+// array in their theme_init() and use this to customise the app behaviour.
// UPDATE: use insert_hook($hookname,$function_name) to do this
//
@@ -248,20 +248,22 @@ function load_hooks() {
/**
* @brief Inserts a hook into a page request.
*
- * Insert a short-lived hook into the running page request.
- * Hooks are normally persistent so that they can be called
+ * Insert a short-lived hook into the running page request.
+ * Hooks are normally persistent so that they can be called
* across asynchronous processes such as delivery and poll
* processes.
*
* insert_hook lets you attach a hook callback immediately
* which will not persist beyond the life of this page request
- * or the current process.
+ * or the current process.
*
* @param string $hook
* name of hook to attach callback
* @param string $fn
* function name of callback handler
- */
+ * @param int $version (optional) default 0
+ * @param int $priority (optional) default 0
+ */
function insert_hook($hook, $fn, $version = 0, $priority = 0) {
if(! is_array(App::$hooks))
@@ -293,7 +295,7 @@ function call_hooks($name, &$data = null) {
$hook[1] = unserialize($hook[1]);
}
elseif(strpos($hook[1],'::')) {
- // We shouldn't need to do this, but it appears that PHP
+ // We shouldn't need to do this, but it appears that PHP
// isn't able to directly execute a string variable with a class
// method in the manner we are attempting it, so we'll
// turn it into an array.
@@ -306,10 +308,10 @@ function call_hooks($name, &$data = null) {
$func($data);
else
$func($a, $data);
- }
+ }
else {
- // Don't do any DB write calls if we're currently logging a possibly failed DB call.
+ // Don't do any DB write calls if we're currently logging a possibly failed DB call.
if(! DBA::$logging) {
// The hook should be removed so we don't process it.
q("DELETE FROM hook WHERE hook = '%s' AND file = '%s' AND fn = '%s'",
@@ -370,7 +372,7 @@ function get_plugin_info($plugin){
} else {
$info[$k][] = array('name' => $v);
}
- }
+ }
else {
$info[$k] = $v;
}
@@ -407,8 +409,8 @@ function check_plugin_versions($info) {
if(array_key_exists('serverroles',$info)) {
$role = \Zotlabs\Lib\System::get_server_role();
if(! (
- stristr($info['serverroles'],'*')
- || stristr($info['serverroles'],'any')
+ stristr($info['serverroles'],'*')
+ || stristr($info['serverroles'],'any')
|| stristr($info['serverroles'],$role))) {
logger('serverrole limit: ' . $info['name'],LOGGER_NORMAL,LOG_WARNING);
return false;
@@ -425,8 +427,15 @@ function check_plugin_versions($info) {
$test = trim($test);
if(! $test)
continue;
+ if(strpos($test,'.')) {
+ $conf = explode('.',$test);
+ if(get_config(trim($conf[0]),trim($conf[1])))
+ return true;
+ else
+ return false;
+ }
if(! in_array($test,App::$plugins))
- $found = false;
+ $found = false;
}
}
if(! $found)
@@ -583,11 +592,11 @@ function format_css_if_exists($source) {
/*
* This basically calculates the baseurl. We have other functions to do that, but
- * there was an issue with script paths and mixed-content whose details are arcane
- * and perhaps lost in the message archives. The short answer is that we're ignoring
- * the URL which we are "supposed" to use, and generating script paths relative to
+ * there was an issue with script paths and mixed-content whose details are arcane
+ * and perhaps lost in the message archives. The short answer is that we're ignoring
+ * the URL which we are "supposed" to use, and generating script paths relative to
* the URL which we are currently using; in order to ensure they are found and aren't
- * blocked due to mixed content issues.
+ * blocked due to mixed content issues.
*/
function script_path() {
@@ -599,7 +608,7 @@ function script_path() {
$scheme = 'https';
else
$scheme = 'http';
-
+
// Some proxy setups may require using http_host
if(intval(App::$config['system']['script_path_use_http_host']))
@@ -631,7 +640,7 @@ function head_remove_js($src, $priority = 0) {
}
// We should probably try to register main.js with a high priority, but currently we handle it
-// separately and put it at the end of the html head block in case any other javascript is
+// separately and put it at the end of the html head block in case any other javascript is
// added outside the head_add_js construct.
function head_get_js() {
@@ -640,7 +649,7 @@ function head_get_js() {
if(App::$js_sources) {
ksort(App::$js_sources,SORT_NUMERIC);
foreach(App::$js_sources as $sources) {
- if(count($sources)) {
+ if(count($sources)) {
foreach($sources as $source) {
if($src === 'main.js')
continue;
@@ -655,7 +664,7 @@ function head_get_js() {
function head_get_main_js() {
$str = '';
$sources = array('main.js');
- if(count($sources))
+ if(count($sources))
foreach($sources as $source)
$str .= format_js_if_exists($source,true);
return $str;
diff --git a/include/queue_fn.php b/include/queue_fn.php
index 676620e2f..0950faf85 100644
--- a/include/queue_fn.php
+++ b/include/queue_fn.php
@@ -93,7 +93,7 @@ function queue_deliver($outq, $immediate = false) {
// your site has existed. Since we don't know for sure what these sites are,
// call them unknown
- q("insert into site (site_url, site_update, site_dead, site_type) values ('%s','%s',0,%d) ",
+ q("insert into site (site_url, site_update, site_dead, site_type, site_crypto) values ('%s','%s',0,%d,'') ",
dbesc($base),
dbesc(datetime_convert()),
intval(($outq['outq_driver'] === 'post') ? SITE_TYPE_NOTZOT : SITE_TYPE_UNKNOWN)
@@ -118,7 +118,7 @@ function queue_deliver($outq, $immediate = false) {
dbesc($base)
);
}
- q("update dreport set dreport_result = '%s', dreport_time = '%s' where dreport_queue = '%s' limit 1",
+ q("update dreport set dreport_result = '%s', dreport_time = '%s' where dreport_queue = '%s'",
dbesc('accepted for delivery'),
dbesc(datetime_convert()),
dbesc($outq['outq_hash'])
diff --git a/include/security.php b/include/security.php
index 9b508d339..2f5de54c7 100644
--- a/include/security.php
+++ b/include/security.php
@@ -2,11 +2,12 @@
/**
* @file include/security.php
*
- * Some security related functions.
+ * @brief Some security related functions.
*/
/**
* @param int $user_record The account_id
+ * @param array $channel
* @param bool $login_initial default false
* @param bool $interactive default false
* @param bool $return
@@ -27,8 +28,8 @@ function authenticate_success($user_record, $channel = null, $login_initial = fa
$uid_to_load = $channel['channel_id'];
if(! $uid_to_load) {
- $uid_to_load = (((x($_SESSION,'uid')) && (intval($_SESSION['uid'])))
- ? intval($_SESSION['uid'])
+ $uid_to_load = (((x($_SESSION,'uid')) && (intval($_SESSION['uid'])))
+ ? intval($_SESSION['uid'])
: intval(App::$account['account_default_channel'])
);
}
@@ -89,21 +90,28 @@ function authenticate_success($user_record, $channel = null, $login_initial = fa
function atoken_login($atoken) {
if(! $atoken)
return false;
+
$_SESSION['authenticated'] = 1;
$_SESSION['visitor_id'] = $atoken['xchan_hash'];
$_SESSION['atoken'] = $atoken['atoken_id'];
\App::set_observer($atoken);
+
return true;
}
-
+/**
+ * @brief
+ *
+ * @param array $atoken
+ * @return array|null
+ */
function atoken_xchan($atoken) {
$c = channelx_by_n($atoken['atoken_uid']);
if($c) {
return [
- 'atoken_id' => $atoken['atoken_id'],
+ 'atoken_id' => $atoken['atoken_id'],
'xchan_hash' => substr($c['channel_hash'],0,16) . '.' . $atoken['atoken_name'],
'xchan_name' => $atoken['atoken_name'],
'xchan_addr' => t('guest:') . $atoken['atoken_name'] . '@' . \App::get_hostname(),
@@ -114,9 +122,9 @@ function atoken_xchan($atoken) {
'xchan_photo_l' => get_default_profile_photo(300),
'xchan_photo_m' => get_default_profile_photo(80),
'xchan_photo_s' => get_default_profile_photo(48)
-
];
}
+
return null;
}
@@ -133,7 +141,7 @@ function atoken_delete($atoken_id) {
);
if(! $c)
return;
-
+
$atoken_xchan = substr($c[0]['channel_hash'],0,16) . '.' . $r[0]['atoken_name'];
q("delete from atoken where atoken_id = %d",
@@ -145,12 +153,16 @@ function atoken_delete($atoken_id) {
);
}
-
-
-// in order for atoken logins to create content (such as posts) they need a stored xchan.
-// we'll create one on the first atoken_login; it can't really ever go away but perhaps
-// @fixme we should set xchan_deleted if it's expired or removed
-
+/**
+ * @brief
+ *
+ * In order for atoken logins to create content (such as posts) they need a stored xchan.
+ * we'll create one on the first atoken_login; it can't really ever go away but perhaps
+ * @fixme we should set xchan_deleted if it's expired or removed
+ *
+ * @param array $xchan
+ * @return void|boolean
+ */
function atoken_create_xchan($xchan) {
$r = q("select xchan_hash from xchan where xchan_hash = '%s'",
@@ -159,7 +171,7 @@ function atoken_create_xchan($xchan) {
if($r)
return;
- $r = q("insert into xchan ( xchan_hash, xchan_guid, xchan_addr, xchan_url, xchan_name, xchan_network, xchan_photo_mimetype, xchan_photo_l, xchan_photo_m, xchan_photo_s )
+ $r = q("insert into xchan ( xchan_hash, xchan_guid, xchan_addr, xchan_url, xchan_name, xchan_network, xchan_photo_mimetype, xchan_photo_l, xchan_photo_m, xchan_photo_s )
values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s') ",
dbesc($xchan['xchan_hash']),
dbesc($xchan['xchan_hash']),
@@ -202,12 +214,11 @@ function atoken_abook($uid,$xchan_hash) {
}
return false;
-
}
function pseudo_abook($xchan) {
- if(! $xchan)
+ if(! $xchan)
return false;
// set abook_pseudo to flag that we aren't really connected.
@@ -216,8 +227,8 @@ function pseudo_abook($xchan) {
$xchan['abook_blocked'] = 0;
$xchan['abook_ignored'] = 0;
$xchan['abook_pending'] = 0;
+
return $xchan;
-
}
@@ -228,7 +239,6 @@ function pseudo_abook($xchan) {
*
* @return bool|array false or channel record of the new channel
*/
-
function change_channel($change_channel) {
$ret = false;
@@ -260,7 +270,7 @@ function change_channel($change_channel) {
date_default_timezone_set($r[0]['channel_timezone']);
$ret = $r[0];
}
- $x = q("select * from xchan where xchan_hash = '%s' limit 1",
+ $x = q("select * from xchan where xchan_hash = '%s' limit 1",
dbesc($hash)
);
if($x) {
@@ -275,7 +285,6 @@ function change_channel($change_channel) {
$arr = [ 'channel_id' => $change_channel, 'chanx' => $ret ];
call_hooks('change_channel', $arr);
-
}
return $ret;
@@ -285,11 +294,11 @@ function change_channel($change_channel) {
* @brief Creates an additional SQL where statement to check permissions.
*
* @param int $owner_id
- * @param bool $remote_observer - if unset use current observer
+ * @param bool $remote_observer (optional) use current observer if unset
+ * @param $table (optional)
*
* @return string additional SQL where statement
*/
-
function permissions_sql($owner_id, $remote_observer = null, $table = '') {
$local_channel = local_channel();
@@ -303,11 +312,10 @@ function permissions_sql($owner_id, $remote_observer = null, $table = '') {
if($table)
$table .= '.';
-
- $sql = " AND {$table}allow_cid = ''
- AND {$table}allow_gid = ''
- AND {$table}deny_cid = ''
- AND {$table}deny_gid = ''
+ $sql = " AND {$table}allow_cid = ''
+ AND {$table}allow_gid = ''
+ AND {$table}deny_cid = ''
+ AND {$table}deny_gid = ''
";
/**
@@ -319,7 +327,7 @@ function permissions_sql($owner_id, $remote_observer = null, $table = '') {
}
/**
- * Authenticated visitor. Unless pre-verified,
+ * Authenticated visitor. Unless pre-verified,
* check that the contact belongs to this $owner_id
* and load the groups the visitor belongs to.
* If pre-verified, the caller is expected to have already
@@ -358,7 +366,7 @@ function permissions_sql($owner_id, $remote_observer = null, $table = '') {
* @brief Creates an addiontal SQL where statement to check permissions for an item.
*
* @param int $owner_id
- * @param bool $remote_observer, use current observer if unset
+ * @param bool $remote_observer (optional) use current observer if unset
*
* @return string additional SQL where statement
*/
@@ -379,7 +387,7 @@ function item_permissions_sql($owner_id, $remote_observer = null) {
*/
if(($local_channel) && ($local_channel == $owner_id)) {
- $sql = '';
+ $sql = '';
}
/**
@@ -425,7 +433,7 @@ function item_permissions_sql($owner_id, $remote_observer = null) {
/**
* Remote visitors also need to be checked against the public_scope parameter if item_private is set.
* This function checks the various permutations of that field for any which apply to this observer.
- *
+ *
*/
@@ -448,9 +456,9 @@ function scopes_sql($uid,$observer) {
$str .= " or public_policy = 'contacts' ) ";
return $str;
}
-
-
-
+
+
+
@@ -500,7 +508,7 @@ function public_permissions_sql($observer_hash) {
* If the new page contains by any chance external elements, then the used security token is exposed by the referrer.
* Actually, important actions should not be triggered by Links / GET-Requests at all, but somethimes they still are,
* so this mechanism brings in some damage control (the attacker would be able to forge a request to a form of this type, but not to forms of other types).
- */
+ */
function get_form_security_token($typename = '') {
$timestamp = time();
@@ -549,7 +557,7 @@ function check_form_security_token_ForbiddenOnErr($typename = '', $formname = 'f
function init_groups_visitor($contact_id) {
$groups = array();
- $r = q("SELECT hash FROM `groups` left join group_member on groups.id = group_member.gid WHERE xchan = '%s' ",
+ $r = q("SELECT hash FROM groups left join group_member on groups.id = group_member.gid WHERE xchan = '%s' ",
dbesc($contact_id)
);
if($r) {
@@ -561,13 +569,13 @@ function init_groups_visitor($contact_id) {
-// This is used to determine which uid have posts which are visible to the logged in user (from the API) for the
+// This is used to determine which uid have posts which are visible to the logged in user (from the API) for the
// public_timeline, and we can use this in a community page by making
-// $perms = (PERMS_NETWORK|PERMS_PUBLIC) unless logged in.
+// $perms = (PERMS_NETWORK|PERMS_PUBLIC) unless logged in.
// Collect uids of everybody on this site who has opened their posts to everybody on this site (or greater visibility)
// We always include yourself if logged in because you can always see your own posts
// resolving granular permissions for the observer against every person and every post on the site
-// will likely be too expensive.
+// will likely be too expensive.
// Returns a string list of comma separated channel_ids suitable for direct inclusion in a SQL query
function stream_perms_api_uids($perms = NULL, $limit = 0, $rand = 0 ) {
diff --git a/include/selectors.php b/include/selectors.php
index d7d070d31..ab049fff6 100644
--- a/include/selectors.php
+++ b/include/selectors.php
@@ -7,7 +7,7 @@ function contact_profile_assign($current) {
$o .= "<select id=\"contact-profile-selector\" name=\"profile_assign\" class=\"form-control\"/>\r\n";
- $r = q("SELECT profile_guid, profile_name FROM `profile` WHERE `uid` = %d",
+ $r = q("SELECT profile_guid, profile_name FROM profile WHERE uid = %d",
intval($_SESSION['uid']));
if($r) {
diff --git a/include/socgraph.php b/include/socgraph.php
index 4cb5600ec..69365f80f 100644
--- a/include/socgraph.php
+++ b/include/socgraph.php
@@ -245,10 +245,10 @@ function common_friends($uid,$xchan,$start = 0,$limit=100000000,$shuffle = false
function count_common_friends_zcid($uid,$zcid) {
- $r = q("SELECT count(*) as `total`
- FROM `glink` left join `gcontact` on `glink`.`gcid` = `gcontact`.`id`
- where `glink`.`zcid` = %d
- and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 ) ",
+ $r = q("SELECT count(*) as total
+ FROM glink left join gcontact on glink.gcid = gcontact.id
+ where glink.zcid = %d
+ and gcontact.nurl in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 ) ",
intval($zcid),
intval($uid)
);
@@ -264,12 +264,12 @@ function common_friends_zcid($uid,$zcid,$start = 0, $limit = 9999,$shuffle = fal
if($shuffle)
$sql_extra = " order by rand() ";
else
- $sql_extra = " order by `gcontact`.`name` asc ";
+ $sql_extra = " order by gcontact.name asc ";
- $r = q("SELECT `gcontact`.*
- FROM `glink` left join `gcontact` on `glink`.`gcid` = `gcontact`.`id`
- where `glink`.`zcid` = %d
- and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 )
+ $r = q("SELECT gcontact.*
+ FROM glink left join gcontact on glink.gcid = gcontact.id
+ where glink.zcid = %d
+ and gcontact.nurl in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 )
$sql_extra limit %d offset %d",
intval($zcid),
intval($uid),
@@ -283,9 +283,9 @@ function common_friends_zcid($uid,$zcid,$start = 0, $limit = 9999,$shuffle = fal
function count_all_friends($uid,$cid) {
- $r = q("SELECT count(*) as `total`
- FROM `glink` left join `gcontact` on `glink`.`gcid` = `gcontact`.`id`
- where `glink`.`cid` = %d and `glink`.`uid` = %d ",
+ $r = q("SELECT count(*) as total
+ FROM glink left join gcontact on glink.gcid = gcontact.id
+ where glink.cid = %d and glink.uid = %d ",
intval($cid),
intval($uid)
);
@@ -299,10 +299,10 @@ function count_all_friends($uid,$cid) {
function all_friends($uid,$cid,$start = 0, $limit = 80) {
- $r = q("SELECT `gcontact`.*
- FROM `glink` left join `gcontact` on `glink`.`gcid` = `gcontact`.`id`
- where `glink`.`cid` = %d and `glink`.`uid` = %d
- order by `gcontact`.`name` asc LIMIT %d OFFSET %d ",
+ $r = q("SELECT gcontact.*
+ FROM glink left join gcontact on glink.gcid = gcontact.id
+ where glink.cid = %d and glink.uid = %d
+ order by gcontact.name asc LIMIT %d OFFSET %d ",
intval($cid),
intval($uid),
intval($limit),
@@ -319,7 +319,7 @@ function suggestion_query($uid, $myxchan, $start = 0, $limit = 80) {
if((! $uid) || (! $myxchan))
return array();
- $r = q("SELECT count(xlink_xchan) as `total`, xchan.* from xchan
+ $r = q("SELECT count(xlink_xchan) as total, xchan.* from xchan
left join xlink on xlink_link = xchan_hash
where xlink_xchan in ( select abook_xchan from abook where abook_channel = %d )
and not xlink_link in ( select abook_xchan from abook where abook_channel = %d )
@@ -339,7 +339,7 @@ function suggestion_query($uid, $myxchan, $start = 0, $limit = 80) {
if($r && count($r) >= ($limit -1))
return $r;
- $r2 = q("SELECT count(xlink_link) as `total`, xchan.* from xchan
+ $r2 = q("SELECT count(xlink_link) as total, xchan.* from xchan
left join xlink on xlink_link = xchan_hash
where xlink_xchan = ''
and not xlink_link in ( select abook_xchan from abook where abook_channel = %d )
@@ -465,11 +465,11 @@ function poco($a,$extended = false) {
$sql_extra = sprintf(" and abook_id = %d and abook_hidden = 0 ",intval($cid));
if($system_mode) {
- $r = q("SELECT count(*) as `total` from abook where abook_self = 1
+ $r = q("SELECT count(*) as total from abook where abook_self = 1
and abook_channel in (select uid from pconfig where cat = 'system' and k = 'suggestme' and v = '1') ");
}
else {
- $r = q("SELECT count(*) as `total` from abook where abook_channel = %d
+ $r = q("SELECT count(*) as total from abook where abook_channel = %d
$sql_extra ",
intval($channel_id)
);
diff --git a/include/statistics_fns.php b/include/statistics_fns.php
index ce2eee5e7..cbff3b0b7 100644
--- a/include/statistics_fns.php
+++ b/include/statistics_fns.php
@@ -64,7 +64,7 @@ function update_channels_active_monthly_stat() {
}
function update_local_posts_stat() {
- $posts = q("SELECT COUNT(*) AS local_posts FROM `item` WHERE item_wall = 1 ");
+ $posts = q("SELECT COUNT(*) AS local_posts FROM item WHERE item_wall = 1 ");
if (is_array($posts)) {
$local_posts_stat = intval($posts[0]["local_posts"]);
set_config('system','local_posts_stat',$local_posts_stat);
diff --git a/include/taxonomy.php b/include/taxonomy.php
index 067bd3246..0b4b2aa9a 100644
--- a/include/taxonomy.php
+++ b/include/taxonomy.php
@@ -386,7 +386,7 @@ function get_things($profile_hash,$uid) {
$things[$k] = null;
foreach($r as $rr) {
- $l = q("select xchan_name, xchan_photo_s, xchan_url from likes left join xchan on likee = xchan_hash where
+ $l = q("select xchan_name, xchan_photo_s, xchan_url from likes left join xchan on liker = xchan_hash where
target_type = '%s' and target_id = '%s' and channel_id = %d",
dbesc(ACTIVITY_OBJ_THING),
dbesc($rr['obj_obj']),
diff --git a/include/text.php b/include/text.php
index 9c4a4a5c5..b25eb8e46 100644
--- a/include/text.php
+++ b/include/text.php
@@ -4,6 +4,7 @@
*/
require_once("include/bbcode.php");
+require_once('include/hubloc.php');
// random string, there are 86 characters max in text mode, 128 for hex
// output is urlsafe
@@ -17,6 +18,7 @@ define('RANDOM_STRING_TEXT', 0x01 );
* @param string|SmartyEngine $s the string requiring macro substitution,
* or an instance of SmartyEngine
* @param array $r key value pairs (search => replace)
+ *
* @return string substituted string
*/
function replace_macros($s, $r) {
@@ -35,6 +37,7 @@ function replace_macros($s, $r) {
*
* @param number $size
* @param int $type
+ *
* @return string
*/
function random_string($size = 64, $type = RANDOM_STRING_HEX) {
@@ -52,14 +55,15 @@ function random_string($size = 64, $type = RANDOM_STRING_HEX) {
* that had an XSS attack vector due to stripping the high-bit on an 8-bit character
* after cleansing, and angle chars with the high bit set could get through as markup.
*
- * This is now disabled because it was interfering with some legitimate unicode sequences
- * and hopefully there aren't a lot of those browsers left.
+ * This is now disabled because it was interfering with some legitimate unicode sequences
+ * and hopefully there aren't a lot of those browsers left.
*
* Use this on any text input where angle chars are not valid or permitted
* They will be replaced with safer brackets. This may be filtered further
* if these are not allowed either.
*
* @param string $string Input string
+ *
* @return string Filtered string
*/
function notags($string) {
@@ -74,13 +78,13 @@ function notags($string) {
/**
* use this on "body" or "content" input where angle chars shouldn't be removed,
* and allow them to be safely displayed.
+ *
* @param string $string
+ *
* @return string
*/
function escape_tags($string) {
-
return(htmlspecialchars($string, ENT_COMPAT, 'UTF-8', false));
-
}
@@ -182,7 +186,7 @@ function purify_html($s, $allow_position = false) {
// f6 plugins
- //abide - the use is pointless since we can't do anything with forms
+ //abide - the use is pointless since we can't do anything with forms
//equalizer
$def->info_global_attr['data-equalizer'] = new HTMLPurifier_AttrDef_Text;
@@ -272,14 +276,12 @@ function purify_html($s, $allow_position = false) {
}
-
$purifier = new HTMLPurifier($config);
return $purifier->purify($s);
}
-
/**
* @brief generate a string that's random, but usually pronounceable.
*
@@ -293,7 +295,7 @@ function autoname($len) {
if ($len <= 0)
return '';
- $vowels = array('a','a','ai','au','e','e','e','ee','ea','i','ie','o','ou','u');
+ $vowels = array('a','a','ai','au','e','e','e','ee','ea','i','ie','o','ou','u');
if (mt_rand(0, 5) == 4)
$vowels[] = 'y';
@@ -370,13 +372,12 @@ function xmlify($str) {
if(is_array($str)) {
- // allow to fall through so we ge a PHP error, as the log statement will
- // probably get lost in the noise unless we're specifically looking for it.
+ // allow to fall through so we ge a PHP error, as the log statement will
+ // probably get lost in the noise unless we're specifically looking for it.
btlogger('xmlify called with array: ' . print_r($str,true), LOGGER_NORMAL, LOG_WARNING);
}
-
$len = mb_strlen($str);
for($x = 0; $x < $len; $x ++) {
$char = mb_substr($str,$x,1);
@@ -412,27 +413,36 @@ function xmlify($str) {
return($buffer);
}
-// undo an xmlify
-// pass xml escaped text ($s), returns unescaped text
-
-
+/**
+ * @brief Undo an xmlify.
+ *
+ * Pass xml escaped text ($s), returns unescaped text.
+ *
+ * @param string $s
+ *
+ * @return string
+ */
function unxmlify($s) {
- $ret = str_replace('&amp;','&', $s);
- $ret = str_replace(array('&lt;','&gt;','&quot;','&apos;'),array('<','>','"',"'"),$ret);
+ $ret = str_replace('&amp;', '&', $s);
+ $ret = str_replace(array('&lt;', '&gt;', '&quot;', '&apos;'), array('<', '>', '"', "'"), $ret);
+
return $ret;
}
-// Automatic pagination.
-// To use, get the count of total items.
-// Then call App::set_pager_total($number_items);
-// Optionally call App::set_pager_itemspage($n) to the number of items to display on each page
-// Then call paginate($a) after the end of the display loop to insert the pager block on the page
-// (assuming there are enough items to paginate).
-// When using with SQL, the setting LIMIT %d, %d => App::$pager['start'],App::$pager['itemspage']
-// will limit the results to the correct items for the current page.
-// The actual page handling is then accomplished at the application layer.
-
-
+/**
+ * @brief Automatic pagination.
+ *
+ * To use, get the count of total items.
+ * Then call App::set_pager_total($number_items);
+ * Optionally call App::set_pager_itemspage($n) to the number of items to display on each page
+ * Then call paginate($a) after the end of the display loop to insert the pager block on the page
+ * (assuming there are enough items to paginate).
+ * When using with SQL, the setting LIMIT %d, %d => App::$pager['start'],App::$pager['itemspage']
+ * will limit the results to the correct items for the current page.
+ * The actual page handling is then accomplished at the application layer.
+ *
+ * @param App &$a
+ */
function paginate(&$a) {
$o = '';
$stripped = preg_replace('/(&page=[0-9]*)/','',App::$query_string);
@@ -451,15 +461,15 @@ function paginate(&$a) {
$o .= "<span class=\"pager_first\"><a href=\"$url"."&page=1\">" . t('first') . "</a></span> ";
- $numpages = App::$pager['total'] / App::$pager['itemspage'];
+ $numpages = App::$pager['total'] / App::$pager['itemspage'];
- $numstart = 1;
- $numstop = $numpages;
+ $numstart = 1;
+ $numstop = $numpages;
- if($numpages > 14) {
- $numstart = (($pagenum > 7) ? ($pagenum - 7) : 1);
- $numstop = (($pagenum > ($numpages - 7)) ? $numpages : ($numstart + 14));
- }
+ if($numpages > 14) {
+ $numstart = (($pagenum > 7) ? ($pagenum - 7) : 1);
+ $numstop = (($pagenum > ($numpages - 7)) ? $numpages : ($numstart + 14));
+ }
for($i = $numstart; $i <= $numstop; $i++){
if($i == App::$pager['page'])
@@ -484,6 +494,7 @@ function paginate(&$a) {
$o .= '<span class="pager_next">'."<a href=\"$url"."&page=".(App::$pager['page'] + 1).'">' . t('next') . '</a></span>';
$o .= '</div>'."\r\n";
}
+
return $o;
}
@@ -514,7 +525,6 @@ function alt_pager(&$a, $i, $more = '', $less = '') {
}
-
/**
* @brief Generate a guaranteed unique (for this domain) item ID for ATOM.
*
@@ -558,17 +568,23 @@ function photo_new_resource() {
return $resource;
}
-
-
-// for html,xml parsing - let's say you've got
-// an attribute foobar="class1 class2 class3"
-// and you want to find out if it contains 'class3'.
-// you can't use a normal sub string search because you
-// might match 'notclass3' and a regex to do the job is
-// possible but a bit complicated.
-// pass the attribute string as $attr and the attribute you
-// are looking for as $s - returns true if found, otherwise false
-
+/**
+ * @brief
+ *
+ * for html,xml parsing - let's say you've got
+ * an attribute foobar="class1 class2 class3"
+ * and you want to find out if it contains 'class3'.
+ * you can't use a normal sub string search because you
+ * might match 'notclass3' and a regex to do the job is
+ * possible but a bit complicated.
+ *
+ * pass the attribute string as $attr and the attribute you
+ * are looking for as $s - returns true if found, otherwise false
+ *
+ * @param string $attr attribute string
+ * @param string $s attribute you are looking for
+ * @return boolean true if found
+ */
function attribute_contains($attr, $s) {
$a = explode(' ', $attr);
if(count($a) && in_array($s, $a))
@@ -591,10 +607,9 @@ function attribute_contains($attr, $s) {
* was called, so no need to add it to the message anymore.
*
* @param string $msg Message to log
- * @param int $level A log level.
+ * @param int $level A log level
* @param int $priority - compatible with syslog
*/
-
function logger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) {
if(App::$module == 'setup' && is_writable('install.log')) {
@@ -612,7 +627,7 @@ function logger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) {
return;
$where = '';
-
+
// We require > 5.4 but leave the version check so that install issues (including version) can be logged
if(version_compare(PHP_VERSION, '5.4.0') >= 0) {
@@ -630,19 +645,23 @@ function logger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) {
@file_put_contents($pluginfo['filename'], $pluginfo['message'], FILE_APPEND);
}
-// like logger() but with a function backtrace to pinpoint certain classes
-// of problems which show up deep in the calling stack
-
-
+/**
+ * @brief like logger() but with a function backtrace to pinpoint certain classes
+ * of problems which show up deep in the calling stack.
+ *
+ * @param string $msg Message to log
+ * @param int $level A log level
+ * @param int $priority - compatible with syslog
+ */
function btlogger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) {
logger($msg, $level, $priority);
if(version_compare(PHP_VERSION, '5.4.0') >= 0) {
- $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
+ $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
if($stack) {
for($x = 1; $x < count($stack); $x ++) {
logger('stack: ' . basename($stack[$x]['file']) . ':' . $stack[$x]['line'] . ':' . $stack[$x]['function'] . '()',$level, $priority);
- }
+ }
}
}
}
@@ -718,15 +737,17 @@ function activity_match($haystack,$needle) {
return false;
}
-
-// Pull out all #hashtags and @person tags from $s;
-// We also get @person@domain.com - which would make
-// the regex quite complicated as tags can also
-// end a sentence. So we'll run through our results
-// and strip the period from any tags which end with one.
-// Returns array of tags found, or empty array.
-
-
+/**
+ * @brief Pull out all #hashtags and @person tags from $s.
+ *
+ * We also get @person@domain.com - which would make
+ * the regex quite complicated as tags can also
+ * end a sentence. So we'll run through our results
+ * and strip the period from any tags which end with one.
+ *
+ * @param string $s
+ * @return Returns array of tags found, or empty array.
+ */
function get_tags($s) {
$ret = array();
$match = array();
@@ -797,9 +818,9 @@ function get_tags($s) {
// make sure the longer tags are returned first so that if two or more have common substrings
// we'll replace the longest ones first. Otherwise the common substring would be found in
- // both strings and the string replacement would link both to the shorter strings and
+ // both strings and the string replacement would link both to the shorter strings and
// fail to link the longer string. Hubzilla github issue #378
-
+
usort($ret,'tag_sort_length');
// logger('get_tags: ' . print_r($ret,true));
@@ -816,21 +837,15 @@ function tag_sort_length($a,$b) {
-function strip_zids($s) {
- return preg_replace('/[\?&]zid=(.*?)(&|$)/ism','$2',$s);
-}
-
-function strip_zats($s) {
- return preg_replace('/[\?&]zat=(.*?)(&|$)/ism','$2',$s);
-}
-
-
-// quick and dirty quoted_printable encoding
-
-
+/**
+ * @brief Quick and dirty quoted_printable encoding.
+ *
+ * @param string $s
+ * @return string
+ */
function qp($s) {
- return str_replace ("%","=",rawurlencode($s));
-}
+ return str_replace ("%", "=", rawurlencode($s));
+}
function get_mentions($item,$tags) {
@@ -889,9 +904,9 @@ function contact_block() {
$contacts = t('No connections');
$micropro = null;
} else {
-
+
$randfunc = db_getfunc('RAND');
-
+
$r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash WHERE abook_channel = %d $abook_flags and abook_archived = 0 and xchan_orphan = 0 and xchan_deleted = 0 $sql_extra ORDER BY $randfunc LIMIT %d",
intval(App::$profile['uid']),
intval($shown)
@@ -936,8 +951,8 @@ function chanlink_cid($d) {
}
function magiclink_url($observer,$myaddr,$url) {
- return (($observer)
- ? z_root() . '/magic?f=&dest=' . $url . '&addr=' . $myaddr
+ return (($observer)
+ ? z_root() . '/magic?f=&dest=' . $url . '&addr=' . $myaddr
: $url
);
}
@@ -1034,8 +1049,8 @@ function sslify($s) {
// Complain to your browser maker
$allow = get_config('system','sslify_everything');
-
- $pattern = (($allow) ? "/\<(.*?)src=\"(http\:.*?)\"(.*?)\>/" : "/\<img(.*?)src=\"(http\:.*?)\"(.*?)\>/" );
+
+ $pattern = (($allow) ? "/\<(.*?)src=\"(http\:.*?)\"(.*?)\>/" : "/\<img(.*?)src=\"(http\:.*?)\"(.*?)\>/" );
$matches = null;
$cnt = preg_match_all($pattern,$s,$matches,PREG_SET_ORDER);
@@ -1105,40 +1120,43 @@ function get_mood_verbs() {
return $arr;
}
-// Function to list all smilies, both internal and from addons
-// Returns array with keys 'texts' and 'icons'
+/**
+ * @brief Function to list all smilies, both internal and from addons.
+ *
+ * @return Returns array with keys 'texts' and 'icons'
+ */
function list_smilies() {
- $texts = array(
- '&lt;3',
- '&lt;/3',
- '&lt;\\3',
- ':-)',
- ';-)',
- ':-(',
- ':-P',
- ':-p',
- ':-"',
- ':-&quot;',
- ':-x',
- ':-X',
- ':-D',
- '8-|',
- '8-O',
- ':-O',
- '\\o/',
- 'o.O',
- 'O.o',
- 'o_O',
- 'O_o',
- ":'(",
- ":-!",
- ":-/",
- ":-[",
+ $texts = array(
+ '&lt;3',
+ '&lt;/3',
+ '&lt;\\3',
+ ':-)',
+ ';-)',
+ ':-(',
+ ':-P',
+ ':-p',
+ ':-"',
+ ':-&quot;',
+ ':-x',
+ ':-X',
+ ':-D',
+ '8-|',
+ '8-O',
+ ':-O',
+ '\\o/',
+ 'o.O',
+ 'O.o',
+ 'o_O',
+ 'O_o',
+ ":'(",
+ ":-!",
+ ":-/",
+ ":-[",
"8-)",
- ':beer',
- ':homebrew',
- ':coffee',
+ ':beer',
+ ':homebrew',
+ ':coffee',
':facepalm',
':like',
':dislike',
@@ -1146,38 +1164,38 @@ function list_smilies() {
);
$icons = array(
- '<img class="smiley" src="' . z_root() . '/images/smiley-heart.gif" alt="&lt;3" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-brokenheart.gif" alt="&lt;/3" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-brokenheart.gif" alt="&lt;\\3" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-smile.gif" alt=":-)" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-wink.gif" alt=";-)" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-frown.gif" alt=":-(" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-tongue-out.gif" alt=":-P" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-tongue-out.gif" alt=":-p" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-kiss.gif" alt=":-\"" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-kiss.gif" alt=":-\"" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-kiss.gif" alt=":-x" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-kiss.gif" alt=":-X" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-laughing.gif" alt=":-D" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-surprised.gif" alt="8-|" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-surprised.gif" alt="8-O" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-surprised.gif" alt=":-O" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-thumbsup.gif" alt="\\o/" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-Oo.gif" alt="o.O" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-Oo.gif" alt="O.o" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-Oo.gif" alt="o_O" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-Oo.gif" alt="O_o" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-cry.gif" alt=":\'(" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-foot-in-mouth.gif" alt=":-!" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-undecided.gif" alt=":-/" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-embarassed.gif" alt=":-[" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-cool.gif" alt="8-)" />',
- '<img class="smiley" src="' . z_root() . '/images/beer_mug.gif" alt=":beer" />',
- '<img class="smiley" src="' . z_root() . '/images/beer_mug.gif" alt=":homebrew" />',
- '<img class="smiley" src="' . z_root() . '/images/coffee.gif" alt=":coffee" />',
- '<img class="smiley" src="' . z_root() . '/images/smiley-facepalm.gif" alt=":facepalm" />',
- '<img class="smiley" src="' . z_root() . '/images/like.gif" alt=":like" />',
- '<img class="smiley" src="' . z_root() . '/images/dislike.gif" alt=":dislike" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-heart.gif" alt="&lt;3" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-brokenheart.gif" alt="&lt;/3" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-brokenheart.gif" alt="&lt;\\3" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-smile.gif" alt=":-)" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-wink.gif" alt=";-)" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-frown.gif" alt=":-(" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-tongue-out.gif" alt=":-P" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-tongue-out.gif" alt=":-p" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-kiss.gif" alt=":-\"" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-kiss.gif" alt=":-\"" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-kiss.gif" alt=":-x" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-kiss.gif" alt=":-X" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-laughing.gif" alt=":-D" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-surprised.gif" alt="8-|" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-surprised.gif" alt="8-O" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-surprised.gif" alt=":-O" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-thumbsup.gif" alt="\\o/" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-Oo.gif" alt="o.O" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-Oo.gif" alt="O.o" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-Oo.gif" alt="o_O" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-Oo.gif" alt="O_o" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-cry.gif" alt=":\'(" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-foot-in-mouth.gif" alt=":-!" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-undecided.gif" alt=":-/" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-embarassed.gif" alt=":-[" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-cool.gif" alt="8-)" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/beer_mug.gif" alt=":beer" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/beer_mug.gif" alt=":homebrew" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/coffee.gif" alt=":coffee" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-facepalm.gif" alt=":facepalm" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/like.gif" alt=":like" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/dislike.gif" alt=":dislike" />',
'<img class="smiley" src="' . z_root() . '/images/hz-16.png" alt=":hubzilla" />',
);
@@ -1208,7 +1226,7 @@ function list_smilies() {
* We will escape text between HTML pre and code blocks, and HTML attributes
* (such as urls) from being processed.
*
- * At a higher level, the bbcode [nosmile] tag can be used to prevent this
+ * At a higher level, the bbcode [nosmile] tag can be used to prevent this
* function from being executed by the prepare_text() routine when preparing
* bbcode source for HTML display.
*
@@ -1218,7 +1236,7 @@ function list_smilies() {
*/
function smilies($s, $sample = false) {
- if(intval(get_config('system', 'no_smilies'))
+ if(intval(get_config('system', 'no_smilies'))
|| (local_channel() && intval(get_pconfig(local_channel(), 'system', 'no_smilies'))))
return $s;
@@ -1255,8 +1273,8 @@ function smile_shield($m) {
return '<!--base64:' . base64special_encode($m[0]) . '-->';
}
-function smile_unshield($m) {
- return base64special_decode($m[1]);
+function smile_unshield($m) {
+ return base64special_decode($m[1]);
}
/**
@@ -1271,7 +1289,7 @@ function preg_heart($x) {
$t = '';
for($cnt = 0; $cnt < strlen($x[1]); $cnt ++)
- $t .= '<img class="smiley" src="' . z_root() . '/images/smiley-heart.gif" alt="&lt;3" />';
+ $t .= '<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-heart.gif" alt="&lt;3" />';
$r = str_replace($x[0],$t,$x[0]);
@@ -1364,11 +1382,11 @@ function theme_attachments(&$item) {
$icon = getIconFromType($r['type']);
$label = (($r['title']) ? urldecode(htmlspecialchars($r['title'], ENT_COMPAT, 'UTF-8')) : t('Unknown Attachment'));
-
+
//some feeds provide an attachment where title an empty space
if($label == ' ')
$label = t('Unknown Attachment');
-
+
$title = t('Size') . ' ' . (($r['length']) ? userReadableSize($r['length']) : t('unknown'));
require_once('include/channel.php');
@@ -1508,7 +1526,7 @@ function generate_named_map($location) {
function prepare_body(&$item,$attach = false) {
- call_hooks('prepare_body_init', $item);
+ call_hooks('prepare_body_init', $item);
$s = '';
$photo = '';
@@ -1602,7 +1620,9 @@ function prepare_body(&$item,$attach = false) {
* @brief Given a text string, convert from bbcode to html and add smilie icons.
*
* @param string $text
- * @param sting $content_type
+ * @param sting $content_type (optional) default text/bbcode
+ * @param boolean $cache (optional) default false
+ *
* @return string
*/
function prepare_text($text, $content_type = 'text/bbcode', $cache = false) {
@@ -1621,19 +1641,18 @@ function prepare_text($text, $content_type = 'text/bbcode', $cache = false) {
$s = Markdown($text);
break;
-
case 'application/x-pdl';
$s = escape_tags($text);
break;
-
- // No security checking is done here at display time - so we need to verify
- // that the author is allowed to use PHP before storing. We also cannot allow
- // importation of PHP text bodies from other sites. Therefore this content
+
+ // No security checking is done here at display time - so we need to verify
+ // that the author is allowed to use PHP before storing. We also cannot allow
+ // importation of PHP text bodies from other sites. Therefore this content
// type is only valid for web pages (and profile details).
- // It may be possible to provide a PHP message body which is evaluated on the
- // sender's site before sending it elsewhere. In that case we will have a
- // different content-type here.
+ // It may be possible to provide a PHP message body which is evaluated on the
+ // sender's site before sending it elsewhere. In that case we will have a
+ // different content-type here.
case 'application/x-php':
ob_start();
@@ -1674,43 +1693,6 @@ function create_export_photo_body(&$item) {
}
/**
- * zidify_callback() and zidify_links() work together to turn any HTML a tags with class="zrl" into zid links
- * These will typically be generated by a bbcode '[zrl]' tag. This is done inside prepare_text() rather than bbcode()
- * because the latter is used for general purpose conversions and the former is used only when preparing text for
- * immediate display.
- *
- * Issues: Currently the order of HTML parameters in the text is somewhat rigid and inflexible.
- * We assume it looks like \<a class="zrl" href="xxxxxxxxxx"\> and will not work if zrl and href appear in a different order.
- *
- * @param array $match
- * @return string
- */
-function zidify_callback($match) {
- $is_zid = ((feature_enabled(local_channel(),'sendzid')) || (strpos($match[1],'zrl')) ? true : false);
- $replace = '<a' . $match[1] . ' href="' . (($is_zid) ? zid($match[2]) : $match[2]) . '"';
- $x = str_replace($match[0],$replace,$match[0]);
-
- return $x;
-}
-
-function zidify_img_callback($match) {
- $is_zid = ((feature_enabled(local_channel(),'sendzid')) || (strpos($match[1],'zrl')) ? true : false);
- $replace = '<img' . $match[1] . ' src="' . (($is_zid) ? zid($match[2]) : $match[2]) . '"';
-
- $x = str_replace($match[0],$replace,$match[0]);
-
- return $x;
-}
-
-
-function zidify_links($s) {
- $s = preg_replace_callback('/\<a(.*?)href\=\"(.*?)\"/ism','zidify_callback',$s);
- $s = preg_replace_callback('/\<img(.*?)src\=\"(.*?)\"/ism','zidify_img_callback',$s);
-
- return $s;
-}
-
-/**
* @brief Return atom link elements for all of our hubs.
*
* @return string
@@ -1735,16 +1717,20 @@ function feed_hublinks() {
return $hubxml;
}
-/* return atom link elements for salmon endpoints */
-
+/**
+ * @brief Return atom link elements for salmon endpoints
+ *
+ * @param string $nick
+ * @return string
+ */
function feed_salmonlinks($nick) {
$salmon = '<link rel="salmon" href="' . xmlify(z_root() . '/salmon/' . $nick) . '" />' . "\n" ;
- // old style links that status.net still needed as of 12/2010
+ // old style links that status.net still needed as of 12/2010
- $salmon .= ' <link rel="http://salmon-protocol.org/ns/salmon-replies" href="' . xmlify(z_root() . '/salmon/' . $nick) . '" />' . "\n" ;
- $salmon .= ' <link rel="http://salmon-protocol.org/ns/salmon-mention" href="' . xmlify(z_root() . '/salmon/' . $nick) . '" />' . "\n" ;
+ $salmon .= ' <link rel="http://salmon-protocol.org/ns/salmon-replies" href="' . xmlify(z_root() . '/salmon/' . $nick) . '" />' . "\n" ;
+ $salmon .= ' <link rel="http://salmon-protocol.org/ns/salmon-mention" href="' . xmlify(z_root() . '/salmon/' . $nick) . '" />' . "\n" ;
return $salmon;
}
@@ -1773,7 +1759,7 @@ function unamp($s) {
}
function layout_select($channel_id, $current = '') {
- $r = q("select mid, v from item left join iconfig on iconfig.iid = item.id
+ $r = q("select mid, v from item left join iconfig on iconfig.iid = item.id
where iconfig.cat = 'system' and iconfig.k = 'PDL' and item.uid = %d and item_type = %d ",
intval($channel_id),
intval(ITEM_TYPE_PDL)
@@ -1817,12 +1803,12 @@ function mimetype_select($channel_id, $current = 'text/bbcode') {
);
if($r) {
- if(($r[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($r[0]['channel_pageflags'] & PAGE_ALLOWCODE)) {
+ if(($r[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($r[0]['channel_pageflags'] & PAGE_ALLOWCODE)) {
if(local_channel() && get_account_id() == $r[0]['account_id']) {
$x[] = 'application/x-php';
}
}
- }
+ }
}
foreach($x as $y) {
@@ -1837,42 +1823,6 @@ function mimetype_select($channel_id, $current = 'text/bbcode') {
return $o;
}
-
-function lang_selector() {
-
- $langs = glob('view/*/hstrings.php');
-
- $lang_options = array();
- $selected = "";
-
- if(is_array($langs) && count($langs)) {
- $langs[] = '';
- if(! in_array('view/en/hstrings.php',$langs))
- $langs[] = 'view/en/';
- asort($langs);
- foreach($langs as $l) {
- if($l == '') {
- $lang_options[""] = t('default');
- continue;
- }
- $ll = substr($l,5);
- $ll = substr($ll,0,strrpos($ll,'/'));
- $selected = (($ll === App::$language && (x($_SESSION, 'language'))) ? $ll : $selected);
- $lang_options[$ll] = get_language_name($ll, $ll) . " ($ll)";
- }
- }
-
- $tpl = get_markup_template("lang_selector.tpl");
- $o = replace_macros($tpl, array(
- '$title' => t('Select an alternate language'),
- '$langs' => array($lang_options, $selected),
-
- ));
-
- return $o;
-}
-
-
function engr_units_to_bytes ($size_str) {
if(! $size_str)
return $size_str;
@@ -1922,9 +1872,8 @@ function base64special_decode($s) {
return base64_decode(strtr($s,',.','+/'));
}
-
/**
- * @ Return a div to clear floats.
+ * @brief Return a div to clear floats.
*
* @return string
*/
@@ -2100,7 +2049,7 @@ function ids_to_array($arr,$idx = 'id') {
$t = array();
if($arr) {
foreach($arr as $x) {
- if(array_key_exists($idx,$x) && strlen($x[$idx]) && (! in_array($x[$idx],$t))) {
+ if(array_key_exists($idx,$x) && strlen($x[$idx]) && (! in_array($x[$idx],$t))) {
$t[] = $x[$idx];
}
}
@@ -2111,23 +2060,33 @@ function ids_to_array($arr,$idx = 'id') {
-function ids_to_querystr($arr,$idx = 'id') {
+function ids_to_querystr($arr,$idx = 'id',$quote = false) {
$t = array();
if($arr) {
foreach($arr as $x) {
if(! in_array($x[$idx],$t)) {
- $t[] = $x[$idx];
+ if($quote)
+ $t[] = "'" . dbesc($x[$idx]) . "'";
+ else
+ $t[] = $x[$idx];
}
}
}
return(implode(',', $t));
}
-// Fetches xchan and hubloc data for an array of items with only an
-// author_xchan and owner_xchan. If $abook is true also include the abook info.
-// This is needed in the API to save extra per item lookups there.
-
-function xchan_query(&$items,$abook = true,$effective_uid = 0) {
+/**
+ * @brief Fetches xchan and hubloc data for an array of items with only an
+ * author_xchan and owner_xchan.
+ *
+ * If $abook is true also include the abook info. This is needed in the API to
+ * save extra per item lookups there.
+ *
+ * @param array[in,out] &$items
+ * @param boolean $abook If true also include the abook info
+ * @param number $effective_uid
+ */
+function xchan_query(&$items, $abook = true, $effective_uid = 0) {
$arr = array();
if($items && count($items)) {
@@ -2160,7 +2119,7 @@ function xchan_query(&$items,$abook = true,$effective_uid = 0) {
if(! $chans)
$chans = $xchans;
else
- $chans = array_merge($xchans,$chans);
+ $chans = array_merge($xchans,$chans);
}
if($items && count($items) && $chans && count($chans)) {
for($x = 0; $x < count($items); $x ++) {
@@ -2218,15 +2177,19 @@ function magic_link($s) {
return $s;
}
-// if $escape is true, dbesc() each element before adding quotes
-
-function stringify_array_elms(&$arr,$escape = false) {
+/**
+ * if $escape is true, dbesc() each element before adding quotes
+ *
+ * @param array[in,out] &$arr
+ * @param boolean $escape default false
+ */
+function stringify_array_elms(&$arr, $escape = false) {
for($x = 0; $x < count($arr); $x ++)
$arr[$x] = "'" . (($escape) ? dbesc($arr[$x]) : $arr[$x]) . "'";
}
/**
- * Indents a flat JSON string to make it more human-readable.
+ * @brief Indents a flat JSON string to make it more human-readable.
*
* @param string $json The original JSON string to process.
*
@@ -2250,7 +2213,7 @@ function jindent($json) {
if ($char == '"' && $prevChar != '\\') {
$outOfQuotes = !$outOfQuotes;
- // If this character is the end of an element,
+ // If this character is the end of an element,
// output a new line and indent the next line.
} else if(($char == '}' || $char == ']') && $outOfQuotes) {
$result .= $newLine;
@@ -2263,7 +2226,7 @@ function jindent($json) {
// Add the character to the result string.
$result .= $char;
- // If the last character was the beginning of an element,
+ // If the last character was the beginning of an element,
// output a new line and indent the next line.
if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
$result .= $newLine;
@@ -2275,7 +2238,7 @@ function jindent($json) {
$result .= $indentStr;
}
}
-
+
$prevChar = $char;
}
@@ -2285,9 +2248,8 @@ function jindent($json) {
/**
* @brief Creates navigation menu for webpage, layout, blocks, menu sites.
*
- * @return string
+ * @return string with parsed HTML
*/
-
function design_tools() {
$channel = App::get_channel();
@@ -2336,7 +2298,7 @@ function website_portation_tools() {
'$file_import_text' => t('Import from cloud files:'),
'$desc' => t('/cloud/channel/path/to/folder'),
'$hint' => t('Enter path to website files'),
- '$select' => t('Select folder'),
+ '$select' => t('Select folder'),
'$export_label' => t('Export website...'),
'$file_download_text' => t('Export to a zip file'),
'$filename_desc' => t('website.zip'),
@@ -2344,12 +2306,17 @@ function website_portation_tools() {
'$cloud_export_text' => t('Export to cloud files'),
'$cloud_export_desc' => t('/path/to/export/folder'),
'$cloud_export_hint' => t('Enter a path to a cloud files destination.'),
- '$cloud_export_select' => t('Specify folder'),
+ '$cloud_export_select' => t('Specify folder'),
));
}
-/* case insensitive in_array() */
-
+/**
+ * @brief case insensitive in_array()
+ *
+ * @param string $needle
+ * @param array $haystack
+ * @return boolean
+ */
function in_arrayi($needle, $haystack) {
return in_array(strtolower($needle), array_map('strtolower', $haystack));
}
@@ -2358,10 +2325,13 @@ function normalise_openid($s) {
return trim(str_replace(array('http://','https://'),array('',''),$s),'/');
}
-// used in ajax endless scroll request to find out all the args that the master page was viewing.
-// This was using $_REQUEST, but $_REQUEST also contains all your cookies. So we're restricting it
-// to $_GET and $_POST.
-
+/**
+ * Used in ajax endless scroll request to find out all the args that the master page was viewing.
+ * This was using $_REQUEST, but $_REQUEST also contains all your cookies. So we're restricting it
+ * to $_GET and $_POST.
+ *
+ * @return string with additional URL parameters
+ */
function extra_query_args() {
$s = '';
if(count($_GET)) {
@@ -2380,6 +2350,7 @@ function extra_query_args() {
}
}
}
+
return $s;
}
@@ -2406,7 +2377,7 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d
$termtype = ((strpos($tag,'@') === 0) ? TERM_MENTION : $termtype);
$termtype = ((strpos($tag,'#^[') === 0) ? TERM_BOOKMARK : $termtype);
- //is it a hash tag?
+ //is it a hash tag?
if(strpos($tag,'#') === 0) {
if(strpos($tag,'#^[') === 0) {
if(preg_match('/#\^\[(url|zrl)(.*?)\](.*?)\[\/(url|zrl)\]/',$tag,$match)) {
@@ -2421,7 +2392,7 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d
return $replaced;
}
if($tag == '#getzot') {
- $basetag = 'getzot';
+ $basetag = 'getzot';
$url = 'http://hubzilla.org';
$newtag = '#[zrl=' . $url . ']' . $basetag . '[/zrl]';
$body = str_replace($tag,$newtag,$body);
@@ -2457,15 +2428,15 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d
$str_tags .= $newtag;
}
return [
- 'replaced' => $replaced,
- 'termtype' => $termtype,
- 'term' => $basetag,
- 'url' => $url,
+ 'replaced' => $replaced,
+ 'termtype' => $termtype,
+ 'term' => $basetag,
+ 'url' => $url,
'contact' => $r[0]
- ];
+ ];
}
- //is it a person tag?
+ //is it a person tag?
if(strpos($tag,'@') === 0) {
@@ -2479,7 +2450,7 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d
//get the person's name
$name = substr($tag,(($exclusive) ? 2 : 1)); // The name or name fragment we are going to replace
- $newname = $name; // a copy that we can mess with
+ $newname = $name; // a copy that we can mess with
$tagcid = 0;
$r = null;
@@ -2525,14 +2496,14 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d
if($abook_id) { // if there was an id
// select channel with that id from the logged in user's address book
- $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
intval($abook_id),
intval($profile_uid)
);
}
else {
- $r = q("SELECT * FROM xchan
+ $r = q("SELECT * FROM xchan
WHERE xchan_hash like '%s%%' LIMIT 1",
dbesc($tagcid)
);
@@ -2561,7 +2532,7 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d
}
//select someone from this user's contacts by name
- $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
WHERE xchan_name = '%s' AND abook_channel = %d LIMIT 1",
dbesc($newname),
intval($profile_uid)
@@ -2569,7 +2540,7 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d
if(! $r) {
//select someone by attag or nick and the name passed in
- $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
WHERE xchan_addr like ('%s') AND abook_channel = %d LIMIT 1",
dbesc(((strpos($newname,'@')) ? $newname : $newname . '@%')),
intval($profile_uid)
@@ -2580,7 +2551,7 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d
// it's possible somebody has a name ending with '+', which we stripped off as a forum indicator
// This is very rare but we want to get it right.
- $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
WHERE xchan_name = '%s' AND abook_channel = %d LIMIT 1",
dbesc($newname . '+'),
intval($profile_uid)
@@ -2604,12 +2575,12 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d
}
else {
- // check for a group/collection exclusion tag
+ // check for a group/collection exclusion tag
// note that we aren't setting $replaced even though we're replacing text.
// This tag isn't going to get a term attached to it. It's only used for
// access control. The link points to out own channel just so it doesn't look
- // weird - as all the other tags are linked to something.
+ // weird - as all the other tags are linked to something.
if(local_channel() && local_channel() == $profile_uid) {
require_once('include/group.php');
@@ -2654,10 +2625,10 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d
}
return [
- 'replaced' => $replaced,
- 'termtype' => $termtype,
- 'term' => $newname,
- 'url' => $url,
+ 'replaced' => $replaced,
+ 'termtype' => $termtype,
+ 'term' => $newname,
+ 'url' => $url,
'contact' => $r[0]
];
}
@@ -2686,7 +2657,7 @@ function linkify_tags($a, &$body, $uid, $diaspora = false) {
if($fullnametagged)
continue;
- $success = handle_tag($a, $body, $access_tag, $str_tags, ($uid) ? $uid : App::$profile_uid , $tag, $diaspora);
+ $success = handle_tag($a, $body, $access_tag, $str_tags, ($uid) ? $uid : App::$profile_uid , $tag, $diaspora);
$results[] = array('success' => $success, 'access_tag' => $access_tag);
if($success['replaced']) $tagged[] = $tag;
}
@@ -2807,10 +2778,10 @@ function json_url_replace($old,$new,&$s) {
$s = $x;
return $replaced;
}
-
+
function item_url_replace($channel,&$item,$old,$new,$oldnick = '') {
-
+
if($item['attach']) {
json_url_replace($old,$new,$item['attach']);
if($oldnick)
@@ -2831,7 +2802,7 @@ function item_url_replace($channel,&$item,$old,$new,$oldnick = '') {
$item['sig'] = base64url_encode(rsa_sign($item['body'],$channel['channel_prvkey']));
$item['item_verified'] = 1;
}
-
+
$item['plink'] = str_replace($old,$new,$item['plink']);
if($oldnick)
$item['plink'] = str_replace('/' . $oldnick . '/' ,'/' . $channel['channel_address'] . '/' ,$item['plink']);
@@ -2839,7 +2810,7 @@ function item_url_replace($channel,&$item,$old,$new,$oldnick = '') {
$item['llink'] = str_replace($old,$new,$item['llink']);
if($oldnick)
$item['llink'] = str_replace('/' . $oldnick . '/' ,'/' . $channel['channel_address'] . '/' ,$item['llink']);
-
+
}
@@ -2877,7 +2848,6 @@ function perms2str($p) {
return $ret;
}
-
/**
* @brief Turn user/group ACLs stored as angle bracketed text into arrays.
*
@@ -2905,35 +2875,41 @@ function expand_acl($s) {
function acl2json($s) {
$s = expand_acl($s);
$s = json_encode($s);
+
return $s;
}
-
-// When editing a webpage - a dropdown is needed to select a page layout
-// On submit, the pdl_select value (which is the mid of an item with item_type = ITEM_TYPE_PDL) is stored in
-// the webpage's resource_id, with resource_type 'pdl'.
-
-// Then when displaying a webpage, we can see if it has a pdl attached. If not we'll
-// use the default site/page layout.
-
-// If it has a pdl we'll load it as we know the mid and pass the body through comanche_parser() which will generate the
-// page layout from the given description
-
-// @FIXME - there is apparently a very similar function called layout_select; this one should probably take precedence
-// and the other should be checked for compatibility and removed
-
-function pdl_selector($uid, $current="") {
+/**
+ * @brief When editing a webpage - a dropdown is needed to select a page layout
+ *
+ * On submit, the pdl_select value (which is the mid of an item with item_type = ITEM_TYPE_PDL)
+ * is stored in the webpage's resource_id, with resource_type 'pdl'.
+ *
+ * Then when displaying a webpage, we can see if it has a pdl attached. If not we'll
+ * use the default site/page layout.
+ *
+ * If it has a pdl we'll load it as we know the mid and pass the body through comanche_parser() which will generate the
+ * page layout from the given description
+ *
+ * @FIXME - there is apparently a very similar function called layout_select; this one should probably take precedence
+ * and the other should be checked for compatibility and removed
+ *
+ * @param int $uid
+ * @param string $current
+ * @return string HTML code for dropdown
+ */
+function pdl_selector($uid, $current='') {
$o = '';
$sql_extra = item_permissions_sql($uid);
- $r = q("select iconfig.*, mid from item_id left join item on iconfig.iid = item.id
+ $r = q("select iconfig.*, mid from item_id left join item on iconfig.iid = item.id
where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'PDL' $sql_extra order by v asc",
intval($uid)
);
$arr = array('channel_id' => $uid, 'current' => $current, 'entries' => $r);
- call_hooks('pdl_selector',$arr);
+ call_hooks('pdl_selector', $arr);
$entries = $arr['entries'];
$current = $arr['current'];
@@ -2949,16 +2925,17 @@ function pdl_selector($uid, $current="") {
return $o;
}
-/*
- * array flatten_array_recursive(array);
- * returns a one-dimensional array from a multi-dimensional array
+/**
+ * @brief returns a one-dimensional array from a multi-dimensional array
* empty values are discarded
+ *
* example: print_r(flatten_array_recursive(array('foo','bar',array('baz','blip',array('zob','glob')),'','grip')));
*
- * Array ( [0] => foo [1] => bar [2] => baz [3] => blip [4] => zob [5] => glob [6] => grip )
+ * Array ( [0] => foo [1] => bar [2] => baz [3] => blip [4] => zob [5] => glob [6] => grip )
*
+ * @param array $arr multi-dimensional array
+ * @return one-dimensional array
*/
-
function flatten_array_recursive($arr) {
$ret = array();
@@ -2969,64 +2946,71 @@ function flatten_array_recursive($arr) {
if(is_array($a)) {
$tmp = flatten_array_recursive($a);
if($tmp) {
- $ret = array_merge($ret,$tmp);
+ $ret = array_merge($ret, $tmp);
}
}
elseif($a) {
$ret[] = $a;
}
}
+
return($ret);
-}
+}
-function text_highlight($s,$lang) {
+/**
+ * @brief Highlight Text.
+ *
+ * @param string $s Text to highlight
+ * @param string $lang Which language should be highlighted
+ * @return string
+ */
+function text_highlight($s, $lang) {
if($lang === 'js')
$lang = 'javascript';
if($lang === 'json') {
$lang = 'javascript';
- if(! strpos(trim($s),"\n"))
+ if(! strpos(trim($s), "\n"))
$s = jindent($s);
}
- if(! strpos('Text_Highlighter',get_include_path())) {
+ if(! strpos('Text_Highlighter', get_include_path())) {
set_include_path(get_include_path() . PATH_SEPARATOR . 'library/Text_Highlighter');
}
require_once('library/Text_Highlighter/Text/Highlighter.php');
- require_once('library/Text_Highlighter/Text/Highlighter/Renderer/Html.php');
- $options = array(
- 'numbers' => HL_NUMBERS_LI,
- 'tabsize' => 4,
- );
+ require_once('library/Text_Highlighter/Text/Highlighter/Renderer/Html.php');
+ $options = array(
+ 'numbers' => HL_NUMBERS_LI,
+ 'tabsize' => 4,
+ );
$tag_added = false;
- $s = trim(html_entity_decode($s,ENT_COMPAT));
- $s = str_replace(" ","\t",$s);
+ $s = trim(html_entity_decode($s, ENT_COMPAT));
+ $s = str_replace(" ", "\t", $s);
- // The highlighter library insists on an opening php tag for php code blocks. If
+ // The highlighter library insists on an opening php tag for php code blocks. If
// it isn't present, nothing is highlighted. So we're going to see if it's present.
- // If not, we'll add it, and then quietly remove it after we get the processed output back.
+ // If not, we'll add it, and then quietly remove it after we get the processed output back.
if($lang === 'php') {
- if(strpos('<?php',$s) !== 0) {
+ if(strpos('<?php', $s) !== 0) {
$s = '<?php' . "\n" . $s;
- $tag_added = true;
+ $tag_added = true;
}
-
- }
- $renderer = new Text_Highlighter_Renderer_HTML($options);
- $hl = Text_Highlighter::factory($lang);
- $hl->setRenderer($renderer);
+ }
+ $renderer = new Text_Highlighter_Renderer_HTML($options);
+ $hl = Text_Highlighter::factory($lang);
+ $hl->setRenderer($renderer);
$o = $hl->highlight($s);
- $o = str_replace([" ","\n"],["&nbsp;&nbsp;&nbsp;&nbsp;",''],$o);
+ $o = str_replace([" ", "\n"], ["&nbsp;&nbsp;&nbsp;&nbsp;", ''], $o);
if($tag_added) {
- $b = substr($o,0,strpos($o,'<li>'));
- $e = substr($o,strpos($o,'</li>'));
+ $b = substr($o, 0, strpos($o, '<li>'));
+ $e = substr($o, strpos($o, '</li>'));
$o = $b . $e;
}
- return('<code>' . $o . '</code>');
+ return('<code>' . $o . '</code>');
}
// function to convert multi-dimensional array to xml
@@ -3041,26 +3025,40 @@ function text_highlight($s,$lang) {
// echo (($xml->asXML('data.xml')) ? 'Your XML file has been generated successfully!' : 'Error generating XML file!');
function arrtoxml($root_elem,$arr) {
- $xml = new SimpleXMLElement('<' . $root_elem . '/>');
+ $xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><' . $root_elem . '></' . $root_elem . '>', null, false);
array2XML($xml,$arr);
+
return $xml->asXML();
}
-function array2XML($obj, $array)
-{
- foreach ($array as $key => $value)
- {
- if(is_numeric($key))
- $key = 'item' . $key;
-
- if (is_array($value))
- {
- $node = $obj->addChild($key);
- array2XML($node, $value);
- }
- else
- {
- $obj->addChild($key, htmlspecialchars($value));
- }
- }
+function array2XML($obj, $array) {
+ foreach ($array as $key => $value) {
+ if(is_numeric($key))
+ $key = 'item' . $key;
+
+ if(is_array($value)) {
+ $node = $obj->addChild($key);
+ array2XML($node, $value);
+ } else {
+ $obj->addChild($key, htmlspecialchars($value));
+ }
+ }
}
+
+
+function create_table_from_array($table, $arr) {
+
+ if(! ($arr && $table))
+ return false;
+
+ if(dbesc_array($arr)) {
+ $r = dbq("INSERT INTO " . TQUOT . $table . TQUOT . " (" . TQUOT
+ . implode(TQUOT . ', ' . TQUOT, array_keys($arr))
+ . TQUOT . ") VALUES ('"
+ . implode("', '", array_values($arr))
+ . "')"
+ );
+ }
+
+ return $r;
+} \ No newline at end of file
diff --git a/include/widgets.php b/include/widgets.php
index 2e1e58717..dde8e7cd0 100644
--- a/include/widgets.php
+++ b/include/widgets.php
@@ -126,7 +126,7 @@ function widget_suggestions($arr) {
// Get two random entries from the top 20 returned.
// We'll grab the first one and the one immediately following.
- // This will throw some entropy intot he situation so you won't
+ // This will throw some entropy intot he situation so you won't
// be looking at the same two mug shots every time the widget runs
$index = ((count($r) > 2) ? mt_rand(0,count($r) - 2) : 0);
@@ -169,7 +169,7 @@ function widget_follow($args) {
intval($uid)
);
if($r)
- $total_channels = $r[0]['total'];
+ $total_channels = $r[0]['total'];
$limit = service_class_fetch($uid,'total_channels');
if($limit !== false) {
$abook_usage_message = sprintf( t("You have %1$.0f of %2$.0f allowed connections."), $total_channels, $limit);
@@ -212,15 +212,15 @@ function widget_savedsearch($arr) {
$search = ((x($_GET,'netsearch')) ? $_GET['netsearch'] : '');
if(! $search)
$search = ((x($_GET,'search')) ? $_GET['search'] : '');
-
+
if(x($_GET,'searchsave') && $search) {
- $r = q("select * from `term` where `uid` = %d and `ttype` = %d and `term` = '%s' limit 1",
+ $r = q("select * from term where uid = %d and ttype = %d and term = '%s' limit 1",
intval(local_channel()),
intval(TERM_SAVEDSEARCH),
dbesc($search)
);
if(! $r) {
- q("insert into `term` ( `uid`,`ttype`,`term` ) values ( %d, %d, '%s') ",
+ q("insert into term ( uid,ttype,term ) values ( %d, %d, '%s') ",
intval(local_channel()),
intval(TERM_SAVEDSEARCH),
dbesc($search)
@@ -229,7 +229,7 @@ function widget_savedsearch($arr) {
}
if(x($_GET,'searchremove') && $search) {
- q("delete from `term` where `uid` = %d and `ttype` = %d and `term` = '%s'",
+ q("delete from term where uid = %d and ttype = %d and term = '%s'",
intval(local_channel()),
intval(TERM_SAVEDSEARCH),
dbesc($search)
@@ -252,11 +252,11 @@ function widget_savedsearch($arr) {
$hasamp = ((strpos($srchurl,'&') !== false) ? true : false);
if(($hasamp) && (! $hasq))
- $srchurl = substr($srchurl,0,strpos($srchurl,'&')) . '?f=&' . substr($srchurl,strpos($srchurl,'&')+1);
+ $srchurl = substr($srchurl,0,strpos($srchurl,'&')) . '?f=&' . substr($srchurl,strpos($srchurl,'&')+1);
$o = '';
- $r = q("select `tid`,`term` from `term` WHERE `uid` = %d and `ttype` = %d ",
+ $r = q("select tid,term from term WHERE uid = %d and ttype = %d ",
intval(local_channel()),
intval(TERM_SAVEDSEARCH)
);
@@ -292,7 +292,7 @@ function widget_savedsearch($arr) {
function widget_sitesearch($arr) {
$search = ((x($_GET,'search')) ? $_GET['search'] : '');
-
+
$srchurl = App::$query_string;
$srchurl = rtrim(preg_replace('/search\=[^\&].*?(\&|$)/is','',$srchurl),'&');
@@ -304,7 +304,7 @@ function widget_sitesearch($arr) {
$hasamp = ((strpos($srchurl,'&') !== false) ? true : false);
if(($hasamp) && (! $hasq))
- $srchurl = substr($srchurl,0,strpos($srchurl,'&')) . '?f=&' . substr($srchurl,strpos($srchurl,'&')+1);
+ $srchurl = substr($srchurl,0,strpos($srchurl,'&')) . '?f=&' . substr($srchurl,strpos($srchurl,'&')+1);
$o = '';
@@ -554,7 +554,7 @@ function widget_affinity($arr) {
));
$arr = array('html' => $x);
call_hooks('main_slider',$arr);
- return $arr['html'];
+ return $arr['html'];
}
return '';
@@ -581,11 +581,11 @@ function widget_settings_menu($arr) {
if($abk)
$abook_self_id = $abk[0]['abook_id'];
- $hublocs = q("select count(*) as total from hubloc where hubloc_hash = '%s'",
+ $x = q("select count(*) as total from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0 ",
dbesc($channel['channel_hash'])
);
- $hublocs = (($hublocs[0]['total'] > 1) ? true : false);
+ $hublocs = (($x && $x[0]['total'] > 1) ? true : false);
$tabs = array(
array(
@@ -778,7 +778,7 @@ function widget_conversations($arr) {
'$messages' => $messages
));
- $o .= alt_pager($a,count($r));
+ //$o .= alt_pager($a,count($r));
}
@@ -802,10 +802,10 @@ function widget_design_tools($arr) {
// mod menu doesn't load a profile. For any modules which load a profile, check it.
// otherwise local_channel() is sufficient for permissions.
- if(App::$profile['profile_uid'])
+ if(App::$profile['profile_uid'])
if((App::$profile['profile_uid'] != local_channel()) && (! App::$is_sys))
return '';
-
+
if(! local_channel())
return '';
@@ -817,10 +817,10 @@ function widget_website_portation_tools($arr) {
// mod menu doesn't load a profile. For any modules which load a profile, check it.
// otherwise local_channel() is sufficient for permissions.
- if(App::$profile['profile_uid'])
+ if(App::$profile['profile_uid'])
if((App::$profile['profile_uid'] != local_channel()) && (! App::$is_sys))
return '';
-
+
if(! local_channel())
return '';
@@ -841,7 +841,7 @@ function widget_photo_albums($arr) {
return '';
require_once('include/photos.php');
$sortkey = ((array_key_exists('sortkey',$arr)) ? $arr['sortkey'] : 'album');
- $direction = ((array_key_exists('direction',$arr)) ? $arr['direction'] : 'asc');
+ $direction = ((array_key_exists('direction',$arr)) ? $arr['direction'] : 'asc');
return photos_album_widget($channelx, App::get_observer(),$sortkey,$direction);
}
@@ -898,26 +898,14 @@ function widget_chatroom_members() {
}
function widget_wiki_list($arr) {
-
require_once("include/wiki.php");
- $channel = null;
- if (argc() < 2 && local_channel()) {
- // This should not occur because /wiki should redirect to /wiki/channel ...
- $channel = \App::get_channel();
- } else {
- $channel = get_channel_by_nick(argv(1)); // Channel being viewed by observer
- }
- if (!$channel) {
- return '';
- }
+ $channel = channelx_by_n(App::$profile_uid);
$wikis = wiki_list($channel, get_observer_hash());
- if ($wikis) {
- return replace_macros(get_markup_template('wikilist.tpl'), array(
+ if($wikis) {
+ return replace_macros(get_markup_template('wikilist_widget.tpl'), array(
'$header' => t('Wiki List'),
'$channel' => $channel['channel_address'],
- '$wikis' => $wikis['wikis'],
- // If the observer is the local channel owner, show the wiki controls
- '$showControls' => ((local_channel() === intval($channel['channel_id'])) ? true : false)
+ '$wikis' => $wikis['wikis']
));
}
return '';
@@ -948,13 +936,18 @@ function widget_wiki_pages($arr) {
}
}
}
+ $can_create = perm_is_allowed(\App::$profile['uid'],get_observer_hash(),'write_pages');
+
return replace_macros(get_markup_template('wiki_page_list.tpl'), array(
'$hide' => $hide,
'$not_refresh' => $not_refresh,
'$header' => t('Wiki Pages'),
'$channel' => $channelname,
'$wikiname' => $wikiname,
- '$pages' => $pages
+ '$pages' => $pages,
+ '$canadd' => $can_create,
+ '$addnew' => t('Add new page'),
+ '$pageName' => array('pageName', t('Page name')),
));
}
@@ -965,7 +958,8 @@ function widget_wiki_page_history($arr) {
$pageHistory = wiki_page_history(array('resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
return replace_macros(get_markup_template('wiki_page_history.tpl'), array(
- '$pageHistory' => $pageHistory['history']
+ '$pageHistory' => $pageHistory['history'],
+ '$permsWrite' => $arr['permsWrite']
));
}
@@ -996,9 +990,9 @@ function widget_suggestedchats($arr) {
if(! feature_enabled(App::$profile['profile_uid'],'ajaxchat'))
return '';
- // There are reports that this tool does not ever remove chatrooms on dead sites,
+ // There are reports that this tool does not ever remove chatrooms on dead sites,
// and also will happily link to private chats which you cannot enter.
- // For those reasons, it will be disabled until somebody decides it's worth
+ // For those reasons, it will be disabled until somebody decides it's worth
// fixing and comes up with a plan for doing so.
return '';
@@ -1044,7 +1038,7 @@ function widget_item($arr) {
if($arr['title']) {
$r = q("select item.* from item left join iconfig on item.id = iconfig.iid
- where item.uid = %d and iconfig.cat = 'system' and iconfig.v = '%s'
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.v = '%s'
and iconfig.k = 'WEBPAGE' and item_type = %d $sql_options $revision limit 1",
intval($channel_id),
dbesc($arr['title']),
@@ -1108,7 +1102,7 @@ function showtime(){
// timeValue += ((seconds < 10) ? ":0" : ":") + seconds
if(! military)
timeValue += (hours >= 12) ? " P.M." : " A.M."
- $('.clockface').html(timeValue)
+ $('.clockface').html(timeValue)
timerID = setTimeout("showtime()",1000)
timerRunning = true
}
@@ -1124,17 +1118,16 @@ return $o;
}
-
/**
- * @function widget_photo($arr)
- * widget to display a single photo.
- * @param array $arr;
- * 'src' => URL of photo
- * 'zrl' => true or false, use zid in url
- * 'style' => CSS string
- * URL must be an http or https URL
+ * @brief Widget to display a single photo.
+ *
+ * @param array $arr associative array with
+ * * \e string \b src URL of photo; URL must be an http or https URL
+ * * \e boolean \b zrl use zid in URL
+ * * \e string \b style CSS string
+ *
+ * @return string with parsed HTML
*/
-
function widget_photo($arr) {
$style = $zrl = false;
@@ -1142,7 +1135,7 @@ function widget_photo($arr) {
if(array_key_exists('src', $arr) && isset($arr['src']))
$url = $arr['src'];
- if(strpos($url,'http') !== 0)
+ if(strpos($url, 'http') !== 0)
return '';
if(array_key_exists('style', $arr) && isset($arr['style']))
@@ -1150,7 +1143,7 @@ function widget_photo($arr) {
// ensure they can't sneak in an eval(js) function
- if(strpbrk($style,'(\'"<>') !== false)
+ if(strpbrk($style, '(\'"<>') !== false)
$style = '';
if(array_key_exists('zrl', $arr) && isset($arr['zrl']))
@@ -1161,8 +1154,8 @@ function widget_photo($arr) {
$o = '<div class="widget">';
- $o .= '<img ' . (($zrl) ? ' class="zrl" ' : '')
- . (($style) ? ' style="' . $style . '"' : '')
+ $o .= '<img ' . (($zrl) ? ' class="zrl" ' : '')
+ . (($style) ? ' style="' . $style . '"' : '')
. ' src="' . $url . '" alt="' . t('photo/image') . '">';
$o .= '</div>';
@@ -1175,7 +1168,7 @@ function widget_cover_photo($arr) {
require_once('include/channel.php');
$o = '';
-
+
if(App::$module == 'channel' && $_REQUEST['mid'])
return '';
@@ -1191,7 +1184,7 @@ function widget_cover_photo($arr) {
if(array_key_exists('style', $arr) && isset($arr['style']))
$style = $arr['style'];
- else
+ else
$style = 'width:100%; height: auto;';
// ensure they can't sneak in an eval(js) function
@@ -1273,8 +1266,8 @@ function widget_photo_rand($arr) {
$o = '<div class="widget">';
- $o .= '<img class="zrl" '
- . (($style) ? ' style="' . $style . '"' : '')
+ $o .= '<img class="zrl" '
+ . (($style) ? ' style="' . $style . '"' : '')
. ' src="' . $url . '" alt="' . t('photo/image') . '">';
$o .= '</div>';
@@ -1304,7 +1297,7 @@ function widget_random_block($arr) {
$randfunc = db_getfunc('RAND');
$r = q("select item.* from item left join iconfig on item.id = iconfig.iid
- where item.uid = %d and iconfig.cat = 'system' and iconfig.v like '%s' and iconfig.k = 'BUILDBLOCK' and
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.v like '%s' and iconfig.k = 'BUILDBLOCK' and
item_type = %d $sql_options order by $randfunc limit 1",
intval($channel_id),
dbesc('%' . $contains . '%'),
@@ -1411,14 +1404,23 @@ function widget_forums($arr) {
$perms_sql = item_permissions_sql(local_channel()) . item_normal();
- /**
- * We used to try and find public forums with custom permissions by checking to see if
- * send_stream was false and tag_deliver was true. However with the newer extensible
- * permissions infrastructure this makes for a very complicated query. Now we're only
- * checking channels that report themselves specifically as pubforums
- */
+ $xf = false;
- $r1 = q("select abook_id, xchan_hash, xchan_name, xchan_url, xchan_photo_s from abook left join xchan on abook_xchan = xchan_hash where xchan_pubforum = 1 and xchan_deleted = 0 and abook_channel = %d order by xchan_name $limit ",
+ $x1 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'send_stream' and v = '0'",
+ intval(local_channel())
+ );
+ if($x1) {
+ $xc = ids_to_querystr($x1,'xchan',true);
+ $x2 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'tag_deliver' and v = '1' and xchan in (" . $xc . ") ",
+ intval(local_channel())
+ );
+ if($x2)
+ $xf = ids_to_querystr($x2,'xchan',true);
+ }
+
+ $sql_extra = (($xf) ? " and ( xchan_hash in (" . $xf . ") or xchan_pubforum = 1 ) " : " and xchan_pubforum = 1 ");
+
+ $r1 = q("select abook_id, xchan_hash, xchan_name, xchan_url, xchan_photo_s from abook left join xchan on abook_xchan = xchan_hash where xchan_deleted = 0 and abook_channel = %d $sql_extra order by xchan_name $limit ",
intval(local_channel())
);
if(! $r1)
@@ -1440,11 +1442,11 @@ function widget_forums($arr) {
/**
* @FIXME
* This SQL makes the counts correct when you get forum posts arriving from different routes/sources
- * (like personal channels). However the network query for these posts doesn't yet include this
- * correction and it makes the SQL for that query pretty hairy so this is left as a future exercise.
+ * (like personal channels). However the network query for these posts doesn't yet include this
+ * correction and it makes the SQL for that query pretty hairy so this is left as a future exercise.
* It may make more sense in that query to look for the mention in the body rather than another join,
* but that makes it very inefficient.
- *
+ *
$r = q("select sum(item_unseen) as unseen from item left join term on oid = id where otype = %d and owner_xchan != '%s' and item.uid = %d and url = '%s' and ttype = %d $perms_sql ",
intval(TERM_OBJ_POST),
dbesc($r1[$x]['xchan_hash']),
@@ -1457,7 +1459,7 @@ function widget_forums($arr) {
*
* end @FIXME
*/
-
+
}
if($r1) {
@@ -1471,7 +1473,7 @@ function widget_forums($arr) {
}
$o .= '</ul></div>';
}
- return $o;
+ return $o;
}
@@ -1489,7 +1491,7 @@ function widget_tasklist($arr) {
$(".tasklist-tasks").html(data.html);
});
}
- </script>';
+ </script>';
$o .= '<div class="widget">' . '<h3>' . t('Tasks') . '</h3><div class="tasklist-tasks">';
$o .= '</div><form id="tasklist-new-form" action="" ><input id="tasklist-new-summary" type="text" name="summary" value="" /></form>';
@@ -1502,7 +1504,6 @@ function widget_tasklist($arr) {
function widget_helpindex($arr) {
$o .= '<div class="widget">';
- $o .= '<h3>' . t('Documentation') . '</h3>';
$level_0 = get_help_content('sitetoc');
if(! $level_0)
@@ -1516,7 +1517,7 @@ function widget_helpindex($arr) {
if(argc() > 2) {
$path = '';
for($x = 1; $x < argc(); $x ++) {
- $path .= argv($x) . '/';
+ $path .= argv($x) . '/';
$y = get_help_content($path . 'sitetoc');
if(! $y)
$y = get_help_content($path . 'toc');
@@ -1590,7 +1591,7 @@ function widget_admin($arr) {
call_hooks('admin_aside',$arr);
$o .= replace_macros(get_markup_template('admin_aside.tpl'), array(
- '$admin' => $aside,
+ '$admin' => $aside,
'$admtxt' => t('Admin'),
'$plugadmtxt' => t('Plugin Features'),
'$plugins' => $plugins,
@@ -1620,7 +1621,7 @@ function widget_album($args) {
if($args['title'])
$title = $args['title'];
- /**
+ /**
* This may return incorrect permissions if you have multiple directories of the same name.
* It is a limitation of the photo table using a name for a photo album instead of a folder hash
*/
@@ -1640,7 +1641,7 @@ function widget_album($args) {
$order = 'DESC';
$r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.imgscale, p.description, p.created FROM photo p INNER JOIN
- (SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) $sql_extra GROUP BY resource_id) ph
+ (SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) $sql_extra GROUP BY resource_id) ph
ON (p.resource_id = ph.resource_id AND p.imgscale = ph.imgscale)
ORDER BY created $order ",
intval($owner_uid),
@@ -1648,7 +1649,7 @@ function widget_album($args) {
intval(PHOTO_NORMAL),
intval(PHOTO_PROFILE)
);
-
+
//edit album name
$album_edit = null;
@@ -1661,7 +1662,7 @@ function widget_album($args) {
$twist = 'rotleft';
else
$twist = 'rotright';
-
+
$ext = $phototypes[$rr['mimetype']];
$imgalt_e = $rr['filename'];
diff --git a/include/wiki.php b/include/wiki.php
index d52308b08..332d4efe0 100644
--- a/include/wiki.php
+++ b/include/wiki.php
@@ -13,11 +13,15 @@ function wiki_list($channel, $observer_hash) {
dbesc(WIKI_ITEM_RESOURCE_TYPE),
intval($channel['channel_id'])
);
- foreach($wikis as &$w) {
- $w['rawName'] = get_iconfig($w, 'wiki', 'rawName');
- $w['htmlName'] = get_iconfig($w, 'wiki', 'htmlName');
- $w['urlName'] = get_iconfig($w, 'wiki', 'urlName');
- $w['path'] = get_iconfig($w, 'wiki', 'path');
+ if($wikis) {
+ foreach($wikis as &$w) {
+ $w['rawName'] = get_iconfig($w, 'wiki', 'rawName');
+ $w['htmlName'] = get_iconfig($w, 'wiki', 'htmlName');
+ $w['urlName'] = get_iconfig($w, 'wiki', 'urlName');
+ $w['path'] = get_iconfig($w, 'wiki', 'path');
+ $w['mimeType'] = get_iconfig($w, 'wiki', 'mimeType');
+ $w['lock'] = (($w['allow_cid'] || $w['allow_gid'] || $w['deny_cid'] || $w['deny_gid']) ? true : false);
+ }
}
// TODO: query db for wikis the observer can access. Return with two lists, for read and write access
return array('wikis' => $wikis);
@@ -29,14 +33,30 @@ function wiki_page_list($resource_id) {
if (!$w['path']) {
return array('pages' => null, 'wiki' => null);
}
- $pages = array();
+
+ $pages[] = [
+ 'resource_id' => '',
+ 'title' => 'Home',
+ 'url' => 'Home',
+ 'link_id' => 'id_wiki_home_0'
+ ];
+
if (is_dir($w['path']) === true) {
$files = array_diff(scandir($w['path']), array('.', '..', '.git'));
// TODO: Check that the files are all text files
-
+ $i = 1;
foreach($files as $file) {
- // strip the .md file extension and unwrap URL encoding to leave HTML encoded name
- $pages[] = array('title' => urldecode(substr($file, 0, -3)), 'url' => urlencode(substr($file, 0, -3)));
+ // strip the file extension and unwrap URL encoding to leave HTML encoded name
+ $title = substr($file, 0, strrpos($file,'.'));
+ if(urldecode($title) !== 'Home') {
+ $pages[] = [
+ 'resource_id' => $resource_id,
+ 'title' => urldecode($title),
+ 'url' => $title,
+ 'link_id' => 'id_' . substr($resource_id, 0, 10) . '_' . $i
+ ];
+ $i++;
+ }
}
}
@@ -73,7 +93,7 @@ function wiki_create_wiki($channel, $observer_hash, $wiki, $acl) {
$resource_id = random_string();
$r = q("SELECT mid FROM item WHERE resource_id = '%s' AND resource_type = '%s' AND uid = %d LIMIT 1",
dbesc($resource_id),
- dbesc(WIKI_ITEM_RESOURCE_TYPE),
+ dbesc(WIKI_ITEM_RESOURCE_TYPE),
intval($channel['channel_id'])
);
if (count($r))
@@ -121,12 +141,15 @@ function wiki_create_wiki($channel, $observer_hash, $wiki, $acl) {
if (!set_iconfig($arr, 'wiki', 'urlName', $wiki['urlName'], true)) {
return array('item' => null, 'success' => false);
}
+ if (!set_iconfig($arr, 'wiki', 'mimeType', $wiki['mimeType'], true)) {
+ return array('item' => null, 'success' => false);
+ }
$post = item_store($arr);
$item_id = $post['item_id'];
if ($item_id) {
- proc_run('php', "include/notifier.php", "activity", $item_id);
- return array('item' => $arr, 'success' => true);
+ \Zotlabs\Daemon\Master::Summon(array('Notifier', 'activity', $item_id));
+ return array('item' => $post['item'], 'success' => true);
} else {
return array('item' => null, 'success' => false);
}
@@ -150,8 +173,8 @@ function wiki_delete_wiki($resource_id) {
function wiki_get_wiki($resource_id) {
$item = q("SELECT * FROM item WHERE resource_type = '%s' AND resource_id = '%s' AND item_deleted = 0 limit 1",
- dbesc(WIKI_ITEM_RESOURCE_TYPE),
- dbesc($resource_id)
+ dbesc(WIKI_ITEM_RESOURCE_TYPE),
+ dbesc($resource_id)
);
if (!$item) {
return array('wiki' => null, 'path' => null);
@@ -161,17 +184,21 @@ function wiki_get_wiki($resource_id) {
$rawName = get_iconfig($w, 'wiki', 'rawName');
$htmlName = get_iconfig($w, 'wiki', 'htmlName');
$urlName = get_iconfig($w, 'wiki', 'urlName');
+ $mimeType = get_iconfig($w, 'wiki', 'mimeType');
+
$path = get_iconfig($w, 'wiki', 'path');
if (!realpath(__DIR__ . '/../' . $path)) {
return array('wiki' => null, 'path' => null);
}
// Path to wiki exists
$abs_path = realpath(__DIR__ . '/../' . $path);
- return array( 'wiki' => $w,
- 'path' => $abs_path,
- 'rawName' => $rawName,
- 'htmlName' => $htmlName,
- 'urlName' => $urlName
+ return array(
+ 'wiki' => $w,
+ 'path' => $abs_path,
+ 'rawName' => $rawName,
+ 'htmlName' => $htmlName,
+ 'urlName' => $urlName,
+ 'mimeType' => $mimeType
);
}
}
@@ -192,22 +219,23 @@ function wiki_exists_by_name($uid, $urlName) {
function wiki_get_permissions($resource_id, $owner_id, $observer_hash) {
// TODO: For now, only the owner can edit
$sql_extra = item_permissions_sql($owner_id, $observer_hash);
- $r = q("SELECT * FROM item WHERE resource_type = '%s' AND resource_id = '%s' $sql_extra LIMIT 1",
- dbesc(WIKI_ITEM_RESOURCE_TYPE),
- dbesc($resource_id)
- );
-
+
+ if(local_channel() && local_channel == $owner_id) {
+ return [ 'read' => true, 'write' => true, 'success' => true ];
+ }
+
+ $r = q("SELECT * FROM item WHERE uid = %d and resource_type = '%s' AND resource_id = '%s' $sql_extra LIMIT 1",
+ intval($owner_id),
+ dbesc(WIKI_ITEM_RESOURCE_TYPE),
+ dbesc($resource_id)
+ );
+
if (!$r) {
return array('read' => false, 'write' => false, 'success' => true);
} else {
- $perms = get_all_perms($owner_id, $observer_hash);
// TODO: Create a new permission setting for wiki analogous to webpages. Until
// then, use webpage permissions
- if (!$perms['write_pages']) {
- $write = false;
- } else {
- $write = true;
- }
+ $write = perm_is_allowed($owner_id, $observer_hash,'write_pages');
return array('read' => true, 'write' => $write, 'success' => true);
}
}
@@ -217,7 +245,8 @@ function wiki_create_page($name, $resource_id) {
if (!$w['path']) {
return array('page' => null, 'wiki' => null, 'message' => 'Wiki not found.', 'success' => false);
}
- $page = array('rawName' => $name, 'htmlName' => escape_tags($name), 'urlName' => urlencode(escape_tags($name)), 'fileName' => urlencode(escape_tags($name)).'.md');
+
+ $page = array('rawName' => $name, 'htmlName' => escape_tags($name), 'urlName' => urlencode(escape_tags($name)), 'fileName' => urlencode(escape_tags($name)) . wiki_get_file_ext($w));
$page_path = $w['path'] . '/' . $page['fileName'];
if (is_file($page_path)) {
return array('page' => null, 'wiki' => null, 'message' => 'Page already exists.', 'success' => false);
@@ -239,11 +268,11 @@ function wiki_rename_page($arr) {
if (!$w['path']) {
return array('message' => 'Wiki not found.', 'success' => false);
}
- $page_path_old = $w['path'].'/'.$pageUrlName.'.md';
+ $page_path_old = $w['path'] . '/' . $pageUrlName . wiki_get_file_ext($w);
if (!is_readable($page_path_old) === true) {
return array('message' => 'Cannot read wiki page: ' . $page_path_old, 'success' => false);
}
- $page = array('rawName' => $pageNewName, 'htmlName' => escape_tags($pageNewName), 'urlName' => urlencode(escape_tags($pageNewName)), 'fileName' => urlencode(escape_tags($pageNewName)).'.md');
+ $page = array('rawName' => $pageNewName, 'htmlName' => escape_tags($pageNewName), 'urlName' => urlencode(escape_tags($pageNewName)), 'fileName' => urlencode(escape_tags($pageNewName)) . wiki_get_file_ext($w));
$page_path_new = $w['path'] . '/' . $page['fileName'] ;
if (is_file($page_path_new)) {
return array('message' => 'Page already exists.', 'success' => false);
@@ -264,7 +293,7 @@ function wiki_get_page_content($arr) {
if (!$w['path']) {
return array('content' => null, 'message' => 'Error reading wiki', 'success' => false);
}
- $page_path = $w['path'].'/'.$pageUrlName.'.md';
+ $page_path = $w['path'] . '/' . $pageUrlName . wiki_get_file_ext($w);
if (is_readable($page_path) === true) {
if(filesize($page_path) === 0) {
$content = '';
@@ -275,7 +304,7 @@ function wiki_get_page_content($arr) {
}
}
// TODO: Check that the files are all text files
- return array('content' => json_encode($content), 'message' => '', 'success' => true);
+ return array('content' => json_encode($content), 'mimeType' => $w['mimeType'], 'message' => '', 'success' => true);
}
}
@@ -286,7 +315,7 @@ function wiki_page_history($arr) {
if (!$w['path']) {
return array('history' => null, 'message' => 'Error reading wiki', 'success' => false);
}
- $page_path = $w['path'].'/'.$pageUrlName.'.md';
+ $page_path = $w['path'] . '/' . $pageUrlName . wiki_get_file_ext($w);
if (!is_readable($page_path) === true) {
return array('history' => null, 'message' => 'Cannot read wiki page: ' . $page_path, 'success' => false);
}
@@ -311,12 +340,14 @@ function wiki_save_page($arr) {
if (!$w['path']) {
return array('message' => 'Error reading wiki', 'success' => false);
}
- $page_path = $w['path'].'/'.$pageUrlName.'.md';
+
+ $fileName = $pageUrlName . wiki_get_file_ext($w);
+ $page_path = $w['path'] . '/' . $fileName;
if (is_writable($page_path) === true) {
if(!file_put_contents($page_path, $content)) {
return array('message' => 'Error writing to page file', 'success' => false);
}
- return array('message' => '', 'success' => true);
+ return array('message' => '', 'filename' => $filename, 'success' => true);
} else {
return array('message' => 'Page file not writable', 'success' => false);
}
@@ -329,7 +360,7 @@ function wiki_delete_page($arr) {
if (!$w['path']) {
return array('message' => 'Error reading wiki', 'success' => false);
}
- $page_path = $w['path'].'/'.$pageUrlName.'.md';
+ $page_path = $w['path'] . '/' . $pageUrlName . wiki_get_file_ext($w);
if (is_writable($page_path) === true) {
if(!unlink($page_path)) {
return array('message' => 'Error deleting page file', 'success' => false);
@@ -351,7 +382,7 @@ function wiki_revert_page($arr) {
if (!$w['path']) {
return array('content' => $content, 'message' => 'Error reading wiki', 'success' => false);
}
- $page_path = $w['path'].'/'.$pageUrlName.'.md';
+ $page_path = $w['path'] . '/' . $pageUrlName . wiki_get_file_ext($w);
if (is_writable($page_path) === true) {
$reponame = ((array_key_exists('title', $w['wiki'])) ? urlencode($w['wiki']['title']) : 'repo');
@@ -363,7 +394,7 @@ function wiki_revert_page($arr) {
try {
$git->setIdentity($observer['xchan_name'], $observer['xchan_addr']);
foreach ($git->git->tree($commitHash) as $object) {
- if ($object['type'] == 'blob' && $object['file'] === $pageUrlName.'.md' ) {
+ if ($object['type'] == 'blob' && $object['file'] === $pageUrlName . wiki_get_file_ext($w)) {
$content = $git->git->cat->blob($object['hash']);
}
}
@@ -388,7 +419,7 @@ function wiki_compare_page($arr) {
if (!$w['path']) {
return array('message' => 'Error reading wiki', 'success' => false);
}
- $page_path = $w['path'].'/'.$pageUrlName.'.md';
+ $page_path = $w['path'] . '/' . $pageUrlName . wiki_get_file_ext($w);
if (is_readable($page_path) === true) {
$reponame = ((array_key_exists('title', $w['wiki'])) ? urlencode($w['wiki']['title']) : 'repo');
if($reponame === '') {
@@ -398,12 +429,12 @@ function wiki_compare_page($arr) {
$compareContent = $currentContent = '';
try {
foreach ($git->git->tree($currentCommit) as $object) {
- if ($object['type'] == 'blob' && $object['file'] === $pageUrlName.'.md' ) {
+ if ($object['type'] == 'blob' && $object['file'] === $pageUrlName . wiki_get_file_ext($w)) {
$currentContent = $git->git->cat->blob($object['hash']);
}
}
foreach ($git->git->tree($compareCommit) as $object) {
- if ($object['type'] == 'blob' && $object['file'] === $pageUrlName.'.md' ) {
+ if ($object['type'] == 'blob' && $object['file'] === $pageUrlName . wiki_get_file_ext($w)) {
$compareContent = $git->git->cat->blob($object['hash']);
}
}
@@ -466,15 +497,6 @@ function wiki_git_commit($arr) {
}
}
-function wiki_generate_page_filename($name) {
- $file = urlencode(escape_tags($name));
- if( $file === '') {
- return null;
- } else {
- return $file . '.md';
- }
-}
-
function wiki_convert_links($s, $wikiURL) {
if (strpos($s,'[[') !== false) {
@@ -502,7 +524,6 @@ function wiki_convert_links($s, $wikiURL) {
* @return string
*/
function wiki_generate_toc($s) {
-
if (strpos($s,'[toc]') !== false) {
//$toc_md = wiki_toc($s); // Generate Markdown-formatted list prior to HTML render
$toc_md = '<ul id="wiki-toc"></ul>'; // use the available jQuery plugin http://ndabas.github.io/toc/
@@ -544,6 +565,13 @@ function wiki_bbcode($s) {
return $s;
}
+function wiki_get_file_ext($arr) {
+ if($arr['mimeType'] == 'text/bbcode')
+ return '.bb';
+ else
+ return '.md';
+}
+
// This function is derived from
// http://stackoverflow.com/questions/32068537/generate-table-of-contents-from-markdown-in-php
function wiki_toc($content) {
@@ -552,36 +580,36 @@ function wiki_toc($content) {
// look for markdown TOC items
preg_match_all(
- '/^(?:=|-|#).*$/m',
- $source,
- $matches,
- PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE
+ '/^(?:=|-|#).*$/m',
+ $source,
+ $matches,
+ PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE
);
// preprocess: iterate matched lines to create an array of items
// where each item is an array(level, text)
$file_size = strlen($source);
foreach ($matches[0] as $item) {
- $found_mark = substr($item[0], 0, 1);
- if ($found_mark == '#') {
- // text is the found item
- $item_text = $item[0];
- $item_level = strrpos($item_text, '#') + 1;
- $item_text = substr($item_text, $item_level);
- } else {
- // text is the previous line (empty if <hr>)
- $item_offset = $item[1];
- $prev_line_offset = strrpos($source, "\n", -($file_size - $item_offset + 2));
- $item_text =
- substr($source, $prev_line_offset, $item_offset - $prev_line_offset - 1);
- $item_text = trim($item_text);
- $item_level = $found_mark == '=' ? 1 : 2;
- }
- if (!trim($item_text) OR strpos($item_text, '|') !== FALSE) {
- // item is an horizontal separator or a table header, don't mind
- continue;
- }
- $raw_toc[] = ['level' => $item_level, 'text' => trim($item_text)];
+ $found_mark = substr($item[0], 0, 1);
+ if ($found_mark == '#') {
+ // text is the found item
+ $item_text = $item[0];
+ $item_level = strrpos($item_text, '#') + 1;
+ $item_text = substr($item_text, $item_level);
+ } else {
+ // text is the previous line (empty if <hr>)
+ $item_offset = $item[1];
+ $prev_line_offset = strrpos($source, "\n", -($file_size - $item_offset + 2));
+ $item_text =
+ substr($source, $prev_line_offset, $item_offset - $prev_line_offset - 1);
+ $item_text = trim($item_text);
+ $item_level = $found_mark == '=' ? 1 : 2;
+ }
+ if (!trim($item_text) OR strpos($item_text, '|') !== FALSE) {
+ // item is an horizontal separator or a table header, don't mind
+ continue;
+ }
+ $raw_toc[] = ['level' => $item_level, 'text' => trim($item_text)];
}
$o = '';
foreach($raw_toc as $t) {
diff --git a/include/zid.php b/include/zid.php
new file mode 100644
index 000000000..ac6433e4c
--- /dev/null
+++ b/include/zid.php
@@ -0,0 +1,232 @@
+<?php
+
+
+function is_matrix_url($url) {
+
+ // in-memory cache to avoid repeated queries for the same host
+ static $remembered = [];
+
+ $m = @parse_url($url);
+ if($m['host']) {
+
+ if(array_key_exists($m['host'],$remembered))
+ return $remembered[$m['host']];
+
+ $r = q("select hubloc_url from hubloc where hubloc_host = '%s' and hubloc_network = 'zot' limit 1",
+ dbesc($m['host'])
+ );
+ if($r) {
+ $remembered[$m['host']] = true;
+ return true;
+ }
+ $remembered[$m['host']] = false;
+ }
+ return false;
+}
+
+/**
+ * @brief Adds a zid parameter to a url.
+ *
+ * @param string $s
+ * The url to accept the zid
+ * @param boolean $address
+ * $address to use instead of session environment
+ * @return string
+ *
+ * @hooks 'zid'
+ * string url - url to accept zid
+ * string zid - urlencoded zid
+ * string result - the return string we calculated, change it if you want to return something else
+ */
+
+function zid($s,$address = '') {
+ if (! strlen($s) || strpos($s,'zid='))
+ return $s;
+
+ $m = parse_url($s);
+ $fragment = ((array_key_exists('fragment',$m) && $m['fragment']) ? $m['fragment'] : false);
+ if($fragment !== false)
+ $s = str_replace('#' . $fragment,'',$s);
+
+ $has_params = ((strpos($s,'?')) ? true : false);
+ $num_slashes = substr_count($s, '/');
+ if (! $has_params)
+ $has_params = ((strpos($s, '&')) ? true : false);
+
+ $achar = strpos($s,'?') ? '&' : '?';
+
+ $mine = get_my_url();
+ $myaddr = (($address) ? $address : get_my_address());
+
+ /**
+ * @FIXME checking against our own channel url is no longer reliable. We may have a lot
+ * of urls attached to out channel. Should probably match against our site, since we
+ * will not need to remote authenticate on our own site anyway.
+ */
+
+ if ($mine && $myaddr && (! link_compare($mine,$s)))
+ $zurl = $s . (($num_slashes >= 3) ? '' : '/') . $achar . 'zid=' . urlencode($myaddr);
+ else
+ $zurl = $s;
+
+ // put fragment at the end
+
+ if($fragment)
+ $zurl .= '#' . $fragment;
+
+ $arr = array('url' => $s, 'zid' => urlencode($myaddr), 'result' => $zurl);
+ call_hooks('zid', $arr);
+
+ return $arr['result'];
+}
+
+
+function strip_zids($s) {
+ return preg_replace('/[\?&]zid=(.*?)(&|$)/ism','$2',$s);
+}
+
+function strip_zats($s) {
+ return preg_replace('/[\?&]zat=(.*?)(&|$)/ism','$2',$s);
+}
+
+
+/**
+ * zidify_callback() and zidify_links() work together to turn any HTML a tags with class="zrl" into zid links
+ * These will typically be generated by a bbcode '[zrl]' tag. This is done inside prepare_text() rather than bbcode()
+ * because the latter is used for general purpose conversions and the former is used only when preparing text for
+ * immediate display.
+ *
+ * Issues: Currently the order of HTML parameters in the text is somewhat rigid and inflexible.
+ * We assume it looks like \<a class="zrl" href="xxxxxxxxxx"\> and will not work if zrl and href appear in a different order.
+ *
+ * @param array $match
+ * @return string
+ */
+function zidify_callback($match) {
+ $is_zid = ((feature_enabled(local_channel(),'sendzid')) || (strpos($match[1],'zrl')) ? true : false);
+ $replace = '<a' . $match[1] . ' href="' . (($is_zid) ? zid($match[2]) : $match[2]) . '"';
+ $x = str_replace($match[0],$replace,$match[0]);
+
+ return $x;
+}
+
+function zidify_img_callback($match) {
+ $is_zid = ((feature_enabled(local_channel(),'sendzid')) || (strpos($match[1],'zrl')) ? true : false);
+ $replace = '<img' . $match[1] . ' src="' . (($is_zid) ? zid($match[2]) : $match[2]) . '"';
+
+ $x = str_replace($match[0],$replace,$match[0]);
+
+ return $x;
+}
+
+
+function zidify_links($s) {
+ $s = preg_replace_callback('/\<a(.*?)href\=\"(.*?)\"/ism','zidify_callback',$s);
+ $s = preg_replace_callback('/\<img(.*?)src\=\"(.*?)\"/ism','zidify_img_callback',$s);
+
+ return $s;
+}
+
+
+
+
+function zidify_text_callback($match) {
+ $is_zid = is_matrix_url($match[2]);
+ $replace = '<a' . $match[1] . ' href="' . (($is_zid) ? zid($match[2]) : $match[2]) . '"';
+ $x = str_replace($match[0],$replace,$match[0]);
+
+ return $x;
+}
+
+function zidify_text_img_callback($match) {
+ $is_zid = is_matrix_url($match[2]);
+ $replace = '<img' . $match[1] . ' src="' . (($is_zid) ? zid($match[2]) : $match[2]) . '"';
+
+ $x = str_replace($match[0],$replace,$match[0]);
+
+ return $x;
+}
+
+function zidify_text($s) {
+
+ $s = preg_replace_callback('/\<a(.*?)href\=\"(.*?)\"/ism','zidify_text_callback',$s);
+ $s = preg_replace_callback('/\<img(.*?)src\=\"(.*?)\"/ism','zidify_text_img_callback',$s);
+
+ return $s;
+
+
+}
+
+
+/**
+ * @brief preg_match function when fixing 'naked' links in mod item.php.
+ *
+ * Check if we've got a hubloc for the site and use a zrl if we do, a url if we don't.
+ * Remove any existing zid= param which may have been pasted by mistake - and will have
+ * the author's credentials. zid's are dynamic and can't really be passed around like
+ * that.
+ *
+ * @param array $matches
+ * @return string
+ */
+function red_zrl_callback($matches) {
+ require_once('include/hubloc.php');
+ $zrl = is_matrix_url($matches[2]);
+
+ $t = strip_zids($matches[2]);
+ if($t !== $matches[2]) {
+ $zrl = true;
+ $matches[2] = $t;
+ }
+
+ if($matches[1] === '#^')
+ $matches[1] = '';
+ if($zrl)
+ return $matches[1] . '#^[zrl=' . $matches[2] . ']' . $matches[2] . '[/zrl]';
+
+ return $matches[1] . '#^[url=' . $matches[2] . ']' . $matches[2] . '[/url]';
+}
+
+/**
+ * If we've got a url or zrl tag with a naked url somewhere in the link text,
+ * escape it with quotes unless the naked url is a linked photo.
+ *
+ * @param array $matches
+ * @return string
+ */
+
+function red_escape_zrl_callback($matches) {
+
+ // Uncertain why the url/zrl forms weren't picked up by the non-greedy regex.
+
+ if((strpos($matches[3], 'zmg') !== false) || (strpos($matches[3], 'img') !== false) || (strpos($matches[3],'zrl') !== false) || (strpos($matches[3],'url') !== false))
+ return $matches[0];
+
+ return '[' . $matches[1] . 'rl' . $matches[2] . ']' . $matches[3] . '"' . $matches[4] . '"' . $matches[5] . '[/' . $matches[6] . 'rl]';
+}
+
+function red_escape_codeblock($m) {
+ return '[$b64' . $m[2] . base64_encode($m[1]) . '[/' . $m[2] . ']';
+}
+
+function red_unescape_codeblock($m) {
+ return '[' . $m[2] . base64_decode($m[1]) . '[/' . $m[2] . ']';
+}
+
+
+function red_zrlify_img_callback($matches) {
+ require_once('include/hubloc.php');
+ $zrl = is_matrix_url($matches[2]);
+
+ $t = strip_zids($matches[2]);
+ if($t !== $matches[2]) {
+ $zrl = true;
+ $matches[2] = $t;
+ }
+
+ if($zrl)
+ return '[zmg' . $matches[1] . ']' . $matches[2] . '[/zmg]';
+
+ return $matches[0];
+}
+
diff --git a/include/zot.php b/include/zot.php
index 572cbaef8..77843c35b 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -110,20 +110,21 @@ function zot_get_hublocs($hash) {
* @param string $extra
* @returns string json encoded zot packet
*/
-function zot_build_packet($channel, $type = 'notify', $recipients = null, $remote_key = null, $secret = null, $extra = null) {
+function zot_build_packet($channel, $type = 'notify', $recipients = null, $remote_key = null, $methods = '', $secret = null, $extra = null) {
- $data = array(
+ $data = [
'type' => $type,
- 'sender' => array(
+ 'sender' => [
'guid' => $channel['channel_guid'],
'guid_sig' => base64url_encode(rsa_sign($channel['channel_guid'],$channel['channel_prvkey'])),
'url' => z_root(),
'url_sig' => base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey'])),
'sitekey' => get_config('system','pubkey')
- ),
+ ],
'callback' => '/post',
- 'version' => ZOT_REVISION
- );
+ 'version' => ZOT_REVISION,
+ 'encryption' => crypto_methods()
+ ];
if ($recipients) {
for ($x = 0; $x < count($recipients); $x ++)
@@ -146,120 +147,67 @@ function zot_build_packet($channel, $type = 'notify', $recipients = null, $remot
// Hush-hush ultra top-secret mode
- if ($remote_key) {
- $data = crypto_encapsulate(json_encode($data),$remote_key);
+ if($remote_key) {
+ $algorithm = zot_best_algorithm($methods);
+ $data = crypto_encapsulate(json_encode($data),$remote_key, $algorithm);
}
return json_encode($data);
}
/**
- * @brief
- *
- * @see z_post_url()
- *
- * @param string $url
- * @param array $data
- * @return array see z_post_url() for returned data format
- */
-function zot_zot($url, $data) {
- return z_post_url($url, array('data' => $data));
-}
-
-/**
- * @brief Look up information about channel.
- *
- * @param string $webbie
- * does not have to be host qualified e.g. 'foo' is treated as 'foo\@thishub'
- * @param array $channel
- * (optional), if supplied permissions will be enumerated specifically for $channel
- * @param boolean $autofallback
- * fallback/failover to http if https connection cannot be established. Default is true.
- *
- * @return array see z_post_url() and \ref mod/zfinger.php
+ * @brief choose best encryption function from those available on both sites
+ *
+ * @param string $methods
+ * comma separated list of encryption methods
+ * @return string first match from our site method preferences crypto_methods() array
+ * of a method which is common to both sites; or 'aes256cbc' if no matches are found.
*/
-function zot_finger($webbie, $channel = null, $autofallback = true) {
-
- if (strpos($webbie,'@') === false) {
- $address = $webbie;
- $host = App::get_hostname();
- } else {
- $address = substr($webbie,0,strpos($webbie,'@'));
- $host = substr($webbie,strpos($webbie,'@')+1);
- }
-
- $xchan_addr = $address . '@' . $host;
-
- if ((! $address) || (! $xchan_addr)) {
- logger('zot_finger: no address :' . $webbie);
- return array('success' => false);
- }
- logger('using xchan_addr: ' . $xchan_addr, LOGGER_DATA, LOG_DEBUG);
- // potential issue here; the xchan_addr points to the primary hub.
- // The webbie we were called with may not, so it might not be found
- // unless we query for hubloc_addr instead of xchan_addr
+function zot_best_algorithm($methods) {
- $r = q("select xchan.*, hubloc.* from xchan
- left join hubloc on xchan_hash = hubloc_hash
- where xchan_addr = '%s' and hubloc_primary = 1 limit 1",
- dbesc($xchan_addr)
- );
-
- if ($r) {
- $url = $r[0]['hubloc_url'];
+ if(\Zotlabs\Lib\System::get_server_role() !== 'pro')
+ return 'aes256cbc';
- if ($r[0]['hubloc_network'] && $r[0]['hubloc_network'] !== 'zot') {
- logger('zot_finger: alternate network: ' . $webbie);
- logger('url: '.$url.', net: '.var_export($r[0]['hubloc_network'],true), LOGGER_DATA, LOG_DEBUG);
- return array('success' => false);
+ if($methods) {
+ $x = explode(',',$methods);
+ if($x) {
+ $y = crypto_methods();
+ if($y) {
+ foreach($y as $yv) {
+ $yv = trim($yv);
+ if(in_array($yv,$x)) {
+ return($yv);
+ }
+ }
+ }
}
- } else {
- $url = 'https://' . $host;
}
- $rhs = '/.well-known/zot-info';
- $https = ((strpos($url,'https://') === 0) ? true : false);
-
- logger('zot_finger: ' . $address . ' at ' . $url, LOGGER_DEBUG);
-
- if ($channel) {
- $postvars = array(
- 'address' => $address,
- 'target' => $channel['channel_guid'],
- 'target_sig' => $channel['channel_guid_sig'],
- 'key' => $channel['channel_pubkey']
- );
-
- $result = z_post_url($url . $rhs,$postvars);
-
- if ((! $result['success']) && ($autofallback)) {
- if ($https) {
- logger('zot_finger: https failed. falling back to http');
- $result = z_post_url('http://' . $host . $rhs,$postvars);
- }
- }
- } else {
- $rhs .= '?f=&address=' . urlencode($address);
+ return 'aes256cbc';
+}
- $result = z_fetch_url($url . $rhs);
- if ((! $result['success']) && ($autofallback)) {
- if ($https) {
- logger('zot_finger: https failed. falling back to http');
- $result = z_fetch_url('http://' . $host . $rhs);
- }
- }
- }
- if (! $result['success'])
- logger('zot_finger: no results');
- return $result;
+/**
+ * @brief
+ *
+ * @see z_post_url()
+ *
+ * @param string $url
+ * @param array $data
+ * @return array see z_post_url() for returned data format
+ */
+function zot_zot($url, $data) {
+ return z_post_url($url, array('data' => $data));
}
/**
* @brief Refreshes after permission changed or friending, etc.
*
+ * The top half of this function is similar to \Zotlabs\Zot\Finger::run() and could potentially be
+ * consolidated.
+ *
* zot_refresh is typically invoked when somebody has changed permissions of a channel and they are notified
* to fetch new permissions via a finger/discovery operation. This may result in a new connection
* (abook entry) being added to a local channel and it may result in auto-permissions being granted.
@@ -281,6 +229,7 @@ function zot_finger($webbie, $channel = null, $autofallback = true) {
*
* @returns boolean true if successful, else false
*/
+
function zot_refresh($them, $channel = null, $force = false) {
if (array_key_exists('xchan_network', $them) && ($them['xchan_network'] !== 'zot')) {
@@ -296,12 +245,13 @@ function zot_refresh($them, $channel = null, $force = false) {
if ($them['hubloc_url']) {
$url = $them['hubloc_url'];
- } else {
+ }
+ else {
$r = null;
// if they re-installed the server we could end up with the wrong record - pointing to the old install.
// We'll order by reverse id to try and pick off the newest one first and hopefully end up with the
- // correct hubloc. If this doesn't work we may have to re-write this section to try them all.
+ // correct hubloc. If this doesn't work we may have to re-write this section to try them all.
if(array_key_exists('xchan_addr',$them) && $them['xchan_addr']) {
$r = q("select hubloc_url, hubloc_primary from hubloc where hubloc_addr = '%s' order by hubloc_id desc",
@@ -332,7 +282,7 @@ function zot_refresh($them, $channel = null, $force = false) {
$token = random_string();
- $postvars = array();
+ $postvars = [];
$postvars['token'] = $token;
@@ -355,6 +305,8 @@ function zot_refresh($them, $channel = null, $force = false) {
$rhs = '/.well-known/zot-info';
+ logger('zot_refresh: ' . $url, LOGGER_DATA, LOG_INFO);
+
$result = z_post_url($url . $rhs,$postvars);
logger('zot_refresh: zot-info: ' . print_r($result,true), LOGGER_DATA, LOG_DEBUG);
@@ -391,10 +343,13 @@ function zot_refresh($them, $channel = null, $force = false) {
if($channel) {
if($j['permissions']['data']) {
- $permissions = crypto_unencapsulate(array(
+ $permissions = crypto_unencapsulate(
+ [
'data' => $j['permissions']['data'],
'key' => $j['permissions']['key'],
- 'iv' => $j['permissions']['iv']),
+ 'iv' => $j['permissions']['iv'],
+ 'alg' => $j['permissions']['alg']
+ ],
$channel['channel_prvkey']);
if($permissions)
$permissions = json_decode($permissions,true);
@@ -420,6 +375,10 @@ function zot_refresh($them, $channel = null, $force = false) {
$next_birthday = NULL_DATE;
}
+
+ // Keep original perms to check if we need to notify them
+ $previous_perms = get_all_perms($channel['channel_id'],$x['hash']);
+
$r = q("select * from abook where abook_xchan = '%s' and abook_channel = %d and abook_self = 0 limit 1",
dbesc($x['hash']),
intval($channel['channel_id'])
@@ -483,10 +442,6 @@ function zot_refresh($them, $channel = null, $force = false) {
}
}
- // Keep original perms to check if we need to notify them
- $previous_perms = get_all_perms($channel['channel_id'],$x['hash']);
-
-
$closeness = get_pconfig($channel['channel_id'],'system','new_abook_closeness');
if($closeness === false)
$closeness = 80;
@@ -516,13 +471,15 @@ function zot_refresh($them, $channel = null, $force = false) {
if($new_connection) {
if(! \Zotlabs\Access\Permissions::PermsCompare($new_perms,$previous_perms))
Zotlabs\Daemon\Master::Summon(array('Notifier','permission_create',$new_connection[0]['abook_id']));
- Zotlabs\Lib\Enotify::submit(array(
+ Zotlabs\Lib\Enotify::submit(
+ [
'type' => NOTIFY_INTRO,
'from_xchan' => $x['hash'],
'to_xchan' => $channel['channel_hash'],
- 'link' => z_root() . '/connedit/' . $new_connection[0]['abook_id'],
- ));
-
+ 'link' => z_root() . '/connedit/' . $new_connection[0]['abook_id']
+ ]
+ );
+
if(intval($permissions['view_stream'])) {
if(intval(get_pconfig($channel['channel_id'],'perm_limits','send_stream') & PERMS_PENDING)
|| (! intval($new_connection[0]['abook_pending'])))
@@ -531,11 +488,12 @@ function zot_refresh($them, $channel = null, $force = false) {
/** If there is a default group for this channel, add this connection to it */
+
$default_group = $channel['channel_default_group'];
if($default_group) {
require_once('include/group.php');
$g = group_rec_byhash($channel['channel_id'],$default_group);
- if($g)
+ if($g)
group_add_member($channel['channel_id'],'',$x['hash'],$g['id']);
}
@@ -571,11 +529,13 @@ function zot_refresh($them, $channel = null, $force = false) {
* * \e string \b guid_sig => guid signed with conversant's private key
* * \e string \b url => URL of the origination hub of this communication
* * \e string \b url_sig => URL signed with conversant's private key
+ * @param boolean $multiple (optional) default false
*
* @returns array|null null if site is blacklisted or not found, otherwise an
* array with an hubloc record
*/
-function zot_gethub($arr,$multiple = false) {
+
+function zot_gethub($arr, $multiple = false) {
if($arr['guid'] && $arr['guid_sig'] && $arr['url'] && $arr['url_sig']) {
@@ -586,8 +546,8 @@ function zot_gethub($arr,$multiple = false) {
$limit = (($multiple) ? '' : ' limit 1 ');
$sitekey = ((array_key_exists('sitekey',$arr) && $arr['sitekey']) ? " and hubloc_sitekey = '" . protect_sprintf($arr['sitekey']) . "' " : '');
-
- $r = q("select * from hubloc
+
+ $r = q("select hubloc.*, site.site_crypto from hubloc left join site on hubloc_url = site_url
where hubloc_guid = '%s' and hubloc_guid_sig = '%s'
and hubloc_url = '%s' and hubloc_url_sig = '%s'
$sitekey $limit",
@@ -624,9 +584,10 @@ function zot_gethub($arr,$multiple = false) {
* * \b success boolean true or false
* * \b message (optional) error string only if success is false
*/
+
function zot_register_hub($arr) {
- $result = array('success' => false);
+ $result = [ 'success' => false ];
if($arr['url'] && $arr['url_sig'] && $arr['guid'] && $arr['guid_sig']) {
@@ -685,6 +646,7 @@ function zot_register_hub($arr) {
* * \e boolean \b success boolean true or false
* * \e string \b message (optional) error string only if success is false
*/
+
function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) {
call_hooks('import_xchan', $arr);
@@ -754,15 +716,15 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) {
if(intval($r[0]['xchan_pubforum']) != intval($arr['public_forum']))
$pubforum_changed = 1;
- if(($r[0]['xchan_name_date'] != $arr['name_updated'])
- || ($r[0]['xchan_connurl'] != $arr['connections_url'])
+ if(($r[0]['xchan_name_date'] != $arr['name_updated'])
+ || ($r[0]['xchan_connurl'] != $arr['connections_url'])
|| ($r[0]['xchan_addr'] != $arr['address'])
|| ($r[0]['xchan_follow'] != $arr['follow_url'])
- || ($r[0]['xchan_connpage'] != $arr['connect_url'])
+ || ($r[0]['xchan_connpage'] != $arr['connect_url'])
|| ($r[0]['xchan_url'] != $arr['url'])
|| $hidden_changed || $adult_changed || $deleted_changed || $pubforum_changed ) {
- $rup = q("update xchan set xchan_name = '%s', xchan_name_date = '%s', xchan_connurl = '%s', xchan_follow = '%s',
- xchan_connpage = '%s', xchan_hidden = %d, xchan_selfcensored = %d, xchan_deleted = %d, xchan_pubforum = %d,
+ $rup = q("update xchan set xchan_name = '%s', xchan_name_date = '%s', xchan_connurl = '%s', xchan_follow = '%s',
+ xchan_connpage = '%s', xchan_hidden = %d, xchan_selfcensored = %d, xchan_deleted = %d, xchan_pubforum = %d,
xchan_addr = '%s', xchan_url = '%s' where xchan_hash = '%s'",
dbesc(($arr['name']) ? $arr['name'] : '-'),
dbesc($arr['name_updated']),
@@ -783,7 +745,8 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) {
$what .= 'xchan ';
$changed = true;
}
- } else {
+ }
+ else {
$import_photos = true;
if((($arr['site']['directory_mode'] === 'standalone')
@@ -819,7 +782,7 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) {
$changed = true;
}
- if ($import_photos) {
+ if($import_photos) {
require_once('include/photo/photo_driver.php');
@@ -828,9 +791,9 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) {
$local = q("select channel_account_id, channel_id from channel where channel_hash = '%s' limit 1",
dbesc($xchan_hash)
);
- if ($local) {
+ if($local) {
$ph = z_fetch_url($arr['photo'], true);
- if ($ph['success']) {
+ if($ph['success']) {
$hash = import_channel_photo($ph['body'], $arr['photo_mimetype'], $local[0]['channel_account_id'], $local[0]['channel_id']);
@@ -868,11 +831,12 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) {
false
);
}
- } else {
+ }
+ else {
$photos = import_xchan_photo($arr['photo'], $xchan_hash);
}
- if ($photos) {
- if ($photos[4]) {
+ if($photos) {
+ if($photos[4]) {
// importing the photo failed somehow. Leave the photo_date alone so we can try again at a later date.
// This often happens when somebody joins the matrix with a bad cert.
$r = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s'
@@ -883,7 +847,8 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) {
dbesc($photos[3]),
dbesc($xchan_hash)
);
- } else {
+ }
+ else {
$r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s'
where xchan_hash = '%s'",
dbescdate(datetime_convert('UTC','UTC',$arr['photo_updated'])),
@@ -940,7 +905,8 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) {
$what .= 'profile ';
$changed = true;
}
- } else {
+ }
+ else {
logger('import_xchan: profile not available - hiding');
// they may have made it private
$r = q("delete from xprof where xprof_hash = '%s'",
@@ -993,16 +959,17 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) {
* @param array $arr - output of z_post_url()
* @param array $outq - The queue structure attached to this request
*/
+
function zot_process_response($hub, $arr, $outq) {
- if (! $arr['success']) {
+ if(! $arr['success']) {
logger('zot_process_response: failed: ' . $hub);
return;
}
$x = json_decode($arr['body'], true);
- if (! $x) {
+ if(! $x) {
logger('zot_process_response: No json from ' . $hub);
logger('zot_process_response: headers: ' . print_r($arr['header'],true), LOGGER_DATA, LOG_DEBUG);
}
@@ -1022,12 +989,12 @@ function zot_process_response($hub, $arr, $outq) {
}
}
- // we have a more descriptive delivery report, so discard the per hub 'queued' report.
+ // we have a more descriptive delivery report, so discard the per hub 'queued' report.
q("delete from dreport where dreport_queue = '%s' ",
dbesc($outq['outq_hash'])
);
-
+
// update the timestamp for this site
q("update site set site_dead = 0, site_update = '%s' where site_url = '%s'",
@@ -1060,6 +1027,7 @@ function zot_process_response($hub, $arr, $outq) {
* decrypted and json decoded notify packet from remote site
* @return array from zot_import()
*/
+
function zot_fetch($arr) {
logger('zot_fetch: ' . print_r($arr,true), LOGGER_DATA, LOG_DEBUG);
@@ -1068,7 +1036,7 @@ function zot_fetch($arr) {
// set $multiple param on zot_gethub() to return all matching hubs
// This allows us to recover from re-installs when a redundant (but invalid) hubloc for
- // this identity is widely dispersed throughout the network.
+ // this identity is widely dispersed throughout the network.
$ret_hubs = zot_gethub($arr['sender'],true);
if(! $ret_hubs) {
@@ -1077,21 +1045,23 @@ function zot_fetch($arr) {
}
foreach($ret_hubs as $ret_hub) {
- $data = array(
- 'type' => 'pickup',
- 'url' => z_root(),
- 'callback_sig' => base64url_encode(rsa_sign(z_root() . '/post',get_config('system','prvkey'))),
- 'callback' => z_root() . '/post',
- 'secret' => $arr['secret'],
- 'secret_sig' => base64url_encode(rsa_sign($arr['secret'],get_config('system','prvkey')))
- );
- $datatosend = json_encode(crypto_encapsulate(json_encode($data),$ret_hub['hubloc_sitekey']));
+ $data = [
+ 'type' => 'pickup',
+ 'url' => z_root(),
+ 'callback_sig' => base64url_encode(rsa_sign(z_root() . '/post', get_config('system','prvkey'))),
+ 'callback' => z_root() . '/post',
+ 'secret' => $arr['secret'],
+ 'secret_sig' => base64url_encode(rsa_sign($arr['secret'], get_config('system','prvkey')))
+ ];
+
+ $algorithm = zot_best_algorithm($ret_hub['site_crypto']);
+ $datatosend = json_encode(crypto_encapsulate(json_encode($data),$ret_hub['hubloc_sitekey'], $algorithm));
$fetch = zot_zot($url,$datatosend);
$result = zot_import($fetch, $arr['sender']['url']);
-
+
if($result)
return $result;
}
@@ -1137,6 +1107,11 @@ function zot_import($arr, $sender_url) {
$data = json_decode(crypto_unencapsulate($data,get_config('system','prvkey')),true);
}
+ if(! is_array($data)) {
+ logger('decode error');
+ return array();
+ }
+
if(! $data['success']) {
if($data['message'])
logger('remote pickup failed: ' . $data['message']);
@@ -1162,6 +1137,12 @@ function zot_import($arr, $sender_url) {
logger('zot_import: notify: ' . print_r($i['notify'],true), LOGGER_DATA, LOG_DEBUG);
+ if(! is_array($i['notify'])) {
+ logger('decode error');
+ continue;
+ }
+
+
$hub = zot_gethub($i['notify']['sender']);
if((! $hub) || ($hub['hubloc_url'] != $sender_url)) {
logger('zot_import: potential forgery: wrong site for sender: ' . $sender_url . ' != ' . print_r($i['notify'],true));
@@ -1195,7 +1176,7 @@ function zot_import($arr, $sender_url) {
if($recip_arr) {
stringify_array_elms($recip_arr);
$recips = implode(',',$recip_arr);
- $r = q("select channel_hash as hash from channel where channel_hash in ( " . $recips . " )
+ $r = q("select channel_hash as hash from channel where channel_hash in ( " . $recips . " )
and channel_removed = 0 ");
}
@@ -1352,6 +1333,7 @@ function zot_import($arr, $sender_url) {
* @param array $msg
* @return NULL|array
*/
+
function public_recips($msg) {
require_once('include/channel.php');
@@ -1403,7 +1385,7 @@ function public_recips($msg) {
$perm = 'post_mail';
$r = array();
-
+
$c = q("select channel_id, channel_hash from channel where channel_removed = 0");
if($c) {
foreach($c as $cc) {
@@ -1432,7 +1414,7 @@ function public_recips($msg) {
if(($tag['type'] === 'mention') && (strpos($tag['url'],z_root()) !== false)) {
$address = basename($tag['url']);
if($address) {
- $z = q("select channel_hash as hash from channel where channel_address = '%s'
+ $z = q("select channel_hash as hash from channel where channel_address = '%s'
and channel_removed = 0 limit 1",
dbesc($address)
);
@@ -1561,6 +1543,7 @@ function allowed_public_recips($msg) {
* @param boolean $request (optional) default false
* @return array
*/
+
function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $request = false) {
$result = array();
@@ -1605,12 +1588,12 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
/**
* @FIXME: Somehow we need to block normal message delivery from our clones, as the delivered
- * message doesn't have ACL information in it as the cloned copy does. That copy
- * will normally arrive first via sync delivery, but this isn't guaranteed.
+ * message doesn't have ACL information in it as the cloned copy does. That copy
+ * will normally arrive first via sync delivery, but this isn't guaranteed.
* There's a chance the current delivery could take place before the cloned copy arrives
* hence the item could have the wrong ACL and *could* be used in subsequent deliveries or
* access checks. So far all attempts at identifying this situation precisely
- * have caused issues with delivery of relayed comments.
+ * have caused issues with delivery of relayed comments.
*/
// if(($d['hash'] === $sender['hash']) && ($sender['url'] !== z_root()) && (! $relay)) {
@@ -1743,7 +1726,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
intval($channel['channel_id']),
dbesc($arr['owner_xchan'])
);
- $abook = (($ab) ? $ab[0] : null);
+ $abook = (($ab) ? $ab[0] : null);
if(intval($arr['item_deleted'])) {
@@ -1757,7 +1740,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
$arr['uid'] = $channel['channel_id'];
$item_id = delete_imported_item($sender,$arr,$channel['channel_id'],$relay);
- $DR->update(($item_id) ? 'deleted' : 'delete_failed');
+ $DR->update(($item_id) ? 'deleted' : 'delete_failed');
$result[] = $DR->get();
if($relay && $item_id) {
@@ -1779,7 +1762,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
$item_id = $r[0]['id'];
if(intval($r[0]['item_deleted'])) {
- // It was deleted locally.
+ // It was deleted locally.
$DR->update('update ignored');
$result[] = $DR->get();
@@ -1806,8 +1789,8 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
$result[] = $DR->get();
- // We need this line to ensure wall-to-wall comments are relayed (by falling through to the relay bit),
- // and at the same time not relay any other relayable posts more than once, because to do so is very wasteful.
+ // We need this line to ensure wall-to-wall comments are relayed (by falling through to the relay bit),
+ // and at the same time not relay any other relayable posts more than once, because to do so is very wasteful.
if(! intval($r[0]['item_origin']))
continue;
}
@@ -1821,7 +1804,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
if(check_item_source($arr['uid'], $arr))
call_hooks('post_local', $arr);
-
+
$item_id = 0;
if(($arr['mid'] == $arr['parent_mid']) && (! post_is_importable($arr,$abook))) {
@@ -1870,6 +1853,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
* * \e int \b mid
* @param int $uid
*/
+
function remove_community_tag($sender, $arr, $uid) {
if(! (activity_match($arr['verb'], ACTIVITY_TAG) && ($arr['obj_type'] == ACTIVITY_OBJ_TAGTERM)))
@@ -1934,10 +1918,13 @@ function remove_community_tag($sender, $arr, $uid) {
* @brief Just calls item_store_update() and logs result.
*
* @see item_store_update()
+ *
* @param array $sender (unused)
* @param array $item
- * @param int $uid (unused)
+ * @param array $orig
+ * @param int $uid
*/
+
function update_imported_item($sender, $item, $orig, $uid) {
// If this is a comment being updated, remove any privacy information
@@ -1957,7 +1944,7 @@ function update_imported_item($sender, $item, $orig, $uid) {
// because event_addtocal will parse the body to get the 'new' event details
if($orig['resource_type'] === 'event') {
- $res = event_addtocal($orig['id'],$uid);
+ $res = event_addtocal($orig['id'], $uid);
if(! $res)
logger('update event: failed');
}
@@ -1978,6 +1965,7 @@ function update_imported_item($sender, $item, $orig, $uid) {
* @param boolean $relay
* @return boolean|int post_id
*/
+
function delete_imported_item($sender, $item, $uid, $relay) {
logger('delete_imported_item invoked', LOGGER_DEBUG);
@@ -1995,13 +1983,14 @@ function delete_imported_item($sender, $item, $uid, $relay) {
intval($uid)
);
- if ($r) {
- if ($r[0]['author_xchan'] === $sender['hash'] || $r[0]['owner_xchan'] === $sender['hash'] || $r[0]['source_xchan'] === $sender['hash'])
+ if($r) {
+ if($r[0]['author_xchan'] === $sender['hash'] || $r[0]['owner_xchan'] === $sender['hash'] || $r[0]['source_xchan'] === $sender['hash'])
$ownership_valid = true;
$post_id = $r[0]['id'];
$item_found = true;
- } else {
+ }
+ else {
// perhaps the item is still in transit and the delete notification got here before the actual item did. Store it with the deleted flag set.
// item_store() won't try to deliver any notifications or start delivery chains if this flag is set.
@@ -2010,25 +1999,24 @@ function delete_imported_item($sender, $item, $uid, $relay) {
logger('delete received for non-existent item - storing item data.');
- /** @BUG $arr is undefined here, so this is dead code */
- if ($arr['author_xchan'] === $sender['hash'] || $arr['owner_xchan'] === $sender['hash'] || $arr['source_xchan'] === $sender['hash']) {
+ if($item['author_xchan'] === $sender['hash'] || $item['owner_xchan'] === $sender['hash'] || $item['source_xchan'] === $sender['hash']) {
$ownership_valid = true;
- $item_result = item_store($arr);
+ $item_result = item_store($item);
$post_id = $item_result['item_id'];
}
}
- if ($ownership_valid === false) {
+ if($ownership_valid === false) {
logger('delete_imported_item: failed: ownership issue');
return false;
}
require_once('include/items.php');
- if ($item_found) {
- if (intval($r[0]['item_deleted'])) {
+ if($item_found) {
+ if(intval($r[0]['item_deleted'])) {
logger('delete_imported_item: item was already deleted');
- if (! $relay)
+ if(! $relay)
return false;
// This is a bit hackish, but may have to suffice until the notification/delivery loop is optimised
@@ -2139,6 +2127,7 @@ function process_mail_delivery($sender, $arr, $deliveries) {
* * \e string \b hash a xchan_hash
* @param array $arr
*/
+
function process_rating_delivery($sender, $arr) {
logger('process_rating_delivery: ' . print_r($arr,true));
@@ -2198,6 +2187,7 @@ function process_rating_delivery($sender, $arr) {
* @param array $arr
* @param array $deliveries (unused)
*/
+
function process_profile_delivery($sender, $arr, $deliveries) {
logger('process_profile_delivery', LOGGER_DEBUG);
@@ -2232,15 +2222,15 @@ function process_location_delivery($sender,$arr,$deliveries) {
/**
* @brief checks for a moved UNO channel and sets the channel_moved flag
- *
+ *
* Currently the effect of this flag is to turn the channel into 'read-only' mode.
- * New content will not be processed (there was still an issue with blocking the
+ * New content will not be processed (there was still an issue with blocking the
* ability to post comments as of 10-Mar-2016).
- * We do not physically remove the channel at this time. The hub admin may choose
+ * We do not physically remove the channel at this time. The hub admin may choose
* to do so, but is encouraged to allow a grace period of several days in case there
* are any issues migrating content. This packet will generally be received by the
* original site when the basic channel import has been processed.
- *
+ *
* This will only be executed on the UNO system which is the old location
* if a new location is reported and there is only one location record.
* The rest of the hubloc syncronisation will be handled within
@@ -2252,7 +2242,7 @@ function process_location_delivery($sender,$arr,$deliveries) {
function check_location_move($sender_hash,$locations) {
if(! $locations)
- return;
+ return;
if(get_config('system','server_role') !== 'basic')
return;
@@ -2275,13 +2265,13 @@ function check_location_move($sender_hash,$locations) {
dbesc($sender_hash)
);
- // federation plugins may wish to notify connections
+ // federation plugins may wish to notify connections
// of the move on singleton networks
$arr = array('channel' => $r[0],'locations' => $locations);
call_hooks('location_move',$arr);
- }
+ }
}
@@ -2294,6 +2284,7 @@ function check_location_move($sender_hash,$locations) {
* @param boolean $absolute (optional) default false
* @return array
*/
+
function sync_locations($sender, $arr, $absolute = false) {
$ret = array();
@@ -2536,12 +2527,12 @@ function zot_encode_locations($channel) {
foreach($x as $hub) {
// if this is a local channel that has been deleted, the hubloc is no good - make sure it is marked deleted
- // so that nobody tries to use it.
+ // so that nobody tries to use it.
if(intval($channel['channel_removed']) && $hub['hubloc_url'] === z_root())
$hub['hubloc_deleted'] = 1;
- $ret[] = array(
+ $ret[] = [
'host' => $hub['hubloc_host'],
'address' => $hub['hubloc_addr'],
'primary' => (intval($hub['hubloc_primary']) ? true : false),
@@ -2550,7 +2541,7 @@ function zot_encode_locations($channel) {
'callback' => $hub['hubloc_callback'],
'sitekey' => $hub['hubloc_sitekey'],
'deleted' => (intval($hub['hubloc_deleted']) ? true : false)
- );
+ ];
}
}
@@ -2567,6 +2558,7 @@ function zot_encode_locations($channel) {
* @param number $suppress_update default 0
* @return boolean $updated if something changed
*/
+
function import_directory_profile($hash, $profile, $addr, $ud_flags = UPDATE_FLAGS_UPDATED, $suppress_update = 0) {
logger('import_directory_profile', LOGGER_DEBUG);
@@ -2701,6 +2693,7 @@ function import_directory_profile($hash, $profile, $addr, $ud_flags = UPDATE_FLA
* @param string $hash
* @param array $keywords
*/
+
function import_directory_keywords($hash, $keywords) {
$existing = array();
@@ -2745,6 +2738,7 @@ function import_directory_keywords($hash, $keywords) {
* @param string $addr
* @param int $flags (optional) default 0
*/
+
function update_modtime($hash, $guid, $addr, $flags = 0) {
$dirmode = intval(get_config('system', 'directory_mode'));
@@ -2777,6 +2771,7 @@ function update_modtime($hash, $guid, $addr, $flags = 0) {
* @param string $pubkey
* @return boolean true if updated or inserted
*/
+
function import_site($arr, $pubkey) {
if( (! is_array($arr)) || (! $arr['url']) || (! $arr['url_sig']))
return false;
@@ -2844,6 +2839,7 @@ function import_site($arr, $pubkey) {
$site_location = htmlspecialchars($arr['location'],ENT_COMPAT,'UTF-8',false);
$site_realm = htmlspecialchars($arr['realm'],ENT_COMPAT,'UTF-8',false);
$site_project = htmlspecialchars($arr['project'],ENT_COMPAT,'UTF-8',false);
+ $site_crypto = ((array_key_exists('encryption',$arr) && is_array($arr['encryption'])) ? htmlspecialchars(implode(',',$arr['encryption']),ENT_COMPAT,'UTF-8',false) : '');
$site_version = ((array_key_exists('version',$arr)) ? htmlspecialchars($arr['version'],ENT_COMPAT,'UTF-8',false) : '');
// You can have one and only one primary directory per realm.
@@ -2865,6 +2861,7 @@ function import_site($arr, $pubkey) {
|| ($siterecord['site_register'] != $register_policy)
|| ($siterecord['site_project'] != $site_project)
|| ($siterecord['site_realm'] != $site_realm)
+ || ($siterecord['site_crypto'] != $site_crypto)
|| ($siterecord['site_version'] != $site_version) ) {
$update = true;
@@ -2873,7 +2870,7 @@ function import_site($arr, $pubkey) {
// logger('import_site: stored: ' . print_r($siterecord,true));
- $r = q("update site set site_dead = 0, site_location = '%s', site_flags = %d, site_access = %d, site_directory = '%s', site_register = %d, site_update = '%s', site_sellpage = '%s', site_realm = '%s', site_type = %d, site_project = '%s', site_version = '%s'
+ $r = q("update site set site_dead = 0, site_location = '%s', site_flags = %d, site_access = %d, site_directory = '%s', site_register = %d, site_update = '%s', site_sellpage = '%s', site_realm = '%s', site_type = %d, site_project = '%s', site_version = '%s', site_crypto = '%s'
where site_url = '%s'",
dbesc($site_location),
intval($site_directory),
@@ -2886,6 +2883,7 @@ function import_site($arr, $pubkey) {
intval(SITE_TYPE_ZOT),
dbesc($site_project),
dbesc($site_version),
+ dbesc($site_crypto),
dbesc($url)
);
if(! $r) {
@@ -2903,8 +2901,8 @@ function import_site($arr, $pubkey) {
else {
$update = true;
- $r = q("insert into site ( site_location, site_url, site_access, site_flags, site_update, site_directory, site_register, site_sellpage, site_realm, site_type, site_project, site_version )
- values ( '%s', '%s', %d, %d, '%s', '%s', %d, '%s', '%s', %d, '%s', '%s' )",
+ $r = q("insert into site ( site_location, site_url, site_access, site_flags, site_update, site_directory, site_register, site_sellpage, site_realm, site_type, site_project, site_version, site_crypto )
+ values ( '%s', '%s', %d, %d, '%s', '%s', %d, '%s', '%s', %d, '%s', '%s', '%s' )",
dbesc($site_location),
dbesc($url),
intval($access_policy),
@@ -2916,7 +2914,8 @@ function import_site($arr, $pubkey) {
dbesc($site_realm),
intval(SITE_TYPE_ZOT),
dbesc($site_project),
- dbesc($site_version)
+ dbesc($site_version),
+ dbesc($site_crypto)
);
if(! $r) {
logger('import_site: record create failed. ' . print_r($arr,true));
@@ -2935,6 +2934,7 @@ function import_site($arr, $pubkey) {
* @param array $packet (optional) default null
* @param boolean $groups_changed (optional) default false
*/
+
function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) {
if(get_config('system','server_role') === 'basic')
@@ -2970,7 +2970,7 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) {
if(intval($channel['channel_removed']))
return;
- $h = q("select * from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0",
+ $h = q("select hubloc.*, site.site_crypto from hubloc left join site on site_url = hubloc_url where hubloc_hash = '%s' and hubloc_deleted = 0",
dbesc($channel['channel_hash'])
);
@@ -3057,7 +3057,7 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) {
foreach($synchubs as $hub) {
$hash = random_string();
- $n = zot_build_packet($channel,'notify',$env_recips,$hub['hubloc_sitekey'],$hash);
+ $n = zot_build_packet($channel,'notify',$env_recips,$hub['hubloc_sitekey'],$hub['site_crypto'],$hash);
queue_insert(array(
'hash' => $hash,
'account_id' => $channel['channel_account_id'],
@@ -3083,6 +3083,7 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) {
* @param array $deliveries
* @return array
*/
+
function process_channel_sync_delivery($sender, $arr, $deliveries) {
if(get_config('system','server_role') === 'basic')
@@ -3090,7 +3091,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
require_once('include/import.php');
- /** @FIXME this will sync red structures (channel, pconfig and abook).
+ /** @FIXME this will sync red structures (channel, pconfig and abook).
Eventually we need to make this application agnostic. */
$result = array();
@@ -3181,15 +3182,15 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
$arr['channel']['channel_pageflags'] = $arr['channel']['channel_pageflags'] - 0x1000;
}
-
- $disallowed = [
- 'channel_id', 'channel_account_id', 'channel_primary', 'channel_prvkey',
- 'channel_address', 'channel_notifyflags', 'channel_removed', 'channel_deleted',
- 'channel_system', 'channel_r_stream', 'channel_r_profile', 'channel_r_abook',
- 'channel_r_storage', 'channel_r_pages', 'channel_w_stream', 'channel_w_wall',
- 'channel_w_comment', 'channel_w_mail', 'channel_w_like', 'channel_w_tagwall',
- 'channel_w_chat', 'channel_w_storage', 'channel_w_pages', 'channel_a_republish',
- 'channel_a_delegate'
+
+ $disallowed = [
+ 'channel_id', 'channel_account_id', 'channel_primary', 'channel_prvkey',
+ 'channel_address', 'channel_notifyflags', 'channel_removed', 'channel_deleted',
+ 'channel_system', 'channel_r_stream', 'channel_r_profile', 'channel_r_abook',
+ 'channel_r_storage', 'channel_r_pages', 'channel_w_stream', 'channel_w_wall',
+ 'channel_w_comment', 'channel_w_mail', 'channel_w_like', 'channel_w_tagwall',
+ 'channel_w_chat', 'channel_w_storage', 'channel_w_pages', 'channel_a_republish',
+ 'channel_a_delegate'
];
$clean = array();
@@ -3226,7 +3227,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
foreach($arr['abook'] as $abook) {
-
+
$abconfig = null;
@@ -3372,7 +3373,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
}
}
if(! $found) {
- $r = q("INSERT INTO `groups` ( hash, uid, visible, deleted, gname )
+ $r = q("INSERT INTO groups ( hash, uid, visible, deleted, gname )
VALUES( '%s', %d, %d, %d, '%s' ) ",
dbesc($cl['collection']),
intval($channel['channel_id']),
@@ -3446,7 +3447,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
// if somebody is in the group that wasn't before - add them
if(! $found) {
- q("INSERT INTO `group_member` (`uid`, `gid`, `xchan`)
+ q("INSERT INTO group_member (uid, gid, xchan)
VALUES( %d, %d, '%s' ) ",
intval($channel['channel_id']),
intval($y['id']),
@@ -3503,7 +3504,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
foreach($profile as $k => $v) {
if(in_array($k,$disallowed))
continue;
-
+
if($k === 'name')
$clean['fullname'] = $v;
elseif($k === 'with')
@@ -3514,15 +3515,16 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
$clean[$k] = $v;
/**
- * @TODO
+ * @TODO
* We also need to import local photos if a custom photo is selected
*/
}
if(count($clean)) {
foreach($clean as $k => $v) {
- $r = dbq("UPDATE profile set `" . dbesc($k) . "` = '" . dbesc($v)
- . "' where profile_guid = '" . dbesc($profile['profile_guid']) . "' and uid = " . intval($channel['channel_id']));
+ $r = dbq("UPDATE profile set " . TQUOT . dbesc($k) . TQUOT . " = '" . dbesc($v)
+ . "' where profile_guid = '" . dbesc($profile['profile_guid'])
+ . "' and uid = " . intval($channel['channel_id']));
}
}
}
@@ -3556,6 +3558,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
* * \e string \b xchan_url
* @return string
*/
+
function get_rpost_path($observer) {
if(! $observer)
return '';
@@ -3571,6 +3574,7 @@ function get_rpost_path($observer) {
* @param array $x
* @return boolean|string return false or a hash
*/
+
function import_author_zot($x) {
$hash = make_xchan_hash($x['guid'],$x['guid_sig']);
@@ -3610,6 +3614,7 @@ function import_author_zot($x) {
* @param array $data
* @return array
*/
+
function zot_reply_message_request($data) {
$ret = array('success' => false);
@@ -3646,7 +3651,7 @@ function zot_reply_message_request($data) {
if ($messages) {
$env_recips = null;
- $r = q("select * from hubloc where hubloc_hash = '%s' and hubloc_error = 0 and hubloc_deleted = 0",
+ $r = q("select hubloc.*, site.site_crypto from hubloc left join site on hubloc_url = site_url where hubloc_hash = '%s' and hubloc_error = 0 and hubloc_deleted = 0",
dbesc($sender_hash)
);
if (! $r) {
@@ -3668,7 +3673,7 @@ function zot_reply_message_request($data) {
* create a notify packet and drop the actual message packet in the queue for pickup
*/
- $n = zot_build_packet($c[0],'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null),$hash,array('message_id' => $data['message_id']));
+ $n = zot_build_packet($c[0],'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null),$hub['site_crypto'],$hash,array('message_id' => $data['message_id']));
queue_insert(array(
'hash' => $hash,
@@ -3715,18 +3720,18 @@ function zotinfo($arr) {
}
}
- $ztarget_hash = (($ztarget && $zsig) ? make_xchan_hash($ztarget,$zsig) : '' );
+ $ztarget_hash = (($ztarget && $zsig) ? make_xchan_hash($ztarget,$zsig) : '' );
$r = null;
if(strlen($zhash)) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
where channel_hash = '%s' limit 1",
dbesc($zhash)
);
}
elseif(strlen($zguid) && strlen($zguid_sig)) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
where channel_guid = '%s' and channel_guid_sig = '%s' limit 1",
dbesc($zguid),
dbesc($zguid_sig)
@@ -3745,7 +3750,7 @@ function zotinfo($arr) {
/**
* The special address '[system]' will return a system channel if one has been defined,
- * Or the first valid channel we find if there are no system channels.
+ * Or the first valid channel we find if there are no system channels.
*
* This is used by magic-auth if we have no prior communications with this site - and
* returns an identity on this site which we can use to create a valid hub record so that
@@ -3760,7 +3765,7 @@ function zotinfo($arr) {
$r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
where channel_removed = 0 order by channel_id limit 1");
}
- }
+ }
}
else {
$ret['message'] = 'Invalid request';
@@ -3785,7 +3790,7 @@ function zotinfo($arr) {
if($deleted || $censored || $sys_channel)
$searchable = false;
-
+
$public_forum = false;
$role = get_pconfig($e['channel_id'],'system','permissions_role');
@@ -3818,14 +3823,14 @@ function zotinfo($arr) {
if($p) {
if(! intval($p[0]['publish']))
- $searchable = false;
+ $searchable = false;
$profile['description'] = $p[0]['pdesc'];
$profile['birthday'] = $p[0]['dob'];
if(($profile['birthday'] != '0000-00-00') && (($bd = z_birthday($p[0]['dob'],$e['channel_timezone'])) !== ''))
$profile['next_birthday'] = $bd;
- if($age = age($p[0]['dob'],$e['channel_timezone'],''))
+ if($age = age($p[0]['dob'],$e['channel_timezone'],''))
$profile['age'] = $age;
$profile['gender'] = $p[0]['gender'];
$profile['marital'] = $p[0]['marital'];
@@ -3878,14 +3883,14 @@ function zotinfo($arr) {
$ret['adult_content'] = $adult_channel;
$ret['public_forum'] = $public_forum;
if($deleted)
- $ret['deleted'] = $deleted;
+ $ret['deleted'] = $deleted;
if(intval($e['channel_removed']))
$ret['deleted_locally'] = true;
// premium or other channel desiring some contact with potential followers before connecting.
// This is a template - %s will be replaced with the follow_url we discover for the return channel.
- if($special_channel)
+ if($special_channel)
$ret['connect_url'] = z_root() . '/connect/' . $e['channel_address'];
// This is a template for our follow url, %s will be replaced with a webbie
@@ -3905,6 +3910,11 @@ function zotinfo($arr) {
$permissions['connected'] = true;
}
+ // encrypt this with the default aes256cbc since we cannot be sure at this point which
+ // algorithms are preferred for communications with the remote site; notably
+ // because ztarget refers to an xchan and we don't necessarily know the origination
+ // location.
+
$ret['permissions'] = (($ztarget && $zkey) ? crypto_encapsulate(json_encode($permissions),$zkey) : $permissions);
if($permissions['view_profile'])
@@ -3935,6 +3945,8 @@ function zotinfo($arr) {
$ret['site']['directory_url'] = z_root() . '/dirsearch';
+ $ret['site']['encryption'] = crypto_methods();
+
// hide detailed site information if you're off the grid
if($dirmode != DIRECTORY_MODE_STANDALONE) {
@@ -3961,7 +3973,7 @@ function zotinfo($arr) {
$ret['site']['access_policy'] = 'tiered';
$ret['site']['accounts'] = account_total();
-
+
require_once('include/channel.php');
$ret['site']['channels'] = channel_total();
@@ -3972,17 +3984,17 @@ function zotinfo($arr) {
$r = q("select * from addon where hidden = 0");
if($r)
foreach($r as $rr)
- $visible_plugins[] = $rr['name'];
+ $visible_plugins[] = $rr['aname'];
}
- $ret['site']['plugins'] = $visible_plugins;
- $ret['site']['sitehash'] = get_config('system','location_hash');
- $ret['site']['sitename'] = get_config('system','sitename');
- $ret['site']['sellpage'] = get_config('system','sellpage');
- $ret['site']['location'] = get_config('system','site_location');
- $ret['site']['realm'] = get_directory_realm();
- $ret['site']['project'] = Zotlabs\Lib\System::get_platform_name() . ' ' . Zotlabs\Lib\System::get_server_role();
- $ret['site']['version'] = Zotlabs\Lib\System::get_project_version();
+ $ret['site']['plugins'] = $visible_plugins;
+ $ret['site']['sitehash'] = get_config('system','location_hash');
+ $ret['site']['sitename'] = get_config('system','sitename');
+ $ret['site']['sellpage'] = get_config('system','sellpage');
+ $ret['site']['location'] = get_config('system','site_location');
+ $ret['site']['realm'] = get_directory_realm();
+ $ret['site']['project'] = Zotlabs\Lib\System::get_platform_name() . ' ' . Zotlabs\Lib\System::get_server_role();
+ $ret['site']['version'] = Zotlabs\Lib\System::get_project_version();
}
@@ -4002,7 +4014,7 @@ function check_zotinfo($channel,$locations,&$ret) {
// This function will likely expand as we find more things to detect and fix.
// 1. Because magic-auth is reliant on it, ensure that the system channel has a valid hubloc
- // Force this to be the case if anything is found to be wrong with it.
+ // Force this to be the case if anything is found to be wrong with it.
// @FIXME ensure that the system channel exists in the first place and has an xchan
@@ -4022,9 +4034,9 @@ function check_zotinfo($channel,$locations,&$ret) {
logger('System channel locations are not valid. Attempting repair.');
- // Don't trust any existing records. Just get rid of them, but only do this
+ // Don't trust any existing records. Just get rid of them, but only do this
// for the sys channel as normal channels will be trickier.
-
+
q("delete from hubloc where hubloc_hash = '%s'",
dbesc($channel['channel_hash'])
);
@@ -4081,7 +4093,7 @@ function delivery_report_is_storable($dr) {
return false;
- // is the recipient one of our connections, or do we want to store every report?
+ // is the recipient one of our connections, or do we want to store every report?
$r = explode(' ', $dr['recipient']);
$rxchan = $r[0];
@@ -4092,15 +4104,15 @@ function delivery_report_is_storable($dr) {
// We always add ourself as a recipient to private and relayed posts
// So if a remote site says they can't find us, that's no big surprise
// and just creates a lot of extra report noise
-
+
if(($dr['location'] !== z_root()) && ($dr['sender'] === $rxchan) && ($dr['status'] === 'recipient_not_found'))
return false;
// If you have a private post with a recipient list, every single site is going to report
- // back a failed delivery for anybody on that list that isn't local to them. We're only
+ // back a failed delivery for anybody on that list that isn't local to them. We're only
// concerned about this if we have a local hubloc record which says we expected them to
// have a channel on that site.
-
+
$r = q("select hubloc_id from hubloc where hubloc_hash = '%s' and hubloc_url = '%s'",
dbesc($rxchan),
dbesc($dr['location'])
@@ -4130,7 +4142,7 @@ function update_hub_connected($hub,$sitekey = '') {
* Any hub with the same URL and a different sitekey cannot be valid.
* Get rid of them (mark them deleted). There's a good chance they were re-installs.
*/
-
+
q("update hubloc set hubloc_deleted = 1, hubloc_error = 1 where hubloc_url = '%s' and hubloc_sitekey != '%s' ",
dbesc($hub['hubloc_url']),
dbesc($sitekey)
@@ -4141,7 +4153,7 @@ function update_hub_connected($hub,$sitekey = '') {
$sitekey = $hub['sitekey'];
}
- // $sender['sitekey'] is a new addition to the protocol to distinguish
+ // $sender['sitekey'] is a new addition to the protocol to distinguish
// hublocs coming from re-installed sites. Older sites will not provide
// this field and we have to still mark them valid, since we can't tell
// if this hubloc has the same sitekey as the packet we received.
@@ -4164,10 +4176,10 @@ function update_hub_connected($hub,$sitekey = '') {
if(intval($hub['hubloc_error'])) {
q("update hubloc set hubloc_error = 0 where hubloc_id = %d and hubloc_sitekey = '%s' ",
intval($hub['hubloc_id']),
- dbesc($sitekey)
+ dbesc($sitekey)
);
- if(intval($r[0]['hubloc_orphancheck'])) {
- q("update hubloc set hubloc_orhpancheck = 0 where hubloc_id = %d and hubloc_sitekey = '%s' ",
+ if(intval($hub['hubloc_orphancheck'])) {
+ q("update hubloc set hubloc_orphancheck = 0 where hubloc_id = %d and hubloc_sitekey = '%s' ",
intval($hub['hubloc_id']),
dbesc($sitekey)
);
@@ -4176,7 +4188,7 @@ function update_hub_connected($hub,$sitekey = '') {
dbesc($hub['hubloc_hash'])
);
}
-
+
return $hub['hubloc_url'];
}
@@ -4189,7 +4201,7 @@ function zot_reply_ping() {
// This will let us know if any important communication details
// that we may have stored are no longer valid, regardless of xchan details.
logger('POST: got ping send pong now back: ' . z_root() , LOGGER_DEBUG );
-
+
$ret['success'] = true;
$ret['site'] = array();
$ret['site']['url'] = z_root();
@@ -4263,7 +4275,7 @@ function zot_reply_pickup($data) {
/*
* If we made it to here, the signatures verify, but we still don't know if the tracking ID is valid.
* It wouldn't be an error if the tracking ID isn't found, because we may have sent this particular
- * queue item with another pickup (after the tracking ID for the other pickup was verified).
+ * queue item with another pickup (after the tracking ID for the other pickup was verified).
*/
$r = q("select outq_posturl from outq where outq_hash = '%s' and outq_posturl = '%s' limit 1",
@@ -4303,13 +4315,21 @@ function zot_reply_pickup($data) {
}
else
$ret['pickup'][] = array('notify' => json_decode($rr['outq_notify'],true),'message' => $x);
-
+
remove_queue_item($rr['outq_hash']);
}
}
}
- $encrypted = crypto_encapsulate(json_encode($ret),$sitekey);
+ // this is a bit of a hack because we don't have the hubloc_url here, only the callback url.
+ // worst case is we'll end up using aes256cbc if they've got a different post endpoint
+
+ $x = q("select site_crypto from site where site_url = '%s' limit 1",
+ dbesc(str_replace('/post','',$data['callback']))
+ );
+ $algorithm = zot_best_algorithm(($x) ? $x[0]['site_crypto'] : '');
+
+ $encrypted = crypto_encapsulate(json_encode($ret),$sitekey,$algorithm);
json_return_and_die($encrypted);
/* pickup: end */
@@ -4325,7 +4345,7 @@ function zot_reply_auth_check($data,$encrypted_packet) {
* Requestor visits /magic/?dest=somewhere on their own site with a browser
* magic redirects them to $destsite/post [with auth args....]
* $destsite sends an auth_check packet to originator site
- * The auth_check packet is handled here by the originator's site
+ * The auth_check packet is handled here by the originator's site
* - the browser session is still waiting
* inside $destsite/post for everything to verify
* If everything checks out we'll return a token to $destsite
@@ -4347,9 +4367,9 @@ function zot_reply_auth_check($data,$encrypted_packet) {
// garbage collect any old unused notifications
- // This was and should be 10 minutes but my hosting provider has time lag between the DB and
- // the web server. We should probably convert this to webserver time rather than DB time so
- // that the different clocks won't affect it and allow us to keep the time short.
+ // This was and should be 10 minutes but my hosting provider has time lag between the DB and
+ // the web server. We should probably convert this to webserver time rather than DB time so
+ // that the different clocks won't affect it and allow us to keep the time short.
Zotlabs\Zot\Verify::purge('auth','30 MINUTE');
@@ -4360,7 +4380,7 @@ function zot_reply_auth_check($data,$encrypted_packet) {
// We created a unique hash in mod/magic.php when we invoked remote auth, and stored it in
// the verify table. It is now coming back to us as 'secret' and is signed by a channel at the other end.
// First verify their signature. We will have obtained a zot-info packet from them as part of the sender
- // verification.
+ // verification.
if ((! $y) || (! rsa_verify($data['secret'], base64url_decode($data['secret_sig']),$y[0]['xchan_pubkey']))) {
logger('mod_zot: auth_check: sender not found or secret_sig invalid.');
@@ -4433,7 +4453,7 @@ function zot_reply_purge($sender,$recipients) {
if ($recipients) {
// basically this means "unfriend"
foreach ($recipients as $recip) {
- $r = q("select channel.*,xchan.* from channel
+ $r = q("select channel.*,xchan.* from channel
left join xchan on channel_hash = xchan_hash
where channel_guid = '%s' and channel_guid_sig = '%s' limit 1",
dbesc($recip['guid']),
@@ -4450,13 +4470,13 @@ function zot_reply_purge($sender,$recipients) {
}
}
$ret['success'] = true;
- }
+ }
else {
// Unfriend everybody - basically this means the channel has committed suicide
$arr = $sender;
$sender_hash = make_xchan_hash($arr['guid'],$arr['guid_sig']);
- remove_all_xchan_resources($sender_hash);
+ remove_all_xchan_resources($sender_hash);
$ret['success'] = true;
}
@@ -4471,7 +4491,7 @@ function zot_reply_refresh($sender,$recipients) {
// remote channel info (such as permissions or photo or something)
// has been updated. Grab a fresh copy and sync it.
- // The difference between refresh and force_refresh is that
+ // The difference between refresh and force_refresh is that
// force_refresh unconditionally creates a directory update record,
// even if no changes were detected upon processing.
@@ -4480,7 +4500,7 @@ function zot_reply_refresh($sender,$recipients) {
// This would be a permissions update, typically for one connection
foreach ($recipients as $recip) {
- $r = q("select channel.*,xchan.* from channel
+ $r = q("select channel.*,xchan.* from channel
left join xchan on channel_hash = xchan_hash
where channel_guid = '%s' and channel_guid_sig = '%s' limit 1",
dbesc($recip['guid']),
@@ -4488,17 +4508,17 @@ function zot_reply_refresh($sender,$recipients) {
);
$x = zot_refresh(array(
- 'xchan_guid' => $sender['guid'],
+ 'xchan_guid' => $sender['guid'],
'xchan_guid_sig' => $sender['guid_sig'],
'hubloc_url' => $sender['url']
), $r[0], (($msgtype === 'force_refresh') ? true : false));
}
- }
+ }
else {
// system wide refresh
$x = zot_refresh(array(
- 'xchan_guid' => $sender['guid'],
+ 'xchan_guid' => $sender['guid'],
'xchan_guid_sig' => $sender['guid_sig'],
'hubloc_url' => $sender['url']
), null, (($msgtype === 'force_refresh') ? true : false));
@@ -4521,7 +4541,7 @@ function zot_reply_notify($data) {
if($async) {
// add to receive queue
// qreceive_add($data);
- }
+ }
else {
$x = zot_fetch($data);
$ret['delivery_report'] = $x;
@@ -4530,4 +4550,4 @@ function zot_reply_notify($data) {
$ret['success'] = true;
json_return_and_die($ret);
-} \ No newline at end of file
+}
diff --git a/install/INSTALL.txt b/install/INSTALL.txt
index 94ec511d8..7d4ed9534 100644
--- a/install/INSTALL.txt
+++ b/install/INSTALL.txt
@@ -1,12 +1,12 @@
-Hubzilla Installation
+Software Installation
-We've tried very hard to ensure that Hubzilla will run on commodity
+We've tried very hard to ensure that this software will run on commodity
hosting platforms - such as those used to host Wordpress blogs and Drupal
websites. It will run on most any Linux VPS system. Windows LAMP platforms
such as XAMPP and WAMP are not officially supported at this time - however
we welcome patches if you manage to get it working.
-Be aware that the Hubzilla is more than a simple web application. It is a
+Be aware that this software is more than a simple web application. It is a
complex communications system which more closely resembles an email server
than a web server. For reliability and performance, messages are delivered in
the background and are queued for later delivery when sites are down. This
@@ -17,20 +17,24 @@ with your hosting provider prior to installation. (And preferably before
entering into a long-term contract.)
If you encounter installation issues, please let us know via the Github issue
-tracker (https://github.com/redmatrix/hubzilla/issues). Please be as clear as you
-can about your operating environment and provide as much detail as possible
+tracker where you downloaded the software. Please be as clear as
+you can about your operating environment and provide as much detail as possible
about any error messages you may see, so that we can prevent it from happening
in the future. Due to the large variety of operating systems and PHP platforms
-in existence we may have only limited ability to debug your PHP installation or
-acquire any missing modules - but we will do our best to solve any general code
-issues.
+in existence we may have only limited ability to debug your PHP installation
+or acquire any missing modules - but we will do our best to solve any general
+code issues.
-Before you begin: Choose a domain name or subdomain name for your server.
+**Before you begin**
-Hubzilla can only be installed into the root of a domain or
-sub-domain, and can not be installed using alternate TCP ports.
+Choose a domain name or subdomain name for your server.
+
+The software can only be installed into the root of a domain or
+sub-domain, and can not be installed using alternate TCP ports. These
+restrictions may be relaxed in the future, but will be inconvenient to work
+with, so we still STRONGLY recommend you abide by them.
Decide if you will use SSL and obtain an SSL certificate before software
installation. You SHOULD use SSL. If you use SSL, you MUST use a
@@ -46,12 +50,12 @@ This restriction is incorporated because public posts from you may contain
references to images on your own hub. Other members viewing their stream on
other hubs will get warnings if your certificate is not trusted by their web
browser. This will confuse many people because this is a decentralised network
-and they will get the warning about your hub while viewing their own hub and may
-think their own hub has an issue. These warnings are very technical and scary to
-some folks, many of whom will not know how to proceed except to follow the browser
-advice. This is disruptive to the community. That said, we recognise the issues
-surrounding the current certificate infrastructure and agree there are many
-problems, but that doesn't change the requirement.
+and they will get the warning about your hub while viewing their own hub and
+may think their own hub has an issue. These warnings are very technical and
+scary to some folks, many of whom will not know how to proceed except to
+follow the browser advice. This is disruptive to the community. That said, we
+recognise the issues surrounding the current certificate infrastructure and
+agree there are many problems, but that doesn't change the requirement.
Free "browser-valid" certificates are available from providers such as StartSSL
and LetsEncrypt.
@@ -63,13 +67,36 @@ SSL port first, before falling back to a less secure connection. If you do not
use SSL, your webserver MUST NOT listen on port 443 at all.
If you use LetsEncrypt to provide certificates and create a file under
-.well-known/acme-challenge so that LetsEncrypt can verify your domain ownership,
-please remove or rename the .well-known directory as soon as the certificate is
-generated. Hubzilla will provide its own handler for ".well-known" services when
-it is installed, and an existing directory in this location may prevent some of
-these services from working correctly. This should not be a problem with Apache,
-but may be an issue with nginx or other web server platforms.
+.well-known/acme-challenge so that LetsEncrypt can verify your domain
+ownership, please remove or rename the .well-known directory as soon as the
+certificate is generated. The software will provide its own handler for
+".well-known" services when it is installed, and an existing directory in this
+location may prevent some of these services from working correctly. This
+should not be a problem with Apache, but may be an issue with nginx or other
+web server platforms.
+
+**Server Roles**
+
+During installation you will be asked to choose a server role. Your choices are
+1. Basic
+2. Standard
+3. Pro
+
+Basic is highly simplified, with almost all the advanced functionality and
+complexity removed or permanently disabled.
+Standard is typically used for federated network use, when you wish to interact
+with other networks using other protocols. Not all the built in features and
+functionality work correctly when other networks are involved. All advanced
+and complex features are available to all members by default.
+
+Pro is for sites that wish to make full use of the built-in abilities and
+features, but **not** to interact with other networks. Advanced features are
+enabled according to a per-account 'techlevel' which reduces complexity
+initially and allows members to adjust the software complexity to match their
+technical abilities.
+
+**Installation**
1. Requirements
- Apache with mod-rewrite enabled and "AllowOverride All" so you can use a
@@ -96,7 +123,7 @@ but may be an issue with nginx or other web server platforms.
- Installation into a top-level domain or sub-domain (without a
directory/path component in the URL) is REQUIRED.
-2. Unpack the Hubzilla files into the root of your web server document area.
+2. Unpack the project files into the root of your web server document area.
If you copy the directory tree to your webserver, make sure that you
also copy .htaccess - as "dot" files are often hidden and aren't normally
@@ -156,12 +183,21 @@ but may be an issue with nginx or other web server platforms.
3. Create an empty database and note the access details (hostname, username,
-password, database name). The MySQL client libraries will fallback to socket
+password, database name). The PDO database libraries will fallback to socket
communication if the hostname is 'localhost' and some people have reported
issues with the socket implementation. Use it if your requirements mandate.
Otherwise if the database is served on the local server, use '127.0.0.1' for
-the hostname. See https://dev.mysql.com/doc/refman/5.0/en/connecting.html
-for more information.
+the hostname.
+
+Internally we now use the PDO library for database connections. If you
+encounter a database configuration which cannot be expressed on the setup form
+(for instance using MySQL with an unusual socket location); you can supply
+the PDO connection string as the database hostname. For instance
+
+ mysql:unix_socket=/my/special/socket_path
+
+You should still fill in all other applicable form values as needed.
+
4. If you know in advance that it will be impossible for the web server to
write or create files in your web directory, create an empty file called
@@ -223,7 +259,7 @@ You should also be sure that App::$config['system']['php_path'] is set correctly
in your .htconfig.php file, it should look like (changing it to the correct
PHP location):
-App::$config['system']['php_path'] = '/usr/local/php55/bin/php';
+App::$config['system']['php_path'] = '/usr/local/php56/bin/php';
#####################################################################
@@ -297,6 +333,21 @@ name of your operating system distribution or Apache package.
#####################################################################
+- If you see an error during database setup that DNS lookup failed
+#####################################################################
+
+This is a known issue on some versions of FreeBSD, because
+dns_get_record() fails for some lookups. Create a file in your top webserver
+folder called '.htpreconfig.php' and inside it put the following:
+
+<?php
+App::$config['system']['do_not_check_dns'] = 1;
+
+This should allow installation to proceed. Once the database has been
+installed, add the same config statement (but not the '<?php' line) to the
+.htconfig.php file which was created during installation.
+
+#####################################################################
- If you are unable to write the file .htconfig.php during installation
due to permissions issues:
#####################################################################
diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql
index d72684a90..e143e252a 100644
--- a/install/schema_mysql.sql
+++ b/install/schema_mysql.sql
@@ -504,10 +504,11 @@ CREATE TABLE IF NOT EXISTS `hook` (
`hook` char(255) NOT NULL DEFAULT '',
`file` char(255) NOT NULL DEFAULT '',
`fn` char(255) NOT NULL DEFAULT '',
- `priority` int(11) unsigned NOT NULL DEFAULT '0',
+ `priority` smallint NOT NULL DEFAULT '0',
`hook_version` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `hook` (`hook`),
+ KEY `priority` (`priority`),
KEY `hook_version` (`hook_version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -1152,6 +1153,7 @@ CREATE TABLE IF NOT EXISTS `site` (
`site_type` smallint NOT NULL DEFAULT '0',
`site_project` char(255) NOT NULL DEFAULT '',
`site_version` varchar(32) NOT NULL DEFAULT '',
+ `site_crypto` text NOT NULL DEFAULT '',
PRIMARY KEY (`site_url`),
KEY `site_flags` (`site_flags`),
KEY `site_update` (`site_update`),
diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql
index ab9a5cff4..b1b1c8474 100644
--- a/install/schema_postgres.sql
+++ b/install/schema_postgres.sql
@@ -492,13 +492,15 @@ CREATE TABLE "hook" (
"hook" text NOT NULL,
"file" text NOT NULL,
"fn" text NOT NULL,
- "priority" bigint NOT NULL DEFAULT '0',
+ "priority" smallint NOT NULL DEFAULT '0',
"hook_version" smallint NOT NULL DEFAULT '0',
PRIMARY KEY ("id")
);
create index "hook_idx" on hook ("hook");
create index "hook_version_idx" on hook ("hook_version");
+create index "hook_priority_idx" on hook ("priority");
+
CREATE TABLE "hubloc" (
"hubloc_id" serial NOT NULL,
"hubloc_guid" text NOT NULL DEFAULT '',
@@ -1132,6 +1134,7 @@ CREATE TABLE "site" (
"site_type" smallint NOT NULL DEFAULT '0',
"site_project" text NOT NULL DEFAULT '',
"site_version" text NOT NULL DEFAULT '',
+ "site_crypto" text NOT NULL DEFAULT '',
PRIMARY KEY ("site_url")
);
create index "site_flags" on site ("site_flags");
diff --git a/install/update.php b/install/update.php
index 921d16e2f..dbf3a08ca 100644
--- a/install/update.php
+++ b/install/update.php
@@ -1,6 +1,6 @@
<?php
-define( 'UPDATE_VERSION' , 1183 );
+define( 'UPDATE_VERSION' , 1185 );
/**
*
@@ -1095,7 +1095,7 @@ function update_r1097() {
$r = q("select hubloc_id, hubloc_addr from hubloc where hubloc_addr like '%%/%%'");
if($r) {
foreach($r as $rr) {
- q("update hubloc set hubloc_addr = '%s' where hubloc_id = %d limit 1",
+ q("update hubloc set hubloc_addr = '%s' where hubloc_id = %d",
dbesc(substr($rr['hubloc_addr'],0,strpos($rr['hubloc_addr'],'/'))),
intval($rr['hubloc_id'])
);
@@ -2444,3 +2444,31 @@ function update_r1182() {
return UPDATE_SUCCESS;
return UPDATE_FAILED;
}
+
+
+function update_r1183() {
+
+ if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
+ $r1 = q("alter table hook ALTER COLUMN priority TYPE smallint");
+ $r2 = q("alter table hook ALTER COLUMN priority SET NOT NULL");
+ $r3 = q("alter table hook ALTER COLUMN priority SET DEFAULT '0'");
+ $r1 = $r1 && $r2 && $r3;
+ }
+ else {
+ $r1 = q("alter table hook CHANGE priority priority smallint NOT NULL DEFAULT '0' ");
+ }
+ $r2 = q("create index priority_idx on hook (priority)");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1184() {
+
+ $r1 = q("alter table site add site_crypto text not null default '' ");
+
+ if($r1)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
diff --git a/library/oauth2/.gitignore b/library/oauth2/.gitignore
new file mode 100644
index 000000000..c43a667d4
--- /dev/null
+++ b/library/oauth2/.gitignore
@@ -0,0 +1,5 @@
+# Test Files #
+test/config/test.sqlite
+vendor
+composer.lock
+.idea
diff --git a/library/oauth2/.travis.yml b/library/oauth2/.travis.yml
new file mode 100644
index 000000000..dd4aae4a6
--- /dev/null
+++ b/library/oauth2/.travis.yml
@@ -0,0 +1,30 @@
+language: php
+sudo: false
+cache:
+ directories:
+ - $HOME/.composer/cache
+ - vendor
+php:
+- 5.3
+- 5.4
+- 5.5
+- 5.6
+- 7
+- hhvm
+env:
+ global:
+ - SKIP_MONGO_TESTS=1
+ - secure: Bc5ZqvZ1YYpoPZNNuU2eCB8DS6vBYrAdfBtTenBs5NSxzb+Vjven4kWakbzaMvZjb/Ib7Uph7DGuOtJXpmxnvBXPLd707LZ89oFWN/yqQlZKCcm8iErvJCB5XL+/ONHj2iPdR242HJweMcat6bMCwbVWoNDidjtWMH0U2mYFy3M=
+ - secure: R3bXlymyFiY2k2jf7+fv/J8i34wtXTkmD4mCr5Ps/U+vn9axm2VtvR2Nj+r7LbRjn61gzFE/xIVjYft/wOyBOYwysrfriydrnRVS0owh6y+7EyOyQWbRX11vVQMf8o31QCQE5BY58V5AJZW3MjoOL0FVlTgySJiJvdw6Pv18v+E=
+services:
+- mongodb
+- redis-server
+- cassandra
+before_install:
+- phpenv config-rm xdebug.ini || return 0
+install:
+- composer install --no-interaction
+before_script:
+- psql -c 'create database oauth2_server_php;' -U postgres
+after_script:
+- php test/cleanup.php
diff --git a/library/oauth2/CHANGELOG.md b/library/oauth2/CHANGELOG.md
new file mode 100644
index 000000000..03d925e06
--- /dev/null
+++ b/library/oauth2/CHANGELOG.md
@@ -0,0 +1,152 @@
+CHANGELOG for 1.x
+=================
+
+This changelog references the relevant changes (bug and security fixes) done
+in 1.x minor versions.
+
+To see the files changed for a given bug, go to https://github.com/bshaffer/oauth2-server-php/issues/### where ### is the bug number
+To get the diff between two versions, go to https://github.com/bshaffer/oauth2-server-php/compare/v1.0...v1.1
+To get the diff for a specific change, go to https://github.com/bshaffer/oauth2-server-php/commit/XXX where XXX is the change hash
+
+* 1.8.0 (2015-09-18)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/643
+
+ * bug #594 - adds jti
+ * bug #598 - fixes lifetime configurations for JWTs
+ * bug #634 - fixes travis builds, upgrade to containers
+ * bug #586 - support for revoking tokens
+ * bug #636 - Adds FirebaseJWT bridge
+ * bug #639 - Mongo HHVM compatibility
+
+* 1.7.0 (2015-04-23)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/572
+
+ * bug #500 - PDO fetch mode changed from FETCH_BOTH to FETCH_ASSOC
+ * bug #508 - Case insensitive for Bearer token header name ba716d4
+ * bug #512 - validateRedirectUri is now public
+ * bug #530 - Add PublicKeyInterface, UserClaimsInterface to Cassandra Storage
+ * bug #505 - DynamoDB storage fixes
+ * bug #556 - adds "code id_token" return type to openid connect
+ * bug #563 - Include "issuer" config key for JwtAccessToken
+ * bug #564 - Fixes JWT vulnerability
+ * bug #571 - Added unset_refresh_token_after_use option
+
+* 1.6 (2015-01-16)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/496
+
+ * bug 437 - renames CryptoToken to JwtAccessToken / use_crypto_tokens to use_jwt_access_tokens
+ * bug 447 - Adds a Couchbase storage implementation
+ * bug 460 - Rename JWT claims to match spec
+ * bug 470 - order does not matter for multi-valued response types
+ * bug 471 - Make validateAuthorizeRequest available for POST in addition to GET
+ * bug 475 - Adds JTI table definitiion
+ * bug 481 - better randomness for generating access tokens
+ * bug 480 - Use hash_equals() for signature verification (prevents remote timing attacks)
+ * bugs 489, 491, 498 - misc other fixes
+
+* 1.5 (2014-08-27)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/446
+
+ * bug #399 - Add DynamoDB Support
+ * bug #404 - renamed error name for malformed/expired tokens
+ * bug #412 - Openid connect: fixes for claims with more than one scope / Add support for the prompt parameter ('consent' and 'none')
+ * bug #411 - fixes xml output
+ * bug #413 - fixes invalid format error
+ * bug #401 - fixes code standards / whitespace
+ * bug #354 - bundles PDO SQL with the library
+ * [BC] bug #397 - refresh tokens should not be encrypted
+ * bug #423 - makes "scope" optional for refresh token storage
+
+* 1.4 (2014-06-12)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/392
+
+ * bug #189 Storage\PDO - allows DSN string in constructor
+ * bug #233 Bearer Tokens - allows token in request body for PUT requests
+ * bug #346 Fixes open_basedir warning
+ * bug #351 Adds OpenID Connect support
+ * bug #355 Adds php 5.6 and HHVM to travis.ci testing
+ * [BC] bug #358 Adds `getQuerystringIdentifier()` to the GrantType interface
+ * bug #363 Encryption\JWT - Allows for subclassing JWT Headers
+ * bug #349 Bearer Tokens - adds requestHasToken method for when access tokens are optional
+ * bug #301 Encryption\JWT - fixes urlSafeB64Encode(): ensures newlines are replaced as expected
+ * bug #323 ResourceController - client_id is no longer required to be returned when calling getAccessToken
+ * bug #367 Storage\PDO - adds Postgres support
+ * bug #368 Access Tokens - use mcrypt_create_iv or openssl_random_pseudo_bytes to create token string
+ * bug #376 Request - allows case insensitive headers
+ * bug #384 Storage\PDO - can pass in PDO options in constructor of PDO storage
+ * misc fixes #361, #292, #373, #374, #379, #396
+* 1.3 (2014-02-27)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/325
+
+ * bug #311 adds cassandra storage
+ * bug #298 fixes response code for user credentials grant type
+ * bug #318 adds 'use_crypto_tokens' config to Server class for better DX
+ * [BC] bug #320 pass client_id to getDefaultScope
+ * bug #324 better feedback when running tests
+ * bug #335 adds support for non-expiring refresh tokens
+ * bug #333 fixes Pdo storage for getClientKey
+ * bug #336 fixes Redis storage for expireAuthorizationCode
+
+* 1.2 (2014-01-03)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/288
+
+ * bug #285 changed response header from 200 to 401 when empty token received
+ * bug #286 adds documentation and links to spec for not including error messages when no token is supplied
+ * bug #280 ensures PHP warnings do not get thrown as a result of an invalid argument to $jwt->decode()
+ * bug #279 predis wrong number of arguments
+ * bug #277 Securing JS WebApp client secret w/ password grant type
+
+* 1.1 (2013-12-17)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/276
+
+ * bug #278 adds refresh token configuration to Server class
+ * bug #274 Supplying a null client_id and client_secret grants API access
+ * bug #244 [MongoStorage] More detailed implementation info
+ * bug #268 Implement jti for JWT Bearer tokens to prevent replay attacks.
+ * bug #266 Removing unused argument to getAccessTokenData
+ * bug #247 Make Bearer token type consistent
+ * bug #253 Fixing CryptoToken refresh token lifetime
+ * bug #246 refactors public key logic to be more intuitive
+ * bug #245 adds support for JSON crypto tokens
+ * bug #230 Remove unused columns in oauth_clients
+ * bug #215 makes Redis Scope Storage obey the same paradigm as PDO
+ * bug #228 removes scope group
+ * bug #227 squelches open basedir restriction error
+ * bug #223 Updated docblocks for RefreshTokenInterface.php
+ * bug #224 Adds protected properties
+ * bug #217 Implement ScopeInterface for PDO, Redis
+
+* 1.0 (2013-08-12)
+
+ * bug #203 Add redirect\_status_code config param for AuthorizeController
+ * bug #205 ensures unnecessary ? is not set when ** bug
+ * bug #204 Fixed call to LogicException
+ * bug #202 Add explode to checkRestrictedGrant in PDO Storage
+ * bug #197 adds support for 'false' default scope ** bug
+ * bug #192 reference errors and adds tests
+ * bug #194 makes some appropriate properties ** bug
+ * bug #191 passes config to HttpBasic
+ * bug #190 validates client credentials before ** bug
+ * bug #171 Fix wrong redirect following authorization step
+ * bug #187 client_id is now passed to getDefaultScope().
+ * bug #176 Require refresh_token in getRefreshToken response
+ * bug #174 make user\_id not required for refresh_token grant
+ * bug #173 Duplication in JwtBearer Grant
+ * bug #168 user\_id not required for authorization_code grant
+ * bug #133 hardens default security for user object
+ * bug #163 allows redirect\_uri on authorization_code to be NULL in docs example
+ * bug #162 adds getToken on ResourceController for convenience
+ * bug #161 fixes fatal error
+ * bug #163 Invalid redirect_uri handling
+ * bug #156 user\_id in OAuth2\_Storage_AuthorizationCodeInterface::getAuthorizationCode() response
+ * bug #157 Fix for extending access and refresh tokens
+ * bug #154 ResponseInterface: getParameter method is used in the library but not defined in the interface
+ * bug #148 Add more detail to examples in Readme.md
diff --git a/library/oauth2/LICENSE b/library/oauth2/LICENSE
new file mode 100644
index 000000000..d7ece8467
--- /dev/null
+++ b/library/oauth2/LICENSE
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2014 Brent Shaffer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/library/oauth2/README.md b/library/oauth2/README.md
new file mode 100644
index 000000000..4ceda6cf9
--- /dev/null
+++ b/library/oauth2/README.md
@@ -0,0 +1,8 @@
+oauth2-server-php
+=================
+
+[![Build Status](https://travis-ci.org/bshaffer/oauth2-server-php.svg?branch=develop)](https://travis-ci.org/bshaffer/oauth2-server-php)
+
+[![Total Downloads](https://poser.pugx.org/bshaffer/oauth2-server-php/downloads.png)](https://packagist.org/packages/bshaffer/oauth2-server-php)
+
+View the [complete documentation](http://bshaffer.github.io/oauth2-server-php-docs/) \ No newline at end of file
diff --git a/library/oauth2/phpunit.xml b/library/oauth2/phpunit.xml
new file mode 100644
index 000000000..e36403f0a
--- /dev/null
+++ b/library/oauth2/phpunit.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+ backupStaticAttributes="false"
+ colors="true"
+ convertErrorsToExceptions="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ processIsolation="false"
+ stopOnFailure="false"
+ syntaxCheck="false"
+ bootstrap="test/bootstrap.php"
+>
+ <testsuites>
+ <testsuite name="Oauth2 Test Suite">
+ <directory>./test/OAuth2/</directory>
+ </testsuite>
+ </testsuites>
+
+ <filter>
+ <whitelist>
+ <directory suffix=".php">./src/OAuth2/</directory>
+ </whitelist>
+ </filter>
+</phpunit>
diff --git a/library/oauth2/src/OAuth2/Autoloader.php b/library/oauth2/src/OAuth2/Autoloader.php
new file mode 100644
index 000000000..ecfb6ba75
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Autoloader.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace OAuth2;
+
+/**
+ * Autoloads OAuth2 classes
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ * @license MIT License
+ */
+class Autoloader
+{
+ private $dir;
+
+ public function __construct($dir = null)
+ {
+ if (is_null($dir)) {
+ $dir = dirname(__FILE__).'/..';
+ }
+ $this->dir = $dir;
+ }
+ /**
+ * Registers OAuth2\Autoloader as an SPL autoloader.
+ */
+ public static function register($dir = null)
+ {
+ ini_set('unserialize_callback_func', 'spl_autoload_call');
+ spl_autoload_register(array(new self($dir), 'autoload'));
+ }
+
+ /**
+ * Handles autoloading of classes.
+ *
+ * @param string $class A class name.
+ *
+ * @return boolean Returns true if the class has been loaded
+ */
+ public function autoload($class)
+ {
+ if (0 !== strpos($class, 'OAuth2')) {
+ return;
+ }
+
+ if (file_exists($file = $this->dir.'/'.str_replace('\\', '/', $class).'.php')) {
+ require $file;
+ }
+ }
+}
diff --git a/library/oauth2/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php b/library/oauth2/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php
new file mode 100644
index 000000000..29c7171b5
--- /dev/null
+++ b/library/oauth2/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace OAuth2\ClientAssertionType;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * Interface for all OAuth2 Client Assertion Types
+ */
+interface ClientAssertionTypeInterface
+{
+ public function validateRequest(RequestInterface $request, ResponseInterface $response);
+ public function getClientId();
+}
diff --git a/library/oauth2/src/OAuth2/ClientAssertionType/HttpBasic.php b/library/oauth2/src/OAuth2/ClientAssertionType/HttpBasic.php
new file mode 100644
index 000000000..0ecb7e18d
--- /dev/null
+++ b/library/oauth2/src/OAuth2/ClientAssertionType/HttpBasic.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace OAuth2\ClientAssertionType;
+
+use OAuth2\Storage\ClientCredentialsInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * Validate a client via Http Basic authentication
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class HttpBasic implements ClientAssertionTypeInterface
+{
+ private $clientData;
+
+ protected $storage;
+ protected $config;
+
+ /**
+ * @param OAuth2\Storage\ClientCredentialsInterface $clientStorage REQUIRED Storage class for retrieving client credentials information
+ * @param array $config OPTIONAL Configuration options for the server
+ * <code>
+ * $config = array(
+ * 'allow_credentials_in_request_body' => true, // whether to look for credentials in the POST body in addition to the Authorize HTTP Header
+ * 'allow_public_clients' => true // if true, "public clients" (clients without a secret) may be authenticated
+ * );
+ * </code>
+ */
+ public function __construct(ClientCredentialsInterface $storage, array $config = array())
+ {
+ $this->storage = $storage;
+ $this->config = array_merge(array(
+ 'allow_credentials_in_request_body' => true,
+ 'allow_public_clients' => true,
+ ), $config);
+ }
+
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$clientData = $this->getClientCredentials($request, $response)) {
+ return false;
+ }
+
+ if (!isset($clientData['client_id'])) {
+ throw new \LogicException('the clientData array must have "client_id" set');
+ }
+
+ if (!isset($clientData['client_secret']) || $clientData['client_secret'] == '') {
+ if (!$this->config['allow_public_clients']) {
+ $response->setError(400, 'invalid_client', 'client credentials are required');
+
+ return false;
+ }
+
+ if (!$this->storage->isPublicClient($clientData['client_id'])) {
+ $response->setError(400, 'invalid_client', 'This client is invalid or must authenticate using a client secret');
+
+ return false;
+ }
+ } elseif ($this->storage->checkClientCredentials($clientData['client_id'], $clientData['client_secret']) === false) {
+ $response->setError(400, 'invalid_client', 'The client credentials are invalid');
+
+ return false;
+ }
+
+ $this->clientData = $clientData;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return $this->clientData['client_id'];
+ }
+
+ /**
+ * Internal function used to get the client credentials from HTTP basic
+ * auth or POST data.
+ *
+ * According to the spec (draft 20), the client_id can be provided in
+ * the Basic Authorization header (recommended) or via GET/POST.
+ *
+ * @return
+ * A list containing the client identifier and password, for example
+ * @code
+ * return array(
+ * "client_id" => CLIENT_ID, // REQUIRED the client id
+ * "client_secret" => CLIENT_SECRET, // OPTIONAL the client secret (may be omitted for public clients)
+ * );
+ * @endcode
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-2.3.1
+ *
+ * @ingroup oauth2_section_2
+ */
+ public function getClientCredentials(RequestInterface $request, ResponseInterface $response = null)
+ {
+ if (!is_null($request->headers('PHP_AUTH_USER')) && !is_null($request->headers('PHP_AUTH_PW'))) {
+ return array('client_id' => $request->headers('PHP_AUTH_USER'), 'client_secret' => $request->headers('PHP_AUTH_PW'));
+ }
+
+ if ($this->config['allow_credentials_in_request_body']) {
+ // Using POST for HttpBasic authorization is not recommended, but is supported by specification
+ if (!is_null($request->request('client_id'))) {
+ /**
+ * client_secret can be null if the client's password is an empty string
+ * @see http://tools.ietf.org/html/rfc6749#section-2.3.1
+ */
+
+ return array('client_id' => $request->request('client_id'), 'client_secret' => $request->request('client_secret'));
+ }
+ }
+
+ if ($response) {
+ $message = $this->config['allow_credentials_in_request_body'] ? ' or body' : '';
+ $response->setError(400, 'invalid_client', 'Client credentials were not found in the headers'.$message);
+ }
+
+ return null;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/Controller/AuthorizeController.php b/library/oauth2/src/OAuth2/Controller/AuthorizeController.php
new file mode 100644
index 000000000..a9a722587
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Controller/AuthorizeController.php
@@ -0,0 +1,388 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\Storage\ClientInterface;
+use OAuth2\ScopeInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+use OAuth2\Scope;
+
+/**
+ * @see OAuth2\Controller\AuthorizeControllerInterface
+ */
+class AuthorizeController implements AuthorizeControllerInterface
+{
+ private $scope;
+ private $state;
+ private $client_id;
+ private $redirect_uri;
+ private $response_type;
+
+ protected $clientStorage;
+ protected $responseTypes;
+ protected $config;
+ protected $scopeUtil;
+
+ /**
+ * @param OAuth2\Storage\ClientInterface $clientStorage REQUIRED Instance of OAuth2\Storage\ClientInterface to retrieve client information
+ * @param array $responseTypes OPTIONAL Array of OAuth2\ResponseType\ResponseTypeInterface objects. Valid array
+ * keys are "code" and "token"
+ * @param array $config OPTIONAL Configuration options for the server
+ * <code>
+ * $config = array(
+ * 'allow_implicit' => false, // if the controller should allow the "implicit" grant type
+ * 'enforce_state' => true // if the controller should require the "state" parameter
+ * 'require_exact_redirect_uri' => true, // if the controller should require an exact match on the "redirect_uri" parameter
+ * 'redirect_status_code' => 302, // HTTP status code to use for redirect responses
+ * );
+ * </code>
+ * @param OAuth2\ScopeInterface $scopeUtil OPTIONAL Instance of OAuth2\ScopeInterface to validate the requested scope
+ */
+ public function __construct(ClientInterface $clientStorage, array $responseTypes = array(), array $config = array(), ScopeInterface $scopeUtil = null)
+ {
+ $this->clientStorage = $clientStorage;
+ $this->responseTypes = $responseTypes;
+ $this->config = array_merge(array(
+ 'allow_implicit' => false,
+ 'enforce_state' => true,
+ 'require_exact_redirect_uri' => true,
+ 'redirect_status_code' => 302,
+ ), $config);
+
+ if (is_null($scopeUtil)) {
+ $scopeUtil = new Scope();
+ }
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ public function handleAuthorizeRequest(RequestInterface $request, ResponseInterface $response, $is_authorized, $user_id = null)
+ {
+ if (!is_bool($is_authorized)) {
+ throw new \InvalidArgumentException('Argument "is_authorized" must be a boolean. This method must know if the user has granted access to the client.');
+ }
+
+ // We repeat this, because we need to re-validate. The request could be POSTed
+ // by a 3rd-party (because we are not internally enforcing NONCEs, etc)
+ if (!$this->validateAuthorizeRequest($request, $response)) {
+ return;
+ }
+
+ // If no redirect_uri is passed in the request, use client's registered one
+ if (empty($this->redirect_uri)) {
+ $clientData = $this->clientStorage->getClientDetails($this->client_id);
+ $registered_redirect_uri = $clientData['redirect_uri'];
+ }
+
+ // the user declined access to the client's application
+ if ($is_authorized === false) {
+ $redirect_uri = $this->redirect_uri ?: $registered_redirect_uri;
+ $this->setNotAuthorizedResponse($request, $response, $redirect_uri, $user_id);
+
+ return;
+ }
+
+ // build the parameters to set in the redirect URI
+ if (!$params = $this->buildAuthorizeParameters($request, $response, $user_id)) {
+ return;
+ }
+
+ $authResult = $this->responseTypes[$this->response_type]->getAuthorizeResponse($params, $user_id);
+
+ list($redirect_uri, $uri_params) = $authResult;
+
+ if (empty($redirect_uri) && !empty($registered_redirect_uri)) {
+ $redirect_uri = $registered_redirect_uri;
+ }
+
+ $uri = $this->buildUri($redirect_uri, $uri_params);
+
+ // return redirect response
+ $response->setRedirect($this->config['redirect_status_code'], $uri);
+ }
+
+ protected function setNotAuthorizedResponse(RequestInterface $request, ResponseInterface $response, $redirect_uri, $user_id = null)
+ {
+ $error = 'access_denied';
+ $error_message = 'The user denied access to your application';
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $this->state, $error, $error_message);
+ }
+
+ /*
+ * We have made this protected so this class can be extended to add/modify
+ * these parameters
+ */
+ protected function buildAuthorizeParameters($request, $response, $user_id)
+ {
+ // @TODO: we should be explicit with this in the future
+ $params = array(
+ 'scope' => $this->scope,
+ 'state' => $this->state,
+ 'client_id' => $this->client_id,
+ 'redirect_uri' => $this->redirect_uri,
+ 'response_type' => $this->response_type,
+ );
+
+ return $params;
+ }
+
+ public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ // Make sure a valid client id was supplied (we can not redirect because we were unable to verify the URI)
+ if (!$client_id = $request->query('client_id', $request->request('client_id'))) {
+ // We don't have a good URI to use
+ $response->setError(400, 'invalid_client', "No client id supplied");
+
+ return false;
+ }
+
+ // Get client details
+ if (!$clientData = $this->clientStorage->getClientDetails($client_id)) {
+ $response->setError(400, 'invalid_client', 'The client id supplied is invalid');
+
+ return false;
+ }
+
+ $registered_redirect_uri = isset($clientData['redirect_uri']) ? $clientData['redirect_uri'] : '';
+
+ // Make sure a valid redirect_uri was supplied. If specified, it must match the clientData URI.
+ // @see http://tools.ietf.org/html/rfc6749#section-3.1.2
+ // @see http://tools.ietf.org/html/rfc6749#section-4.1.2.1
+ // @see http://tools.ietf.org/html/rfc6749#section-4.2.2.1
+ if ($supplied_redirect_uri = $request->query('redirect_uri', $request->request('redirect_uri'))) {
+ // validate there is no fragment supplied
+ $parts = parse_url($supplied_redirect_uri);
+ if (isset($parts['fragment']) && $parts['fragment']) {
+ $response->setError(400, 'invalid_uri', 'The redirect URI must not contain a fragment');
+
+ return false;
+ }
+
+ // validate against the registered redirect uri(s) if available
+ if ($registered_redirect_uri && !$this->validateRedirectUri($supplied_redirect_uri, $registered_redirect_uri)) {
+ $response->setError(400, 'redirect_uri_mismatch', 'The redirect URI provided is missing or does not match', '#section-3.1.2');
+
+ return false;
+ }
+ $redirect_uri = $supplied_redirect_uri;
+ } else {
+ // use the registered redirect_uri if none has been supplied, if possible
+ if (!$registered_redirect_uri) {
+ $response->setError(400, 'invalid_uri', 'No redirect URI was supplied or stored');
+
+ return false;
+ }
+
+ if (count(explode(' ', $registered_redirect_uri)) > 1) {
+ $response->setError(400, 'invalid_uri', 'A redirect URI must be supplied when multiple redirect URIs are registered', '#section-3.1.2.3');
+
+ return false;
+ }
+ $redirect_uri = $registered_redirect_uri;
+ }
+
+ // Select the redirect URI
+ $response_type = $request->query('response_type', $request->request('response_type'));
+
+ // for multiple-valued response types - make them alphabetical
+ if (false !== strpos($response_type, ' ')) {
+ $types = explode(' ', $response_type);
+ sort($types);
+ $response_type = ltrim(implode(' ', $types));
+ }
+
+ $state = $request->query('state', $request->request('state'));
+
+ // type and client_id are required
+ if (!$response_type || !in_array($response_type, $this->getValidResponseTypes())) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'invalid_request', 'Invalid or missing response type', null);
+
+ return false;
+ }
+
+ if ($response_type == self::RESPONSE_TYPE_AUTHORIZATION_CODE) {
+ if (!isset($this->responseTypes['code'])) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unsupported_response_type', 'authorization code grant type not supported', null);
+
+ return false;
+ }
+ if (!$this->clientStorage->checkRestrictedGrantType($client_id, 'authorization_code')) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unauthorized_client', 'The grant type is unauthorized for this client_id', null);
+
+ return false;
+ }
+ if ($this->responseTypes['code']->enforceRedirect() && !$redirect_uri) {
+ $response->setError(400, 'redirect_uri_mismatch', 'The redirect URI is mandatory and was not supplied');
+
+ return false;
+ }
+ } else {
+ if (!$this->config['allow_implicit']) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unsupported_response_type', 'implicit grant type not supported', null);
+
+ return false;
+ }
+ if (!$this->clientStorage->checkRestrictedGrantType($client_id, 'implicit')) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unauthorized_client', 'The grant type is unauthorized for this client_id', null);
+
+ return false;
+ }
+ }
+
+ // validate requested scope if it exists
+ $requestedScope = $this->scopeUtil->getScopeFromRequest($request);
+
+ if ($requestedScope) {
+ // restrict scope by client specific scope if applicable,
+ // otherwise verify the scope exists
+ $clientScope = $this->clientStorage->getClientScope($client_id);
+ if ((empty($clientScope) && !$this->scopeUtil->scopeExists($requestedScope))
+ || (!empty($clientScope) && !$this->scopeUtil->checkScope($requestedScope, $clientScope))) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'invalid_scope', 'An unsupported scope was requested', null);
+
+ return false;
+ }
+ } else {
+ // use a globally-defined default scope
+ $defaultScope = $this->scopeUtil->getDefaultScope($client_id);
+
+ if (false === $defaultScope) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'invalid_client', 'This application requires you specify a scope parameter', null);
+
+ return false;
+ }
+
+ $requestedScope = $defaultScope;
+ }
+
+ // Validate state parameter exists (if configured to enforce this)
+ if ($this->config['enforce_state'] && !$state) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, null, 'invalid_request', 'The state parameter is required');
+
+ return false;
+ }
+
+ // save the input data and return true
+ $this->scope = $requestedScope;
+ $this->state = $state;
+ $this->client_id = $client_id;
+ // Only save the SUPPLIED redirect URI (@see http://tools.ietf.org/html/rfc6749#section-4.1.3)
+ $this->redirect_uri = $supplied_redirect_uri;
+ $this->response_type = $response_type;
+
+ return true;
+ }
+
+ /**
+ * Build the absolute URI based on supplied URI and parameters.
+ *
+ * @param $uri An absolute URI.
+ * @param $params Parameters to be append as GET.
+ *
+ * @return
+ * An absolute URI with supplied parameters.
+ *
+ * @ingroup oauth2_section_4
+ */
+ private function buildUri($uri, $params)
+ {
+ $parse_url = parse_url($uri);
+
+ // Add our params to the parsed uri
+ foreach ($params as $k => $v) {
+ if (isset($parse_url[$k])) {
+ $parse_url[$k] .= "&" . http_build_query($v, '', '&');
+ } else {
+ $parse_url[$k] = http_build_query($v, '', '&');
+ }
+ }
+
+ // Put humpty dumpty back together
+ return
+ ((isset($parse_url["scheme"])) ? $parse_url["scheme"] . "://" : "")
+ . ((isset($parse_url["user"])) ? $parse_url["user"]
+ . ((isset($parse_url["pass"])) ? ":" . $parse_url["pass"] : "") . "@" : "")
+ . ((isset($parse_url["host"])) ? $parse_url["host"] : "")
+ . ((isset($parse_url["port"])) ? ":" . $parse_url["port"] : "")
+ . ((isset($parse_url["path"])) ? $parse_url["path"] : "")
+ . ((isset($parse_url["query"]) && !empty($parse_url['query'])) ? "?" . $parse_url["query"] : "")
+ . ((isset($parse_url["fragment"])) ? "#" . $parse_url["fragment"] : "")
+ ;
+ }
+
+ protected function getValidResponseTypes()
+ {
+ return array(
+ self::RESPONSE_TYPE_ACCESS_TOKEN,
+ self::RESPONSE_TYPE_AUTHORIZATION_CODE,
+ );
+ }
+
+ /**
+ * Internal method for validating redirect URI supplied
+ *
+ * @param string $inputUri The submitted URI to be validated
+ * @param string $registeredUriString The allowed URI(s) to validate against. Can be a space-delimited string of URIs to
+ * allow for multiple URIs
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-3.1.2
+ */
+ protected function validateRedirectUri($inputUri, $registeredUriString)
+ {
+ if (!$inputUri || !$registeredUriString) {
+ return false; // if either one is missing, assume INVALID
+ }
+
+ $registered_uris = explode(' ', $registeredUriString);
+ foreach ($registered_uris as $registered_uri) {
+ if ($this->config['require_exact_redirect_uri']) {
+ // the input uri is validated against the registered uri using exact match
+ if (strcmp($inputUri, $registered_uri) === 0) {
+ return true;
+ }
+ } else {
+ $registered_uri_length = strlen($registered_uri);
+ if ($registered_uri_length === 0) {
+ return false;
+ }
+
+ // the input uri is validated against the registered uri using case-insensitive match of the initial string
+ // i.e. additional query parameters may be applied
+ if (strcasecmp(substr($inputUri, 0, $registered_uri_length), $registered_uri) === 0) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Convenience methods to access the parameters derived from the validated request
+ */
+
+ public function getScope()
+ {
+ return $this->scope;
+ }
+
+ public function getState()
+ {
+ return $this->state;
+ }
+
+ public function getClientId()
+ {
+ return $this->client_id;
+ }
+
+ public function getRedirectUri()
+ {
+ return $this->redirect_uri;
+ }
+
+ public function getResponseType()
+ {
+ return $this->response_type;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/Controller/AuthorizeControllerInterface.php b/library/oauth2/src/OAuth2/Controller/AuthorizeControllerInterface.php
new file mode 100644
index 000000000..fa07ae8d2
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Controller/AuthorizeControllerInterface.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * This controller is called when a user should be authorized
+ * by an authorization server. As OAuth2 does not handle
+ * authorization directly, this controller ensures the request is valid, but
+ * requires the application to determine the value of $is_authorized
+ *
+ * ex:
+ * > $user_id = $this->somehowDetermineUserId();
+ * > $is_authorized = $this->somehowDetermineUserAuthorization();
+ * > $response = new OAuth2\Response();
+ * > $authorizeController->handleAuthorizeRequest(
+ * > OAuth2\Request::createFromGlobals(),
+ * > $response,
+ * > $is_authorized,
+ * > $user_id);
+ * > $response->send();
+ *
+ */
+interface AuthorizeControllerInterface
+{
+ /**
+ * List of possible authentication response types.
+ * The "authorization_code" mechanism exclusively supports 'code'
+ * and the "implicit" mechanism exclusively supports 'token'.
+ *
+ * @var string
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.1
+ * @see http://tools.ietf.org/html/rfc6749#section-4.2.1
+ */
+ const RESPONSE_TYPE_AUTHORIZATION_CODE = 'code';
+ const RESPONSE_TYPE_ACCESS_TOKEN = 'token';
+
+ public function handleAuthorizeRequest(RequestInterface $request, ResponseInterface $response, $is_authorized, $user_id = null);
+
+ public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/library/oauth2/src/OAuth2/Controller/ResourceController.php b/library/oauth2/src/OAuth2/Controller/ResourceController.php
new file mode 100644
index 000000000..e8588188f
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Controller/ResourceController.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\TokenType\TokenTypeInterface;
+use OAuth2\Storage\AccessTokenInterface;
+use OAuth2\ScopeInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+use OAuth2\Scope;
+
+/**
+ * @see OAuth2\Controller\ResourceControllerInterface
+ */
+class ResourceController implements ResourceControllerInterface
+{
+ private $token;
+
+ protected $tokenType;
+ protected $tokenStorage;
+ protected $config;
+ protected $scopeUtil;
+
+ public function __construct(TokenTypeInterface $tokenType, AccessTokenInterface $tokenStorage, $config = array(), ScopeInterface $scopeUtil = null)
+ {
+ $this->tokenType = $tokenType;
+ $this->tokenStorage = $tokenStorage;
+
+ $this->config = array_merge(array(
+ 'www_realm' => 'Service',
+ ), $config);
+
+ if (is_null($scopeUtil)) {
+ $scopeUtil = new Scope();
+ }
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ public function verifyResourceRequest(RequestInterface $request, ResponseInterface $response, $scope = null)
+ {
+ $token = $this->getAccessTokenData($request, $response);
+
+ // Check if we have token data
+ if (is_null($token)) {
+ return false;
+ }
+
+ /**
+ * Check scope, if provided
+ * If token doesn't have a scope, it's null/empty, or it's insufficient, then throw 403
+ * @see http://tools.ietf.org/html/rfc6750#section-3.1
+ */
+ if ($scope && (!isset($token["scope"]) || !$token["scope"] || !$this->scopeUtil->checkScope($scope, $token["scope"]))) {
+ $response->setError(403, 'insufficient_scope', 'The request requires higher privileges than provided by the access token');
+ $response->addHttpHeaders(array(
+ 'WWW-Authenticate' => sprintf('%s realm="%s", scope="%s", error="%s", error_description="%s"',
+ $this->tokenType->getTokenType(),
+ $this->config['www_realm'],
+ $scope,
+ $response->getParameter('error'),
+ $response->getParameter('error_description')
+ )
+ ));
+
+ return false;
+ }
+
+ // allow retrieval of the token
+ $this->token = $token;
+
+ return (bool) $token;
+ }
+
+ public function getAccessTokenData(RequestInterface $request, ResponseInterface $response)
+ {
+ // Get the token parameter
+ if ($token_param = $this->tokenType->getAccessTokenParameter($request, $response)) {
+ // Get the stored token data (from the implementing subclass)
+ // Check we have a well formed token
+ // Check token expiration (expires is a mandatory paramter)
+ if (!$token = $this->tokenStorage->getAccessToken($token_param)) {
+ $response->setError(401, 'invalid_token', 'The access token provided is invalid');
+ } elseif (!isset($token["expires"]) || !isset($token["client_id"])) {
+ $response->setError(401, 'malformed_token', 'Malformed token (missing "expires")');
+ } elseif (time() > $token["expires"]) {
+ $response->setError(401, 'expired_token', 'The access token provided has expired');
+ } else {
+ return $token;
+ }
+ }
+
+ $authHeader = sprintf('%s realm="%s"', $this->tokenType->getTokenType(), $this->config['www_realm']);
+
+ if ($error = $response->getParameter('error')) {
+ $authHeader = sprintf('%s, error="%s"', $authHeader, $error);
+ if ($error_description = $response->getParameter('error_description')) {
+ $authHeader = sprintf('%s, error_description="%s"', $authHeader, $error_description);
+ }
+ }
+
+ $response->addHttpHeaders(array('WWW-Authenticate' => $authHeader));
+
+ return null;
+ }
+
+ // convenience method to allow retrieval of the token
+ public function getToken()
+ {
+ return $this->token;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/Controller/ResourceControllerInterface.php b/library/oauth2/src/OAuth2/Controller/ResourceControllerInterface.php
new file mode 100644
index 000000000..611421935
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Controller/ResourceControllerInterface.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * This controller is called when a "resource" is requested.
+ * call verifyResourceRequest in order to determine if the request
+ * contains a valid token.
+ *
+ * ex:
+ * > if (!$resourceController->verifyResourceRequest(OAuth2\Request::createFromGlobals(), $response = new OAuth2\Response())) {
+ * > $response->send(); // authorization failed
+ * > die();
+ * > }
+ * > return json_encode($resource); // valid token! Send the stuff!
+ *
+ */
+interface ResourceControllerInterface
+{
+ public function verifyResourceRequest(RequestInterface $request, ResponseInterface $response, $scope = null);
+
+ public function getAccessTokenData(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/library/oauth2/src/OAuth2/Controller/TokenController.php b/library/oauth2/src/OAuth2/Controller/TokenController.php
new file mode 100644
index 000000000..42dab892f
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Controller/TokenController.php
@@ -0,0 +1,278 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\ClientAssertionType\ClientAssertionTypeInterface;
+use OAuth2\GrantType\GrantTypeInterface;
+use OAuth2\ScopeInterface;
+use OAuth2\Scope;
+use OAuth2\Storage\ClientInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * @see OAuth2\Controller\TokenControllerInterface
+ */
+class TokenController implements TokenControllerInterface
+{
+ protected $accessToken;
+ protected $grantTypes;
+ protected $clientAssertionType;
+ protected $scopeUtil;
+ protected $clientStorage;
+
+ public function __construct(AccessTokenInterface $accessToken, ClientInterface $clientStorage, array $grantTypes = array(), ClientAssertionTypeInterface $clientAssertionType = null, ScopeInterface $scopeUtil = null)
+ {
+ if (is_null($clientAssertionType)) {
+ foreach ($grantTypes as $grantType) {
+ if (!$grantType instanceof ClientAssertionTypeInterface) {
+ throw new \InvalidArgumentException('You must supply an instance of OAuth2\ClientAssertionType\ClientAssertionTypeInterface or only use grant types which implement OAuth2\ClientAssertionType\ClientAssertionTypeInterface');
+ }
+ }
+ }
+ $this->clientAssertionType = $clientAssertionType;
+ $this->accessToken = $accessToken;
+ $this->clientStorage = $clientStorage;
+ foreach ($grantTypes as $grantType) {
+ $this->addGrantType($grantType);
+ }
+
+ if (is_null($scopeUtil)) {
+ $scopeUtil = new Scope();
+ }
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ public function handleTokenRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if ($token = $this->grantAccessToken($request, $response)) {
+ // @see http://tools.ietf.org/html/rfc6749#section-5.1
+ // server MUST disable caching in headers when tokens are involved
+ $response->setStatusCode(200);
+ $response->addParameters($token);
+ $response->addHttpHeaders(array(
+ 'Cache-Control' => 'no-store',
+ 'Pragma' => 'no-cache',
+ 'Content-Type' => 'application/json'
+ ));
+ }
+ }
+
+ /**
+ * Grant or deny a requested access token.
+ * This would be called from the "/token" endpoint as defined in the spec.
+ * You can call your endpoint whatever you want.
+ *
+ * @param $request - RequestInterface
+ * Request object to grant access token
+ *
+ * @throws InvalidArgumentException
+ * @throws LogicException
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @see http://tools.ietf.org/html/rfc6749#section-10.6
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.3
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function grantAccessToken(RequestInterface $request, ResponseInterface $response)
+ {
+ if (strtolower($request->server('REQUEST_METHOD')) != 'post') {
+ $response->setError(405, 'invalid_request', 'The request method must be POST when requesting an access token', '#section-3.2');
+ $response->addHttpHeaders(array('Allow' => 'POST'));
+
+ return null;
+ }
+
+ /**
+ * Determine grant type from request
+ * and validate the request for that grant type
+ */
+ if (!$grantTypeIdentifier = $request->request('grant_type')) {
+ $response->setError(400, 'invalid_request', 'The grant type was not specified in the request');
+
+ return null;
+ }
+
+ if (!isset($this->grantTypes[$grantTypeIdentifier])) {
+ /* TODO: If this is an OAuth2 supported grant type that we have chosen not to implement, throw a 501 Not Implemented instead */
+ $response->setError(400, 'unsupported_grant_type', sprintf('Grant type "%s" not supported', $grantTypeIdentifier));
+
+ return null;
+ }
+
+ $grantType = $this->grantTypes[$grantTypeIdentifier];
+
+ /**
+ * Retrieve the client information from the request
+ * ClientAssertionTypes allow for grant types which also assert the client data
+ * in which case ClientAssertion is handled in the validateRequest method
+ *
+ * @see OAuth2\GrantType\JWTBearer
+ * @see OAuth2\GrantType\ClientCredentials
+ */
+ if (!$grantType instanceof ClientAssertionTypeInterface) {
+ if (!$this->clientAssertionType->validateRequest($request, $response)) {
+ return null;
+ }
+ $clientId = $this->clientAssertionType->getClientId();
+ }
+
+ /**
+ * Retrieve the grant type information from the request
+ * The GrantTypeInterface object handles all validation
+ * If the object is an instance of ClientAssertionTypeInterface,
+ * That logic is handled here as well
+ */
+ if (!$grantType->validateRequest($request, $response)) {
+ return null;
+ }
+
+ if ($grantType instanceof ClientAssertionTypeInterface) {
+ $clientId = $grantType->getClientId();
+ } else {
+ // validate the Client ID (if applicable)
+ if (!is_null($storedClientId = $grantType->getClientId()) && $storedClientId != $clientId) {
+ $response->setError(400, 'invalid_grant', sprintf('%s doesn\'t exist or is invalid for the client', $grantTypeIdentifier));
+
+ return null;
+ }
+ }
+
+ /**
+ * Validate the client can use the requested grant type
+ */
+ if (!$this->clientStorage->checkRestrictedGrantType($clientId, $grantTypeIdentifier)) {
+ $response->setError(400, 'unauthorized_client', 'The grant type is unauthorized for this client_id');
+
+ return false;
+ }
+
+ /**
+ * Validate the scope of the token
+ *
+ * requestedScope - the scope specified in the token request
+ * availableScope - the scope associated with the grant type
+ * ex: in the case of the "Authorization Code" grant type,
+ * the scope is specified in the authorize request
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-3.3
+ */
+
+ $requestedScope = $this->scopeUtil->getScopeFromRequest($request);
+ $availableScope = $grantType->getScope();
+
+ if ($requestedScope) {
+ // validate the requested scope
+ if ($availableScope) {
+ if (!$this->scopeUtil->checkScope($requestedScope, $availableScope)) {
+ $response->setError(400, 'invalid_scope', 'The scope requested is invalid for this request');
+
+ return null;
+ }
+ } else {
+ // validate the client has access to this scope
+ if ($clientScope = $this->clientStorage->getClientScope($clientId)) {
+ if (!$this->scopeUtil->checkScope($requestedScope, $clientScope)) {
+ $response->setError(400, 'invalid_scope', 'The scope requested is invalid for this client');
+
+ return false;
+ }
+ } elseif (!$this->scopeUtil->scopeExists($requestedScope)) {
+ $response->setError(400, 'invalid_scope', 'An unsupported scope was requested');
+
+ return null;
+ }
+ }
+ } elseif ($availableScope) {
+ // use the scope associated with this grant type
+ $requestedScope = $availableScope;
+ } else {
+ // use a globally-defined default scope
+ $defaultScope = $this->scopeUtil->getDefaultScope($clientId);
+
+ // "false" means default scopes are not allowed
+ if (false === $defaultScope) {
+ $response->setError(400, 'invalid_scope', 'This application requires you specify a scope parameter');
+
+ return null;
+ }
+
+ $requestedScope = $defaultScope;
+ }
+
+ return $grantType->createAccessToken($this->accessToken, $clientId, $grantType->getUserId(), $requestedScope);
+ }
+
+ /**
+ * addGrantType
+ *
+ * @param grantType - OAuth2\GrantTypeInterface
+ * the grant type to add for the specified identifier
+ * @param identifier - string
+ * a string passed in as "grant_type" in the response that will call this grantType
+ */
+ public function addGrantType(GrantTypeInterface $grantType, $identifier = null)
+ {
+ if (is_null($identifier) || is_numeric($identifier)) {
+ $identifier = $grantType->getQuerystringIdentifier();
+ }
+
+ $this->grantTypes[$identifier] = $grantType;
+ }
+
+ public function handleRevokeRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if ($this->revokeToken($request, $response)) {
+ $response->setStatusCode(200);
+ $response->addParameters(array('revoked' => true));
+ }
+ }
+
+ /**
+ * Revoke a refresh or access token. Returns true on success and when tokens are invalid
+ *
+ * Note: invalid tokens do not cause an error response since the client
+ * cannot handle such an error in a reasonable way. Moreover, the
+ * purpose of the revocation request, invalidating the particular token,
+ * is already achieved.
+ *
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return bool|null
+ */
+ public function revokeToken(RequestInterface $request, ResponseInterface $response)
+ {
+ if (strtolower($request->server('REQUEST_METHOD')) != 'post') {
+ $response->setError(405, 'invalid_request', 'The request method must be POST when revoking an access token', '#section-3.2');
+ $response->addHttpHeaders(array('Allow' => 'POST'));
+
+ return null;
+ }
+
+ $token_type_hint = $request->request('token_type_hint');
+ if (!in_array($token_type_hint, array(null, 'access_token', 'refresh_token'), true)) {
+ $response->setError(400, 'invalid_request', 'Token type hint must be either \'access_token\' or \'refresh_token\'');
+
+ return null;
+ }
+
+ $token = $request->request('token');
+ if ($token === null) {
+ $response->setError(400, 'invalid_request', 'Missing token parameter to revoke');
+
+ return null;
+ }
+
+ // @todo remove this check for v2.0
+ if (!method_exists($this->accessToken, 'revokeToken')) {
+ $class = get_class($this->accessToken);
+ throw new \RuntimeException("AccessToken {$class} does not implement required revokeToken method");
+ }
+
+ $this->accessToken->revokeToken($token, $token_type_hint);
+
+ return true;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/Controller/TokenControllerInterface.php b/library/oauth2/src/OAuth2/Controller/TokenControllerInterface.php
new file mode 100644
index 000000000..72d72570f
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Controller/TokenControllerInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * This controller is called when a token is being requested.
+ * it is called to handle all grant types the application supports.
+ * It also validates the client's credentials
+ *
+ * ex:
+ * > $tokenController->handleTokenRequest(OAuth2\Request::createFromGlobals(), $response = new OAuth2\Response());
+ * > $response->send();
+ *
+ */
+interface TokenControllerInterface
+{
+ /**
+ * handleTokenRequest
+ *
+ * @param $request
+ * OAuth2\RequestInterface - The current http request
+ * @param $response
+ * OAuth2\ResponseInterface - An instance of OAuth2\ResponseInterface to contain the response data
+ *
+ */
+ public function handleTokenRequest(RequestInterface $request, ResponseInterface $response);
+
+ public function grantAccessToken(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/library/oauth2/src/OAuth2/Encryption/EncryptionInterface.php b/library/oauth2/src/OAuth2/Encryption/EncryptionInterface.php
new file mode 100644
index 000000000..2d336c664
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Encryption/EncryptionInterface.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+interface EncryptionInterface
+{
+ public function encode($payload, $key, $algorithm = null);
+ public function decode($payload, $key, $algorithm = null);
+ public function urlSafeB64Encode($data);
+ public function urlSafeB64Decode($b64);
+}
diff --git a/library/oauth2/src/OAuth2/Encryption/FirebaseJwt.php b/library/oauth2/src/OAuth2/Encryption/FirebaseJwt.php
new file mode 100644
index 000000000..1b527e0a0
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Encryption/FirebaseJwt.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+/**
+ * Bridge file to use the firebase/php-jwt package for JWT encoding and decoding.
+ * @author Francis Chuang <francis.chuang@gmail.com>
+ */
+class FirebaseJwt implements EncryptionInterface
+{
+ public function __construct()
+ {
+ if (!class_exists('\JWT')) {
+ throw new \ErrorException('firebase/php-jwt must be installed to use this feature. You can do this by running "composer require firebase/php-jwt"');
+ }
+ }
+
+ public function encode($payload, $key, $alg = 'HS256', $keyId = null)
+ {
+ return \JWT::encode($payload, $key, $alg, $keyId);
+ }
+
+ public function decode($jwt, $key = null, $allowedAlgorithms = null)
+ {
+ try {
+
+ //Maintain BC: Do not verify if no algorithms are passed in.
+ if (!$allowedAlgorithms) {
+ $key = null;
+ }
+
+ return (array)\JWT::decode($jwt, $key, $allowedAlgorithms);
+ } catch (\Exception $e) {
+ return false;
+ }
+ }
+
+ public function urlSafeB64Encode($data)
+ {
+ return \JWT::urlsafeB64Encode($data);
+ }
+
+ public function urlSafeB64Decode($b64)
+ {
+ return \JWT::urlsafeB64Decode($b64);
+ }
+}
diff --git a/library/oauth2/src/OAuth2/Encryption/Jwt.php b/library/oauth2/src/OAuth2/Encryption/Jwt.php
new file mode 100644
index 000000000..ee576e643
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Encryption/Jwt.php
@@ -0,0 +1,173 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+/**
+ * @link https://github.com/F21/jwt
+ * @author F21
+ */
+class Jwt implements EncryptionInterface
+{
+ public function encode($payload, $key, $algo = 'HS256')
+ {
+ $header = $this->generateJwtHeader($payload, $algo);
+
+ $segments = array(
+ $this->urlSafeB64Encode(json_encode($header)),
+ $this->urlSafeB64Encode(json_encode($payload))
+ );
+
+ $signing_input = implode('.', $segments);
+
+ $signature = $this->sign($signing_input, $key, $algo);
+ $segments[] = $this->urlsafeB64Encode($signature);
+
+ return implode('.', $segments);
+ }
+
+ public function decode($jwt, $key = null, $allowedAlgorithms = true)
+ {
+ if (!strpos($jwt, '.')) {
+ return false;
+ }
+
+ $tks = explode('.', $jwt);
+
+ if (count($tks) != 3) {
+ return false;
+ }
+
+ list($headb64, $payloadb64, $cryptob64) = $tks;
+
+ if (null === ($header = json_decode($this->urlSafeB64Decode($headb64), true))) {
+ return false;
+ }
+
+ if (null === $payload = json_decode($this->urlSafeB64Decode($payloadb64), true)) {
+ return false;
+ }
+
+ $sig = $this->urlSafeB64Decode($cryptob64);
+
+ if ((bool) $allowedAlgorithms) {
+ if (!isset($header['alg'])) {
+ return false;
+ }
+
+ // check if bool arg supplied here to maintain BC
+ if (is_array($allowedAlgorithms) && !in_array($header['alg'], $allowedAlgorithms)) {
+ return false;
+ }
+
+ if (!$this->verifySignature($sig, "$headb64.$payloadb64", $key, $header['alg'])) {
+ return false;
+ }
+ }
+
+ return $payload;
+ }
+
+ private function verifySignature($signature, $input, $key, $algo = 'HS256')
+ {
+ // use constants when possible, for HipHop support
+ switch ($algo) {
+ case'HS256':
+ case'HS384':
+ case'HS512':
+ return $this->hash_equals(
+ $this->sign($input, $key, $algo),
+ $signature
+ );
+
+ case 'RS256':
+ return openssl_verify($input, $signature, $key, defined('OPENSSL_ALGO_SHA256') ? OPENSSL_ALGO_SHA256 : 'sha256') === 1;
+
+ case 'RS384':
+ return @openssl_verify($input, $signature, $key, defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'sha384') === 1;
+
+ case 'RS512':
+ return @openssl_verify($input, $signature, $key, defined('OPENSSL_ALGO_SHA512') ? OPENSSL_ALGO_SHA512 : 'sha512') === 1;
+
+ default:
+ throw new \InvalidArgumentException("Unsupported or invalid signing algorithm.");
+ }
+ }
+
+ private function sign($input, $key, $algo = 'HS256')
+ {
+ switch ($algo) {
+ case 'HS256':
+ return hash_hmac('sha256', $input, $key, true);
+
+ case 'HS384':
+ return hash_hmac('sha384', $input, $key, true);
+
+ case 'HS512':
+ return hash_hmac('sha512', $input, $key, true);
+
+ case 'RS256':
+ return $this->generateRSASignature($input, $key, defined('OPENSSL_ALGO_SHA256') ? OPENSSL_ALGO_SHA256 : 'sha256');
+
+ case 'RS384':
+ return $this->generateRSASignature($input, $key, defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'sha384');
+
+ case 'RS512':
+ return $this->generateRSASignature($input, $key, defined('OPENSSL_ALGO_SHA512') ? OPENSSL_ALGO_SHA512 : 'sha512');
+
+ default:
+ throw new \Exception("Unsupported or invalid signing algorithm.");
+ }
+ }
+
+ private function generateRSASignature($input, $key, $algo)
+ {
+ if (!openssl_sign($input, $signature, $key, $algo)) {
+ throw new \Exception("Unable to sign data.");
+ }
+
+ return $signature;
+ }
+
+ public function urlSafeB64Encode($data)
+ {
+ $b64 = base64_encode($data);
+ $b64 = str_replace(array('+', '/', "\r", "\n", '='),
+ array('-', '_'),
+ $b64);
+
+ return $b64;
+ }
+
+ public function urlSafeB64Decode($b64)
+ {
+ $b64 = str_replace(array('-', '_'),
+ array('+', '/'),
+ $b64);
+
+ return base64_decode($b64);
+ }
+
+ /**
+ * Override to create a custom header
+ */
+ protected function generateJwtHeader($payload, $algorithm)
+ {
+ return array(
+ 'typ' => 'JWT',
+ 'alg' => $algorithm,
+ );
+ }
+
+ protected function hash_equals($a, $b)
+ {
+ if (function_exists('hash_equals')) {
+ return hash_equals($a, $b);
+ }
+ $diff = strlen($a) ^ strlen($b);
+ for ($i = 0; $i < strlen($a) && $i < strlen($b); $i++) {
+ $diff |= ord($a[$i]) ^ ord($b[$i]);
+ }
+
+ return $diff === 0;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/GrantType/AuthorizationCode.php b/library/oauth2/src/OAuth2/GrantType/AuthorizationCode.php
new file mode 100644
index 000000000..e8995204c
--- /dev/null
+++ b/library/oauth2/src/OAuth2/GrantType/AuthorizationCode.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\AuthorizationCodeInterface;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AuthorizationCode implements GrantTypeInterface
+{
+ protected $storage;
+ protected $authCode;
+
+ /**
+ * @param OAuth2\Storage\AuthorizationCodeInterface $storage REQUIRED Storage class for retrieving authorization code information
+ */
+ public function __construct(AuthorizationCodeInterface $storage)
+ {
+ $this->storage = $storage;
+ }
+
+ public function getQuerystringIdentifier()
+ {
+ return 'authorization_code';
+ }
+
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$request->request('code')) {
+ $response->setError(400, 'invalid_request', 'Missing parameter: "code" is required');
+
+ return false;
+ }
+
+ $code = $request->request('code');
+ if (!$authCode = $this->storage->getAuthorizationCode($code)) {
+ $response->setError(400, 'invalid_grant', 'Authorization code doesn\'t exist or is invalid for the client');
+
+ return false;
+ }
+
+ /*
+ * 4.1.3 - ensure that the "redirect_uri" parameter is present if the "redirect_uri" parameter was included in the initial authorization request
+ * @uri - http://tools.ietf.org/html/rfc6749#section-4.1.3
+ */
+ if (isset($authCode['redirect_uri']) && $authCode['redirect_uri']) {
+ if (!$request->request('redirect_uri') || urldecode($request->request('redirect_uri')) != $authCode['redirect_uri']) {
+ $response->setError(400, 'redirect_uri_mismatch', "The redirect URI is missing or do not match", "#section-4.1.3");
+
+ return false;
+ }
+ }
+
+ if (!isset($authCode['expires'])) {
+ throw new \Exception('Storage must return authcode with a value for "expires"');
+ }
+
+ if ($authCode["expires"] < time()) {
+ $response->setError(400, 'invalid_grant', "The authorization code has expired");
+
+ return false;
+ }
+
+ if (!isset($authCode['code'])) {
+ $authCode['code'] = $code; // used to expire the code after the access token is granted
+ }
+
+ $this->authCode = $authCode;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return $this->authCode['client_id'];
+ }
+
+ public function getScope()
+ {
+ return isset($this->authCode['scope']) ? $this->authCode['scope'] : null;
+ }
+
+ public function getUserId()
+ {
+ return isset($this->authCode['user_id']) ? $this->authCode['user_id'] : null;
+ }
+
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ $token = $accessToken->createAccessToken($client_id, $user_id, $scope);
+ $this->storage->expireAuthorizationCode($this->authCode['code']);
+
+ return $token;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/GrantType/ClientCredentials.php b/library/oauth2/src/OAuth2/GrantType/ClientCredentials.php
new file mode 100644
index 000000000..f953e4e8d
--- /dev/null
+++ b/library/oauth2/src/OAuth2/GrantType/ClientCredentials.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\ClientAssertionType\HttpBasic;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\Storage\ClientCredentialsInterface;
+
+/**
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ *
+ * @see OAuth2\ClientAssertionType_HttpBasic
+ */
+class ClientCredentials extends HttpBasic implements GrantTypeInterface
+{
+ private $clientData;
+
+ public function __construct(ClientCredentialsInterface $storage, array $config = array())
+ {
+ /**
+ * The client credentials grant type MUST only be used by confidential clients
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.4
+ */
+ $config['allow_public_clients'] = false;
+
+ parent::__construct($storage, $config);
+ }
+
+ public function getQuerystringIdentifier()
+ {
+ return 'client_credentials';
+ }
+
+ public function getScope()
+ {
+ $this->loadClientData();
+
+ return isset($this->clientData['scope']) ? $this->clientData['scope'] : null;
+ }
+
+ public function getUserId()
+ {
+ $this->loadClientData();
+
+ return isset($this->clientData['user_id']) ? $this->clientData['user_id'] : null;
+ }
+
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ /**
+ * Client Credentials Grant does NOT include a refresh token
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.4.3
+ */
+ $includeRefreshToken = false;
+
+ return $accessToken->createAccessToken($client_id, $user_id, $scope, $includeRefreshToken);
+ }
+
+ private function loadClientData()
+ {
+ if (!$this->clientData) {
+ $this->clientData = $this->storage->getClientDetails($this->getClientId());
+ }
+ }
+}
diff --git a/library/oauth2/src/OAuth2/GrantType/GrantTypeInterface.php b/library/oauth2/src/OAuth2/GrantType/GrantTypeInterface.php
new file mode 100644
index 000000000..98489e9c1
--- /dev/null
+++ b/library/oauth2/src/OAuth2/GrantType/GrantTypeInterface.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * Interface for all OAuth2 Grant Types
+ */
+interface GrantTypeInterface
+{
+ public function getQuerystringIdentifier();
+ public function validateRequest(RequestInterface $request, ResponseInterface $response);
+ public function getClientId();
+ public function getUserId();
+ public function getScope();
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope);
+}
diff --git a/library/oauth2/src/OAuth2/GrantType/JwtBearer.php b/library/oauth2/src/OAuth2/GrantType/JwtBearer.php
new file mode 100644
index 000000000..bb11a6954
--- /dev/null
+++ b/library/oauth2/src/OAuth2/GrantType/JwtBearer.php
@@ -0,0 +1,226 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\ClientAssertionType\ClientAssertionTypeInterface;
+use OAuth2\Storage\JwtBearerInterface;
+use OAuth2\Encryption\Jwt;
+use OAuth2\Encryption\EncryptionInterface;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * The JWT bearer authorization grant implements JWT (JSON Web Tokens) as a grant type per the IETF draft.
+ *
+ * @see http://tools.ietf.org/html/draft-ietf-oauth-jwt-bearer-04#section-4
+ *
+ * @author F21
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class JwtBearer implements GrantTypeInterface, ClientAssertionTypeInterface
+{
+ private $jwt;
+
+ protected $storage;
+ protected $audience;
+ protected $jwtUtil;
+ protected $allowedAlgorithms;
+
+ /**
+ * Creates an instance of the JWT bearer grant type.
+ *
+ * @param OAuth2\Storage\JWTBearerInterface|JwtBearerInterface $storage A valid storage interface that implements storage hooks for the JWT bearer grant type.
+ * @param string $audience The audience to validate the token against. This is usually the full URI of the OAuth token requests endpoint.
+ * @param EncryptionInterface|OAuth2\Encryption\JWT $jwtUtil OPTONAL The class used to decode, encode and verify JWTs.
+ * @param array $config
+ */
+ public function __construct(JwtBearerInterface $storage, $audience, EncryptionInterface $jwtUtil = null, array $config = array())
+ {
+ $this->storage = $storage;
+ $this->audience = $audience;
+
+ if (is_null($jwtUtil)) {
+ $jwtUtil = new Jwt();
+ }
+
+ $this->config = array_merge(array(
+ 'allowed_algorithms' => array('RS256', 'RS384', 'RS512')
+ ), $config);
+
+ $this->jwtUtil = $jwtUtil;
+
+ $this->allowedAlgorithms = $this->config['allowed_algorithms'];
+ }
+
+ /**
+ * Returns the grant_type get parameter to identify the grant type request as JWT bearer authorization grant.
+ *
+ * @return
+ * The string identifier for grant_type.
+ *
+ * @see OAuth2\GrantType\GrantTypeInterface::getQuerystringIdentifier()
+ */
+ public function getQuerystringIdentifier()
+ {
+ return 'urn:ietf:params:oauth:grant-type:jwt-bearer';
+ }
+
+ /**
+ * Validates the data from the decoded JWT.
+ *
+ * @return
+ * TRUE if the JWT request is valid and can be decoded. Otherwise, FALSE is returned.
+ *
+ * @see OAuth2\GrantType\GrantTypeInterface::getTokenData()
+ */
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$request->request("assertion")) {
+ $response->setError(400, 'invalid_request', 'Missing parameters: "assertion" required');
+
+ return null;
+ }
+
+ // Store the undecoded JWT for later use
+ $undecodedJWT = $request->request('assertion');
+
+ // Decode the JWT
+ $jwt = $this->jwtUtil->decode($request->request('assertion'), null, false);
+
+ if (!$jwt) {
+ $response->setError(400, 'invalid_request', "JWT is malformed");
+
+ return null;
+ }
+
+ // ensure these properties contain a value
+ // @todo: throw malformed error for missing properties
+ $jwt = array_merge(array(
+ 'scope' => null,
+ 'iss' => null,
+ 'sub' => null,
+ 'aud' => null,
+ 'exp' => null,
+ 'nbf' => null,
+ 'iat' => null,
+ 'jti' => null,
+ 'typ' => null,
+ ), $jwt);
+
+ if (!isset($jwt['iss'])) {
+ $response->setError(400, 'invalid_grant', "Invalid issuer (iss) provided");
+
+ return null;
+ }
+
+ if (!isset($jwt['sub'])) {
+ $response->setError(400, 'invalid_grant', "Invalid subject (sub) provided");
+
+ return null;
+ }
+
+ if (!isset($jwt['exp'])) {
+ $response->setError(400, 'invalid_grant', "Expiration (exp) time must be present");
+
+ return null;
+ }
+
+ // Check expiration
+ if (ctype_digit($jwt['exp'])) {
+ if ($jwt['exp'] <= time()) {
+ $response->setError(400, 'invalid_grant', "JWT has expired");
+
+ return null;
+ }
+ } else {
+ $response->setError(400, 'invalid_grant', "Expiration (exp) time must be a unix time stamp");
+
+ return null;
+ }
+
+ // Check the not before time
+ if ($notBefore = $jwt['nbf']) {
+ if (ctype_digit($notBefore)) {
+ if ($notBefore > time()) {
+ $response->setError(400, 'invalid_grant', "JWT cannot be used before the Not Before (nbf) time");
+
+ return null;
+ }
+ } else {
+ $response->setError(400, 'invalid_grant', "Not Before (nbf) time must be a unix time stamp");
+
+ return null;
+ }
+ }
+
+ // Check the audience if required to match
+ if (!isset($jwt['aud']) || ($jwt['aud'] != $this->audience)) {
+ $response->setError(400, 'invalid_grant', "Invalid audience (aud)");
+
+ return null;
+ }
+
+ // Check the jti (nonce)
+ // @see http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-13#section-4.1.7
+ if (isset($jwt['jti'])) {
+ $jti = $this->storage->getJti($jwt['iss'], $jwt['sub'], $jwt['aud'], $jwt['exp'], $jwt['jti']);
+
+ //Reject if jti is used and jwt is still valid (exp parameter has not expired).
+ if ($jti && $jti['expires'] > time()) {
+ $response->setError(400, 'invalid_grant', "JSON Token Identifier (jti) has already been used");
+
+ return null;
+ } else {
+ $this->storage->setJti($jwt['iss'], $jwt['sub'], $jwt['aud'], $jwt['exp'], $jwt['jti']);
+ }
+ }
+
+ // Get the iss's public key
+ // @see http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06#section-4.1.1
+ if (!$key = $this->storage->getClientKey($jwt['iss'], $jwt['sub'])) {
+ $response->setError(400, 'invalid_grant', "Invalid issuer (iss) or subject (sub) provided");
+
+ return null;
+ }
+
+ // Verify the JWT
+ if (!$this->jwtUtil->decode($undecodedJWT, $key, $this->allowedAlgorithms)) {
+ $response->setError(400, 'invalid_grant', "JWT failed signature verification");
+
+ return null;
+ }
+
+ $this->jwt = $jwt;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return $this->jwt['iss'];
+ }
+
+ public function getUserId()
+ {
+ return $this->jwt['sub'];
+ }
+
+ public function getScope()
+ {
+ return null;
+ }
+
+ /**
+ * Creates an access token that is NOT associated with a refresh token.
+ * If a subject (sub) the name of the user/account we are accessing data on behalf of.
+ *
+ * @see OAuth2\GrantType\GrantTypeInterface::createAccessToken()
+ */
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ $includeRefreshToken = false;
+
+ return $accessToken->createAccessToken($client_id, $user_id, $scope, $includeRefreshToken);
+ }
+}
diff --git a/library/oauth2/src/OAuth2/GrantType/RefreshToken.php b/library/oauth2/src/OAuth2/GrantType/RefreshToken.php
new file mode 100644
index 000000000..e55385222
--- /dev/null
+++ b/library/oauth2/src/OAuth2/GrantType/RefreshToken.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\RefreshTokenInterface;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class RefreshToken implements GrantTypeInterface
+{
+ private $refreshToken;
+
+ protected $storage;
+ protected $config;
+
+ /**
+ * @param OAuth2\Storage\RefreshTokenInterface $storage REQUIRED Storage class for retrieving refresh token information
+ * @param array $config OPTIONAL Configuration options for the server
+ * <code>
+ * $config = array(
+ * 'always_issue_new_refresh_token' => true, // whether to issue a new refresh token upon successful token request
+ * 'unset_refresh_token_after_use' => true // whether to unset the refresh token after after using
+ * );
+ * </code>
+ */
+ public function __construct(RefreshTokenInterface $storage, $config = array())
+ {
+ $this->config = array_merge(array(
+ 'always_issue_new_refresh_token' => false,
+ 'unset_refresh_token_after_use' => true
+ ), $config);
+
+ // to preserve B.C. with v1.6
+ // @see https://github.com/bshaffer/oauth2-server-php/pull/580
+ // @todo - remove in v2.0
+ if (isset($config['always_issue_new_refresh_token']) && !isset($config['unset_refresh_token_after_use'])) {
+ $this->config['unset_refresh_token_after_use'] = $config['always_issue_new_refresh_token'];
+ }
+
+ $this->storage = $storage;
+ }
+
+ public function getQuerystringIdentifier()
+ {
+ return 'refresh_token';
+ }
+
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$request->request("refresh_token")) {
+ $response->setError(400, 'invalid_request', 'Missing parameter: "refresh_token" is required');
+
+ return null;
+ }
+
+ if (!$refreshToken = $this->storage->getRefreshToken($request->request("refresh_token"))) {
+ $response->setError(400, 'invalid_grant', 'Invalid refresh token');
+
+ return null;
+ }
+
+ if ($refreshToken['expires'] > 0 && $refreshToken["expires"] < time()) {
+ $response->setError(400, 'invalid_grant', 'Refresh token has expired');
+
+ return null;
+ }
+
+ // store the refresh token locally so we can delete it when a new refresh token is generated
+ $this->refreshToken = $refreshToken;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return $this->refreshToken['client_id'];
+ }
+
+ public function getUserId()
+ {
+ return isset($this->refreshToken['user_id']) ? $this->refreshToken['user_id'] : null;
+ }
+
+ public function getScope()
+ {
+ return isset($this->refreshToken['scope']) ? $this->refreshToken['scope'] : null;
+ }
+
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ /*
+ * It is optional to force a new refresh token when a refresh token is used.
+ * However, if a new refresh token is issued, the old one MUST be expired
+ * @see http://tools.ietf.org/html/rfc6749#section-6
+ */
+ $issueNewRefreshToken = $this->config['always_issue_new_refresh_token'];
+ $unsetRefreshToken = $this->config['unset_refresh_token_after_use'];
+ $token = $accessToken->createAccessToken($client_id, $user_id, $scope, $issueNewRefreshToken);
+
+ if ($unsetRefreshToken) {
+ $this->storage->unsetRefreshToken($this->refreshToken['refresh_token']);
+ }
+
+ return $token;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/GrantType/UserCredentials.php b/library/oauth2/src/OAuth2/GrantType/UserCredentials.php
new file mode 100644
index 000000000..f165538ba
--- /dev/null
+++ b/library/oauth2/src/OAuth2/GrantType/UserCredentials.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\UserCredentialsInterface;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class UserCredentials implements GrantTypeInterface
+{
+ private $userInfo;
+
+ protected $storage;
+
+ /**
+ * @param OAuth2\Storage\UserCredentialsInterface $storage REQUIRED Storage class for retrieving user credentials information
+ */
+ public function __construct(UserCredentialsInterface $storage)
+ {
+ $this->storage = $storage;
+ }
+
+ public function getQuerystringIdentifier()
+ {
+ return 'password';
+ }
+
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$request->request("password") || !$request->request("username")) {
+ $response->setError(400, 'invalid_request', 'Missing parameters: "username" and "password" required');
+
+ return null;
+ }
+
+ if (!$this->storage->checkUserCredentials($request->request("username"), $request->request("password"))) {
+ $response->setError(401, 'invalid_grant', 'Invalid username and password combination');
+
+ return null;
+ }
+
+ $userInfo = $this->storage->getUserDetails($request->request("username"));
+
+ if (empty($userInfo)) {
+ $response->setError(400, 'invalid_grant', 'Unable to retrieve user information');
+
+ return null;
+ }
+
+ if (!isset($userInfo['user_id'])) {
+ throw new \LogicException("you must set the user_id on the array returned by getUserDetails");
+ }
+
+ $this->userInfo = $userInfo;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return null;
+ }
+
+ public function getUserId()
+ {
+ return $this->userInfo['user_id'];
+ }
+
+ public function getScope()
+ {
+ return isset($this->userInfo['scope']) ? $this->userInfo['scope'] : null;
+ }
+
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ return $accessToken->createAccessToken($client_id, $user_id, $scope);
+ }
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeController.php b/library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeController.php
new file mode 100644
index 000000000..c9b5c6af7
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeController.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\Controller\AuthorizeController as BaseAuthorizeController;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * @see OAuth2\Controller\AuthorizeControllerInterface
+ */
+class AuthorizeController extends BaseAuthorizeController implements AuthorizeControllerInterface
+{
+ private $nonce;
+
+ protected function setNotAuthorizedResponse(RequestInterface $request, ResponseInterface $response, $redirect_uri, $user_id = null)
+ {
+ $prompt = $request->query('prompt', 'consent');
+ if ($prompt == 'none') {
+ if (is_null($user_id)) {
+ $error = 'login_required';
+ $error_message = 'The user must log in';
+ } else {
+ $error = 'interaction_required';
+ $error_message = 'The user must grant access to your application';
+ }
+ } else {
+ $error = 'consent_required';
+ $error_message = 'The user denied access to your application';
+ }
+
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $this->getState(), $error, $error_message);
+ }
+
+ protected function buildAuthorizeParameters($request, $response, $user_id)
+ {
+ if (!$params = parent::buildAuthorizeParameters($request, $response, $user_id)) {
+ return;
+ }
+
+ // Generate an id token if needed.
+ if ($this->needsIdToken($this->getScope()) && $this->getResponseType() == self::RESPONSE_TYPE_AUTHORIZATION_CODE) {
+ $params['id_token'] = $this->responseTypes['id_token']->createIdToken($this->getClientId(), $user_id, $this->nonce);
+ }
+
+ // add the nonce to return with the redirect URI
+ $params['nonce'] = $this->nonce;
+
+ return $params;
+ }
+
+ public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!parent::validateAuthorizeRequest($request, $response)) {
+ return false;
+ }
+
+ $nonce = $request->query('nonce');
+
+ // Validate required nonce for "id_token" and "id_token token"
+ if (!$nonce && in_array($this->getResponseType(), array(self::RESPONSE_TYPE_ID_TOKEN, self::RESPONSE_TYPE_ID_TOKEN_TOKEN))) {
+ $response->setError(400, 'invalid_nonce', 'This application requires you specify a nonce parameter');
+
+ return false;
+ }
+
+ $this->nonce = $nonce;
+
+ return true;
+ }
+
+ protected function getValidResponseTypes()
+ {
+ return array(
+ self::RESPONSE_TYPE_ACCESS_TOKEN,
+ self::RESPONSE_TYPE_AUTHORIZATION_CODE,
+ self::RESPONSE_TYPE_ID_TOKEN,
+ self::RESPONSE_TYPE_ID_TOKEN_TOKEN,
+ self::RESPONSE_TYPE_CODE_ID_TOKEN,
+ );
+ }
+
+ /**
+ * Returns whether the current request needs to generate an id token.
+ *
+ * ID Tokens are a part of the OpenID Connect specification, so this
+ * method checks whether OpenID Connect is enabled in the server settings
+ * and whether the openid scope was requested.
+ *
+ * @param $request_scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if an id token is needed, FALSE otherwise.
+ */
+ public function needsIdToken($request_scope)
+ {
+ // see if the "openid" scope exists in the requested scope
+ return $this->scopeUtil->checkScope('openid', $request_scope);
+ }
+
+ public function getNonce()
+ {
+ return $this->nonce;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php b/library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php
new file mode 100644
index 000000000..1e231d844
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+interface AuthorizeControllerInterface
+{
+ const RESPONSE_TYPE_ID_TOKEN = 'id_token';
+ const RESPONSE_TYPE_ID_TOKEN_TOKEN = 'id_token token';
+ const RESPONSE_TYPE_CODE_ID_TOKEN = 'code id_token';
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/Controller/UserInfoController.php b/library/oauth2/src/OAuth2/OpenID/Controller/UserInfoController.php
new file mode 100644
index 000000000..30cb942d0
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/Controller/UserInfoController.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\Scope;
+use OAuth2\TokenType\TokenTypeInterface;
+use OAuth2\Storage\AccessTokenInterface;
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\Controller\ResourceController;
+use OAuth2\ScopeInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * @see OAuth2\Controller\UserInfoControllerInterface
+ */
+class UserInfoController extends ResourceController implements UserInfoControllerInterface
+{
+ private $token;
+
+ protected $tokenType;
+ protected $tokenStorage;
+ protected $userClaimsStorage;
+ protected $config;
+ protected $scopeUtil;
+
+ public function __construct(TokenTypeInterface $tokenType, AccessTokenInterface $tokenStorage, UserClaimsInterface $userClaimsStorage, $config = array(), ScopeInterface $scopeUtil = null)
+ {
+ $this->tokenType = $tokenType;
+ $this->tokenStorage = $tokenStorage;
+ $this->userClaimsStorage = $userClaimsStorage;
+
+ $this->config = array_merge(array(
+ 'www_realm' => 'Service',
+ ), $config);
+
+ if (is_null($scopeUtil)) {
+ $scopeUtil = new Scope();
+ }
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ public function handleUserInfoRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$this->verifyResourceRequest($request, $response, 'openid')) {
+ return;
+ }
+
+ $token = $this->getToken();
+ $claims = $this->userClaimsStorage->getUserClaims($token['user_id'], $token['scope']);
+ // The sub Claim MUST always be returned in the UserInfo Response.
+ // http://openid.net/specs/openid-connect-core-1_0.html#UserInfoResponse
+ $claims += array(
+ 'sub' => $token['user_id'],
+ );
+ $response->addParameters($claims);
+ }
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php b/library/oauth2/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php
new file mode 100644
index 000000000..a89049d49
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * This controller is called when the user claims for OpenID Connect's
+ * UserInfo endpoint should be returned.
+ *
+ * ex:
+ * > $response = new OAuth2\Response();
+ * > $userInfoController->handleUserInfoRequest(
+ * > OAuth2\Request::createFromGlobals(),
+ * > $response;
+ * > $response->send();
+ *
+ */
+interface UserInfoControllerInterface
+{
+ public function handleUserInfoRequest(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/GrantType/AuthorizationCode.php b/library/oauth2/src/OAuth2/OpenID/GrantType/AuthorizationCode.php
new file mode 100644
index 000000000..8ed1edc26
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/GrantType/AuthorizationCode.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace OAuth2\OpenID\GrantType;
+
+use OAuth2\GrantType\AuthorizationCode as BaseAuthorizationCode;
+use OAuth2\ResponseType\AccessTokenInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AuthorizationCode extends BaseAuthorizationCode
+{
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ $includeRefreshToken = true;
+ if (isset($this->authCode['id_token'])) {
+ // OpenID Connect requests include the refresh token only if the
+ // offline_access scope has been requested and granted.
+ $scopes = explode(' ', trim($scope));
+ $includeRefreshToken = in_array('offline_access', $scopes);
+ }
+
+ $token = $accessToken->createAccessToken($client_id, $user_id, $scope, $includeRefreshToken);
+ if (isset($this->authCode['id_token'])) {
+ $token['id_token'] = $this->authCode['id_token'];
+ }
+
+ $this->storage->expireAuthorizationCode($this->authCode['code']);
+
+ return $token;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php
new file mode 100644
index 000000000..8971954c5
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\AuthorizationCode as BaseAuthorizationCode;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as AuthorizationCodeStorageInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AuthorizationCode extends BaseAuthorizationCode implements AuthorizationCodeInterface
+{
+ public function __construct(AuthorizationCodeStorageInterface $storage, array $config = array())
+ {
+ parent::__construct($storage, $config);
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ // build the URL to redirect to
+ $result = array('query' => array());
+
+ $params += array('scope' => null, 'state' => null, 'id_token' => null);
+
+ $result['query']['code'] = $this->createAuthorizationCode($params['client_id'], $user_id, $params['redirect_uri'], $params['scope'], $params['id_token']);
+
+ if (isset($params['state'])) {
+ $result['query']['state'] = $params['state'];
+ }
+
+ return array($params['redirect_uri'], $result);
+ }
+
+ /**
+ * Handle the creation of the authorization code.
+ *
+ * @param $client_id
+ * Client identifier related to the authorization code
+ * @param $user_id
+ * User ID associated with the authorization code
+ * @param $redirect_uri
+ * An absolute URI to which the authorization server will redirect the
+ * user-agent to when the end-user authorization step is completed.
+ * @param $scope
+ * (optional) Scopes to be stored in space-separated string.
+ * @param $id_token
+ * (optional) The OpenID Connect id_token.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @ingroup oauth2_section_4
+ */
+ public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null, $id_token = null)
+ {
+ $code = $this->generateAuthorizationCode();
+ $this->storage->setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, time() + $this->config['auth_code_lifetime'], $scope, $id_token);
+
+ return $code;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php
new file mode 100644
index 000000000..ea4779255
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\AuthorizationCodeInterface as BaseAuthorizationCodeInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AuthorizationCodeInterface extends BaseAuthorizationCodeInterface
+{
+ /**
+ * Handle the creation of the authorization code.
+ *
+ * @param $client_id Client identifier related to the authorization code
+ * @param $user_id User ID associated with the authorization code
+ * @param $redirect_uri An absolute URI to which the authorization server will redirect the
+ * user-agent to when the end-user authorization step is completed.
+ * @param $scope OPTIONAL Scopes to be stored in space-separated string.
+ * @param $id_token OPTIONAL The OpenID Connect id_token.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @ingroup oauth2_section_4
+ */
+ public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null, $id_token = null);
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdToken.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdToken.php
new file mode 100644
index 000000000..ac7764d6c
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdToken.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+class CodeIdToken implements CodeIdTokenInterface
+{
+ protected $authCode;
+ protected $idToken;
+
+ public function __construct(AuthorizationCodeInterface $authCode, IdTokenInterface $idToken)
+ {
+ $this->authCode = $authCode;
+ $this->idToken = $idToken;
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ $result = $this->authCode->getAuthorizeResponse($params, $user_id);
+ $resultIdToken = $this->idToken->getAuthorizeResponse($params, $user_id);
+ $result[1]['query']['id_token'] = $resultIdToken[1]['fragment']['id_token'];
+
+ return $result;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php
new file mode 100644
index 000000000..629adcca8
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\ResponseTypeInterface;
+
+interface CodeIdTokenInterface extends ResponseTypeInterface
+{
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/IdToken.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/IdToken.php
new file mode 100644
index 000000000..97777fbf2
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/ResponseType/IdToken.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\Encryption\EncryptionInterface;
+use OAuth2\Encryption\Jwt;
+use OAuth2\Storage\PublicKeyInterface;
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+
+class IdToken implements IdTokenInterface
+{
+ protected $userClaimsStorage;
+ protected $publicKeyStorage;
+ protected $config;
+ protected $encryptionUtil;
+
+ public function __construct(UserClaimsInterface $userClaimsStorage, PublicKeyInterface $publicKeyStorage, array $config = array(), EncryptionInterface $encryptionUtil = null)
+ {
+ $this->userClaimsStorage = $userClaimsStorage;
+ $this->publicKeyStorage = $publicKeyStorage;
+ if (is_null($encryptionUtil)) {
+ $encryptionUtil = new Jwt();
+ }
+ $this->encryptionUtil = $encryptionUtil;
+
+ if (!isset($config['issuer'])) {
+ throw new \LogicException('config parameter "issuer" must be set');
+ }
+ $this->config = array_merge(array(
+ 'id_lifetime' => 3600,
+ ), $config);
+ }
+
+ public function getAuthorizeResponse($params, $userInfo = null)
+ {
+ // build the URL to redirect to
+ $result = array('query' => array());
+ $params += array('scope' => null, 'state' => null, 'nonce' => null);
+
+ // create the id token.
+ list($user_id, $auth_time) = $this->getUserIdAndAuthTime($userInfo);
+ $userClaims = $this->userClaimsStorage->getUserClaims($user_id, $params['scope']);
+
+ $id_token = $this->createIdToken($params['client_id'], $userInfo, $params['nonce'], $userClaims, null);
+ $result["fragment"] = array('id_token' => $id_token);
+ if (isset($params['state'])) {
+ $result["fragment"]["state"] = $params['state'];
+ }
+
+ return array($params['redirect_uri'], $result);
+ }
+
+ public function createIdToken($client_id, $userInfo, $nonce = null, $userClaims = null, $access_token = null)
+ {
+ // pull auth_time from user info if supplied
+ list($user_id, $auth_time) = $this->getUserIdAndAuthTime($userInfo);
+
+ $token = array(
+ 'iss' => $this->config['issuer'],
+ 'sub' => $user_id,
+ 'aud' => $client_id,
+ 'iat' => time(),
+ 'exp' => time() + $this->config['id_lifetime'],
+ 'auth_time' => $auth_time,
+ );
+
+ if ($nonce) {
+ $token['nonce'] = $nonce;
+ }
+
+ if ($userClaims) {
+ $token += $userClaims;
+ }
+
+ if ($access_token) {
+ $token['at_hash'] = $this->createAtHash($access_token, $client_id);
+ }
+
+ return $this->encodeToken($token, $client_id);
+ }
+
+ protected function createAtHash($access_token, $client_id = null)
+ {
+ // maps HS256 and RS256 to sha256, etc.
+ $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
+ $hash_algorithm = 'sha' . substr($algorithm, 2);
+ $hash = hash($hash_algorithm, $access_token, true);
+ $at_hash = substr($hash, 0, strlen($hash) / 2);
+
+ return $this->encryptionUtil->urlSafeB64Encode($at_hash);
+ }
+
+ protected function encodeToken(array $token, $client_id = null)
+ {
+ $private_key = $this->publicKeyStorage->getPrivateKey($client_id);
+ $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
+
+ return $this->encryptionUtil->encode($token, $private_key, $algorithm);
+ }
+
+ private function getUserIdAndAuthTime($userInfo)
+ {
+ $auth_time = null;
+
+ // support an array for user_id / auth_time
+ if (is_array($userInfo)) {
+ if (!isset($userInfo['user_id'])) {
+ throw new \LogicException('if $user_id argument is an array, user_id index must be set');
+ }
+
+ $auth_time = isset($userInfo['auth_time']) ? $userInfo['auth_time'] : null;
+ $user_id = $userInfo['user_id'];
+ } else {
+ $user_id = $userInfo;
+ }
+
+ if (is_null($auth_time)) {
+ $auth_time = time();
+ }
+
+ // userInfo is a scalar, and so this is the $user_id. Auth Time is null
+ return array($user_id, $auth_time);
+ }
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php
new file mode 100644
index 000000000..0bd2f8391
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\ResponseTypeInterface;
+
+interface IdTokenInterface extends ResponseTypeInterface
+{
+ /**
+ * Create the id token.
+ *
+ * If Authorization Code Flow is used, the id_token is generated when the
+ * authorization code is issued, and later returned from the token endpoint
+ * together with the access_token.
+ * If the Implicit Flow is used, the token and id_token are generated and
+ * returned together.
+ *
+ * @param string $client_id The client id.
+ * @param string $user_id The user id.
+ * @param string $nonce OPTIONAL The nonce.
+ * @param string $userClaims OPTIONAL Claims about the user.
+ * @param string $access_token OPTIONAL The access token, if known.
+ *
+ * @return string The ID Token represented as a JSON Web Token (JWT).
+ *
+ * @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken
+ */
+ public function createIdToken($client_id, $userInfo, $nonce = null, $userClaims = null, $access_token = null);
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenToken.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenToken.php
new file mode 100644
index 000000000..f0c59799b
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenToken.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\AccessTokenInterface;
+
+class IdTokenToken implements IdTokenTokenInterface
+{
+ protected $accessToken;
+ protected $idToken;
+
+ public function __construct(AccessTokenInterface $accessToken, IdTokenInterface $idToken)
+ {
+ $this->accessToken = $accessToken;
+ $this->idToken = $idToken;
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ $result = $this->accessToken->getAuthorizeResponse($params, $user_id);
+ $access_token = $result[1]['fragment']['access_token'];
+ $id_token = $this->idToken->createIdToken($params['client_id'], $user_id, $params['nonce'], null, $access_token);
+ $result[1]['fragment']['id_token'] = $id_token;
+
+ return $result;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php
new file mode 100644
index 000000000..ac13e2032
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\ResponseTypeInterface;
+
+interface IdTokenTokenInterface extends ResponseTypeInterface
+{
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php b/library/oauth2/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php
new file mode 100644
index 000000000..51dd867ec
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace OAuth2\OpenID\Storage;
+
+use OAuth2\Storage\AuthorizationCodeInterface as BaseAuthorizationCodeInterface;
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get/save authorization codes for the "Authorization Code"
+ * grant type
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AuthorizationCodeInterface extends BaseAuthorizationCodeInterface
+{
+ /**
+ * Take the provided authorization code values and store them somewhere.
+ *
+ * This function should be the storage counterpart to getAuthCode().
+ *
+ * If storage fails for some reason, we're not currently checking for
+ * any sort of success/failure, so you should bail out of the script
+ * and provide a descriptive fail message.
+ *
+ * Required for OAuth2::GRANT_TYPE_AUTH_CODE.
+ *
+ * @param $code authorization code to be stored.
+ * @param $client_id client identifier to be stored.
+ * @param $user_id user identifier to be stored.
+ * @param string $redirect_uri redirect URI(s) to be stored in a space-separated string.
+ * @param int $expires expiration to be stored as a Unix timestamp.
+ * @param string $scope OPTIONAL scopes to be stored in space-separated string.
+ * @param string $id_token OPTIONAL the OpenID Connect id_token.
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null);
+}
diff --git a/library/oauth2/src/OAuth2/OpenID/Storage/UserClaimsInterface.php b/library/oauth2/src/OAuth2/OpenID/Storage/UserClaimsInterface.php
new file mode 100644
index 000000000..f230bef9e
--- /dev/null
+++ b/library/oauth2/src/OAuth2/OpenID/Storage/UserClaimsInterface.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace OAuth2\OpenID\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should retrieve user claims for the OpenID Connect id_token.
+ */
+interface UserClaimsInterface
+{
+ // valid scope values to pass into the user claims API call
+ const VALID_CLAIMS = 'profile email address phone';
+
+ // fields returned for the claims above
+ const PROFILE_CLAIM_VALUES = 'name family_name given_name middle_name nickname preferred_username profile picture website gender birthdate zoneinfo locale updated_at';
+ const EMAIL_CLAIM_VALUES = 'email email_verified';
+ const ADDRESS_CLAIM_VALUES = 'formatted street_address locality region postal_code country';
+ const PHONE_CLAIM_VALUES = 'phone_number phone_number_verified';
+
+ /**
+ * Return claims about the provided user id.
+ *
+ * Groups of claims are returned based on the requested scopes. No group
+ * is required, and no claim is required.
+ *
+ * @param $user_id
+ * The id of the user for which claims should be returned.
+ * @param $scope
+ * The requested scope.
+ * Scopes with matching claims: profile, email, address, phone.
+ *
+ * @return
+ * An array in the claim => value format.
+ *
+ * @see http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims
+ */
+ public function getUserClaims($user_id, $scope);
+}
diff --git a/library/oauth2/src/OAuth2/Request.php b/library/oauth2/src/OAuth2/Request.php
new file mode 100644
index 000000000..c92cee821
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Request.php
@@ -0,0 +1,213 @@
+<?php
+
+namespace OAuth2;
+
+/**
+ * OAuth2\Request
+ * This class is taken from the Symfony2 Framework and is part of the Symfony package.
+ * See Symfony\Component\HttpFoundation\Request (https://github.com/symfony/symfony)
+ */
+class Request implements RequestInterface
+{
+ public $attributes;
+ public $request;
+ public $query;
+ public $server;
+ public $files;
+ public $cookies;
+ public $headers;
+ public $content;
+
+ /**
+ * Constructor.
+ *
+ * @param array $query The GET parameters
+ * @param array $request The POST parameters
+ * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
+ * @param array $cookies The COOKIE parameters
+ * @param array $files The FILES parameters
+ * @param array $server The SERVER parameters
+ * @param string $content The raw body data
+ *
+ * @api
+ */
+ public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null, array $headers = null)
+ {
+ $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content, $headers);
+ }
+
+ /**
+ * Sets the parameters for this request.
+ *
+ * This method also re-initializes all properties.
+ *
+ * @param array $query The GET parameters
+ * @param array $request The POST parameters
+ * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
+ * @param array $cookies The COOKIE parameters
+ * @param array $files The FILES parameters
+ * @param array $server The SERVER parameters
+ * @param string $content The raw body data
+ *
+ * @api
+ */
+ public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null, array $headers = null)
+ {
+ $this->request = $request;
+ $this->query = $query;
+ $this->attributes = $attributes;
+ $this->cookies = $cookies;
+ $this->files = $files;
+ $this->server = $server;
+ $this->content = $content;
+ $this->headers = is_null($headers) ? $this->getHeadersFromServer($this->server) : $headers;
+ }
+
+ public function query($name, $default = null)
+ {
+ return isset($this->query[$name]) ? $this->query[$name] : $default;
+ }
+
+ public function request($name, $default = null)
+ {
+ return isset($this->request[$name]) ? $this->request[$name] : $default;
+ }
+
+ public function server($name, $default = null)
+ {
+ return isset($this->server[$name]) ? $this->server[$name] : $default;
+ }
+
+ public function headers($name, $default = null)
+ {
+ $headers = array_change_key_case($this->headers);
+ $name = strtolower($name);
+
+ return isset($headers[$name]) ? $headers[$name] : $default;
+ }
+
+ public function getAllQueryParameters()
+ {
+ return $this->query;
+ }
+
+ /**
+ * Returns the request body content.
+ *
+ * @param Boolean $asResource If true, a resource will be returned
+ *
+ * @return string|resource The request body content or a resource to read the body stream.
+ */
+ public function getContent($asResource = false)
+ {
+ if (false === $this->content || (true === $asResource && null !== $this->content)) {
+ throw new \LogicException('getContent() can only be called once when using the resource return type.');
+ }
+
+ if (true === $asResource) {
+ $this->content = false;
+
+ return fopen('php://input', 'rb');
+ }
+
+ if (null === $this->content) {
+ $this->content = file_get_contents('php://input');
+ }
+
+ return $this->content;
+ }
+
+ private function getHeadersFromServer($server)
+ {
+ $headers = array();
+ foreach ($server as $key => $value) {
+ if (0 === strpos($key, 'HTTP_')) {
+ $headers[substr($key, 5)] = $value;
+ }
+ // CONTENT_* are not prefixed with HTTP_
+ elseif (in_array($key, array('CONTENT_LENGTH', 'CONTENT_MD5', 'CONTENT_TYPE'))) {
+ $headers[$key] = $value;
+ }
+ }
+
+ if (isset($server['PHP_AUTH_USER'])) {
+ $headers['PHP_AUTH_USER'] = $server['PHP_AUTH_USER'];
+ $headers['PHP_AUTH_PW'] = isset($server['PHP_AUTH_PW']) ? $server['PHP_AUTH_PW'] : '';
+ } else {
+ /*
+ * php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default
+ * For this workaround to work, add this line to your .htaccess file:
+ * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+ *
+ * A sample .htaccess file:
+ * RewriteEngine On
+ * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+ * RewriteCond %{REQUEST_FILENAME} !-f
+ * RewriteRule ^(.*)$ app.php [QSA,L]
+ */
+
+ $authorizationHeader = null;
+ if (isset($server['HTTP_AUTHORIZATION'])) {
+ $authorizationHeader = $server['HTTP_AUTHORIZATION'];
+ } elseif (isset($server['REDIRECT_HTTP_AUTHORIZATION'])) {
+ $authorizationHeader = $server['REDIRECT_HTTP_AUTHORIZATION'];
+ } elseif (function_exists('apache_request_headers')) {
+ $requestHeaders = (array) apache_request_headers();
+
+ // Server-side fix for bug in old Android versions (a nice side-effect of this fix means we don't care about capitalization for Authorization)
+ $requestHeaders = array_combine(array_map('ucwords', array_keys($requestHeaders)), array_values($requestHeaders));
+
+ if (isset($requestHeaders['Authorization'])) {
+ $authorizationHeader = trim($requestHeaders['Authorization']);
+ }
+ }
+
+ if (null !== $authorizationHeader) {
+ $headers['AUTHORIZATION'] = $authorizationHeader;
+ // Decode AUTHORIZATION header into PHP_AUTH_USER and PHP_AUTH_PW when authorization header is basic
+ if (0 === stripos($authorizationHeader, 'basic')) {
+ $exploded = explode(':', base64_decode(substr($authorizationHeader, 6)));
+ if (count($exploded) == 2) {
+ list($headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']) = $exploded;
+ }
+ }
+ }
+ }
+
+ // PHP_AUTH_USER/PHP_AUTH_PW
+ if (isset($headers['PHP_AUTH_USER'])) {
+ $headers['AUTHORIZATION'] = 'Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.$headers['PHP_AUTH_PW']);
+ }
+
+ return $headers;
+ }
+
+ /**
+ * Creates a new request with values from PHP's super globals.
+ *
+ * @return Request A new request
+ *
+ * @api
+ */
+ public static function createFromGlobals()
+ {
+ $class = get_called_class();
+ $request = new $class($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER);
+
+ $contentType = $request->server('CONTENT_TYPE', '');
+ $requestMethod = $request->server('REQUEST_METHOD', 'GET');
+ if (0 === strpos($contentType, 'application/x-www-form-urlencoded')
+ && in_array(strtoupper($requestMethod), array('PUT', 'DELETE'))
+ ) {
+ parse_str($request->getContent(), $data);
+ $request->request = $data;
+ } elseif (0 === strpos($contentType, 'application/json')
+ && in_array(strtoupper($requestMethod), array('POST', 'PUT', 'DELETE'))
+ ) {
+ $data = json_decode($request->getContent(), true);
+ $request->request = $data;
+ }
+
+ return $request;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/RequestInterface.php b/library/oauth2/src/OAuth2/RequestInterface.php
new file mode 100644
index 000000000..8a70d5fad
--- /dev/null
+++ b/library/oauth2/src/OAuth2/RequestInterface.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace OAuth2;
+
+interface RequestInterface
+{
+ public function query($name, $default = null);
+
+ public function request($name, $default = null);
+
+ public function server($name, $default = null);
+
+ public function headers($name, $default = null);
+
+ public function getAllQueryParameters();
+}
diff --git a/library/oauth2/src/OAuth2/Response.php b/library/oauth2/src/OAuth2/Response.php
new file mode 100644
index 000000000..d8eabe79e
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Response.php
@@ -0,0 +1,369 @@
+<?php
+
+namespace OAuth2;
+
+/**
+ * Class to handle OAuth2 Responses in a graceful way. Use this interface
+ * to output the proper OAuth2 responses.
+ *
+ * @see OAuth2\ResponseInterface
+ *
+ * This class borrows heavily from the Symfony2 Framework and is part of the symfony package
+ * @see Symfony\Component\HttpFoundation\Request (https://github.com/symfony/symfony)
+ */
+class Response implements ResponseInterface
+{
+ public $version;
+ protected $statusCode = 200;
+ protected $statusText;
+ protected $parameters = array();
+ protected $httpHeaders = array();
+
+ public static $statusTexts = array(
+ 100 => 'Continue',
+ 101 => 'Switching Protocols',
+ 200 => 'OK',
+ 201 => 'Created',
+ 202 => 'Accepted',
+ 203 => 'Non-Authoritative Information',
+ 204 => 'No Content',
+ 205 => 'Reset Content',
+ 206 => 'Partial Content',
+ 300 => 'Multiple Choices',
+ 301 => 'Moved Permanently',
+ 302 => 'Found',
+ 303 => 'See Other',
+ 304 => 'Not Modified',
+ 305 => 'Use Proxy',
+ 307 => 'Temporary Redirect',
+ 400 => 'Bad Request',
+ 401 => 'Unauthorized',
+ 402 => 'Payment Required',
+ 403 => 'Forbidden',
+ 404 => 'Not Found',
+ 405 => 'Method Not Allowed',
+ 406 => 'Not Acceptable',
+ 407 => 'Proxy Authentication Required',
+ 408 => 'Request Timeout',
+ 409 => 'Conflict',
+ 410 => 'Gone',
+ 411 => 'Length Required',
+ 412 => 'Precondition Failed',
+ 413 => 'Request Entity Too Large',
+ 414 => 'Request-URI Too Long',
+ 415 => 'Unsupported Media Type',
+ 416 => 'Requested Range Not Satisfiable',
+ 417 => 'Expectation Failed',
+ 418 => 'I\'m a teapot',
+ 500 => 'Internal Server Error',
+ 501 => 'Not Implemented',
+ 502 => 'Bad Gateway',
+ 503 => 'Service Unavailable',
+ 504 => 'Gateway Timeout',
+ 505 => 'HTTP Version Not Supported',
+ );
+
+ public function __construct($parameters = array(), $statusCode = 200, $headers = array())
+ {
+ $this->setParameters($parameters);
+ $this->setStatusCode($statusCode);
+ $this->setHttpHeaders($headers);
+ $this->version = '1.1';
+ }
+
+ /**
+ * Converts the response object to string containing all headers and the response content.
+ *
+ * @return string The response with headers and content
+ */
+ public function __toString()
+ {
+ $headers = array();
+ foreach ($this->httpHeaders as $name => $value) {
+ $headers[$name] = (array) $value;
+ }
+
+ return
+ sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n".
+ $this->getHttpHeadersAsString($headers)."\r\n".
+ $this->getResponseBody();
+ }
+
+ /**
+ * Returns the build header line.
+ *
+ * @param string $name The header name
+ * @param string $value The header value
+ *
+ * @return string The built header line
+ */
+ protected function buildHeader($name, $value)
+ {
+ return sprintf("%s: %s\n", $name, $value);
+ }
+
+ public function getStatusCode()
+ {
+ return $this->statusCode;
+ }
+
+ public function setStatusCode($statusCode, $text = null)
+ {
+ $this->statusCode = (int) $statusCode;
+ if ($this->isInvalid()) {
+ throw new \InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $statusCode));
+ }
+
+ $this->statusText = false === $text ? '' : (null === $text ? self::$statusTexts[$this->statusCode] : $text);
+ }
+
+ public function getStatusText()
+ {
+ return $this->statusText;
+ }
+
+ public function getParameters()
+ {
+ return $this->parameters;
+ }
+
+ public function setParameters(array $parameters)
+ {
+ $this->parameters = $parameters;
+ }
+
+ public function addParameters(array $parameters)
+ {
+ $this->parameters = array_merge($this->parameters, $parameters);
+ }
+
+ public function getParameter($name, $default = null)
+ {
+ return isset($this->parameters[$name]) ? $this->parameters[$name] : $default;
+ }
+
+ public function setParameter($name, $value)
+ {
+ $this->parameters[$name] = $value;
+ }
+
+ public function setHttpHeaders(array $httpHeaders)
+ {
+ $this->httpHeaders = $httpHeaders;
+ }
+
+ public function setHttpHeader($name, $value)
+ {
+ $this->httpHeaders[$name] = $value;
+ }
+
+ public function addHttpHeaders(array $httpHeaders)
+ {
+ $this->httpHeaders = array_merge($this->httpHeaders, $httpHeaders);
+ }
+
+ public function getHttpHeaders()
+ {
+ return $this->httpHeaders;
+ }
+
+ public function getHttpHeader($name, $default = null)
+ {
+ return isset($this->httpHeaders[$name]) ? $this->httpHeaders[$name] : $default;
+ }
+
+ public function getResponseBody($format = 'json')
+ {
+ switch ($format) {
+ case 'json':
+ return json_encode($this->parameters);
+ case 'xml':
+ // this only works for single-level arrays
+ $xml = new \SimpleXMLElement('<response/>');
+ foreach ($this->parameters as $key => $param) {
+ $xml->addChild($key, $param);
+ }
+
+ return $xml->asXML();
+ }
+
+ throw new \InvalidArgumentException(sprintf('The format %s is not supported', $format));
+
+ }
+
+ public function send($format = 'json')
+ {
+ // headers have already been sent by the developer
+ if (headers_sent()) {
+ return;
+ }
+
+ switch ($format) {
+ case 'json':
+ $this->setHttpHeader('Content-Type', 'application/json');
+ break;
+ case 'xml':
+ $this->setHttpHeader('Content-Type', 'text/xml');
+ break;
+ }
+ // status
+ header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText));
+
+ foreach ($this->getHttpHeaders() as $name => $header) {
+ header(sprintf('%s: %s', $name, $header));
+ }
+ echo $this->getResponseBody($format);
+ }
+
+ public function setError($statusCode, $error, $errorDescription = null, $errorUri = null)
+ {
+ $parameters = array(
+ 'error' => $error,
+ 'error_description' => $errorDescription,
+ );
+
+ if (!is_null($errorUri)) {
+ if (strlen($errorUri) > 0 && $errorUri[0] == '#') {
+ // we are referencing an oauth bookmark (for brevity)
+ $errorUri = 'http://tools.ietf.org/html/rfc6749' . $errorUri;
+ }
+ $parameters['error_uri'] = $errorUri;
+ }
+
+ $httpHeaders = array(
+ 'Cache-Control' => 'no-store'
+ );
+
+ $this->setStatusCode($statusCode);
+ $this->addParameters($parameters);
+ $this->addHttpHeaders($httpHeaders);
+
+ if (!$this->isClientError() && !$this->isServerError()) {
+ throw new \InvalidArgumentException(sprintf('The HTTP status code is not an error ("%s" given).', $statusCode));
+ }
+ }
+
+ public function setRedirect($statusCode, $url, $state = null, $error = null, $errorDescription = null, $errorUri = null)
+ {
+ if (empty($url)) {
+ throw new \InvalidArgumentException('Cannot redirect to an empty URL.');
+ }
+
+ $parameters = array();
+
+ if (!is_null($state)) {
+ $parameters['state'] = $state;
+ }
+
+ if (!is_null($error)) {
+ $this->setError(400, $error, $errorDescription, $errorUri);
+ }
+ $this->setStatusCode($statusCode);
+ $this->addParameters($parameters);
+
+ if (count($this->parameters) > 0) {
+ // add parameters to URL redirection
+ $parts = parse_url($url);
+ $sep = isset($parts['query']) && count($parts['query']) > 0 ? '&' : '?';
+ $url .= $sep . http_build_query($this->parameters);
+ }
+
+ $this->addHttpHeaders(array('Location' => $url));
+
+ if (!$this->isRedirection()) {
+ throw new \InvalidArgumentException(sprintf('The HTTP status code is not a redirect ("%s" given).', $statusCode));
+ }
+ }
+
+ // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isInvalid()
+ {
+ return $this->statusCode < 100 || $this->statusCode >= 600;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isInformational()
+ {
+ return $this->statusCode >= 100 && $this->statusCode < 200;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isSuccessful()
+ {
+ return $this->statusCode >= 200 && $this->statusCode < 300;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isRedirection()
+ {
+ return $this->statusCode >= 300 && $this->statusCode < 400;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isClientError()
+ {
+ return $this->statusCode >= 400 && $this->statusCode < 500;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isServerError()
+ {
+ return $this->statusCode >= 500 && $this->statusCode < 600;
+ }
+
+ /*
+ * Functions from Symfony2 HttpFoundation - output pretty header
+ */
+ private function getHttpHeadersAsString($headers)
+ {
+ if (count($headers) == 0) {
+ return '';
+ }
+
+ $max = max(array_map('strlen', array_keys($headers))) + 1;
+ $content = '';
+ ksort($headers);
+ foreach ($headers as $name => $values) {
+ foreach ($values as $value) {
+ $content .= sprintf("%-{$max}s %s\r\n", $this->beautifyHeaderName($name).':', $value);
+ }
+ }
+
+ return $content;
+ }
+
+ private function beautifyHeaderName($name)
+ {
+ return preg_replace_callback('/\-(.)/', array($this, 'beautifyCallback'), ucfirst($name));
+ }
+
+ private function beautifyCallback($match)
+ {
+ return '-'.strtoupper($match[1]);
+ }
+}
diff --git a/library/oauth2/src/OAuth2/ResponseInterface.php b/library/oauth2/src/OAuth2/ResponseInterface.php
new file mode 100644
index 000000000..c99b5f7d1
--- /dev/null
+++ b/library/oauth2/src/OAuth2/ResponseInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace OAuth2;
+
+/**
+ * Interface which represents an object response. Meant to handle and display the proper OAuth2 Responses
+ * for errors and successes
+ *
+ * @see OAuth2\Response
+ */
+interface ResponseInterface
+{
+ public function addParameters(array $parameters);
+
+ public function addHttpHeaders(array $httpHeaders);
+
+ public function setStatusCode($statusCode);
+
+ public function setError($statusCode, $name, $description = null, $uri = null);
+
+ public function setRedirect($statusCode, $url, $state = null, $error = null, $errorDescription = null, $errorUri = null);
+
+ public function getParameter($name);
+}
diff --git a/library/oauth2/src/OAuth2/ResponseType/AccessToken.php b/library/oauth2/src/OAuth2/ResponseType/AccessToken.php
new file mode 100644
index 000000000..b235ad0c5
--- /dev/null
+++ b/library/oauth2/src/OAuth2/ResponseType/AccessToken.php
@@ -0,0 +1,194 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Storage\AccessTokenInterface as AccessTokenStorageInterface;
+use OAuth2\Storage\RefreshTokenInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AccessToken implements AccessTokenInterface
+{
+ protected $tokenStorage;
+ protected $refreshStorage;
+ protected $config;
+
+ /**
+ * @param OAuth2\Storage\AccessTokenInterface $tokenStorage REQUIRED Storage class for saving access token information
+ * @param OAuth2\Storage\RefreshTokenInterface $refreshStorage OPTIONAL Storage class for saving refresh token information
+ * @param array $config OPTIONAL Configuration options for the server
+ * <code>
+ * $config = array(
+ * 'token_type' => 'bearer', // token type identifier
+ * 'access_lifetime' => 3600, // time before access token expires
+ * 'refresh_token_lifetime' => 1209600, // time before refresh token expires
+ * );
+ * </endcode>
+ */
+ public function __construct(AccessTokenStorageInterface $tokenStorage, RefreshTokenInterface $refreshStorage = null, array $config = array())
+ {
+ $this->tokenStorage = $tokenStorage;
+ $this->refreshStorage = $refreshStorage;
+
+ $this->config = array_merge(array(
+ 'token_type' => 'bearer',
+ 'access_lifetime' => 3600,
+ 'refresh_token_lifetime' => 1209600,
+ ), $config);
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ // build the URL to redirect to
+ $result = array('query' => array());
+
+ $params += array('scope' => null, 'state' => null);
+
+ /*
+ * a refresh token MUST NOT be included in the fragment
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.2.2
+ */
+ $includeRefreshToken = false;
+ $result["fragment"] = $this->createAccessToken($params['client_id'], $user_id, $params['scope'], $includeRefreshToken);
+
+ if (isset($params['state'])) {
+ $result["fragment"]["state"] = $params['state'];
+ }
+
+ return array($params['redirect_uri'], $result);
+ }
+
+ /**
+ * Handle the creation of access token, also issue refresh token if supported / desirable.
+ *
+ * @param $client_id client identifier related to the access token.
+ * @param $user_id user ID associated with the access token
+ * @param $scope OPTIONAL scopes to be stored in space-separated string.
+ * @param bool $includeRefreshToken if true, a new refresh_token will be added to the response
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-5
+ * @ingroup oauth2_section_5
+ */
+ public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true)
+ {
+ $token = array(
+ "access_token" => $this->generateAccessToken(),
+ "expires_in" => $this->config['access_lifetime'],
+ "token_type" => $this->config['token_type'],
+ "scope" => $scope
+ );
+
+ $this->tokenStorage->setAccessToken($token["access_token"], $client_id, $user_id, $this->config['access_lifetime'] ? time() + $this->config['access_lifetime'] : null, $scope);
+
+ /*
+ * Issue a refresh token also, if we support them
+ *
+ * Refresh Tokens are considered supported if an instance of OAuth2\Storage\RefreshTokenInterface
+ * is supplied in the constructor
+ */
+ if ($includeRefreshToken && $this->refreshStorage) {
+ $token["refresh_token"] = $this->generateRefreshToken();
+ $expires = 0;
+ if ($this->config['refresh_token_lifetime'] > 0) {
+ $expires = time() + $this->config['refresh_token_lifetime'];
+ }
+ $this->refreshStorage->setRefreshToken($token['refresh_token'], $client_id, $user_id, $expires, $scope);
+ }
+
+ return $token;
+ }
+
+ /**
+ * Generates an unique access token.
+ *
+ * Implementing classes may want to override this function to implement
+ * other access token generation schemes.
+ *
+ * @return
+ * An unique access token.
+ *
+ * @ingroup oauth2_section_4
+ */
+ protected function generateAccessToken()
+ {
+ if (function_exists('mcrypt_create_iv')) {
+ $randomData = mcrypt_create_iv(20, MCRYPT_DEV_URANDOM);
+ if ($randomData !== false && strlen($randomData) === 20) {
+ return bin2hex($randomData);
+ }
+ }
+ if (function_exists('openssl_random_pseudo_bytes')) {
+ $randomData = openssl_random_pseudo_bytes(20);
+ if ($randomData !== false && strlen($randomData) === 20) {
+ return bin2hex($randomData);
+ }
+ }
+ if (@file_exists('/dev/urandom')) { // Get 100 bytes of random data
+ $randomData = file_get_contents('/dev/urandom', false, null, 0, 20);
+ if ($randomData !== false && strlen($randomData) === 20) {
+ return bin2hex($randomData);
+ }
+ }
+ // Last resort which you probably should just get rid of:
+ $randomData = mt_rand() . mt_rand() . mt_rand() . mt_rand() . microtime(true) . uniqid(mt_rand(), true);
+
+ return substr(hash('sha512', $randomData), 0, 40);
+ }
+
+ /**
+ * Generates an unique refresh token
+ *
+ * Implementing classes may want to override this function to implement
+ * other refresh token generation schemes.
+ *
+ * @return
+ * An unique refresh.
+ *
+ * @ingroup oauth2_section_4
+ * @see OAuth2::generateAccessToken()
+ */
+ protected function generateRefreshToken()
+ {
+ return $this->generateAccessToken(); // let's reuse the same scheme for token generation
+ }
+
+ /**
+ * Handle the revoking of refresh tokens, and access tokens if supported / desirable
+ * RFC7009 specifies that "If the server is unable to locate the token using
+ * the given hint, it MUST extend its search across all of its supported token types"
+ *
+ * @param $token
+ * @param null $tokenTypeHint
+ * @return boolean
+ */
+ public function revokeToken($token, $tokenTypeHint = null)
+ {
+ if ($tokenTypeHint == 'refresh_token') {
+ if ($this->refreshStorage && $revoked = $this->refreshStorage->unsetRefreshToken($token)) {
+ return true;
+ }
+ }
+
+ /** @TODO remove in v2 */
+ if (!method_exists($this->tokenStorage, 'unsetAccessToken')) {
+ throw new \RuntimeException(
+ sprintf('Token storage %s must implement unsetAccessToken method', get_class($this->tokenStorage)
+ ));
+ }
+
+ $revoked = $this->tokenStorage->unsetAccessToken($token);
+
+ // if a typehint is supplied and fails, try other storages
+ // @see https://tools.ietf.org/html/rfc7009#section-2.1
+ if (!$revoked && $tokenTypeHint != 'refresh_token') {
+ if ($this->refreshStorage) {
+ $revoked = $this->refreshStorage->unsetRefreshToken($token);
+ }
+ }
+
+ return $revoked;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/ResponseType/AccessTokenInterface.php b/library/oauth2/src/OAuth2/ResponseType/AccessTokenInterface.php
new file mode 100644
index 000000000..4bd3928d8
--- /dev/null
+++ b/library/oauth2/src/OAuth2/ResponseType/AccessTokenInterface.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AccessTokenInterface extends ResponseTypeInterface
+{
+ /**
+ * Handle the creation of access token, also issue refresh token if supported / desirable.
+ *
+ * @param $client_id client identifier related to the access token.
+ * @param $user_id user ID associated with the access token
+ * @param $scope OPTONAL scopes to be stored in space-separated string.
+ * @param bool $includeRefreshToken if true, a new refresh_token will be added to the response
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-5
+ * @ingroup oauth2_section_5
+ */
+ public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true);
+
+ /**
+ * Handle the revoking of refresh tokens, and access tokens if supported / desirable
+ *
+ * @param $token
+ * @param $tokenTypeHint
+ * @return mixed
+ *
+ * @todo v2.0 include this method in interface. Omitted to maintain BC in v1.x
+ */
+ //public function revokeToken($token, $tokenTypeHint);
+}
diff --git a/library/oauth2/src/OAuth2/ResponseType/AuthorizationCode.php b/library/oauth2/src/OAuth2/ResponseType/AuthorizationCode.php
new file mode 100644
index 000000000..6a305fd75
--- /dev/null
+++ b/library/oauth2/src/OAuth2/ResponseType/AuthorizationCode.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Storage\AuthorizationCodeInterface as AuthorizationCodeStorageInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AuthorizationCode implements AuthorizationCodeInterface
+{
+ protected $storage;
+ protected $config;
+
+ public function __construct(AuthorizationCodeStorageInterface $storage, array $config = array())
+ {
+ $this->storage = $storage;
+ $this->config = array_merge(array(
+ 'enforce_redirect' => false,
+ 'auth_code_lifetime' => 30,
+ ), $config);
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ // build the URL to redirect to
+ $result = array('query' => array());
+
+ $params += array('scope' => null, 'state' => null);
+
+ $result['query']['code'] = $this->createAuthorizationCode($params['client_id'], $user_id, $params['redirect_uri'], $params['scope']);
+
+ if (isset($params['state'])) {
+ $result['query']['state'] = $params['state'];
+ }
+
+ return array($params['redirect_uri'], $result);
+ }
+
+ /**
+ * Handle the creation of the authorization code.
+ *
+ * @param $client_id
+ * Client identifier related to the authorization code
+ * @param $user_id
+ * User ID associated with the authorization code
+ * @param $redirect_uri
+ * An absolute URI to which the authorization server will redirect the
+ * user-agent to when the end-user authorization step is completed.
+ * @param $scope
+ * (optional) Scopes to be stored in space-separated string.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @ingroup oauth2_section_4
+ */
+ public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null)
+ {
+ $code = $this->generateAuthorizationCode();
+ $this->storage->setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, time() + $this->config['auth_code_lifetime'], $scope);
+
+ return $code;
+ }
+
+ /**
+ * @return
+ * TRUE if the grant type requires a redirect_uri, FALSE if not
+ */
+ public function enforceRedirect()
+ {
+ return $this->config['enforce_redirect'];
+ }
+
+ /**
+ * Generates an unique auth code.
+ *
+ * Implementing classes may want to override this function to implement
+ * other auth code generation schemes.
+ *
+ * @return
+ * An unique auth code.
+ *
+ * @ingroup oauth2_section_4
+ */
+ protected function generateAuthorizationCode()
+ {
+ $tokenLen = 40;
+ if (function_exists('mcrypt_create_iv')) {
+ $randomData = mcrypt_create_iv(100, MCRYPT_DEV_URANDOM);
+ } elseif (function_exists('openssl_random_pseudo_bytes')) {
+ $randomData = openssl_random_pseudo_bytes(100);
+ } elseif (@file_exists('/dev/urandom')) { // Get 100 bytes of random data
+ $randomData = file_get_contents('/dev/urandom', false, null, 0, 100) . uniqid(mt_rand(), true);
+ } else {
+ $randomData = mt_rand() . mt_rand() . mt_rand() . mt_rand() . microtime(true) . uniqid(mt_rand(), true);
+ }
+
+ return substr(hash('sha512', $randomData), 0, $tokenLen);
+ }
+}
diff --git a/library/oauth2/src/OAuth2/ResponseType/AuthorizationCodeInterface.php b/library/oauth2/src/OAuth2/ResponseType/AuthorizationCodeInterface.php
new file mode 100644
index 000000000..df777e221
--- /dev/null
+++ b/library/oauth2/src/OAuth2/ResponseType/AuthorizationCodeInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AuthorizationCodeInterface extends ResponseTypeInterface
+{
+ /**
+ * @return
+ * TRUE if the grant type requires a redirect_uri, FALSE if not
+ */
+ public function enforceRedirect();
+
+ /**
+ * Handle the creation of the authorization code.
+ *
+ * @param $client_id client identifier related to the authorization code
+ * @param $user_id user id associated with the authorization code
+ * @param $redirect_uri an absolute URI to which the authorization server will redirect the
+ * user-agent to when the end-user authorization step is completed.
+ * @param $scope OPTIONAL scopes to be stored in space-separated string.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @ingroup oauth2_section_4
+ */
+ public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null);
+}
diff --git a/library/oauth2/src/OAuth2/ResponseType/JwtAccessToken.php b/library/oauth2/src/OAuth2/ResponseType/JwtAccessToken.php
new file mode 100644
index 000000000..3942fe41e
--- /dev/null
+++ b/library/oauth2/src/OAuth2/ResponseType/JwtAccessToken.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Encryption\EncryptionInterface;
+use OAuth2\Encryption\Jwt;
+use OAuth2\Storage\AccessTokenInterface as AccessTokenStorageInterface;
+use OAuth2\Storage\RefreshTokenInterface;
+use OAuth2\Storage\PublicKeyInterface;
+use OAuth2\Storage\Memory;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class JwtAccessToken extends AccessToken
+{
+ protected $publicKeyStorage;
+ protected $encryptionUtil;
+
+ /**
+ * @param $config
+ * - store_encrypted_token_string (bool true)
+ * whether the entire encrypted string is stored,
+ * or just the token ID is stored
+ */
+ public function __construct(PublicKeyInterface $publicKeyStorage = null, AccessTokenStorageInterface $tokenStorage = null, RefreshTokenInterface $refreshStorage = null, array $config = array(), EncryptionInterface $encryptionUtil = null)
+ {
+ $this->publicKeyStorage = $publicKeyStorage;
+ $config = array_merge(array(
+ 'store_encrypted_token_string' => true,
+ 'issuer' => ''
+ ), $config);
+ if (is_null($tokenStorage)) {
+ // a pass-thru, so we can call the parent constructor
+ $tokenStorage = new Memory();
+ }
+ if (is_null($encryptionUtil)) {
+ $encryptionUtil = new Jwt();
+ }
+ $this->encryptionUtil = $encryptionUtil;
+ parent::__construct($tokenStorage, $refreshStorage, $config);
+ }
+
+ /**
+ * Handle the creation of access token, also issue refresh token if supported / desirable.
+ *
+ * @param $client_id
+ * Client identifier related to the access token.
+ * @param $user_id
+ * User ID associated with the access token
+ * @param $scope
+ * (optional) Scopes to be stored in space-separated string.
+ * @param bool $includeRefreshToken
+ * If true, a new refresh_token will be added to the response
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-5
+ * @ingroup oauth2_section_5
+ */
+ public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true)
+ {
+ // token to encrypt
+ $expires = time() + $this->config['access_lifetime'];
+ $id = $this->generateAccessToken();
+ $jwtAccessToken = array(
+ 'id' => $id, // for BC (see #591)
+ 'jti' => $id,
+ 'iss' => $this->config['issuer'],
+ 'aud' => $client_id,
+ 'sub' => $user_id,
+ 'exp' => $expires,
+ 'iat' => time(),
+ 'token_type' => $this->config['token_type'],
+ 'scope' => $scope
+ );
+
+ /*
+ * Encode the token data into a single access_token string
+ */
+ $access_token = $this->encodeToken($jwtAccessToken, $client_id);
+
+ /*
+ * Save the token to a secondary storage. This is implemented on the
+ * OAuth2\Storage\JwtAccessToken side, and will not actually store anything,
+ * if no secondary storage has been supplied
+ */
+ $token_to_store = $this->config['store_encrypted_token_string'] ? $access_token : $jwtAccessToken['id'];
+ $this->tokenStorage->setAccessToken($token_to_store, $client_id, $user_id, $this->config['access_lifetime'] ? time() + $this->config['access_lifetime'] : null, $scope);
+
+ // token to return to the client
+ $token = array(
+ 'access_token' => $access_token,
+ 'expires_in' => $this->config['access_lifetime'],
+ 'token_type' => $this->config['token_type'],
+ 'scope' => $scope
+ );
+
+ /*
+ * Issue a refresh token also, if we support them
+ *
+ * Refresh Tokens are considered supported if an instance of OAuth2\Storage\RefreshTokenInterface
+ * is supplied in the constructor
+ */
+ if ($includeRefreshToken && $this->refreshStorage) {
+ $refresh_token = $this->generateRefreshToken();
+ $expires = 0;
+ if ($this->config['refresh_token_lifetime'] > 0) {
+ $expires = time() + $this->config['refresh_token_lifetime'];
+ }
+ $this->refreshStorage->setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope);
+ $token['refresh_token'] = $refresh_token;
+ }
+
+ return $token;
+ }
+
+ protected function encodeToken(array $token, $client_id = null)
+ {
+ $private_key = $this->publicKeyStorage->getPrivateKey($client_id);
+ $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
+
+ return $this->encryptionUtil->encode($token, $private_key, $algorithm);
+ }
+}
diff --git a/library/oauth2/src/OAuth2/ResponseType/ResponseTypeInterface.php b/library/oauth2/src/OAuth2/ResponseType/ResponseTypeInterface.php
new file mode 100644
index 000000000..f8e26a5b0
--- /dev/null
+++ b/library/oauth2/src/OAuth2/ResponseType/ResponseTypeInterface.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+interface ResponseTypeInterface
+{
+ public function getAuthorizeResponse($params, $user_id = null);
+}
diff --git a/library/oauth2/src/OAuth2/Scope.php b/library/oauth2/src/OAuth2/Scope.php
new file mode 100644
index 000000000..c44350bfd
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Scope.php
@@ -0,0 +1,103 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Storage\Memory;
+use OAuth2\Storage\ScopeInterface as ScopeStorageInterface;
+
+/**
+* @see OAuth2\ScopeInterface
+*/
+class Scope implements ScopeInterface
+{
+ protected $storage;
+
+ /**
+ * @param mixed @storage
+ * Either an array of supported scopes, or an instance of OAuth2\Storage\ScopeInterface
+ */
+ public function __construct($storage = null)
+ {
+ if (is_null($storage) || is_array($storage)) {
+ $storage = new Memory((array) $storage);
+ }
+
+ if (!$storage instanceof ScopeStorageInterface) {
+ throw new \InvalidArgumentException("Argument 1 to OAuth2\Scope must be null, an array, or instance of OAuth2\Storage\ScopeInterface");
+ }
+
+ $this->storage = $storage;
+ }
+
+ /**
+ * Check if everything in required scope is contained in available scope.
+ *
+ * @param $required_scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if everything in required scope is contained in available scope,
+ * and FALSE if it isn't.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-7
+ *
+ * @ingroup oauth2_section_7
+ */
+ public function checkScope($required_scope, $available_scope)
+ {
+ $required_scope = explode(' ', trim($required_scope));
+ $available_scope = explode(' ', trim($available_scope));
+
+ return (count(array_diff($required_scope, $available_scope)) == 0);
+ }
+
+ /**
+ * Check if the provided scope exists in storage.
+ *
+ * @param $scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if it exists, FALSE otherwise.
+ */
+ public function scopeExists($scope)
+ {
+ // Check reserved scopes first.
+ $scope = explode(' ', trim($scope));
+ $reservedScope = $this->getReservedScopes();
+ $nonReservedScopes = array_diff($scope, $reservedScope);
+ if (count($nonReservedScopes) == 0) {
+ return true;
+ } else {
+ // Check the storage for non-reserved scopes.
+ $nonReservedScopes = implode(' ', $nonReservedScopes);
+
+ return $this->storage->scopeExists($nonReservedScopes);
+ }
+ }
+
+ public function getScopeFromRequest(RequestInterface $request)
+ {
+ // "scope" is valid if passed in either POST or QUERY
+ return $request->request('scope', $request->query('scope'));
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ return $this->storage->getDefaultScope($client_id);
+ }
+
+ /**
+ * Get reserved scopes needed by the server.
+ *
+ * In case OpenID Connect is used, these scopes must include:
+ * 'openid', offline_access'.
+ *
+ * @return
+ * An array of reserved scopes.
+ */
+ public function getReservedScopes()
+ {
+ return array('openid', 'offline_access');
+ }
+}
diff --git a/library/oauth2/src/OAuth2/ScopeInterface.php b/library/oauth2/src/OAuth2/ScopeInterface.php
new file mode 100644
index 000000000..5b60f9aee
--- /dev/null
+++ b/library/oauth2/src/OAuth2/ScopeInterface.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Storage\ScopeInterface as ScopeStorageInterface;
+
+/**
+ * Class to handle scope implementation logic
+ *
+ * @see OAuth2\Storage\ScopeInterface
+ */
+interface ScopeInterface extends ScopeStorageInterface
+{
+ /**
+ * Check if everything in required scope is contained in available scope.
+ *
+ * @param $required_scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if everything in required scope is contained in available scope,
+ * and FALSE if it isn't.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-7
+ *
+ * @ingroup oauth2_section_7
+ */
+ public function checkScope($required_scope, $available_scope);
+
+ /**
+ * Return scope info from request
+ *
+ * @param OAuth2\RequestInterface
+ * Request object to check
+ *
+ * @return
+ * string representation of requested scope
+ */
+ public function getScopeFromRequest(RequestInterface $request);
+}
diff --git a/library/oauth2/src/OAuth2/Server.php b/library/oauth2/src/OAuth2/Server.php
new file mode 100644
index 000000000..171a4f069
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Server.php
@@ -0,0 +1,832 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Controller\ResourceControllerInterface;
+use OAuth2\Controller\ResourceController;
+use OAuth2\OpenID\Controller\UserInfoControllerInterface;
+use OAuth2\OpenID\Controller\UserInfoController;
+use OAuth2\OpenID\Controller\AuthorizeController as OpenIDAuthorizeController;
+use OAuth2\OpenID\ResponseType\AuthorizationCode as OpenIDAuthorizationCodeResponseType;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+use OAuth2\OpenID\GrantType\AuthorizationCode as OpenIDAuthorizationCodeGrantType;
+use OAuth2\Controller\AuthorizeControllerInterface;
+use OAuth2\Controller\AuthorizeController;
+use OAuth2\Controller\TokenControllerInterface;
+use OAuth2\Controller\TokenController;
+use OAuth2\ClientAssertionType\ClientAssertionTypeInterface;
+use OAuth2\ClientAssertionType\HttpBasic;
+use OAuth2\ResponseType\ResponseTypeInterface;
+use OAuth2\ResponseType\AuthorizationCode as AuthorizationCodeResponseType;
+use OAuth2\ResponseType\AccessToken;
+use OAuth2\ResponseType\JwtAccessToken;
+use OAuth2\OpenID\ResponseType\CodeIdToken;
+use OAuth2\OpenID\ResponseType\IdToken;
+use OAuth2\OpenID\ResponseType\IdTokenToken;
+use OAuth2\TokenType\TokenTypeInterface;
+use OAuth2\TokenType\Bearer;
+use OAuth2\GrantType\GrantTypeInterface;
+use OAuth2\GrantType\UserCredentials;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\GrantType\RefreshToken;
+use OAuth2\GrantType\AuthorizationCode;
+use OAuth2\Storage\JwtAccessToken as JwtAccessTokenStorage;
+use OAuth2\Storage\JwtAccessTokenInterface;
+
+/**
+* Server class for OAuth2
+* This class serves as a convience class which wraps the other Controller classes
+*
+* @see OAuth2\Controller\ResourceController
+* @see OAuth2\Controller\AuthorizeController
+* @see OAuth2\Controller\TokenController
+*/
+class Server implements ResourceControllerInterface,
+ AuthorizeControllerInterface,
+ TokenControllerInterface,
+ UserInfoControllerInterface
+{
+ // misc properties
+ protected $response;
+ protected $config;
+ protected $storages;
+
+ // servers
+ protected $authorizeController;
+ protected $tokenController;
+ protected $resourceController;
+ protected $userInfoController;
+
+ // config classes
+ protected $grantTypes;
+ protected $responseTypes;
+ protected $tokenType;
+ protected $scopeUtil;
+ protected $clientAssertionType;
+
+ protected $storageMap = array(
+ 'access_token' => 'OAuth2\Storage\AccessTokenInterface',
+ 'authorization_code' => 'OAuth2\Storage\AuthorizationCodeInterface',
+ 'client_credentials' => 'OAuth2\Storage\ClientCredentialsInterface',
+ 'client' => 'OAuth2\Storage\ClientInterface',
+ 'refresh_token' => 'OAuth2\Storage\RefreshTokenInterface',
+ 'user_credentials' => 'OAuth2\Storage\UserCredentialsInterface',
+ 'user_claims' => 'OAuth2\OpenID\Storage\UserClaimsInterface',
+ 'public_key' => 'OAuth2\Storage\PublicKeyInterface',
+ 'jwt_bearer' => 'OAuth2\Storage\JWTBearerInterface',
+ 'scope' => 'OAuth2\Storage\ScopeInterface',
+ );
+
+ protected $responseTypeMap = array(
+ 'token' => 'OAuth2\ResponseType\AccessTokenInterface',
+ 'code' => 'OAuth2\ResponseType\AuthorizationCodeInterface',
+ 'id_token' => 'OAuth2\OpenID\ResponseType\IdTokenInterface',
+ 'id_token token' => 'OAuth2\OpenID\ResponseType\IdTokenTokenInterface',
+ 'code id_token' => 'OAuth2\OpenID\ResponseType\CodeIdTokenInterface',
+ );
+
+ /**
+ * @param mixed $storage (array or OAuth2\Storage) - single object or array of objects implementing the
+ * required storage types (ClientCredentialsInterface and AccessTokenInterface as a minimum)
+ * @param array $config specify a different token lifetime, token header name, etc
+ * @param array $grantTypes An array of OAuth2\GrantType\GrantTypeInterface to use for granting access tokens
+ * @param array $responseTypes Response types to use. array keys should be "code" and and "token" for
+ * Access Token and Authorization Code response types
+ * @param OAuth2\TokenType\TokenTypeInterface $tokenType The token type object to use. Valid token types are "bearer" and "mac"
+ * @param OAuth2\ScopeInterface $scopeUtil The scope utility class to use to validate scope
+ * @param OAuth2\ClientAssertionType\ClientAssertionTypeInterface $clientAssertionType The method in which to verify the client identity. Default is HttpBasic
+ *
+ * @ingroup oauth2_section_7
+ */
+ public function __construct($storage = array(), array $config = array(), array $grantTypes = array(), array $responseTypes = array(), TokenTypeInterface $tokenType = null, ScopeInterface $scopeUtil = null, ClientAssertionTypeInterface $clientAssertionType = null)
+ {
+ $storage = is_array($storage) ? $storage : array($storage);
+ $this->storages = array();
+ foreach ($storage as $key => $service) {
+ $this->addStorage($service, $key);
+ }
+
+ // merge all config values. These get passed to our controller objects
+ $this->config = array_merge(array(
+ 'use_jwt_access_tokens' => false,
+ 'store_encrypted_token_string' => true,
+ 'use_openid_connect' => false,
+ 'id_lifetime' => 3600,
+ 'access_lifetime' => 3600,
+ 'www_realm' => 'Service',
+ 'token_param_name' => 'access_token',
+ 'token_bearer_header_name' => 'Bearer',
+ 'enforce_state' => true,
+ 'require_exact_redirect_uri' => true,
+ 'allow_implicit' => false,
+ 'allow_credentials_in_request_body' => true,
+ 'allow_public_clients' => true,
+ 'always_issue_new_refresh_token' => false,
+ 'unset_refresh_token_after_use' => true,
+ ), $config);
+
+ foreach ($grantTypes as $key => $grantType) {
+ $this->addGrantType($grantType, $key);
+ }
+
+ foreach ($responseTypes as $key => $responseType) {
+ $this->addResponseType($responseType, $key);
+ }
+
+ $this->tokenType = $tokenType;
+ $this->scopeUtil = $scopeUtil;
+ $this->clientAssertionType = $clientAssertionType;
+
+ if ($this->config['use_openid_connect']) {
+ $this->validateOpenIdConnect();
+ }
+ }
+
+ public function getAuthorizeController()
+ {
+ if (is_null($this->authorizeController)) {
+ $this->authorizeController = $this->createDefaultAuthorizeController();
+ }
+
+ return $this->authorizeController;
+ }
+
+ public function getTokenController()
+ {
+ if (is_null($this->tokenController)) {
+ $this->tokenController = $this->createDefaultTokenController();
+ }
+
+ return $this->tokenController;
+ }
+
+ public function getResourceController()
+ {
+ if (is_null($this->resourceController)) {
+ $this->resourceController = $this->createDefaultResourceController();
+ }
+
+ return $this->resourceController;
+ }
+
+ public function getUserInfoController()
+ {
+ if (is_null($this->userInfoController)) {
+ $this->userInfoController = $this->createDefaultUserInfoController();
+ }
+
+ return $this->userInfoController;
+ }
+
+ /**
+ * every getter deserves a setter
+ */
+ public function setAuthorizeController(AuthorizeControllerInterface $authorizeController)
+ {
+ $this->authorizeController = $authorizeController;
+ }
+
+ /**
+ * every getter deserves a setter
+ */
+ public function setTokenController(TokenControllerInterface $tokenController)
+ {
+ $this->tokenController = $tokenController;
+ }
+
+ /**
+ * every getter deserves a setter
+ */
+ public function setResourceController(ResourceControllerInterface $resourceController)
+ {
+ $this->resourceController = $resourceController;
+ }
+
+ /**
+ * every getter deserves a setter
+ */
+ public function setUserInfoController(UserInfoControllerInterface $userInfoController)
+ {
+ $this->userInfoController = $userInfoController;
+ }
+
+ /**
+ * Return claims about the authenticated end-user.
+ * This would be called from the "/UserInfo" endpoint as defined in the spec.
+ *
+ * @param $request - OAuth2\RequestInterface
+ * Request object to grant access token
+ *
+ * @param $response - OAuth2\ResponseInterface
+ * Response object containing error messages (failure) or user claims (success)
+ *
+ * @throws InvalidArgumentException
+ * @throws LogicException
+ *
+ * @see http://openid.net/specs/openid-connect-core-1_0.html#UserInfo
+ */
+ public function handleUserInfoRequest(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $this->getUserInfoController()->handleUserInfoRequest($request, $this->response);
+
+ return $this->response;
+ }
+
+ /**
+ * Grant or deny a requested access token.
+ * This would be called from the "/token" endpoint as defined in the spec.
+ * Obviously, you can call your endpoint whatever you want.
+ *
+ * @param $request - OAuth2\RequestInterface
+ * Request object to grant access token
+ *
+ * @param $response - OAuth2\ResponseInterface
+ * Response object containing error messages (failure) or access token (success)
+ *
+ * @throws InvalidArgumentException
+ * @throws LogicException
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @see http://tools.ietf.org/html/rfc6749#section-10.6
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.3
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function handleTokenRequest(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $this->getTokenController()->handleTokenRequest($request, $this->response);
+
+ return $this->response;
+ }
+
+ public function grantAccessToken(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $value = $this->getTokenController()->grantAccessToken($request, $this->response);
+
+ return $value;
+ }
+
+ /**
+ * Handle a revoke token request
+ * This would be called from the "/revoke" endpoint as defined in the draft Token Revocation spec
+ *
+ * @see https://tools.ietf.org/html/rfc7009#section-2
+ *
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return Response|ResponseInterface
+ */
+ public function handleRevokeRequest(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $this->getTokenController()->handleRevokeRequest($request, $this->response);
+
+ return $this->response;
+ }
+
+ /**
+ * Redirect the user appropriately after approval.
+ *
+ * After the user has approved or denied the resource request the
+ * authorization server should call this function to redirect the user
+ * appropriately.
+ *
+ * @param $request
+ * The request should have the follow parameters set in the querystring:
+ * - response_type: The requested response: an access token, an
+ * authorization code, or both.
+ * - client_id: The client identifier as described in Section 2.
+ * - redirect_uri: An absolute URI to which the authorization server
+ * will redirect the user-agent to when the end-user authorization
+ * step is completed.
+ * - scope: (optional) The scope of the resource request expressed as a
+ * list of space-delimited strings.
+ * - state: (optional) An opaque value used by the client to maintain
+ * state between the request and callback.
+ * @param $is_authorized
+ * TRUE or FALSE depending on whether the user authorized the access.
+ * @param $user_id
+ * Identifier of user who authorized the client
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function handleAuthorizeRequest(RequestInterface $request, ResponseInterface $response, $is_authorized, $user_id = null)
+ {
+ $this->response = $response;
+ $this->getAuthorizeController()->handleAuthorizeRequest($request, $this->response, $is_authorized, $user_id);
+
+ return $this->response;
+ }
+
+ /**
+ * Pull the authorization request data out of the HTTP request.
+ * - The redirect_uri is OPTIONAL as per draft 20. But your implementation can enforce it
+ * by setting $config['enforce_redirect'] to true.
+ * - The state is OPTIONAL but recommended to enforce CSRF. Draft 21 states, however, that
+ * CSRF protection is MANDATORY. You can enforce this by setting the $config['enforce_state'] to true.
+ *
+ * The draft specifies that the parameters should be retrieved from GET, override the Response
+ * object to change this
+ *
+ * @return
+ * The authorization parameters so the authorization server can prompt
+ * the user for approval if valid.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.1
+ * @see http://tools.ietf.org/html/rfc6749#section-10.12
+ *
+ * @ingroup oauth2_section_3
+ */
+ public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $value = $this->getAuthorizeController()->validateAuthorizeRequest($request, $this->response);
+
+ return $value;
+ }
+
+ public function verifyResourceRequest(RequestInterface $request, ResponseInterface $response = null, $scope = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $value = $this->getResourceController()->verifyResourceRequest($request, $this->response, $scope);
+
+ return $value;
+ }
+
+ public function getAccessTokenData(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $value = $this->getResourceController()->getAccessTokenData($request, $this->response);
+
+ return $value;
+ }
+
+ public function addGrantType(GrantTypeInterface $grantType, $identifier = null)
+ {
+ if (!is_string($identifier)) {
+ $identifier = $grantType->getQuerystringIdentifier();
+ }
+
+ $this->grantTypes[$identifier] = $grantType;
+
+ // persist added grant type down to TokenController
+ if (!is_null($this->tokenController)) {
+ $this->getTokenController()->addGrantType($grantType, $identifier);
+ }
+ }
+
+ /**
+ * Set a storage object for the server
+ *
+ * @param $storage
+ * An object implementing one of the Storage interfaces
+ * @param $key
+ * If null, the storage is set to the key of each storage interface it implements
+ *
+ * @see storageMap
+ */
+ public function addStorage($storage, $key = null)
+ {
+ // if explicitly set to a valid key, do not "magically" set below
+ if (isset($this->storageMap[$key])) {
+ if (!is_null($storage) && !$storage instanceof $this->storageMap[$key]) {
+ throw new \InvalidArgumentException(sprintf('storage of type "%s" must implement interface "%s"', $key, $this->storageMap[$key]));
+ }
+ $this->storages[$key] = $storage;
+
+ // special logic to handle "client" and "client_credentials" strangeness
+ if ($key === 'client' && !isset($this->storages['client_credentials'])) {
+ if ($storage instanceof \OAuth2\Storage\ClientCredentialsInterface) {
+ $this->storages['client_credentials'] = $storage;
+ }
+ } elseif ($key === 'client_credentials' && !isset($this->storages['client'])) {
+ if ($storage instanceof \OAuth2\Storage\ClientInterface) {
+ $this->storages['client'] = $storage;
+ }
+ }
+ } elseif (!is_null($key) && !is_numeric($key)) {
+ throw new \InvalidArgumentException(sprintf('unknown storage key "%s", must be one of [%s]', $key, implode(', ', array_keys($this->storageMap))));
+ } else {
+ $set = false;
+ foreach ($this->storageMap as $type => $interface) {
+ if ($storage instanceof $interface) {
+ $this->storages[$type] = $storage;
+ $set = true;
+ }
+ }
+
+ if (!$set) {
+ throw new \InvalidArgumentException(sprintf('storage of class "%s" must implement one of [%s]', get_class($storage), implode(', ', $this->storageMap)));
+ }
+ }
+ }
+
+ public function addResponseType(ResponseTypeInterface $responseType, $key = null)
+ {
+ $key = $this->normalizeResponseType($key);
+
+ if (isset($this->responseTypeMap[$key])) {
+ if (!$responseType instanceof $this->responseTypeMap[$key]) {
+ throw new \InvalidArgumentException(sprintf('responseType of type "%s" must implement interface "%s"', $key, $this->responseTypeMap[$key]));
+ }
+ $this->responseTypes[$key] = $responseType;
+ } elseif (!is_null($key) && !is_numeric($key)) {
+ throw new \InvalidArgumentException(sprintf('unknown responseType key "%s", must be one of [%s]', $key, implode(', ', array_keys($this->responseTypeMap))));
+ } else {
+ $set = false;
+ foreach ($this->responseTypeMap as $type => $interface) {
+ if ($responseType instanceof $interface) {
+ $this->responseTypes[$type] = $responseType;
+ $set = true;
+ }
+ }
+
+ if (!$set) {
+ throw new \InvalidArgumentException(sprintf('Unknown response type %s. Please implement one of [%s]', get_class($responseType), implode(', ', $this->responseTypeMap)));
+ }
+ }
+ }
+
+ public function getScopeUtil()
+ {
+ if (!$this->scopeUtil) {
+ $storage = isset($this->storages['scope']) ? $this->storages['scope'] : null;
+ $this->scopeUtil = new Scope($storage);
+ }
+
+ return $this->scopeUtil;
+ }
+
+ /**
+ * every getter deserves a setter
+ */
+ public function setScopeUtil($scopeUtil)
+ {
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ protected function createDefaultAuthorizeController()
+ {
+ if (!isset($this->storages['client'])) {
+ throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\ClientInterface to use the authorize server");
+ }
+ if (0 == count($this->responseTypes)) {
+ $this->responseTypes = $this->getDefaultResponseTypes();
+ }
+ if ($this->config['use_openid_connect'] && !isset($this->responseTypes['id_token'])) {
+ $this->responseTypes['id_token'] = $this->createDefaultIdTokenResponseType();
+ if ($this->config['allow_implicit']) {
+ $this->responseTypes['id_token token'] = $this->createDefaultIdTokenTokenResponseType();
+ }
+ }
+
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'allow_implicit enforce_state require_exact_redirect_uri')));
+
+ if ($this->config['use_openid_connect']) {
+ return new OpenIDAuthorizeController($this->storages['client'], $this->responseTypes, $config, $this->getScopeUtil());
+ }
+
+ return new AuthorizeController($this->storages['client'], $this->responseTypes, $config, $this->getScopeUtil());
+ }
+
+ protected function createDefaultTokenController()
+ {
+ if (0 == count($this->grantTypes)) {
+ $this->grantTypes = $this->getDefaultGrantTypes();
+ }
+
+ if (is_null($this->clientAssertionType)) {
+ // see if HttpBasic assertion type is requred. If so, then create it from storage classes.
+ foreach ($this->grantTypes as $grantType) {
+ if (!$grantType instanceof ClientAssertionTypeInterface) {
+ if (!isset($this->storages['client_credentials'])) {
+ throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\ClientCredentialsInterface to use the token server");
+ }
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'allow_credentials_in_request_body allow_public_clients')));
+ $this->clientAssertionType = new HttpBasic($this->storages['client_credentials'], $config);
+ break;
+ }
+ }
+ }
+
+ if (!isset($this->storages['client'])) {
+ throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\ClientInterface to use the token server");
+ }
+
+ $accessTokenResponseType = $this->getAccessTokenResponseType();
+
+ return new TokenController($accessTokenResponseType, $this->storages['client'], $this->grantTypes, $this->clientAssertionType, $this->getScopeUtil());
+ }
+
+ protected function createDefaultResourceController()
+ {
+ if ($this->config['use_jwt_access_tokens']) {
+ // overwrites access token storage with crypto token storage if "use_jwt_access_tokens" is set
+ if (!isset($this->storages['access_token']) || !$this->storages['access_token'] instanceof JwtAccessTokenInterface) {
+ $this->storages['access_token'] = $this->createDefaultJwtAccessTokenStorage();
+ }
+ } elseif (!isset($this->storages['access_token'])) {
+ throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\AccessTokenInterface or use JwtAccessTokens to use the resource server");
+ }
+
+ if (!$this->tokenType) {
+ $this->tokenType = $this->getDefaultTokenType();
+ }
+
+ $config = array_intersect_key($this->config, array('www_realm' => ''));
+
+ return new ResourceController($this->tokenType, $this->storages['access_token'], $config, $this->getScopeUtil());
+ }
+
+ protected function createDefaultUserInfoController()
+ {
+ if ($this->config['use_jwt_access_tokens']) {
+ // overwrites access token storage with crypto token storage if "use_jwt_access_tokens" is set
+ if (!isset($this->storages['access_token']) || !$this->storages['access_token'] instanceof JwtAccessTokenInterface) {
+ $this->storages['access_token'] = $this->createDefaultJwtAccessTokenStorage();
+ }
+ } elseif (!isset($this->storages['access_token'])) {
+ throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\AccessTokenInterface or use JwtAccessTokens to use the UserInfo server");
+ }
+
+ if (!isset($this->storages['user_claims'])) {
+ throw new \LogicException("You must supply a storage object implementing OAuth2\OpenID\Storage\UserClaimsInterface to use the UserInfo server");
+ }
+
+ if (!$this->tokenType) {
+ $this->tokenType = $this->getDefaultTokenType();
+ }
+
+ $config = array_intersect_key($this->config, array('www_realm' => ''));
+
+ return new UserInfoController($this->tokenType, $this->storages['access_token'], $this->storages['user_claims'], $config, $this->getScopeUtil());
+ }
+
+ protected function getDefaultTokenType()
+ {
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'token_param_name token_bearer_header_name')));
+
+ return new Bearer($config);
+ }
+
+ protected function getDefaultResponseTypes()
+ {
+ $responseTypes = array();
+
+ if ($this->config['allow_implicit']) {
+ $responseTypes['token'] = $this->getAccessTokenResponseType();
+ }
+
+ if ($this->config['use_openid_connect']) {
+ $responseTypes['id_token'] = $this->getIdTokenResponseType();
+ if ($this->config['allow_implicit']) {
+ $responseTypes['id_token token'] = $this->getIdTokenTokenResponseType();
+ }
+ }
+
+ if (isset($this->storages['authorization_code'])) {
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'enforce_redirect auth_code_lifetime')));
+ if ($this->config['use_openid_connect']) {
+ if (!$this->storages['authorization_code'] instanceof OpenIDAuthorizationCodeInterface) {
+ throw new \LogicException("Your authorization_code storage must implement OAuth2\OpenID\Storage\AuthorizationCodeInterface to work when 'use_openid_connect' is true");
+ }
+ $responseTypes['code'] = new OpenIDAuthorizationCodeResponseType($this->storages['authorization_code'], $config);
+ $responseTypes['code id_token'] = new CodeIdToken($responseTypes['code'], $responseTypes['id_token']);
+ } else {
+ $responseTypes['code'] = new AuthorizationCodeResponseType($this->storages['authorization_code'], $config);
+ }
+ }
+
+ if (count($responseTypes) == 0) {
+ throw new \LogicException("You must supply an array of response_types in the constructor or implement a OAuth2\Storage\AuthorizationCodeInterface storage object or set 'allow_implicit' to true and implement a OAuth2\Storage\AccessTokenInterface storage object");
+ }
+
+ return $responseTypes;
+ }
+
+ protected function getDefaultGrantTypes()
+ {
+ $grantTypes = array();
+
+ if (isset($this->storages['user_credentials'])) {
+ $grantTypes['password'] = new UserCredentials($this->storages['user_credentials']);
+ }
+
+ if (isset($this->storages['client_credentials'])) {
+ $config = array_intersect_key($this->config, array('allow_credentials_in_request_body' => ''));
+ $grantTypes['client_credentials'] = new ClientCredentials($this->storages['client_credentials'], $config);
+ }
+
+ if (isset($this->storages['refresh_token'])) {
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'always_issue_new_refresh_token unset_refresh_token_after_use')));
+ $grantTypes['refresh_token'] = new RefreshToken($this->storages['refresh_token'], $config);
+ }
+
+ if (isset($this->storages['authorization_code'])) {
+ if ($this->config['use_openid_connect']) {
+ if (!$this->storages['authorization_code'] instanceof OpenIDAuthorizationCodeInterface) {
+ throw new \LogicException("Your authorization_code storage must implement OAuth2\OpenID\Storage\AuthorizationCodeInterface to work when 'use_openid_connect' is true");
+ }
+ $grantTypes['authorization_code'] = new OpenIDAuthorizationCodeGrantType($this->storages['authorization_code']);
+ } else {
+ $grantTypes['authorization_code'] = new AuthorizationCode($this->storages['authorization_code']);
+ }
+ }
+
+ if (count($grantTypes) == 0) {
+ throw new \LogicException("Unable to build default grant types - You must supply an array of grant_types in the constructor");
+ }
+
+ return $grantTypes;
+ }
+
+ protected function getAccessTokenResponseType()
+ {
+ if (isset($this->responseTypes['token'])) {
+ return $this->responseTypes['token'];
+ }
+
+ if ($this->config['use_jwt_access_tokens']) {
+ return $this->createDefaultJwtAccessTokenResponseType();
+ }
+
+ return $this->createDefaultAccessTokenResponseType();
+ }
+
+ protected function getIdTokenResponseType()
+ {
+ if (isset($this->responseTypes['id_token'])) {
+ return $this->responseTypes['id_token'];
+ }
+
+ return $this->createDefaultIdTokenResponseType();
+ }
+
+ protected function getIdTokenTokenResponseType()
+ {
+ if (isset($this->responseTypes['id_token token'])) {
+ return $this->responseTypes['id_token token'];
+ }
+
+ return $this->createDefaultIdTokenTokenResponseType();
+ }
+
+ /**
+ * For Resource Controller
+ */
+ protected function createDefaultJwtAccessTokenStorage()
+ {
+ if (!isset($this->storages['public_key'])) {
+ throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\PublicKeyInterface to use crypto tokens");
+ }
+ $tokenStorage = null;
+ if (!empty($this->config['store_encrypted_token_string']) && isset($this->storages['access_token'])) {
+ $tokenStorage = $this->storages['access_token'];
+ }
+ // wrap the access token storage as required.
+ return new JwtAccessTokenStorage($this->storages['public_key'], $tokenStorage);
+ }
+
+ /**
+ * For Authorize and Token Controllers
+ */
+ protected function createDefaultJwtAccessTokenResponseType()
+ {
+ if (!isset($this->storages['public_key'])) {
+ throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\PublicKeyInterface to use crypto tokens");
+ }
+
+ $tokenStorage = null;
+ if (isset($this->storages['access_token'])) {
+ $tokenStorage = $this->storages['access_token'];
+ }
+
+ $refreshStorage = null;
+ if (isset($this->storages['refresh_token'])) {
+ $refreshStorage = $this->storages['refresh_token'];
+ }
+
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'store_encrypted_token_string issuer access_lifetime refresh_token_lifetime')));
+
+ return new JwtAccessToken($this->storages['public_key'], $tokenStorage, $refreshStorage, $config);
+ }
+
+ protected function createDefaultAccessTokenResponseType()
+ {
+ if (!isset($this->storages['access_token'])) {
+ throw new \LogicException("You must supply a response type implementing OAuth2\ResponseType\AccessTokenInterface, or a storage object implementing OAuth2\Storage\AccessTokenInterface to use the token server");
+ }
+
+ $refreshStorage = null;
+ if (isset($this->storages['refresh_token'])) {
+ $refreshStorage = $this->storages['refresh_token'];
+ }
+
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'access_lifetime refresh_token_lifetime')));
+ $config['token_type'] = $this->tokenType ? $this->tokenType->getTokenType() : $this->getDefaultTokenType()->getTokenType();
+
+ return new AccessToken($this->storages['access_token'], $refreshStorage, $config);
+ }
+
+ protected function createDefaultIdTokenResponseType()
+ {
+ if (!isset($this->storages['user_claims'])) {
+ throw new \LogicException("You must supply a storage object implementing OAuth2\OpenID\Storage\UserClaimsInterface to use openid connect");
+ }
+ if (!isset($this->storages['public_key'])) {
+ throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\PublicKeyInterface to use openid connect");
+ }
+
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'issuer id_lifetime')));
+
+ return new IdToken($this->storages['user_claims'], $this->storages['public_key'], $config);
+ }
+
+ protected function createDefaultIdTokenTokenResponseType()
+ {
+ return new IdTokenToken($this->getAccessTokenResponseType(), $this->getIdTokenResponseType());
+ }
+
+ protected function validateOpenIdConnect()
+ {
+ $authCodeGrant = $this->getGrantType('authorization_code');
+ if (!empty($authCodeGrant) && !$authCodeGrant instanceof OpenIDAuthorizationCodeGrantType) {
+ throw new \InvalidArgumentException('You have enabled OpenID Connect, but supplied a grant type that does not support it.');
+ }
+ }
+
+ protected function normalizeResponseType($name)
+ {
+ // for multiple-valued response types - make them alphabetical
+ if (!empty($name) && false !== strpos($name, ' ')) {
+ $types = explode(' ', $name);
+ sort($types);
+ $name = implode(' ', $types);
+ }
+
+ return $name;
+ }
+
+ public function getResponse()
+ {
+ return $this->response;
+ }
+
+ public function getStorages()
+ {
+ return $this->storages;
+ }
+
+ public function getStorage($name)
+ {
+ return isset($this->storages[$name]) ? $this->storages[$name] : null;
+ }
+
+ public function getGrantTypes()
+ {
+ return $this->grantTypes;
+ }
+
+ public function getGrantType($name)
+ {
+ return isset($this->grantTypes[$name]) ? $this->grantTypes[$name] : null;
+ }
+
+ public function getResponseTypes()
+ {
+ return $this->responseTypes;
+ }
+
+ public function getResponseType($name)
+ {
+ // for multiple-valued response types - make them alphabetical
+ $name = $this->normalizeResponseType($name);
+
+ return isset($this->responseTypes[$name]) ? $this->responseTypes[$name] : null;
+ }
+
+ public function getTokenType()
+ {
+ return $this->tokenType;
+ }
+
+ public function getClientAssertionType()
+ {
+ return $this->clientAssertionType;
+ }
+
+ public function setConfig($name, $value)
+ {
+ $this->config[$name] = $value;
+ }
+
+ public function getConfig($name, $default = null)
+ {
+ return isset($this->config[$name]) ? $this->config[$name] : $default;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/Storage/AccessTokenInterface.php b/library/oauth2/src/OAuth2/Storage/AccessTokenInterface.php
new file mode 100644
index 000000000..1819158af
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/AccessTokenInterface.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get/save access tokens
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AccessTokenInterface
+{
+ /**
+ * Look up the supplied oauth_token from storage.
+ *
+ * We need to retrieve access token data as we create and verify tokens.
+ *
+ * @param $oauth_token
+ * oauth_token to be check with.
+ *
+ * @return
+ * An associative array as below, and return NULL if the supplied oauth_token
+ * is invalid:
+ * - expires: Stored expiration in unix timestamp.
+ * - client_id: (optional) Stored client identifier.
+ * - user_id: (optional) Stored user identifier.
+ * - scope: (optional) Stored scope values in space-separated string.
+ * - id_token: (optional) Stored id_token (if "use_openid_connect" is true).
+ *
+ * @ingroup oauth2_section_7
+ */
+ public function getAccessToken($oauth_token);
+
+ /**
+ * Store the supplied access token values to storage.
+ *
+ * We need to store access token data as we create and verify tokens.
+ *
+ * @param $oauth_token oauth_token to be stored.
+ * @param $client_id client identifier to be stored.
+ * @param $user_id user identifier to be stored.
+ * @param int $expires expiration to be stored as a Unix timestamp.
+ * @param string $scope OPTIONAL Scopes to be stored in space-separated string.
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope = null);
+
+ /**
+ * Expire an access token.
+ *
+ * This is not explicitly required in the spec, but if defined in a draft RFC for token
+ * revoking (RFC 7009) https://tools.ietf.org/html/rfc7009
+ *
+ * @param $access_token
+ * Access token to be expired.
+ *
+ * @return BOOL true if an access token was unset, false if not
+ * @ingroup oauth2_section_6
+ *
+ * @todo v2.0 include this method in interface. Omitted to maintain BC in v1.x
+ */
+ //public function unsetAccessToken($access_token);
+}
diff --git a/library/oauth2/src/OAuth2/Storage/AuthorizationCodeInterface.php b/library/oauth2/src/OAuth2/Storage/AuthorizationCodeInterface.php
new file mode 100644
index 000000000..3beb0e437
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/AuthorizationCodeInterface.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get/save authorization codes for the "Authorization Code"
+ * grant type
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AuthorizationCodeInterface
+{
+ /**
+ * The Authorization Code grant type supports a response type of "code".
+ *
+ * @var string
+ * @see http://tools.ietf.org/html/rfc6749#section-1.4.1
+ * @see http://tools.ietf.org/html/rfc6749#section-4.2
+ */
+ const RESPONSE_TYPE_CODE = "code";
+
+ /**
+ * Fetch authorization code data (probably the most common grant type).
+ *
+ * Retrieve the stored data for the given authorization code.
+ *
+ * Required for OAuth2::GRANT_TYPE_AUTH_CODE.
+ *
+ * @param $code
+ * Authorization code to be check with.
+ *
+ * @return
+ * An associative array as below, and NULL if the code is invalid
+ * @code
+ * return array(
+ * "client_id" => CLIENT_ID, // REQUIRED Stored client identifier
+ * "user_id" => USER_ID, // REQUIRED Stored user identifier
+ * "expires" => EXPIRES, // REQUIRED Stored expiration in unix timestamp
+ * "redirect_uri" => REDIRECT_URI, // REQUIRED Stored redirect URI
+ * "scope" => SCOPE, // OPTIONAL Stored scope values in space-separated string
+ * );
+ * @endcode
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function getAuthorizationCode($code);
+
+ /**
+ * Take the provided authorization code values and store them somewhere.
+ *
+ * This function should be the storage counterpart to getAuthCode().
+ *
+ * If storage fails for some reason, we're not currently checking for
+ * any sort of success/failure, so you should bail out of the script
+ * and provide a descriptive fail message.
+ *
+ * Required for OAuth2::GRANT_TYPE_AUTH_CODE.
+ *
+ * @param string $code Authorization code to be stored.
+ * @param mixed $client_id Client identifier to be stored.
+ * @param mixed $user_id User identifier to be stored.
+ * @param string $redirect_uri Redirect URI(s) to be stored in a space-separated string.
+ * @param int $expires Expiration to be stored as a Unix timestamp.
+ * @param string $scope OPTIONAL Scopes to be stored in space-separated string.
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null);
+
+ /**
+ * once an Authorization Code is used, it must be exipired
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.2
+ *
+ * The client MUST NOT use the authorization code
+ * more than once. If an authorization code is used more than
+ * once, the authorization server MUST deny the request and SHOULD
+ * revoke (when possible) all tokens previously issued based on
+ * that authorization code
+ *
+ */
+ public function expireAuthorizationCode($code);
+}
diff --git a/library/oauth2/src/OAuth2/Storage/Cassandra.php b/library/oauth2/src/OAuth2/Storage/Cassandra.php
new file mode 100644
index 000000000..602e8a058
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/Cassandra.php
@@ -0,0 +1,480 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use phpcassa\ColumnFamily;
+use phpcassa\ColumnSlice;
+use phpcassa\Connection\ConnectionPool;
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Cassandra storage for all storage types
+ *
+ * To use, install "thobbs/phpcassa" via composer
+ * <code>
+ * composer require thobbs/phpcassa:dev-master
+ * </code>
+ *
+ * Once this is done, instantiate the
+ * <code>
+ * $cassandra = new \phpcassa\Connection\ConnectionPool('oauth2_server', array('127.0.0.1:9160'));
+ * </code>
+ *
+ * Then, register the storage client:
+ * <code>
+ * $storage = new OAuth2\Storage\Cassandra($cassandra);
+ * $storage->setClientDetails($client_id, $client_secret, $redirect_uri);
+ * </code>
+ *
+ * @see test/lib/OAuth2/Storage/Bootstrap::getCassandraStorage
+ */
+class Cassandra implements AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ PublicKeyInterface,
+ UserClaimsInterface,
+ OpenIDAuthorizationCodeInterface
+{
+
+ private $cache;
+
+ /* The cassandra client */
+ protected $cassandra;
+
+ /* Configuration array */
+ protected $config;
+
+ /**
+ * Cassandra Storage! uses phpCassa
+ *
+ * @param \phpcassa\ConnectionPool $cassandra
+ * @param array $config
+ */
+ public function __construct($connection = array(), array $config = array())
+ {
+ if ($connection instanceof ConnectionPool) {
+ $this->cassandra = $connection;
+ } else {
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Cassandra must be an instance of phpcassa\Connection\ConnectionPool or a configuration array');
+ }
+ $connection = array_merge(array(
+ 'keyspace' => 'oauth2',
+ 'servers' => null,
+ ), $connection);
+
+ $this->cassandra = new ConnectionPool($connection['keyspace'], $connection['servers']);
+ }
+
+ $this->config = array_merge(array(
+ // cassandra config
+ 'column_family' => 'auth',
+
+ // key names
+ 'client_key' => 'oauth_clients:',
+ 'access_token_key' => 'oauth_access_tokens:',
+ 'refresh_token_key' => 'oauth_refresh_tokens:',
+ 'code_key' => 'oauth_authorization_codes:',
+ 'user_key' => 'oauth_users:',
+ 'jwt_key' => 'oauth_jwt:',
+ 'scope_key' => 'oauth_scopes:',
+ 'public_key_key' => 'oauth_public_keys:',
+ ), $config);
+ }
+
+ protected function getValue($key)
+ {
+ if (isset($this->cache[$key])) {
+ return $this->cache[$key];
+ }
+ $cf = new ColumnFamily($this->cassandra, $this->config['column_family']);
+
+ try {
+ $value = $cf->get($key, new ColumnSlice("", ""));
+ $value = array_shift($value);
+ } catch (\cassandra\NotFoundException $e) {
+ return false;
+ }
+
+ return json_decode($value, true);
+ }
+
+ protected function setValue($key, $value, $expire = 0)
+ {
+ $this->cache[$key] = $value;
+
+ $cf = new ColumnFamily($this->cassandra, $this->config['column_family']);
+
+ $str = json_encode($value);
+ if ($expire > 0) {
+ try {
+ $seconds = $expire - time();
+ // __data key set as C* requires a field, note: max TTL can only be 630720000 seconds
+ $cf->insert($key, array('__data' => $str), null, $seconds);
+ } catch (\Exception $e) {
+ return false;
+ }
+ } else {
+ try {
+ // __data key set as C* requires a field
+ $cf->insert($key, array('__data' => $str));
+ } catch (\Exception $e) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ protected function expireValue($key)
+ {
+ unset($this->cache[$key]);
+
+ $cf = new ColumnFamily($this->cassandra, $this->config['column_family']);
+
+ if ($cf->get_count($key) > 0) {
+ try {
+ // __data key set as C* requires a field
+ $cf->remove($key, array('__data'));
+ } catch (\Exception $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ return $this->getValue($this->config['code_key'] . $code);
+ }
+
+ public function setAuthorizationCode($authorization_code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ return $this->setValue(
+ $this->config['code_key'] . $authorization_code,
+ compact('authorization_code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token'),
+ $expires
+ );
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $key = $this->config['code_key'] . $code;
+ unset($this->cache[$key]);
+
+ return $this->expireValue($key);
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $this->hashPassword($password);
+ }
+
+ // use a secure hashing algorithm when storing passwords. Override this for your application
+ protected function hashPassword($password)
+ {
+ return sha1($password);
+ }
+
+ public function getUserDetails($username)
+ {
+ return $this->getUser($username);
+ }
+
+ public function getUser($username)
+ {
+ if (!$userInfo = $this->getValue($this->config['user_key'] . $username)) {
+ return false;
+ }
+
+ // the default behavior is to use "username" as the user_id
+ return array_merge(array(
+ 'user_id' => $username,
+ ), $userInfo);
+ }
+
+ public function setUser($username, $password, $first_name = null, $last_name = null)
+ {
+ $password = $this->hashPassword($password);
+
+ return $this->setValue(
+ $this->config['user_key'] . $username,
+ compact('username', 'password', 'first_name', 'last_name')
+ );
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if (!$client = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ return isset($client['client_secret'])
+ && $client['client_secret'] == $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$client = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ return empty($client['client_secret']);;
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ return $this->getValue($this->config['client_key'] . $client_id);
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ return $this->setValue(
+ $this->config['client_key'] . $client_id,
+ compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id')
+ );
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, (array) $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ return $this->getValue($this->config['refresh_token_key'] . $refresh_token);
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ return $this->setValue(
+ $this->config['refresh_token_key'] . $refresh_token,
+ compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope'),
+ $expires
+ );
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ return $this->expireValue($this->config['refresh_token_key'] . $refresh_token);
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ return $this->getValue($this->config['access_token_key'].$access_token);
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ return $this->setValue(
+ $this->config['access_token_key'].$access_token,
+ compact('access_token', 'client_id', 'user_id', 'expires', 'scope'),
+ $expires
+ );
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ return $this->expireValue($this->config['access_token_key'] . $access_token);
+ }
+
+ /* ScopeInterface */
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', $scope);
+
+ $result = $this->getValue($this->config['scope_key'].'supported:global');
+
+ $supportedScope = explode(' ', (string) $result);
+
+ return (count(array_diff($scope, $supportedScope)) == 0);
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ if (is_null($client_id) || !$result = $this->getValue($this->config['scope_key'].'default:'.$client_id)) {
+ $result = $this->getValue($this->config['scope_key'].'default:global');
+ }
+
+ return $result;
+ }
+
+ public function setScope($scope, $client_id = null, $type = 'supported')
+ {
+ if (!in_array($type, array('default', 'supported'))) {
+ throw new \InvalidArgumentException('"$type" must be one of "default", "supported"');
+ }
+
+ if (is_null($client_id)) {
+ $key = $this->config['scope_key'].$type.':global';
+ } else {
+ $key = $this->config['scope_key'].$type.':'.$client_id;
+ }
+
+ return $this->setValue($key, $scope);
+ }
+
+ /*JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ if (!$jwt = $this->getValue($this->config['jwt_key'] . $client_id)) {
+ return false;
+ }
+
+ if (isset($jwt['subject']) && $jwt['subject'] == $subject ) {
+ return $jwt['key'];
+ }
+
+ return null;
+ }
+
+ public function setClientKey($client_id, $key, $subject = null)
+ {
+ return $this->setValue($this->config['jwt_key'] . $client_id, array(
+ 'key' => $key,
+ 'subject' => $subject
+ ));
+ }
+
+ /*ScopeInterface */
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs cassandra implementation.
+ throw new \Exception('getJti() for the Cassandra driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs cassandra implementation.
+ throw new \Exception('setJti() for the Cassandra driver is currently unimplemented.');
+ }
+
+ /* PublicKeyInterface */
+ public function getPublicKey($client_id = '')
+ {
+ $public_key = $this->getValue($this->config['public_key_key'] . $client_id);
+ if (is_array($public_key)) {
+ return $public_key['public_key'];
+ }
+ $public_key = $this->getValue($this->config['public_key_key']);
+ if (is_array($public_key)) {
+ return $public_key['public_key'];
+ }
+ }
+
+ public function getPrivateKey($client_id = '')
+ {
+ $public_key = $this->getValue($this->config['public_key_key'] . $client_id);
+ if (is_array($public_key)) {
+ return $public_key['private_key'];
+ }
+ $public_key = $this->getValue($this->config['public_key_key']);
+ if (is_array($public_key)) {
+ return $public_key['private_key'];
+ }
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ $public_key = $this->getValue($this->config['public_key_key'] . $client_id);
+ if (is_array($public_key)) {
+ return $public_key['encryption_algorithm'];
+ }
+ $public_key = $this->getValue($this->config['public_key_key']);
+ if (is_array($public_key)) {
+ return $public_key['encryption_algorithm'];
+ }
+
+ return 'RS256';
+ }
+
+ /* UserClaimsInterface */
+ public function getUserClaims($user_id, $claims)
+ {
+ $userDetails = $this->getUserDetails($user_id);
+ if (!is_array($userDetails)) {
+ return false;
+ }
+
+ $claims = explode(' ', trim($claims));
+ $userClaims = array();
+
+ // for each requested claim, if the user has the claim, set it in the response
+ $validClaims = explode(' ', self::VALID_CLAIMS);
+ foreach ($validClaims as $validClaim) {
+ if (in_array($validClaim, $claims)) {
+ if ($validClaim == 'address') {
+ // address is an object with subfields
+ $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
+ } else {
+ $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
+ }
+ }
+ }
+
+ return $userClaims;
+ }
+
+ protected function getUserClaim($claim, $userDetails)
+ {
+ $userClaims = array();
+ $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
+ $claimValues = explode(' ', $claimValuesString);
+
+ foreach ($claimValues as $value) {
+ if ($value == 'email_verified') {
+ $userClaims[$value] = $userDetails[$value]=='true' ? true : false;
+ } else {
+ $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
+ }
+ }
+
+ return $userClaims;
+ }
+
+}
diff --git a/library/oauth2/src/OAuth2/Storage/ClientCredentialsInterface.php b/library/oauth2/src/OAuth2/Storage/ClientCredentialsInterface.php
new file mode 100644
index 000000000..3318c6966
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/ClientCredentialsInterface.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify how the OAuth2 Server
+ * should verify client credentials
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface ClientCredentialsInterface extends ClientInterface
+{
+
+ /**
+ * Make sure that the client credentials is valid.
+ *
+ * @param $client_id
+ * Client identifier to be check with.
+ * @param $client_secret
+ * (optional) If a secret is required, check that they've given the right one.
+ *
+ * @return
+ * TRUE if the client credentials are valid, and MUST return FALSE if it isn't.
+ * @endcode
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-3.1
+ *
+ * @ingroup oauth2_section_3
+ */
+ public function checkClientCredentials($client_id, $client_secret = null);
+
+ /**
+ * Determine if the client is a "public" client, and therefore
+ * does not require passing credentials for certain grant types
+ *
+ * @param $client_id
+ * Client identifier to be check with.
+ *
+ * @return
+ * TRUE if the client is public, and FALSE if it isn't.
+ * @endcode
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-2.3
+ * @see https://github.com/bshaffer/oauth2-server-php/issues/257
+ *
+ * @ingroup oauth2_section_2
+ */
+ public function isPublicClient($client_id);
+}
diff --git a/library/oauth2/src/OAuth2/Storage/ClientInterface.php b/library/oauth2/src/OAuth2/Storage/ClientInterface.php
new file mode 100644
index 000000000..09a5bffc1
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/ClientInterface.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should retrieve client information
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface ClientInterface
+{
+ /**
+ * Get client details corresponding client_id.
+ *
+ * OAuth says we should store request URIs for each registered client.
+ * Implement this function to grab the stored URI for a given client id.
+ *
+ * @param $client_id
+ * Client identifier to be check with.
+ *
+ * @return array
+ * Client details. The only mandatory key in the array is "redirect_uri".
+ * This function MUST return FALSE if the given client does not exist or is
+ * invalid. "redirect_uri" can be space-delimited to allow for multiple valid uris.
+ * <code>
+ * return array(
+ * "redirect_uri" => REDIRECT_URI, // REQUIRED redirect_uri registered for the client
+ * "client_id" => CLIENT_ID, // OPTIONAL the client id
+ * "grant_types" => GRANT_TYPES, // OPTIONAL an array of restricted grant types
+ * "user_id" => USER_ID, // OPTIONAL the user identifier associated with this client
+ * "scope" => SCOPE, // OPTIONAL the scopes allowed for this client
+ * );
+ * </code>
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function getClientDetails($client_id);
+
+ /**
+ * Get the scope associated with this client
+ *
+ * @return
+ * STRING the space-delineated scope list for the specified client_id
+ */
+ public function getClientScope($client_id);
+
+ /**
+ * Check restricted grant types of corresponding client identifier.
+ *
+ * If you want to restrict clients to certain grant types, override this
+ * function.
+ *
+ * @param $client_id
+ * Client identifier to be check with.
+ * @param $grant_type
+ * Grant type to be check with
+ *
+ * @return
+ * TRUE if the grant type is supported by this client identifier, and
+ * FALSE if it isn't.
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function checkRestrictedGrantType($client_id, $grant_type);
+}
diff --git a/library/oauth2/src/OAuth2/Storage/CouchbaseDB.php b/library/oauth2/src/OAuth2/Storage/CouchbaseDB.php
new file mode 100755
index 000000000..1eb55f027
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/CouchbaseDB.php
@@ -0,0 +1,331 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple Couchbase storage for all storage types
+ *
+ * This class should be extended or overridden as required
+ *
+ * NOTE: Passwords are stored in plaintext, which is never
+ * a good idea. Be sure to override this for your application
+ *
+ * @author Tom Park <tom@raucter.com>
+ */
+class CouchbaseDB implements AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $db;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if ($connection instanceof \Couchbase) {
+ $this->db = $connection;
+ } else {
+ if (!is_array($connection) || !is_array($connection['servers'])) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\CouchbaseDB must be an instance of Couchbase or a configuration array containing a server array');
+ }
+
+ $this->db = new \Couchbase($connection['servers'], (!isset($connection['username'])) ? '' : $connection['username'], (!isset($connection['password'])) ? '' : $connection['password'], $connection['bucket'], false);
+ }
+
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'jwt_table' => 'oauth_jwt',
+ ), $config);
+ }
+
+ // Helper function to access couchbase item by type:
+ protected function getObjectByType($name,$id)
+ {
+ return json_decode($this->db->get($this->config[$name].'-'.$id),true);
+ }
+
+ // Helper function to set couchbase item by type:
+ protected function setObjectByType($name,$id,$array)
+ {
+ $array['type'] = $name;
+
+ return $this->db->set($this->config[$name].'-'.$id,json_encode($array));
+ }
+
+ // Helper function to delete couchbase item by type, wait for persist to at least 1 node
+ protected function deleteObjectByType($name,$id)
+ {
+ $this->db->delete($this->config[$name].'-'.$id,"",1);
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if ($result = $this->getObjectByType('client_table',$client_id)) {
+ return $result['client_secret'] == $client_secret;
+ }
+
+ return false;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$result = $this->getObjectByType('client_table',$client_id)) {
+ return false;
+ }
+
+ return empty($result['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $result = $this->getObjectByType('client_table',$client_id);
+
+ return is_null($result) ? false : $result;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ if ($this->getClientDetails($client_id)) {
+
+ $this->setObjectByType('client_table',$client_id, array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ ));
+ } else {
+ $this->setObjectByType('client_table',$client_id, array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ ));
+ }
+
+ return true;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $token = $this->getObjectByType('access_token_table',$access_token);
+
+ return is_null($token) ? false : $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // if it exists, update it.
+ if ($this->getAccessToken($access_token)) {
+ $this->setObjectByType('access_token_table',$access_token, array(
+ 'access_token' => $access_token,
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ ));
+ } else {
+ $this->setObjectByType('access_token_table',$access_token, array(
+ 'access_token' => $access_token,
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ ));
+ }
+
+ return true;
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $code = $this->getObjectByType('code_table',$code);
+
+ return is_null($code) ? false : $code;
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $this->setObjectByType('code_table',$code, array(
+ 'authorization_code' => $code,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ ));
+ } else {
+ $this->setObjectByType('code_table',$code,array(
+ 'authorization_code' => $code,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ ));
+ }
+
+ return true;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $this->deleteObjectByType('code_table',$code);
+
+ return true;
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ if ($user = $this->getUser($username)) {
+ $user['user_id'] = $user['username'];
+ }
+
+ return $user;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $token = $this->getObjectByType('refresh_token_table',$refresh_token);
+
+ return is_null($token) ? false : $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ $this->setObjectByType('refresh_token_table',$refresh_token, array(
+ 'refresh_token' => $refresh_token,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'expires' => $expires,
+ 'scope' => $scope
+ ));
+
+ return true;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $this->deleteObjectByType('refresh_token_table',$refresh_token);
+
+ return true;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $password;
+ }
+
+ public function getUser($username)
+ {
+ $result = $this->getObjectByType('user_table',$username);
+
+ return is_null($result) ? false : $result;
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ if ($this->getUser($username)) {
+ $this->setObjectByType('user_table',$username, array(
+ 'username' => $username,
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ ));
+
+ } else {
+ $this->setObjectByType('user_table',$username, array(
+ 'username' => $username,
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ ));
+
+ }
+
+ return true;
+ }
+
+ public function getClientKey($client_id, $subject)
+ {
+ if (!$jwt = $this->getObjectByType('jwt_table',$client_id)) {
+ return false;
+ }
+
+ if (isset($jwt['subject']) && $jwt['subject'] == $subject) {
+ return $jwt['key'];
+ }
+
+ return false;
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs couchbase implementation.
+ throw new \Exception('getJti() for the Couchbase driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs couchbase implementation.
+ throw new \Exception('setJti() for the Couchbase driver is currently unimplemented.');
+ }
+}
diff --git a/library/oauth2/src/OAuth2/Storage/DynamoDB.php b/library/oauth2/src/OAuth2/Storage/DynamoDB.php
new file mode 100644
index 000000000..8347ab258
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/DynamoDB.php
@@ -0,0 +1,540 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use Aws\DynamoDb\DynamoDbClient;
+
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+/**
+ * DynamoDB storage for all storage types
+ *
+ * To use, install "aws/aws-sdk-php" via composer
+ * <code>
+ * composer require aws/aws-sdk-php:dev-master
+ * </code>
+ *
+ * Once this is done, instantiate the DynamoDB client
+ * <code>
+ * $storage = new OAuth2\Storage\Dynamodb(array("key" => "YOURKEY", "secret" => "YOURSECRET", "region" => "YOURREGION"));
+ * </code>
+ *
+ * Table :
+ * - oauth_access_tokens (primary hash key : access_token)
+ * - oauth_authorization_codes (primary hash key : authorization_code)
+ * - oauth_clients (primary hash key : client_id)
+ * - oauth_jwt (primary hash key : client_id, primary range key : subject)
+ * - oauth_public_keys (primary hash key : client_id)
+ * - oauth_refresh_tokens (primary hash key : refresh_token)
+ * - oauth_scopes (primary hash key : scope, secondary index : is_default-index hash key is_default)
+ * - oauth_users (primary hash key : username)
+ *
+ * @author Frederic AUGUSTE <frederic.auguste at gmail dot com>
+ */
+class DynamoDB implements
+ AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ PublicKeyInterface,
+ UserClaimsInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $client;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if (!($connection instanceof DynamoDbClient)) {
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Dynamodb must be an instance a configuration array containt key, secret, region');
+ }
+ if (!array_key_exists("key",$connection) || !array_key_exists("secret",$connection) || !array_key_exists("region",$connection) ) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Dynamodb must be an instance a configuration array containt key, secret, region');
+ }
+ $this->client = DynamoDbClient::factory(array(
+ 'key' => $connection["key"],
+ 'secret' => $connection["secret"],
+ 'region' =>$connection["region"]
+ ));
+ } else {
+ $this->client = $connection;
+ }
+
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'jwt_table' => 'oauth_jwt',
+ 'scope_table' => 'oauth_scopes',
+ 'public_key_table' => 'oauth_public_keys',
+ ), $config);
+ }
+
+ /* OAuth2\Storage\ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['client_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+
+ return $result->count()==1 && $result["Item"]["client_secret"]["S"] == $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['client_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+
+ if ($result->count()==0) {
+ return false ;
+ }
+
+ return empty($result["Item"]["client_secret"]);
+ }
+
+ /* OAuth2\Storage\ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['client_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $result = $this->dynamo2array($result);
+ foreach (array('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id') as $key => $val) {
+ if (!array_key_exists ($val, $result)) {
+ $result[$val] = null;
+ }
+ }
+
+ return $result;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ $clientData = compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['client_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, (array) $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* OAuth2\Storage\AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['access_token_table'],
+ "Key" => array('access_token' => array('S' => $access_token))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+ if (array_key_exists ('expires', $token)) {
+ $token['expires'] = strtotime($token['expires']);
+ }
+
+ return $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ $clientData = compact('access_token', 'client_id', 'user_id', 'expires', 'scope');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['access_token_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $result = $this->client->deleteItem(array(
+ 'TableName' => $this->config['access_token_table'],
+ 'Key' => $this->client->formatAttributes(array("access_token" => $access_token)),
+ 'ReturnValues' => 'ALL_OLD',
+ ));
+
+ return null !== $result->get('Attributes');
+ }
+
+ /* OAuth2\Storage\AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['code_table'],
+ "Key" => array('authorization_code' => array('S' => $code))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+ if (!array_key_exists("id_token", $token )) {
+ $token['id_token'] = null;
+ }
+ $token['expires'] = strtotime($token['expires']);
+
+ return $token;
+
+ }
+
+ public function setAuthorizationCode($authorization_code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ $clientData = compact('authorization_code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'id_token', 'scope');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['code_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+
+ $result = $this->client->deleteItem(array(
+ 'TableName' => $this->config['code_table'],
+ 'Key' => $this->client->formatAttributes(array("authorization_code" => $code))
+ ));
+
+ return true;
+ }
+
+ /* OAuth2\Storage\UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ return $this->getUser($username);
+ }
+
+ /* UserClaimsInterface */
+ public function getUserClaims($user_id, $claims)
+ {
+ if (!$userDetails = $this->getUserDetails($user_id)) {
+ return false;
+ }
+
+ $claims = explode(' ', trim($claims));
+ $userClaims = array();
+
+ // for each requested claim, if the user has the claim, set it in the response
+ $validClaims = explode(' ', self::VALID_CLAIMS);
+ foreach ($validClaims as $validClaim) {
+ if (in_array($validClaim, $claims)) {
+ if ($validClaim == 'address') {
+ // address is an object with subfields
+ $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
+ } else {
+ $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
+ }
+ }
+ }
+
+ return $userClaims;
+ }
+
+ protected function getUserClaim($claim, $userDetails)
+ {
+ $userClaims = array();
+ $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
+ $claimValues = explode(' ', $claimValuesString);
+
+ foreach ($claimValues as $value) {
+ if ($value == 'email_verified') {
+ $userClaims[$value] = $userDetails[$value]=='true' ? true : false;
+ } else {
+ $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
+ }
+ }
+
+ return $userClaims;
+ }
+
+ /* OAuth2\Storage\RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['refresh_token_table'],
+ "Key" => array('refresh_token' => array('S' => $refresh_token))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+ $token['expires'] = strtotime($token['expires']);
+
+ return $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ $clientData = compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['refresh_token_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $result = $this->client->deleteItem(array(
+ 'TableName' => $this->config['refresh_token_table'],
+ 'Key' => $this->client->formatAttributes(array("refresh_token" => $refresh_token))
+ ));
+
+ return true;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $this->hashPassword($password);
+ }
+
+ // use a secure hashing algorithm when storing passwords. Override this for your application
+ protected function hashPassword($password)
+ {
+ return sha1($password);
+ }
+
+ public function getUser($username)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['user_table'],
+ "Key" => array('username' => array('S' => $username))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+ $token['user_id'] = $username;
+
+ return $token;
+ }
+
+ public function setUser($username, $password, $first_name = null, $last_name = null)
+ {
+ // do not store in plaintext
+ $password = $this->hashPassword($password);
+
+ $clientData = compact('username', 'password', 'first_name', 'last_name');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['user_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+
+ }
+
+ /* ScopeInterface */
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', $scope);
+ $scope_query = array();
+ $count = 0;
+ foreach ($scope as $key => $val) {
+ $result = $this->client->query(array(
+ 'TableName' => $this->config['scope_table'],
+ 'Select' => 'COUNT',
+ 'KeyConditions' => array(
+ 'scope' => array(
+ 'AttributeValueList' => array(array('S' => $val)),
+ 'ComparisonOperator' => 'EQ'
+ )
+ )
+ ));
+ $count += $result['Count'];
+ }
+
+ return $count == count($scope);
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+
+ $result = $this->client->query(array(
+ 'TableName' => $this->config['scope_table'],
+ 'IndexName' => 'is_default-index',
+ 'Select' => 'ALL_ATTRIBUTES',
+ 'KeyConditions' => array(
+ 'is_default' => array(
+ 'AttributeValueList' => array(array('S' => 'true')),
+ 'ComparisonOperator' => 'EQ',
+ ),
+ )
+ ));
+ $defaultScope = array();
+ if ($result->count() > 0) {
+ $array = $result->toArray();
+ foreach ($array["Items"] as $item) {
+ $defaultScope[] = $item['scope']['S'];
+ }
+
+ return empty($defaultScope) ? null : implode(' ', $defaultScope);
+ }
+
+ return null;
+ }
+
+ /* JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['jwt_table'],
+ "Key" => array('client_id' => array('S' => $client_id), 'subject' => array('S' => $subject))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+
+ return $token['public_key'];
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ //TODO not use.
+ }
+
+ public function setJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ //TODO not use.
+ }
+
+ /* PublicKeyInterface */
+ public function getPublicKey($client_id = '0')
+ {
+
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['public_key_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+
+ return $token['public_key'];
+
+ }
+
+ public function getPrivateKey($client_id = '0')
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['public_key_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+
+ return $token['private_key'];
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['public_key_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+ if ($result->count()==0) {
+ return 'RS256' ;
+ }
+ $token = $this->dynamo2array($result);
+
+ return $token['encryption_algorithm'];
+ }
+
+ /**
+ * Transform dynamodb resultset to an array.
+ * @param $dynamodbResult
+ * @return $array
+ */
+ private function dynamo2array($dynamodbResult)
+ {
+ $result = array();
+ foreach ($dynamodbResult["Item"] as $key => $val) {
+ $result[$key] = $val["S"];
+ $result[] = $val["S"];
+ }
+
+ return $result;
+ }
+
+ private static function isNotEmpty($value)
+ {
+ return null !== $value && '' !== $value;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/Storage/JwtAccessToken.php b/library/oauth2/src/OAuth2/Storage/JwtAccessToken.php
new file mode 100644
index 000000000..75b49d301
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/JwtAccessToken.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\Encryption\EncryptionInterface;
+use OAuth2\Encryption\Jwt;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class JwtAccessToken implements JwtAccessTokenInterface
+{
+ protected $publicKeyStorage;
+ protected $tokenStorage;
+ protected $encryptionUtil;
+
+ /**
+ * @param OAuth2\Encryption\PublicKeyInterface $publicKeyStorage the public key encryption to use
+ * @param OAuth2\Storage\AccessTokenInterface $tokenStorage OPTIONAL persist the access token to another storage. This is useful if
+ * you want to retain access token grant information somewhere, but
+ * is not necessary when using this grant type.
+ * @param OAuth2\Encryption\EncryptionInterface $encryptionUtil OPTIONAL class to use for "encode" and "decode" functions.
+ */
+ public function __construct(PublicKeyInterface $publicKeyStorage, AccessTokenInterface $tokenStorage = null, EncryptionInterface $encryptionUtil = null)
+ {
+ $this->publicKeyStorage = $publicKeyStorage;
+ $this->tokenStorage = $tokenStorage;
+ if (is_null($encryptionUtil)) {
+ $encryptionUtil = new Jwt;
+ }
+ $this->encryptionUtil = $encryptionUtil;
+ }
+
+ public function getAccessToken($oauth_token)
+ {
+ // just decode the token, don't verify
+ if (!$tokenData = $this->encryptionUtil->decode($oauth_token, null, false)) {
+ return false;
+ }
+
+ $client_id = isset($tokenData['aud']) ? $tokenData['aud'] : null;
+ $public_key = $this->publicKeyStorage->getPublicKey($client_id);
+ $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
+
+ // now that we have the client_id, verify the token
+ if (false === $this->encryptionUtil->decode($oauth_token, $public_key, array($algorithm))) {
+ return false;
+ }
+
+ // normalize the JWT claims to the format expected by other components in this library
+ return $this->convertJwtToOAuth2($tokenData);
+ }
+
+ public function setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ if ($this->tokenStorage) {
+ return $this->tokenStorage->setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope);
+ }
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ if ($this->tokenStorage) {
+ return $this->tokenStorage->unsetAccessToken($access_token);
+ }
+ }
+
+
+ // converts a JWT access token into an OAuth2-friendly format
+ protected function convertJwtToOAuth2($tokenData)
+ {
+ $keyMapping = array(
+ 'aud' => 'client_id',
+ 'exp' => 'expires',
+ 'sub' => 'user_id'
+ );
+
+ foreach ($keyMapping as $jwtKey => $oauth2Key) {
+ if (isset($tokenData[$jwtKey])) {
+ $tokenData[$oauth2Key] = $tokenData[$jwtKey];
+ unset($tokenData[$jwtKey]);
+ }
+ }
+
+ return $tokenData;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/Storage/JwtAccessTokenInterface.php b/library/oauth2/src/OAuth2/Storage/JwtAccessTokenInterface.php
new file mode 100644
index 000000000..3abb2aa2d
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/JwtAccessTokenInterface.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * No specific methods, but allows the library to check "instanceof"
+ * against interface rather than class
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface JwtAccessTokenInterface extends AccessTokenInterface
+{
+
+}
diff --git a/library/oauth2/src/OAuth2/Storage/JwtBearerInterface.php b/library/oauth2/src/OAuth2/Storage/JwtBearerInterface.php
new file mode 100644
index 000000000..c83aa72ea
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/JwtBearerInterface.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get the JWT key for clients
+ *
+ * @TODO consider extending ClientInterface, as this will almost always
+ * be the same storage as retrieving clientData
+ *
+ * @author F21
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface JwtBearerInterface
+{
+ /**
+ * Get the public key associated with a client_id
+ *
+ * @param $client_id
+ * Client identifier to be checked with.
+ *
+ * @return
+ * STRING Return the public key for the client_id if it exists, and MUST return FALSE if it doesn't.
+ */
+ public function getClientKey($client_id, $subject);
+
+ /**
+ * Get a jti (JSON token identifier) by matching against the client_id, subject, audience and expiration.
+ *
+ * @param $client_id
+ * Client identifier to match.
+ *
+ * @param $subject
+ * The subject to match.
+ *
+ * @param $audience
+ * The audience to match.
+ *
+ * @param $expiration
+ * The expiration of the jti.
+ *
+ * @param $jti
+ * The jti to match.
+ *
+ * @return
+ * An associative array as below, and return NULL if the jti does not exist.
+ * - issuer: Stored client identifier.
+ * - subject: Stored subject.
+ * - audience: Stored audience.
+ * - expires: Stored expiration in unix timestamp.
+ * - jti: The stored jti.
+ */
+ public function getJti($client_id, $subject, $audience, $expiration, $jti);
+
+ /**
+ * Store a used jti so that we can check against it to prevent replay attacks.
+ * @param $client_id
+ * Client identifier to insert.
+ *
+ * @param $subject
+ * The subject to insert.
+ *
+ * @param $audience
+ * The audience to insert.
+ *
+ * @param $expiration
+ * The expiration of the jti.
+ *
+ * @param $jti
+ * The jti to insert.
+ */
+ public function setJti($client_id, $subject, $audience, $expiration, $jti);
+}
diff --git a/library/oauth2/src/OAuth2/Storage/Memory.php b/library/oauth2/src/OAuth2/Storage/Memory.php
new file mode 100644
index 000000000..42d833ccb
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/Memory.php
@@ -0,0 +1,381 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple in-memory storage for all storage types
+ *
+ * NOTE: This class should never be used in production, and is
+ * a stub class for example use only
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class Memory implements AuthorizationCodeInterface,
+ UserCredentialsInterface,
+ UserClaimsInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ PublicKeyInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ public $authorizationCodes;
+ public $userCredentials;
+ public $clientCredentials;
+ public $refreshTokens;
+ public $accessTokens;
+ public $jwt;
+ public $jti;
+ public $supportedScopes;
+ public $defaultScope;
+ public $keys;
+
+ public function __construct($params = array())
+ {
+ $params = array_merge(array(
+ 'authorization_codes' => array(),
+ 'user_credentials' => array(),
+ 'client_credentials' => array(),
+ 'refresh_tokens' => array(),
+ 'access_tokens' => array(),
+ 'jwt' => array(),
+ 'jti' => array(),
+ 'default_scope' => null,
+ 'supported_scopes' => array(),
+ 'keys' => array(),
+ ), $params);
+
+ $this->authorizationCodes = $params['authorization_codes'];
+ $this->userCredentials = $params['user_credentials'];
+ $this->clientCredentials = $params['client_credentials'];
+ $this->refreshTokens = $params['refresh_tokens'];
+ $this->accessTokens = $params['access_tokens'];
+ $this->jwt = $params['jwt'];
+ $this->jti = $params['jti'];
+ $this->supportedScopes = $params['supported_scopes'];
+ $this->defaultScope = $params['default_scope'];
+ $this->keys = $params['keys'];
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ if (!isset($this->authorizationCodes[$code])) {
+ return false;
+ }
+
+ return array_merge(array(
+ 'authorization_code' => $code,
+ ), $this->authorizationCodes[$code]);
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ $this->authorizationCodes[$code] = compact('code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token');
+
+ return true;
+ }
+
+ public function setAuthorizationCodes($authorization_codes)
+ {
+ $this->authorizationCodes = $authorization_codes;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ unset($this->authorizationCodes[$code]);
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ $userDetails = $this->getUserDetails($username);
+
+ return $userDetails && $userDetails['password'] && $userDetails['password'] === $password;
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ $this->userCredentials[$username] = array(
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName,
+ );
+
+ return true;
+ }
+
+ public function getUserDetails($username)
+ {
+ if (!isset($this->userCredentials[$username])) {
+ return false;
+ }
+
+ return array_merge(array(
+ 'user_id' => $username,
+ 'password' => null,
+ 'first_name' => null,
+ 'last_name' => null,
+ ), $this->userCredentials[$username]);
+ }
+
+ /* UserClaimsInterface */
+ public function getUserClaims($user_id, $claims)
+ {
+ if (!$userDetails = $this->getUserDetails($user_id)) {
+ return false;
+ }
+
+ $claims = explode(' ', trim($claims));
+ $userClaims = array();
+
+ // for each requested claim, if the user has the claim, set it in the response
+ $validClaims = explode(' ', self::VALID_CLAIMS);
+ foreach ($validClaims as $validClaim) {
+ if (in_array($validClaim, $claims)) {
+ if ($validClaim == 'address') {
+ // address is an object with subfields
+ $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
+ } else {
+ $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
+ }
+ }
+ }
+
+ return $userClaims;
+ }
+
+ protected function getUserClaim($claim, $userDetails)
+ {
+ $userClaims = array();
+ $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
+ $claimValues = explode(' ', $claimValuesString);
+
+ foreach ($claimValues as $value) {
+ $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
+ }
+
+ return $userClaims;
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ return isset($this->clientCredentials[$client_id]['client_secret']) && $this->clientCredentials[$client_id]['client_secret'] === $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!isset($this->clientCredentials[$client_id])) {
+ return false;
+ }
+
+ return empty($this->clientCredentials[$client_id]['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ if (!isset($this->clientCredentials[$client_id])) {
+ return false;
+ }
+
+ $clientDetails = array_merge(array(
+ 'client_id' => $client_id,
+ 'client_secret' => null,
+ 'redirect_uri' => null,
+ 'scope' => null,
+ ), $this->clientCredentials[$client_id]);
+
+ return $clientDetails;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ if (isset($this->clientCredentials[$client_id]['grant_types'])) {
+ $grant_types = explode(' ', $this->clientCredentials[$client_id]['grant_types']);
+
+ return in_array($grant_type, $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ $this->clientCredentials[$client_id] = array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ );
+
+ return true;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ return isset($this->refreshTokens[$refresh_token]) ? $this->refreshTokens[$refresh_token] : false;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ $this->refreshTokens[$refresh_token] = compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope');
+
+ return true;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ if (isset($this->refreshTokens[$refresh_token])) {
+ unset($this->refreshTokens[$refresh_token]);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public function setRefreshTokens($refresh_tokens)
+ {
+ $this->refreshTokens = $refresh_tokens;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ return isset($this->accessTokens[$access_token]) ? $this->accessTokens[$access_token] : false;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null, $id_token = null)
+ {
+ $this->accessTokens[$access_token] = compact('access_token', 'client_id', 'user_id', 'expires', 'scope', 'id_token');
+
+ return true;
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ if (isset($this->accessTokens[$access_token])) {
+ unset($this->accessTokens[$access_token]);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', trim($scope));
+
+ return (count(array_diff($scope, $this->supportedScopes)) == 0);
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ return $this->defaultScope;
+ }
+
+ /*JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ if (isset($this->jwt[$client_id])) {
+ $jwt = $this->jwt[$client_id];
+ if ($jwt) {
+ if ($jwt["subject"] == $subject) {
+ return $jwt["key"];
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ foreach ($this->jti as $storedJti) {
+ if ($storedJti['issuer'] == $client_id && $storedJti['subject'] == $subject && $storedJti['audience'] == $audience && $storedJti['expires'] == $expires && $storedJti['jti'] == $jti) {
+ return array(
+ 'issuer' => $storedJti['issuer'],
+ 'subject' => $storedJti['subject'],
+ 'audience' => $storedJti['audience'],
+ 'expires' => $storedJti['expires'],
+ 'jti' => $storedJti['jti']
+ );
+ }
+ }
+
+ return null;
+ }
+
+ public function setJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ $this->jti[] = array('issuer' => $client_id, 'subject' => $subject, 'audience' => $audience, 'expires' => $expires, 'jti' => $jti);
+ }
+
+ /*PublicKeyInterface */
+ public function getPublicKey($client_id = null)
+ {
+ if (isset($this->keys[$client_id])) {
+ return $this->keys[$client_id]['public_key'];
+ }
+
+ // use a global encryption pair
+ if (isset($this->keys['public_key'])) {
+ return $this->keys['public_key'];
+ }
+
+ return false;
+ }
+
+ public function getPrivateKey($client_id = null)
+ {
+ if (isset($this->keys[$client_id])) {
+ return $this->keys[$client_id]['private_key'];
+ }
+
+ // use a global encryption pair
+ if (isset($this->keys['private_key'])) {
+ return $this->keys['private_key'];
+ }
+
+ return false;
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ if (isset($this->keys[$client_id]['encryption_algorithm'])) {
+ return $this->keys[$client_id]['encryption_algorithm'];
+ }
+
+ // use a global encryption algorithm
+ if (isset($this->keys['encryption_algorithm'])) {
+ return $this->keys['encryption_algorithm'];
+ }
+
+ return 'RS256';
+ }
+}
diff --git a/library/oauth2/src/OAuth2/Storage/Mongo.php b/library/oauth2/src/OAuth2/Storage/Mongo.php
new file mode 100644
index 000000000..cef35e5e9
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/Mongo.php
@@ -0,0 +1,339 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple MongoDB storage for all storage types
+ *
+ * NOTE: This class is meant to get users started
+ * quickly. If your application requires further
+ * customization, extend this class or create your own.
+ *
+ * NOTE: Passwords are stored in plaintext, which is never
+ * a good idea. Be sure to override this for your application
+ *
+ * @author Julien Chaumond <chaumond@gmail.com>
+ */
+class Mongo implements AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $db;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if ($connection instanceof \MongoDB) {
+ $this->db = $connection;
+ } else {
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Mongo must be an instance of MongoDB or a configuration array');
+ }
+ $server = sprintf('mongodb://%s:%d', $connection['host'], $connection['port']);
+ $m = new \MongoClient($server);
+ $this->db = $m->{$connection['database']};
+ }
+
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'jwt_table' => 'oauth_jwt',
+ ), $config);
+ }
+
+ // Helper function to access a MongoDB collection by `type`:
+ protected function collection($name)
+ {
+ return $this->db->{$this->config[$name]};
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if ($result = $this->collection('client_table')->findOne(array('client_id' => $client_id))) {
+ return $result['client_secret'] == $client_secret;
+ }
+
+ return false;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$result = $this->collection('client_table')->findOne(array('client_id' => $client_id))) {
+ return false;
+ }
+
+ return empty($result['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $result = $this->collection('client_table')->findOne(array('client_id' => $client_id));
+
+ return is_null($result) ? false : $result;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ if ($this->getClientDetails($client_id)) {
+ $this->collection('client_table')->update(
+ array('client_id' => $client_id),
+ array('$set' => array(
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ ))
+ );
+ } else {
+ $client = array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ );
+ $this->collection('client_table')->insert($client);
+ }
+
+ return true;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $token = $this->collection('access_token_table')->findOne(array('access_token' => $access_token));
+
+ return is_null($token) ? false : $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // if it exists, update it.
+ if ($this->getAccessToken($access_token)) {
+ $this->collection('access_token_table')->update(
+ array('access_token' => $access_token),
+ array('$set' => array(
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ ))
+ );
+ } else {
+ $token = array(
+ 'access_token' => $access_token,
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ );
+ $this->collection('access_token_table')->insert($token);
+ }
+
+ return true;
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $result = $this->collection('access_token_table')->remove(array(
+ 'access_token' => $access_token
+ ), array('w' => 1));
+
+ return $result['n'] > 0;
+ }
+
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $code = $this->collection('code_table')->findOne(array('authorization_code' => $code));
+
+ return is_null($code) ? false : $code;
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $this->collection('code_table')->update(
+ array('authorization_code' => $code),
+ array('$set' => array(
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ ))
+ );
+ } else {
+ $token = array(
+ 'authorization_code' => $code,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ );
+ $this->collection('code_table')->insert($token);
+ }
+
+ return true;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $this->collection('code_table')->remove(array('authorization_code' => $code));
+
+ return true;
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ if ($user = $this->getUser($username)) {
+ $user['user_id'] = $user['username'];
+ }
+
+ return $user;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $token = $this->collection('refresh_token_table')->findOne(array('refresh_token' => $refresh_token));
+
+ return is_null($token) ? false : $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ $token = array(
+ 'refresh_token' => $refresh_token,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'expires' => $expires,
+ 'scope' => $scope
+ );
+ $this->collection('refresh_token_table')->insert($token);
+
+ return true;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $result = $this->collection('refresh_token_table')->remove(array(
+ 'refresh_token' => $refresh_token
+ ), array('w' => 1));
+
+ return $result['n'] > 0;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $password;
+ }
+
+ public function getUser($username)
+ {
+ $result = $this->collection('user_table')->findOne(array('username' => $username));
+
+ return is_null($result) ? false : $result;
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ if ($this->getUser($username)) {
+ $this->collection('user_table')->update(
+ array('username' => $username),
+ array('$set' => array(
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ ))
+ );
+ } else {
+ $user = array(
+ 'username' => $username,
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ );
+ $this->collection('user_table')->insert($user);
+ }
+
+ return true;
+ }
+
+ public function getClientKey($client_id, $subject)
+ {
+ $result = $this->collection('jwt_table')->findOne(array(
+ 'client_id' => $client_id,
+ 'subject' => $subject
+ ));
+
+ return is_null($result) ? false : $result['key'];
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs mongodb implementation.
+ throw new \Exception('getJti() for the MongoDB driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs mongodb implementation.
+ throw new \Exception('setJti() for the MongoDB driver is currently unimplemented.');
+ }
+}
diff --git a/library/oauth2/src/OAuth2/Storage/Pdo.php b/library/oauth2/src/OAuth2/Storage/Pdo.php
new file mode 100644
index 000000000..ae5107e29
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/Pdo.php
@@ -0,0 +1,553 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple PDO storage for all storage types
+ *
+ * NOTE: This class is meant to get users started
+ * quickly. If your application requires further
+ * customization, extend this class or create your own.
+ *
+ * NOTE: Passwords are stored in plaintext, which is never
+ * a good idea. Be sure to override this for your application
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class Pdo implements
+ AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ PublicKeyInterface,
+ UserClaimsInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $db;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if (!$connection instanceof \PDO) {
+ if (is_string($connection)) {
+ $connection = array('dsn' => $connection);
+ }
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Pdo must be an instance of PDO, a DSN string, or a configuration array');
+ }
+ if (!isset($connection['dsn'])) {
+ throw new \InvalidArgumentException('configuration array must contain "dsn"');
+ }
+ // merge optional parameters
+ $connection = array_merge(array(
+ 'username' => null,
+ 'password' => null,
+ 'options' => array(),
+ ), $connection);
+ $connection = new \PDO($connection['dsn'], $connection['username'], $connection['password'], $connection['options']);
+ }
+ $this->db = $connection;
+
+ // debugging
+ $connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'jwt_table' => 'oauth_jwt',
+ 'jti_table' => 'oauth_jti',
+ 'scope_table' => 'oauth_scopes',
+ 'public_key_table' => 'oauth_public_keys',
+ ), $config);
+ }
+
+ /* OAuth2\Storage\ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where client_id = :client_id', $this->config['client_table']));
+ $stmt->execute(compact('client_id'));
+ $result = $stmt->fetch(\PDO::FETCH_ASSOC);
+
+ // make this extensible
+ return $result && $result['client_secret'] == $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where client_id = :client_id', $this->config['client_table']));
+ $stmt->execute(compact('client_id'));
+
+ if (!$result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return false;
+ }
+
+ return empty($result['client_secret']);
+ }
+
+ /* OAuth2\Storage\ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where client_id = :client_id', $this->config['client_table']));
+ $stmt->execute(compact('client_id'));
+
+ return $stmt->fetch(\PDO::FETCH_ASSOC);
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ // if it exists, update it.
+ if ($this->getClientDetails($client_id)) {
+ $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET client_secret=:client_secret, redirect_uri=:redirect_uri, grant_types=:grant_types, scope=:scope, user_id=:user_id where client_id=:client_id', $this->config['client_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (client_id, client_secret, redirect_uri, grant_types, scope, user_id) VALUES (:client_id, :client_secret, :redirect_uri, :grant_types, :scope, :user_id)', $this->config['client_table']));
+ }
+
+ return $stmt->execute(compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id'));
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, (array) $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* OAuth2\Storage\AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where access_token = :access_token', $this->config['access_token_table']));
+
+ $token = $stmt->execute(compact('access_token'));
+ if ($token = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ // convert date string back to timestamp
+ $token['expires'] = strtotime($token['expires']);
+ }
+
+ return $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ // if it exists, update it.
+ if ($this->getAccessToken($access_token)) {
+ $stmt = $this->db->prepare(sprintf('UPDATE %s SET client_id=:client_id, expires=:expires, user_id=:user_id, scope=:scope where access_token=:access_token', $this->config['access_token_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (access_token, client_id, expires, user_id, scope) VALUES (:access_token, :client_id, :expires, :user_id, :scope)', $this->config['access_token_table']));
+ }
+
+ return $stmt->execute(compact('access_token', 'client_id', 'user_id', 'expires', 'scope'));
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $stmt = $this->db->prepare(sprintf('DELETE FROM %s WHERE access_token = :access_token', $this->config['access_token_table']));
+
+ $stmt->execute(compact('access_token'));
+
+ return $stmt->rowCount() > 0;
+ }
+
+ /* OAuth2\Storage\AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where authorization_code = :code', $this->config['code_table']));
+ $stmt->execute(compact('code'));
+
+ if ($code = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ // convert date string back to timestamp
+ $code['expires'] = strtotime($code['expires']);
+ }
+
+ return $code;
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ if (func_num_args() > 6) {
+ // we are calling with an id token
+ return call_user_func_array(array($this, 'setAuthorizationCodeWithIdToken'), func_get_args());
+ }
+
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET client_id=:client_id, user_id=:user_id, redirect_uri=:redirect_uri, expires=:expires, scope=:scope where authorization_code=:code', $this->config['code_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (authorization_code, client_id, user_id, redirect_uri, expires, scope) VALUES (:code, :client_id, :user_id, :redirect_uri, :expires, :scope)', $this->config['code_table']));
+ }
+
+ return $stmt->execute(compact('code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope'));
+ }
+
+ private function setAuthorizationCodeWithIdToken($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET client_id=:client_id, user_id=:user_id, redirect_uri=:redirect_uri, expires=:expires, scope=:scope, id_token =:id_token where authorization_code=:code', $this->config['code_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (authorization_code, client_id, user_id, redirect_uri, expires, scope, id_token) VALUES (:code, :client_id, :user_id, :redirect_uri, :expires, :scope, :id_token)', $this->config['code_table']));
+ }
+
+ return $stmt->execute(compact('code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token'));
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $stmt = $this->db->prepare(sprintf('DELETE FROM %s WHERE authorization_code = :code', $this->config['code_table']));
+
+ return $stmt->execute(compact('code'));
+ }
+
+ /* OAuth2\Storage\UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ return $this->getUser($username);
+ }
+
+ /* UserClaimsInterface */
+ public function getUserClaims($user_id, $claims)
+ {
+ if (!$userDetails = $this->getUserDetails($user_id)) {
+ return false;
+ }
+
+ $claims = explode(' ', trim($claims));
+ $userClaims = array();
+
+ // for each requested claim, if the user has the claim, set it in the response
+ $validClaims = explode(' ', self::VALID_CLAIMS);
+ foreach ($validClaims as $validClaim) {
+ if (in_array($validClaim, $claims)) {
+ if ($validClaim == 'address') {
+ // address is an object with subfields
+ $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
+ } else {
+ $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
+ }
+ }
+ }
+
+ return $userClaims;
+ }
+
+ protected function getUserClaim($claim, $userDetails)
+ {
+ $userClaims = array();
+ $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
+ $claimValues = explode(' ', $claimValuesString);
+
+ foreach ($claimValues as $value) {
+ $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
+ }
+
+ return $userClaims;
+ }
+
+ /* OAuth2\Storage\RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * FROM %s WHERE refresh_token = :refresh_token', $this->config['refresh_token_table']));
+
+ $token = $stmt->execute(compact('refresh_token'));
+ if ($token = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ // convert expires to epoch time
+ $token['expires'] = strtotime($token['expires']);
+ }
+
+ return $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (refresh_token, client_id, user_id, expires, scope) VALUES (:refresh_token, :client_id, :user_id, :expires, :scope)', $this->config['refresh_token_table']));
+
+ return $stmt->execute(compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope'));
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $stmt = $this->db->prepare(sprintf('DELETE FROM %s WHERE refresh_token = :refresh_token', $this->config['refresh_token_table']));
+
+ $stmt->execute(compact('refresh_token'));
+
+ return $stmt->rowCount() > 0;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $this->hashPassword($password);
+ }
+
+ // use a secure hashing algorithm when storing passwords. Override this for your application
+ protected function hashPassword($password)
+ {
+ return sha1($password);
+ }
+
+ public function getUser($username)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT * from %s where username=:username', $this->config['user_table']));
+ $stmt->execute(array('username' => $username));
+
+ if (!$userInfo = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return false;
+ }
+
+ // the default behavior is to use "username" as the user_id
+ return array_merge(array(
+ 'user_id' => $username
+ ), $userInfo);
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ // do not store in plaintext
+ $password = $this->hashPassword($password);
+
+ // if it exists, update it.
+ if ($this->getUser($username)) {
+ $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET password=:password, first_name=:firstName, last_name=:lastName where username=:username', $this->config['user_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (username, password, first_name, last_name) VALUES (:username, :password, :firstName, :lastName)', $this->config['user_table']));
+ }
+
+ return $stmt->execute(compact('username', 'password', 'firstName', 'lastName'));
+ }
+
+ /* ScopeInterface */
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', $scope);
+ $whereIn = implode(',', array_fill(0, count($scope), '?'));
+ $stmt = $this->db->prepare(sprintf('SELECT count(scope) as count FROM %s WHERE scope IN (%s)', $this->config['scope_table'], $whereIn));
+ $stmt->execute($scope);
+
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return $result['count'] == count($scope);
+ }
+
+ return false;
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT scope FROM %s WHERE is_default=:is_default', $this->config['scope_table']));
+ $stmt->execute(array('is_default' => true));
+
+ if ($result = $stmt->fetchAll(\PDO::FETCH_ASSOC)) {
+ $defaultScope = array_map(function ($row) {
+ return $row['scope'];
+ }, $result);
+
+ return implode(' ', $defaultScope);
+ }
+
+ return null;
+ }
+
+ /* JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT public_key from %s where client_id=:client_id AND subject=:subject', $this->config['jwt_table']));
+
+ $stmt->execute(array('client_id' => $client_id, 'subject' => $subject));
+
+ return $stmt->fetchColumn();
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT * FROM %s WHERE issuer=:client_id AND subject=:subject AND audience=:audience AND expires=:expires AND jti=:jti', $this->config['jti_table']));
+
+ $stmt->execute(compact('client_id', 'subject', 'audience', 'expires', 'jti'));
+
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return array(
+ 'issuer' => $result['issuer'],
+ 'subject' => $result['subject'],
+ 'audience' => $result['audience'],
+ 'expires' => $result['expires'],
+ 'jti' => $result['jti'],
+ );
+ }
+
+ return null;
+ }
+
+ public function setJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (issuer, subject, audience, expires, jti) VALUES (:client_id, :subject, :audience, :expires, :jti)', $this->config['jti_table']));
+
+ return $stmt->execute(compact('client_id', 'subject', 'audience', 'expires', 'jti'));
+ }
+
+ /* PublicKeyInterface */
+ public function getPublicKey($client_id = null)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT public_key FROM %s WHERE client_id=:client_id OR client_id IS NULL ORDER BY client_id IS NOT NULL DESC', $this->config['public_key_table']));
+
+ $stmt->execute(compact('client_id'));
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return $result['public_key'];
+ }
+ }
+
+ public function getPrivateKey($client_id = null)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT private_key FROM %s WHERE client_id=:client_id OR client_id IS NULL ORDER BY client_id IS NOT NULL DESC', $this->config['public_key_table']));
+
+ $stmt->execute(compact('client_id'));
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return $result['private_key'];
+ }
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT encryption_algorithm FROM %s WHERE client_id=:client_id OR client_id IS NULL ORDER BY client_id IS NOT NULL DESC', $this->config['public_key_table']));
+
+ $stmt->execute(compact('client_id'));
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return $result['encryption_algorithm'];
+ }
+
+ return 'RS256';
+ }
+
+ /**
+ * DDL to create OAuth2 database and tables for PDO storage
+ *
+ * @see https://github.com/dsquier/oauth2-server-php-mysql
+ */
+ public function getBuildSql($dbName = 'oauth2_server_php')
+ {
+ $sql = "
+ CREATE TABLE {$this->config['client_table']} (
+ client_id VARCHAR(80) NOT NULL,
+ client_secret VARCHAR(80),
+ redirect_uri VARCHAR(2000),
+ grant_types VARCHAR(80),
+ scope VARCHAR(4000),
+ user_id VARCHAR(80),
+ PRIMARY KEY (client_id)
+ );
+
+ CREATE TABLE {$this->config['access_token_table']} (
+ access_token VARCHAR(40) NOT NULL,
+ client_id VARCHAR(80) NOT NULL,
+ user_id VARCHAR(80),
+ expires TIMESTAMP NOT NULL,
+ scope VARCHAR(4000),
+ PRIMARY KEY (access_token)
+ );
+
+ CREATE TABLE {$this->config['code_table']} (
+ authorization_code VARCHAR(40) NOT NULL,
+ client_id VARCHAR(80) NOT NULL,
+ user_id VARCHAR(80),
+ redirect_uri VARCHAR(2000),
+ expires TIMESTAMP NOT NULL,
+ scope VARCHAR(4000),
+ id_token VARCHAR(1000),
+ PRIMARY KEY (authorization_code)
+ );
+
+ CREATE TABLE {$this->config['refresh_token_table']} (
+ refresh_token VARCHAR(40) NOT NULL,
+ client_id VARCHAR(80) NOT NULL,
+ user_id VARCHAR(80),
+ expires TIMESTAMP NOT NULL,
+ scope VARCHAR(4000),
+ PRIMARY KEY (refresh_token)
+ );
+
+ CREATE TABLE {$this->config['user_table']} (
+ username VARCHAR(80),
+ password VARCHAR(80),
+ first_name VARCHAR(80),
+ last_name VARCHAR(80),
+ email VARCHAR(80),
+ email_verified BOOLEAN,
+ scope VARCHAR(4000)
+ );
+
+ CREATE TABLE {$this->config['scope_table']} (
+ scope VARCHAR(80) NOT NULL,
+ is_default BOOLEAN,
+ PRIMARY KEY (scope)
+ );
+
+ CREATE TABLE {$this->config['jwt_table']} (
+ client_id VARCHAR(80) NOT NULL,
+ subject VARCHAR(80),
+ public_key VARCHAR(2000) NOT NULL
+ );
+
+ CREATE TABLE {$this->config['jti_table']} (
+ issuer VARCHAR(80) NOT NULL,
+ subject VARCHAR(80),
+ audience VARCHAR(80),
+ expires TIMESTAMP NOT NULL,
+ jti VARCHAR(2000) NOT NULL
+ );
+
+ CREATE TABLE {$this->config['public_key_table']} (
+ client_id VARCHAR(80),
+ public_key VARCHAR(2000),
+ private_key VARCHAR(2000),
+ encryption_algorithm VARCHAR(100) DEFAULT 'RS256'
+ )
+";
+
+ return $sql;
+ }
+}
diff --git a/library/oauth2/src/OAuth2/Storage/PublicKeyInterface.php b/library/oauth2/src/OAuth2/Storage/PublicKeyInterface.php
new file mode 100644
index 000000000..108418d3a
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/PublicKeyInterface.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get public/private key information
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface PublicKeyInterface
+{
+ public function getPublicKey($client_id = null);
+ public function getPrivateKey($client_id = null);
+ public function getEncryptionAlgorithm($client_id = null);
+}
diff --git a/library/oauth2/src/OAuth2/Storage/Redis.php b/library/oauth2/src/OAuth2/Storage/Redis.php
new file mode 100644
index 000000000..e6294e22d
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/Redis.php
@@ -0,0 +1,321 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * redis storage for all storage types
+ *
+ * To use, install "predis/predis" via composer
+ *
+ * Register client:
+ * <code>
+ * $storage = new OAuth2\Storage\Redis($redis);
+ * $storage->setClientDetails($client_id, $client_secret, $redirect_uri);
+ * </code>
+ */
+class Redis implements AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ OpenIDAuthorizationCodeInterface
+{
+
+ private $cache;
+
+ /* The redis client */
+ protected $redis;
+
+ /* Configuration array */
+ protected $config;
+
+ /**
+ * Redis Storage!
+ *
+ * @param \Predis\Client $redis
+ * @param array $config
+ */
+ public function __construct($redis, $config=array())
+ {
+ $this->redis = $redis;
+ $this->config = array_merge(array(
+ 'client_key' => 'oauth_clients:',
+ 'access_token_key' => 'oauth_access_tokens:',
+ 'refresh_token_key' => 'oauth_refresh_tokens:',
+ 'code_key' => 'oauth_authorization_codes:',
+ 'user_key' => 'oauth_users:',
+ 'jwt_key' => 'oauth_jwt:',
+ 'scope_key' => 'oauth_scopes:',
+ ), $config);
+ }
+
+ protected function getValue($key)
+ {
+ if ( isset($this->cache[$key]) ) {
+ return $this->cache[$key];
+ }
+ $value = $this->redis->get($key);
+ if ( isset($value) ) {
+ return json_decode($value, true);
+ } else {
+ return false;
+ }
+ }
+
+ protected function setValue($key, $value, $expire=0)
+ {
+ $this->cache[$key] = $value;
+ $str = json_encode($value);
+ if ($expire > 0) {
+ $seconds = $expire - time();
+ $ret = $this->redis->setex($key, $seconds, $str);
+ } else {
+ $ret = $this->redis->set($key, $str);
+ }
+
+ // check that the key was set properly
+ // if this fails, an exception will usually thrown, so this step isn't strictly necessary
+ return is_bool($ret) ? $ret : $ret->getPayload() == 'OK';
+ }
+
+ protected function expireValue($key)
+ {
+ unset($this->cache[$key]);
+
+ return $this->redis->del($key);
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ return $this->getValue($this->config['code_key'] . $code);
+ }
+
+ public function setAuthorizationCode($authorization_code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ return $this->setValue(
+ $this->config['code_key'] . $authorization_code,
+ compact('authorization_code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token'),
+ $expires
+ );
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $key = $this->config['code_key'] . $code;
+ unset($this->cache[$key]);
+
+ return $this->expireValue($key);
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ $user = $this->getUserDetails($username);
+
+ return $user && $user['password'] === $password;
+ }
+
+ public function getUserDetails($username)
+ {
+ return $this->getUser($username);
+ }
+
+ public function getUser($username)
+ {
+ if (!$userInfo = $this->getValue($this->config['user_key'] . $username)) {
+ return false;
+ }
+
+ // the default behavior is to use "username" as the user_id
+ return array_merge(array(
+ 'user_id' => $username,
+ ), $userInfo);
+ }
+
+ public function setUser($username, $password, $first_name = null, $last_name = null)
+ {
+ return $this->setValue(
+ $this->config['user_key'] . $username,
+ compact('username', 'password', 'first_name', 'last_name')
+ );
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if (!$client = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ return isset($client['client_secret'])
+ && $client['client_secret'] == $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$client = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ return empty($client['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ return $this->getValue($this->config['client_key'] . $client_id);
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ return $this->setValue(
+ $this->config['client_key'] . $client_id,
+ compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id')
+ );
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, (array) $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ return $this->getValue($this->config['refresh_token_key'] . $refresh_token);
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ return $this->setValue(
+ $this->config['refresh_token_key'] . $refresh_token,
+ compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope'),
+ $expires
+ );
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $result = $this->expireValue($this->config['refresh_token_key'] . $refresh_token);
+
+ return $result > 0;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ return $this->getValue($this->config['access_token_key'].$access_token);
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ return $this->setValue(
+ $this->config['access_token_key'].$access_token,
+ compact('access_token', 'client_id', 'user_id', 'expires', 'scope'),
+ $expires
+ );
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $result = $this->expireValue($this->config['access_token_key'] . $access_token);
+
+ return $result > 0;
+ }
+
+ /* ScopeInterface */
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', $scope);
+
+ $result = $this->getValue($this->config['scope_key'].'supported:global');
+
+ $supportedScope = explode(' ', (string) $result);
+
+ return (count(array_diff($scope, $supportedScope)) == 0);
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ if (is_null($client_id) || !$result = $this->getValue($this->config['scope_key'].'default:'.$client_id)) {
+ $result = $this->getValue($this->config['scope_key'].'default:global');
+ }
+
+ return $result;
+ }
+
+ public function setScope($scope, $client_id = null, $type = 'supported')
+ {
+ if (!in_array($type, array('default', 'supported'))) {
+ throw new \InvalidArgumentException('"$type" must be one of "default", "supported"');
+ }
+
+ if (is_null($client_id)) {
+ $key = $this->config['scope_key'].$type.':global';
+ } else {
+ $key = $this->config['scope_key'].$type.':'.$client_id;
+ }
+
+ return $this->setValue($key, $scope);
+ }
+
+ /*JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ if (!$jwt = $this->getValue($this->config['jwt_key'] . $client_id)) {
+ return false;
+ }
+
+ if (isset($jwt['subject']) && $jwt['subject'] == $subject) {
+ return $jwt['key'];
+ }
+
+ return null;
+ }
+
+ public function setClientKey($client_id, $key, $subject = null)
+ {
+ return $this->setValue($this->config['jwt_key'] . $client_id, array(
+ 'key' => $key,
+ 'subject' => $subject
+ ));
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs redis implementation.
+ throw new \Exception('getJti() for the Redis driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs redis implementation.
+ throw new \Exception('setJti() for the Redis driver is currently unimplemented.');
+ }
+}
diff --git a/library/oauth2/src/OAuth2/Storage/RefreshTokenInterface.php b/library/oauth2/src/OAuth2/Storage/RefreshTokenInterface.php
new file mode 100644
index 000000000..0273f2125
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/RefreshTokenInterface.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get/save refresh tokens for the "Refresh Token"
+ * grant type
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface RefreshTokenInterface
+{
+ /**
+ * Grant refresh access tokens.
+ *
+ * Retrieve the stored data for the given refresh token.
+ *
+ * Required for OAuth2::GRANT_TYPE_REFRESH_TOKEN.
+ *
+ * @param $refresh_token
+ * Refresh token to be check with.
+ *
+ * @return
+ * An associative array as below, and NULL if the refresh_token is
+ * invalid:
+ * - refresh_token: Refresh token identifier.
+ * - client_id: Client identifier.
+ * - user_id: User identifier.
+ * - expires: Expiration unix timestamp, or 0 if the token doesn't expire.
+ * - scope: (optional) Scope values in space-separated string.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-6
+ *
+ * @ingroup oauth2_section_6
+ */
+ public function getRefreshToken($refresh_token);
+
+ /**
+ * Take the provided refresh token values and store them somewhere.
+ *
+ * This function should be the storage counterpart to getRefreshToken().
+ *
+ * If storage fails for some reason, we're not currently checking for
+ * any sort of success/failure, so you should bail out of the script
+ * and provide a descriptive fail message.
+ *
+ * Required for OAuth2::GRANT_TYPE_REFRESH_TOKEN.
+ *
+ * @param $refresh_token
+ * Refresh token to be stored.
+ * @param $client_id
+ * Client identifier to be stored.
+ * @param $user_id
+ * User identifier to be stored.
+ * @param $expires
+ * Expiration timestamp to be stored. 0 if the token doesn't expire.
+ * @param $scope
+ * (optional) Scopes to be stored in space-separated string.
+ *
+ * @ingroup oauth2_section_6
+ */
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null);
+
+ /**
+ * Expire a used refresh token.
+ *
+ * This is not explicitly required in the spec, but is almost implied.
+ * After granting a new refresh token, the old one is no longer useful and
+ * so should be forcibly expired in the data store so it can't be used again.
+ *
+ * If storage fails for some reason, we're not currently checking for
+ * any sort of success/failure, so you should bail out of the script
+ * and provide a descriptive fail message.
+ *
+ * @param $refresh_token
+ * Refresh token to be expirse.
+ *
+ * @ingroup oauth2_section_6
+ */
+ public function unsetRefreshToken($refresh_token);
+}
diff --git a/library/oauth2/src/OAuth2/Storage/ScopeInterface.php b/library/oauth2/src/OAuth2/Storage/ScopeInterface.php
new file mode 100644
index 000000000..a8292269b
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/ScopeInterface.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should retrieve data involving the relevent scopes associated
+ * with this implementation.
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface ScopeInterface
+{
+ /**
+ * Check if the provided scope exists.
+ *
+ * @param $scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if it exists, FALSE otherwise.
+ */
+ public function scopeExists($scope);
+
+ /**
+ * The default scope to use in the event the client
+ * does not request one. By returning "false", a
+ * request_error is returned by the server to force a
+ * scope request by the client. By returning "null",
+ * opt out of requiring scopes
+ *
+ * @param $client_id
+ * An optional client id that can be used to return customized default scopes.
+ *
+ * @return
+ * string representation of default scope, null if
+ * scopes are not defined, or false to force scope
+ * request by the client
+ *
+ * ex:
+ * 'default'
+ * ex:
+ * null
+ */
+ public function getDefaultScope($client_id = null);
+}
diff --git a/library/oauth2/src/OAuth2/Storage/UserCredentialsInterface.php b/library/oauth2/src/OAuth2/Storage/UserCredentialsInterface.php
new file mode 100644
index 000000000..6e0fd7bad
--- /dev/null
+++ b/library/oauth2/src/OAuth2/Storage/UserCredentialsInterface.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should retrieve user credentials for the
+ * "Resource Owner Password Credentials" grant type
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface UserCredentialsInterface
+{
+ /**
+ * Grant access tokens for basic user credentials.
+ *
+ * Check the supplied username and password for validity.
+ *
+ * You can also use the $client_id param to do any checks required based
+ * on a client, if you need that.
+ *
+ * Required for OAuth2::GRANT_TYPE_USER_CREDENTIALS.
+ *
+ * @param $username
+ * Username to be check with.
+ * @param $password
+ * Password to be check with.
+ *
+ * @return
+ * TRUE if the username and password are valid, and FALSE if it isn't.
+ * Moreover, if the username and password are valid, and you want to
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.3
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function checkUserCredentials($username, $password);
+
+ /**
+ * @return
+ * ARRAY the associated "user_id" and optional "scope" values
+ * This function MUST return FALSE if the requested user does not exist or is
+ * invalid. "scope" is a space-separated list of restricted scopes.
+ * @code
+ * return array(
+ * "user_id" => USER_ID, // REQUIRED user_id to be stored with the authorization code or access token
+ * "scope" => SCOPE // OPTIONAL space-separated list of restricted scopes
+ * );
+ * @endcode
+ */
+ public function getUserDetails($username);
+}
diff --git a/library/oauth2/src/OAuth2/TokenType/Bearer.php b/library/oauth2/src/OAuth2/TokenType/Bearer.php
new file mode 100644
index 000000000..8ac8596ac
--- /dev/null
+++ b/library/oauth2/src/OAuth2/TokenType/Bearer.php
@@ -0,0 +1,130 @@
+<?php
+
+namespace OAuth2\TokenType;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+*
+*/
+class Bearer implements TokenTypeInterface
+{
+ private $config;
+
+ public function __construct(array $config = array())
+ {
+ $this->config = array_merge(array(
+ 'token_param_name' => 'access_token',
+ 'token_bearer_header_name' => 'Bearer',
+ ), $config);
+ }
+
+ public function getTokenType()
+ {
+ return 'Bearer';
+ }
+
+ /**
+ * Check if the request has supplied token
+ *
+ * @see https://github.com/bshaffer/oauth2-server-php/issues/349#issuecomment-37993588
+ */
+ public function requestHasToken(RequestInterface $request)
+ {
+ $headers = $request->headers('AUTHORIZATION');
+
+ // check the header, then the querystring, then the request body
+ return !empty($headers) || (bool) ($request->request($this->config['token_param_name'])) || (bool) ($request->query($this->config['token_param_name']));
+ }
+
+ /**
+ * This is a convenience function that can be used to get the token, which can then
+ * be passed to getAccessTokenData(). The constraints specified by the draft are
+ * attempted to be adheared to in this method.
+ *
+ * As per the Bearer spec (draft 8, section 2) - there are three ways for a client
+ * to specify the bearer token, in order of preference: Authorization Header,
+ * POST and GET.
+ *
+ * NB: Resource servers MUST accept tokens via the Authorization scheme
+ * (http://tools.ietf.org/html/rfc6750#section-2).
+ *
+ * @todo Should we enforce TLS/SSL in this function?
+ *
+ * @see http://tools.ietf.org/html/rfc6750#section-2.1
+ * @see http://tools.ietf.org/html/rfc6750#section-2.2
+ * @see http://tools.ietf.org/html/rfc6750#section-2.3
+ *
+ * Old Android version bug (at least with version 2.2)
+ * @see http://code.google.com/p/android/issues/detail?id=6684
+ *
+ */
+ public function getAccessTokenParameter(RequestInterface $request, ResponseInterface $response)
+ {
+ $headers = $request->headers('AUTHORIZATION');
+
+ /**
+ * Ensure more than one method is not used for including an
+ * access token
+ *
+ * @see http://tools.ietf.org/html/rfc6750#section-3.1
+ */
+ $methodsUsed = !empty($headers) + (bool) ($request->query($this->config['token_param_name'])) + (bool) ($request->request($this->config['token_param_name']));
+ if ($methodsUsed > 1) {
+ $response->setError(400, 'invalid_request', 'Only one method may be used to authenticate at a time (Auth header, GET or POST)');
+
+ return null;
+ }
+
+ /**
+ * If no authentication is provided, set the status code
+ * to 401 and return no other error information
+ *
+ * @see http://tools.ietf.org/html/rfc6750#section-3.1
+ */
+ if ($methodsUsed == 0) {
+ $response->setStatusCode(401);
+
+ return null;
+ }
+
+ // HEADER: Get the access token from the header
+ if (!empty($headers)) {
+ if (!preg_match('/' . $this->config['token_bearer_header_name'] . '\s(\S+)/i', $headers, $matches)) {
+ $response->setError(400, 'invalid_request', 'Malformed auth header');
+
+ return null;
+ }
+
+ return $matches[1];
+ }
+
+ if ($request->request($this->config['token_param_name'])) {
+ // // POST: Get the token from POST data
+ if (!in_array(strtolower($request->server('REQUEST_METHOD')), array('post', 'put'))) {
+ $response->setError(400, 'invalid_request', 'When putting the token in the body, the method must be POST or PUT', '#section-2.2');
+
+ return null;
+ }
+
+ $contentType = $request->server('CONTENT_TYPE');
+ if (false !== $pos = strpos($contentType, ';')) {
+ $contentType = substr($contentType, 0, $pos);
+ }
+
+ if ($contentType !== null && $contentType != 'application/x-www-form-urlencoded') {
+ // IETF specifies content-type. NB: Not all webservers populate this _SERVER variable
+ // @see http://tools.ietf.org/html/rfc6750#section-2.2
+ $response->setError(400, 'invalid_request', 'The content type for POST requests must be "application/x-www-form-urlencoded"');
+
+ return null;
+ }
+
+ return $request->request($this->config['token_param_name']);
+ }
+
+ // GET method
+ return $request->query($this->config['token_param_name']);
+ }
+}
diff --git a/library/oauth2/src/OAuth2/TokenType/Mac.php b/library/oauth2/src/OAuth2/TokenType/Mac.php
new file mode 100644
index 000000000..fe6a86aa6
--- /dev/null
+++ b/library/oauth2/src/OAuth2/TokenType/Mac.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace OAuth2\TokenType;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+* This is not yet supported!
+*/
+class Mac implements TokenTypeInterface
+{
+ public function getTokenType()
+ {
+ return 'mac';
+ }
+
+ public function getAccessTokenParameter(RequestInterface $request, ResponseInterface $response)
+ {
+ throw new \LogicException("Not supported");
+ }
+}
diff --git a/library/oauth2/src/OAuth2/TokenType/TokenTypeInterface.php b/library/oauth2/src/OAuth2/TokenType/TokenTypeInterface.php
new file mode 100644
index 000000000..ad77d4a25
--- /dev/null
+++ b/library/oauth2/src/OAuth2/TokenType/TokenTypeInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace OAuth2\TokenType;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+interface TokenTypeInterface
+{
+ /**
+ * Token type identification string
+ *
+ * ex: "bearer" or "mac"
+ */
+ public function getTokenType();
+
+ /**
+ * Retrieves the token string from the request object
+ */
+ public function getAccessTokenParameter(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/library/oauth2/test/OAuth2/AutoloadTest.php b/library/oauth2/test/OAuth2/AutoloadTest.php
new file mode 100644
index 000000000..5901bdc42
--- /dev/null
+++ b/library/oauth2/test/OAuth2/AutoloadTest.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace OAuth2;
+
+class AutoloadTest extends \PHPUnit_Framework_TestCase
+{
+ public function testClassesExist()
+ {
+ // autoloader is called in test/bootstrap.php
+ $this->assertTrue(class_exists('OAuth2\Server'));
+ $this->assertTrue(class_exists('OAuth2\Request'));
+ $this->assertTrue(class_exists('OAuth2\Response'));
+ $this->assertTrue(class_exists('OAuth2\GrantType\UserCredentials'));
+ $this->assertTrue(interface_exists('OAuth2\Storage\AccessTokenInterface'));
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Controller/AuthorizeControllerTest.php b/library/oauth2/test/OAuth2/Controller/AuthorizeControllerTest.php
new file mode 100644
index 000000000..3bfc760e4
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Controller/AuthorizeControllerTest.php
@@ -0,0 +1,492 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\Storage\Memory;
+use OAuth2\Scope;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\GrantType\AuthorizationCode;
+use OAuth2\Request;
+use OAuth2\Response;
+use OAuth2\Request\TestRequest;
+
+class AuthorizeControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoClientIdResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request();
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'No client id supplied');
+ }
+
+ public function testInvalidClientIdResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Fake Client ID', // invalid client id
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'The client id supplied is invalid');
+ }
+
+ public function testNoRedirectUriSuppliedOrStoredResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_uri');
+ $this->assertEquals($response->getParameter('error_description'), 'No redirect URI was supplied or stored');
+ }
+
+ public function testNoResponseTypeResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'invalid_request');
+ $this->assertEquals($query['error_description'], 'Invalid or missing response type');
+ }
+
+ public function testInvalidResponseTypeResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'invalid', // invalid response type
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'invalid_request');
+ $this->assertEquals($query['error_description'], 'Invalid or missing response type');
+ }
+
+ public function testRedirectUriFragmentResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com#fragment', // valid redirect URI
+ 'response_type' => 'code', // invalid response type
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_uri');
+ $this->assertEquals($response->getParameter('error_description'), 'The redirect URI must not contain a fragment');
+ }
+
+ public function testEnforceState()
+ {
+ $server = $this->getTestServer(array('enforce_state' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'invalid_request');
+ $this->assertEquals($query['error_description'], 'The state parameter is required');
+ }
+
+ public function testDoNotEnforceState()
+ {
+ $server = $this->getTestServer(array('enforce_state' => false));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNotContains('error', $response->getHttpHeader('Location'));
+ }
+
+ public function testEnforceScope()
+ {
+ $server = $this->getTestServer();
+ $scopeStorage = new Memory(array('default_scope' => false, 'supported_scopes' => array('testscope')));
+ $server->setScopeUtil(new Scope($scopeStorage));
+
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'invalid_client');
+ $this->assertEquals($query['error_description'], 'This application requires you specify a scope parameter');
+
+ $request->query['scope'] = 'testscope';
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNotContains('error', $response->getHttpHeader('Location'));
+ }
+
+ public function testInvalidRedirectUri()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // invalid redirect URI
+ 'response_type' => 'code',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'redirect_uri_mismatch');
+ $this->assertEquals($response->getParameter('error_description'), 'The redirect URI provided is missing or does not match');
+ }
+
+ public function testInvalidRedirectUriApprovedByBuggyRegisteredUri()
+ {
+ $server = $this->getTestServer();
+ $server->setConfig('require_exact_redirect_uri', false);
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Buggy Redirect Uri', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // invalid redirect URI
+ 'response_type' => 'code',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'redirect_uri_mismatch');
+ $this->assertEquals($response->getParameter('error_description'), 'The redirect URI provided is missing or does not match');
+ }
+
+ public function testNoRedirectUriWithMultipleRedirectUris()
+ {
+ $server = $this->getTestServer();
+
+ // create a request with no "redirect_uri" in querystring
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Multiple Redirect Uris', // valid client id
+ 'response_type' => 'code',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_uri');
+ $this->assertEquals($response->getParameter('error_description'), 'A redirect URI must be supplied when multiple redirect URIs are registered');
+ }
+
+ public function testRedirectUriWithValidRedirectUri()
+ {
+ $server = $this->getTestServer();
+
+ // create a request with no "redirect_uri" in querystring
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri Parts', // valid client id
+ 'response_type' => 'code',
+ 'redirect_uri' => 'http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true',
+ 'state' => 'xyz',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('code', $response->getHttpHeader('Location'));
+ }
+
+ public function testRedirectUriWithDifferentQueryAndExactMatchRequired()
+ {
+ $server = $this->getTestServer(array('require_exact_redirect_uri' => true));
+
+ // create a request with no "redirect_uri" in querystring
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri Parts', // valid client id
+ 'response_type' => 'code',
+ 'redirect_uri' => 'http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true&hereisa=querystring',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'redirect_uri_mismatch');
+ $this->assertEquals($response->getParameter('error_description'), 'The redirect URI provided is missing or does not match');
+ }
+
+ public function testRedirectUriWithDifferentQueryAndExactMatchNotRequired()
+ {
+ $server = $this->getTestServer(array('require_exact_redirect_uri' => false));
+
+ // create a request with no "redirect_uri" in querystring
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri Parts', // valid client id
+ 'response_type' => 'code',
+ 'redirect_uri' => 'http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true&hereisa=querystring',
+ 'state' => 'xyz',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('code', $response->getHttpHeader('Location'));
+ }
+
+ public function testMultipleRedirectUris()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Multiple Redirect Uris', // valid client id
+ 'redirect_uri' => 'http://brentertainment.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'xyz'
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('code', $response->getHttpHeader('Location'));
+
+ // call again with different (but still valid) redirect URI
+ $request->query['redirect_uri'] = 'http://morehazards.com';
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('code', $response->getHttpHeader('Location'));
+ }
+
+ /**
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.3
+ * @see https://github.com/bshaffer/oauth2-server-php/issues/163
+ */
+ public function testNoRedirectUriSuppliedDoesNotRequireTokenRedirectUri()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri', // valid client id
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('state', $response->getHttpHeader('Location'));
+ $this->assertStringStartsWith('http://brentertainment.com?code=', $response->getHttpHeader('Location'));
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['query'], $query);
+
+ // call token endpoint with no redirect_uri supplied
+ $request = TestRequest::createPost(array(
+ 'client_id' => 'Test Client ID with Redirect Uri', // valid client id
+ 'client_secret' => 'TestSecret2',
+ 'grant_type' => 'authorization_code',
+ 'code' => $query['code'],
+ ));
+
+ $server->handleTokenRequest($request, $response = new Response(), true);
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNotNull($response->getParameter('access_token'));
+ }
+
+ public function testUserDeniesAccessResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'access_denied');
+ $this->assertEquals($query['error_description'], 'The user denied access to your application');
+ }
+
+ public function testCodeQueryParamIsSet()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+
+ $this->assertEquals('http', $parts['scheme']); // same as passed in to redirect_uri
+ $this->assertEquals('adobe.com', $parts['host']); // same as passed in to redirect_uri
+ $this->assertArrayHasKey('query', $parts);
+ $this->assertFalse(isset($parts['fragment']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $query);
+ $this->assertNotNull($query);
+ $this->assertArrayHasKey('code', $query);
+
+ // ensure no id_token was saved, since the openid scope wasn't requested
+ $storage = $server->getStorage('authorization_code');
+ $code = $storage->getAuthorizationCode($query['code']);
+ $this->assertTrue(empty($code['id_token']));
+
+ // ensure no error was returned
+ $this->assertFalse(isset($query['error']));
+ $this->assertFalse(isset($query['error_description']));
+ }
+
+ public function testSuccessfulRequestReturnsStateParameter()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'test', // valid state string (just needs to be passed back to us)
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+ parse_str($parts['query'], $query);
+
+ $this->assertArrayHasKey('state', $query);
+ $this->assertEquals($query['state'], 'test');
+
+ // ensure no error was returned
+ $this->assertFalse(isset($query['error']));
+ $this->assertFalse(isset($query['error_description']));
+ }
+
+ public function testSuccessfulRequestStripsExtraParameters()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'test', // valid state string (just needs to be passed back to us)
+ 'fake' => 'something', // extra query param
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertFalse(isset($parts['fake']));
+ $this->assertArrayHasKey('query', $parts);
+ parse_str($parts['query'], $query);
+
+ $this->assertFalse(isset($parmas['fake']));
+ $this->assertArrayHasKey('state', $query);
+ $this->assertEquals($query['state'], 'test');
+ }
+
+ public function testSuccessfulOpenidConnectRequest()
+ {
+ $server = $this->getTestServer(array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'bojanz',
+ ));
+
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID',
+ 'redirect_uri' => 'http://adobe.com',
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ 'scope' => 'openid',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+ $this->assertFalse(isset($parts['fragment']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $query);
+ $this->assertNotNull($query);
+ $this->assertArrayHasKey('code', $query);
+
+ // ensure no error was returned
+ $this->assertFalse(isset($query['error']));
+ $this->assertFalse(isset($query['error_description']));
+
+ // confirm that the id_token has been created.
+ $storage = $server->getStorage('authorization_code');
+ $code = $storage->getAuthorizationCode($query['code']);
+ $this->assertTrue(!empty($code['id_token']));
+ }
+
+ public function testCreateController()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $controller = new AuthorizeController($storage);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ // Add the two types supported for authorization grant
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Controller/ResourceControllerTest.php b/library/oauth2/test/OAuth2/Controller/ResourceControllerTest.php
new file mode 100644
index 000000000..ee6d96ff8
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Controller/ResourceControllerTest.php
@@ -0,0 +1,175 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\GrantType\AuthorizationCode;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class ResourceControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoAccessToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+ }
+
+ public function testMalformedHeader()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'tH1s i5 B0gU5';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Malformed auth header');
+ }
+
+ public function testMultipleTokensSubmitted()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->request['access_token'] = 'TEST';
+ $request->query['access_token'] = 'TEST';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Only one method may be used to authenticate at a time (Auth header, GET or POST)');
+ }
+
+ public function testInvalidRequestMethod()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->server['REQUEST_METHOD'] = 'GET';
+ $request->request['access_token'] = 'TEST';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'When putting the token in the body, the method must be POST or PUT');
+ }
+
+ public function testInvalidContentType()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->server['REQUEST_METHOD'] = 'POST';
+ $request->server['CONTENT_TYPE'] = 'application/json';
+ $request->request['access_token'] = 'TEST';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'The content type for POST requests must be "application/x-www-form-urlencoded"');
+ }
+
+ public function testInvalidToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer TESTTOKEN';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'invalid_token');
+ $this->assertEquals($response->getParameter('error_description'), 'The access token provided is invalid');
+ }
+
+ public function testExpiredToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-expired';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'expired_token');
+ $this->assertEquals($response->getParameter('error_description'), 'The access token provided has expired');
+ }
+
+ public function testOutOfScopeToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
+ $scope = 'outofscope';
+ $allow = $server->verifyResourceRequest($request, $response = new Response(), $scope);
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 403);
+ $this->assertEquals($response->getParameter('error'), 'insufficient_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The request requires higher privileges than provided by the access token');
+
+ // verify the "scope" has been set in the "WWW-Authenticate" header
+ preg_match('/scope="(.*?)"/', $response->getHttpHeader('WWW-Authenticate'), $matches);
+ $this->assertEquals(2, count($matches));
+ $this->assertEquals($matches[1], 'outofscope');
+ }
+
+ public function testMalformedToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-malformed';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'malformed_token');
+ $this->assertEquals($response->getParameter('error_description'), 'Malformed token (missing "expires")');
+ }
+
+ public function testValidToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertTrue($allow);
+ }
+
+ public function testValidTokenWithScopeParam()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
+ $request->query['scope'] = 'testscope';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertTrue($allow);
+ }
+
+ public function testCreateController()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $tokenType = new \OAuth2\TokenType\Bearer();
+ $controller = new ResourceController($tokenType, $storage);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ // Add the two types supported for authorization grant
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Controller/TokenControllerTest.php b/library/oauth2/test/OAuth2/Controller/TokenControllerTest.php
new file mode 100644
index 000000000..4a217bd55
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Controller/TokenControllerTest.php
@@ -0,0 +1,289 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\GrantType\AuthorizationCode;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\GrantType\UserCredentials;
+use OAuth2\Scope;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class TokenControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoGrantType()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $server->handleTokenRequest(TestRequest::createPost(), $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'The grant type was not specified in the request');
+ }
+
+ public function testInvalidGrantType()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'invalid_grant_type', // invalid grant type
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'unsupported_grant_type');
+ $this->assertEquals($response->getParameter('error_description'), 'Grant type "invalid_grant_type" not supported');
+ }
+
+ public function testNoClientId()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'Client credentials were not found in the headers or body');
+ }
+
+ public function testNoClientSecretWithConfidentialClient()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ 'client_id' => 'Test Client ID', // valid client id
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'This client is invalid or must authenticate using a client secret');
+ }
+
+ public function testNoClientSecretWithEmptySecret()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode-empty-secret',
+ 'client_id' => 'Test Client ID Empty Secret', // valid client id
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 200);
+ }
+
+ public function testInvalidClientId()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ 'client_id' => 'Fake Client ID', // invalid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'The client credentials are invalid');
+ }
+
+ public function testInvalidClientSecret()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'Fake Client Secret', // invalid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'The client credentials are invalid');
+ }
+
+ public function testValidTokenResponse()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode', // valid authorization code
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+ $this->assertNotNull($response->getParameter('access_token'));
+ $this->assertNotNull($response->getParameter('expires_in'));
+ $this->assertNotNull($response->getParameter('token_type'));
+ }
+
+ public function testValidClientIdScope()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'scope' => 'clientscope1 clientscope2'
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+ $this->assertEquals('clientscope1 clientscope2', $response->getParameter('scope'));
+ }
+
+ public function testInvalidClientIdScope()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode-with-scope',
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'scope' => 'clientscope3'
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testEnforceScope()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new ClientCredentials($storage));
+
+ $scope = new Scope(array(
+ 'default_scope' => false,
+ 'supported_scopes' => array('testscope')
+ ));
+ $server->setScopeUtil($scope);
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $response = $server->handleTokenRequest($request);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'This application requires you specify a scope parameter');
+ }
+
+ public function testCanReceiveAccessTokenUsingPasswordGrantTypeWithoutClientSecret()
+ {
+ // add the test parameters in memory
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new UserCredentials($storage));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID For Password Grant', // valid client id
+ 'username' => 'johndoe', // valid username
+ 'password' => 'password', // valid password for username
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals(200, $response->getStatusCode(), var_export($response, 1));
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+ $this->assertNotNull($response->getParameter('access_token'));
+ $this->assertNotNull($response->getParameter('expires_in'));
+ $this->assertNotNull($response->getParameter('token_type'));
+ }
+
+ public function testInvalidTokenTypeHintForRevoke()
+ {
+ $server = $this->getTestServer();
+
+ $request = TestRequest::createPost(array(
+ 'token_type_hint' => 'foo',
+ 'token' => 'sometoken'
+ ));
+
+ $server->handleRevokeRequest($request, $response = new Response());
+
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals(400, $response->getStatusCode(), var_export($response, 1));
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Token type hint must be either \'access_token\' or \'refresh_token\'');
+ }
+
+ public function testMissingTokenForRevoke()
+ {
+ $server = $this->getTestServer();
+
+ $request = TestRequest::createPost(array(
+ 'token_type_hint' => 'access_token'
+ ));
+
+ $server->handleRevokeRequest($request, $response = new Response());
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals(400, $response->getStatusCode(), var_export($response, 1));
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing token parameter to revoke');
+ }
+
+ public function testInvalidRequestMethodForRevoke()
+ {
+ $server = $this->getTestServer();
+
+ $request = new TestRequest();
+ $request->setQuery(array(
+ 'token_type_hint' => 'access_token'
+ ));
+
+ $server->handleRevokeRequest($request, $response = new Response());
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals(405, $response->getStatusCode(), var_export($response, 1));
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'The request method must be POST when revoking an access token');
+ }
+
+ public function testCreateController()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $accessToken = new \OAuth2\ResponseType\AccessToken($storage);
+ $controller = new TokenController($accessToken, $storage);
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Encryption/FirebaseJwtTest.php b/library/oauth2/test/OAuth2/Encryption/FirebaseJwtTest.php
new file mode 100644
index 000000000..d34136767
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Encryption/FirebaseJwtTest.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+use OAuth2\Storage\Bootstrap;
+
+class FirebaseJwtTest extends \PHPUnit_Framework_TestCase
+{
+ private $privateKey;
+
+ public function setUp()
+ {
+ $this->privateKey = <<<EOD
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQC5/SxVlE8gnpFqCxgl2wjhzY7ucEi00s0kUg3xp7lVEvgLgYcA
+nHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1owR0p4d9pOaJK07d01+RzoQLO
+IQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8UlvdRKBxriRnlP3qJQIDAQAB
+AoGAVgJJVU4fhYMu1e5JfYAcTGfF+Gf+h3iQm4JCpoUcxMXf5VpB9ztk3K7LRN5y
+kwFuFALpnUAarRcUPs0D8FoP4qBluKksbAtgHkO7bMSH9emN+mH4le4qpFlR7+P1
+3fLE2Y19IBwPwEfClC+TpJvuog6xqUYGPlg6XLq/MxQUB4ECQQDgovP1v+ONSeGS
+R+NgJTR47noTkQT3M2izlce/OG7a+O0yw6BOZjNXqH2wx3DshqMcPUFrTjibIClP
+l/tEQ3ShAkEA0/TdBYDtXpNNjqg0R9GVH2pw7Kh68ne6mZTuj0kCgFYpUF6L6iMm
+zXamIJ51rTDsTyKTAZ1JuAhAsK/M2BbDBQJAKQ5fXEkIA+i+64dsDUR/hKLBeRYG
+PFAPENONQGvGBwt7/s02XV3cgGbxIgAxqWkqIp0neb9AJUoJgtyaNe3GQQJANoL4
+QQ0af0NVJAZgg8QEHTNL3aGrFSbzx8IE5Lb7PLRsJa5bP5lQxnDoYuU+EI/Phr62
+niisp/b/ZDGidkTMXQJBALeRsH1I+LmICAvWXpLKa9Gv0zGCwkuIJLiUbV9c6CVh
+suocCAteQwL5iW2gA4AnYr5OGeHFsEl7NCQcwfPZpJ0=
+-----END RSA PRIVATE KEY-----
+EOD;
+ }
+
+ /** @dataProvider provideClientCredentials */
+ public function testJwtUtil($client_id, $client_key)
+ {
+ $jwtUtil = new FirebaseJwt();
+
+ $params = array(
+ 'iss' => $client_id,
+ 'exp' => time() + 1000,
+ 'iat' => time(),
+ 'sub' => 'testuser@ourdomain.com',
+ 'aud' => 'http://myapp.com/oauth/auth',
+ 'scope' => null,
+ );
+
+ $encoded = $jwtUtil->encode($params, $this->privateKey, 'RS256');
+
+ // test BC behaviour of trusting the algorithm in the header
+ $payload = $jwtUtil->decode($encoded, $client_key, array('RS256'));
+ $this->assertEquals($params, $payload);
+
+ // test BC behaviour of not verifying by passing false
+ $payload = $jwtUtil->decode($encoded, $client_key, false);
+ $this->assertEquals($params, $payload);
+
+ // test the new restricted algorithms header
+ $payload = $jwtUtil->decode($encoded, $client_key, array('RS256'));
+ $this->assertEquals($params, $payload);
+ }
+
+ public function testInvalidJwt()
+ {
+ $jwtUtil = new FirebaseJwt();
+
+ $this->assertFalse($jwtUtil->decode('goob'));
+ $this->assertFalse($jwtUtil->decode('go.o.b'));
+ }
+
+ /** @dataProvider provideClientCredentials */
+ public function testInvalidJwtHeader($client_id, $client_key)
+ {
+ $jwtUtil = new FirebaseJwt();
+
+ $params = array(
+ 'iss' => $client_id,
+ 'exp' => time() + 1000,
+ 'iat' => time(),
+ 'sub' => 'testuser@ourdomain.com',
+ 'aud' => 'http://myapp.com/oauth/auth',
+ 'scope' => null,
+ );
+
+ // testing for algorithm tampering when only RSA256 signing is allowed
+ // @see https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
+ $tampered = $jwtUtil->encode($params, $client_key, 'HS256');
+
+ $payload = $jwtUtil->decode($tampered, $client_key, array('RS256'));
+
+ $this->assertFalse($payload);
+ }
+
+ public function provideClientCredentials()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $client_id = 'Test Client ID';
+ $client_key = $storage->getClientKey($client_id, "testuser@ourdomain.com");
+
+ return array(
+ array($client_id, $client_key),
+ );
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Encryption/JwtTest.php b/library/oauth2/test/OAuth2/Encryption/JwtTest.php
new file mode 100644
index 000000000..214eebac8
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Encryption/JwtTest.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+use OAuth2\Storage\Bootstrap;
+
+class JwtTest extends \PHPUnit_Framework_TestCase
+{
+ private $privateKey;
+
+ public function setUp()
+ {
+ $this->privateKey = <<<EOD
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQC5/SxVlE8gnpFqCxgl2wjhzY7ucEi00s0kUg3xp7lVEvgLgYcA
+nHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1owR0p4d9pOaJK07d01+RzoQLO
+IQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8UlvdRKBxriRnlP3qJQIDAQAB
+AoGAVgJJVU4fhYMu1e5JfYAcTGfF+Gf+h3iQm4JCpoUcxMXf5VpB9ztk3K7LRN5y
+kwFuFALpnUAarRcUPs0D8FoP4qBluKksbAtgHkO7bMSH9emN+mH4le4qpFlR7+P1
+3fLE2Y19IBwPwEfClC+TpJvuog6xqUYGPlg6XLq/MxQUB4ECQQDgovP1v+ONSeGS
+R+NgJTR47noTkQT3M2izlce/OG7a+O0yw6BOZjNXqH2wx3DshqMcPUFrTjibIClP
+l/tEQ3ShAkEA0/TdBYDtXpNNjqg0R9GVH2pw7Kh68ne6mZTuj0kCgFYpUF6L6iMm
+zXamIJ51rTDsTyKTAZ1JuAhAsK/M2BbDBQJAKQ5fXEkIA+i+64dsDUR/hKLBeRYG
+PFAPENONQGvGBwt7/s02XV3cgGbxIgAxqWkqIp0neb9AJUoJgtyaNe3GQQJANoL4
+QQ0af0NVJAZgg8QEHTNL3aGrFSbzx8IE5Lb7PLRsJa5bP5lQxnDoYuU+EI/Phr62
+niisp/b/ZDGidkTMXQJBALeRsH1I+LmICAvWXpLKa9Gv0zGCwkuIJLiUbV9c6CVh
+suocCAteQwL5iW2gA4AnYr5OGeHFsEl7NCQcwfPZpJ0=
+-----END RSA PRIVATE KEY-----
+EOD;
+ }
+
+ /** @dataProvider provideClientCredentials */
+ public function testJwtUtil($client_id, $client_key)
+ {
+ $jwtUtil = new Jwt();
+
+ $params = array(
+ 'iss' => $client_id,
+ 'exp' => time() + 1000,
+ 'iat' => time(),
+ 'sub' => 'testuser@ourdomain.com',
+ 'aud' => 'http://myapp.com/oauth/auth',
+ 'scope' => null,
+ );
+
+ $encoded = $jwtUtil->encode($params, $this->privateKey, 'RS256');
+
+ // test BC behaviour of trusting the algorithm in the header
+ $payload = $jwtUtil->decode($encoded, $client_key);
+ $this->assertEquals($params, $payload);
+
+ // test BC behaviour of not verifying by passing false
+ $payload = $jwtUtil->decode($encoded, $client_key, false);
+ $this->assertEquals($params, $payload);
+
+ // test the new restricted algorithms header
+ $payload = $jwtUtil->decode($encoded, $client_key, array('RS256'));
+ $this->assertEquals($params, $payload);
+ }
+
+ public function testInvalidJwt()
+ {
+ $jwtUtil = new Jwt();
+
+ $this->assertFalse($jwtUtil->decode('goob'));
+ $this->assertFalse($jwtUtil->decode('go.o.b'));
+ }
+
+ /** @dataProvider provideClientCredentials */
+ public function testInvalidJwtHeader($client_id, $client_key)
+ {
+ $jwtUtil = new Jwt();
+
+ $params = array(
+ 'iss' => $client_id,
+ 'exp' => time() + 1000,
+ 'iat' => time(),
+ 'sub' => 'testuser@ourdomain.com',
+ 'aud' => 'http://myapp.com/oauth/auth',
+ 'scope' => null,
+ );
+
+ // testing for algorithm tampering when only RSA256 signing is allowed
+ // @see https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
+ $tampered = $jwtUtil->encode($params, $client_key, 'HS256');
+
+ $payload = $jwtUtil->decode($tampered, $client_key, array('RS256'));
+
+ $this->assertFalse($payload);
+ }
+
+ public function provideClientCredentials()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $client_id = 'Test Client ID';
+ $client_key = $storage->getClientKey($client_id, "testuser@ourdomain.com");
+
+ return array(
+ array($client_id, $client_key),
+ );
+ }
+}
diff --git a/library/oauth2/test/OAuth2/GrantType/AuthorizationCodeTest.php b/library/oauth2/test/OAuth2/GrantType/AuthorizationCodeTest.php
new file mode 100644
index 000000000..740989635
--- /dev/null
+++ b/library/oauth2/test/OAuth2/GrantType/AuthorizationCodeTest.php
@@ -0,0 +1,207 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class AuthorizationCodeTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameter: "code" is required');
+ }
+
+ public function testInvalidCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'InvalidCode', // invalid authorization code
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Authorization code doesn\'t exist or is invalid for the client');
+ }
+
+ public function testCodeCannotBeUsedTwice()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode', // valid code
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNotNull($response->getParameter('access_token'));
+
+ // try to use the same code again
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Authorization code doesn\'t exist or is invalid for the client');
+ }
+
+ public function testExpiredCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-expired', // expired authorization code
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'The authorization code has expired');
+ }
+
+ public function testValidCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testValidCodeNoScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1 scope2');
+ }
+
+ public function testValidCodeSameScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ 'scope' => 'scope2 scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope2 scope1');
+ }
+
+ public function testValidCodeLessScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ 'scope' => 'scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidCodeDifferentScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ 'scope' => 'scope3',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testValidCodeInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ 'scope' => 'invalid-scope',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testValidClientDifferentCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Some Other Client', // valid client id
+ 'client_secret' => 'TestSecret3', // valid client secret
+ 'code' => 'testcode', // valid code
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'authorization_code doesn\'t exist or is invalid for the client');
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/GrantType/ClientCredentialsTest.php b/library/oauth2/test/OAuth2/GrantType/ClientCredentialsTest.php
new file mode 100644
index 000000000..f0d46ccb3
--- /dev/null
+++ b/library/oauth2/test/OAuth2/GrantType/ClientCredentialsTest.php
@@ -0,0 +1,159 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class ClientCredentialsTest extends \PHPUnit_Framework_TestCase
+{
+ public function testInvalidCredentials()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'FakeSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'The client credentials are invalid');
+ }
+
+ public function testValidCredentials()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertNull($token['scope']);
+ }
+
+ public function testValidCredentialsWithScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'scope' => 'scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidCredentialsInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'scope' => 'invalid-scope',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'An unsupported scope was requested');
+ }
+
+ public function testValidCredentialsInHeader()
+ {
+ // create with HTTP_AUTHORIZATION in header
+ $server = $this->getTestServer();
+ $headers = array('HTTP_AUTHORIZATION' => 'Basic '.base64_encode('Test Client ID:TestSecret'), 'REQUEST_METHOD' => 'POST');
+ $params = array('grant_type' => 'client_credentials');
+ $request = new Request(array(), $params, array(), array(), array(), $headers);
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertNotNull($token['access_token']);
+
+ // create using PHP Authorization Globals
+ $headers = array('PHP_AUTH_USER' => 'Test Client ID', 'PHP_AUTH_PW' => 'TestSecret', 'REQUEST_METHOD' => 'POST');
+ $params = array('grant_type' => 'client_credentials');
+ $request = new Request(array(), $params, array(), array(), array(), $headers);
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertNotNull($token['access_token']);
+ }
+
+ public function testValidCredentialsInRequest()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertNotNull($token['access_token']);
+ }
+
+ public function testValidCredentialsInQuerystring()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertNotNull($token['access_token']);
+ }
+
+ public function testClientUserIdIsSetInAccessToken()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Client ID With User ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+
+ // verify the user_id was associated with the token
+ $storage = $server->getStorage('client');
+ $token = $storage->getAccessToken($token['access_token']);
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('user_id', $token);
+ $this->assertEquals($token['user_id'], 'brent@brentertainment.com');
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new ClientCredentials($storage));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/GrantType/ImplicitTest.php b/library/oauth2/test/OAuth2/GrantType/ImplicitTest.php
new file mode 100644
index 000000000..a47aae3e8
--- /dev/null
+++ b/library/oauth2/test/OAuth2/GrantType/ImplicitTest.php
@@ -0,0 +1,143 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class ImplicitTest extends \PHPUnit_Framework_TestCase
+{
+ public function testImplicitNotAllowedResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'token', // invalid response type
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'unsupported_response_type');
+ $this->assertEquals($query['error_description'], 'implicit grant type not supported');
+ }
+
+ public function testUserDeniesAccessResponse()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'token', // valid response type
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'access_denied');
+ $this->assertEquals($query['error_description'], 'The user denied access to your application');
+ }
+
+ public function testSuccessfulRequestFragmentParameter()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'token', // valid response type
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+
+ $this->assertEquals('http', $parts['scheme']); // same as passed in to redirect_uri
+ $this->assertEquals('adobe.com', $parts['host']); // same as passed in to redirect_uri
+ $this->assertArrayHasKey('fragment', $parts);
+ $this->assertFalse(isset($parts['query']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['fragment'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('access_token', $params);
+ $this->assertArrayHasKey('expires_in', $params);
+ $this->assertArrayHasKey('token_type', $params);
+ }
+
+ public function testSuccessfulRequestReturnsStateParameter()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'token', // valid response type
+ 'state' => 'test', // valid state string (just needs to be passed back to us)
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('fragment', $parts);
+ parse_str($parts['fragment'], $params);
+
+ $this->assertArrayHasKey('state', $params);
+ $this->assertEquals($params['state'], 'test');
+ }
+
+ public function testSuccessfulRequestStripsExtraParameters()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com?fake=something', // valid redirect URI
+ 'response_type' => 'token', // valid response type
+ 'state' => 'test', // valid state string (just needs to be passed back to us)
+ 'fake' => 'something', // add extra param to querystring
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ $this->assertFalse(isset($parts['fake']));
+ $this->assertArrayHasKey('fragment', $parts);
+ parse_str($parts['fragment'], $params);
+
+ $this->assertFalse(isset($params['fake']));
+ $this->assertArrayHasKey('state', $params);
+ $this->assertEquals($params['state'], 'test');
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ // Add the two types supported for authorization grant
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/GrantType/JwtBearerTest.php b/library/oauth2/test/OAuth2/GrantType/JwtBearerTest.php
new file mode 100644
index 000000000..0a6c4b827
--- /dev/null
+++ b/library/oauth2/test/OAuth2/GrantType/JwtBearerTest.php
@@ -0,0 +1,360 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+use OAuth2\Encryption\Jwt;
+
+class JwtBearerTest extends \PHPUnit_Framework_TestCase
+{
+ private $privateKey;
+
+ public function setUp()
+ {
+ $this->privateKey = <<<EOD
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQC5/SxVlE8gnpFqCxgl2wjhzY7ucEi00s0kUg3xp7lVEvgLgYcA
+nHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1owR0p4d9pOaJK07d01+RzoQLO
+IQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8UlvdRKBxriRnlP3qJQIDAQAB
+AoGAVgJJVU4fhYMu1e5JfYAcTGfF+Gf+h3iQm4JCpoUcxMXf5VpB9ztk3K7LRN5y
+kwFuFALpnUAarRcUPs0D8FoP4qBluKksbAtgHkO7bMSH9emN+mH4le4qpFlR7+P1
+3fLE2Y19IBwPwEfClC+TpJvuog6xqUYGPlg6XLq/MxQUB4ECQQDgovP1v+ONSeGS
+R+NgJTR47noTkQT3M2izlce/OG7a+O0yw6BOZjNXqH2wx3DshqMcPUFrTjibIClP
+l/tEQ3ShAkEA0/TdBYDtXpNNjqg0R9GVH2pw7Kh68ne6mZTuj0kCgFYpUF6L6iMm
+zXamIJ51rTDsTyKTAZ1JuAhAsK/M2BbDBQJAKQ5fXEkIA+i+64dsDUR/hKLBeRYG
+PFAPENONQGvGBwt7/s02XV3cgGbxIgAxqWkqIp0neb9AJUoJgtyaNe3GQQJANoL4
+QQ0af0NVJAZgg8QEHTNL3aGrFSbzx8IE5Lb7PLRsJa5bP5lQxnDoYuU+EI/Phr62
+niisp/b/ZDGidkTMXQJBALeRsH1I+LmICAvWXpLKa9Gv0zGCwkuIJLiUbV9c6CVh
+suocCAteQwL5iW2gA4AnYr5OGeHFsEl7NCQcwfPZpJ0=
+-----END RSA PRIVATE KEY-----
+EOD;
+ }
+
+ public function testMalformedJWT()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get the jwt and break it
+ $jwt = $this->getJWT();
+ $jwt = substr_replace($jwt, 'broken', 3, 6);
+
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'JWT is malformed');
+ }
+
+ public function testBrokenSignature()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get the jwt and break signature
+ $jwt = $this->getJWT() . 'notSupposeToBeHere';
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JWT failed signature verification');
+ }
+
+ public function testExpiredJWT()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get an expired JWT
+ $jwt = $this->getJWT(1234);
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JWT has expired');
+ }
+
+ public function testBadExp()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get an expired JWT
+ $jwt = $this->getJWT('badtimestamp');
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Expiration (exp) time must be a unix time stamp');
+ }
+
+ public function testNoAssert()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Do not pass the assert (JWT)
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "assertion" required');
+ }
+
+ public function testNotBefore()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get a future NBF
+ $jwt = $this->getJWT(null, time() + 10000);
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JWT cannot be used before the Not Before (nbf) time');
+ }
+
+ public function testBadNotBefore()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get a non timestamp nbf
+ $jwt = $this->getJWT(null, 'notatimestamp');
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Not Before (nbf) time must be a unix time stamp');
+ }
+
+ public function testNonMatchingAudience()
+ {
+ $server = $this->getTestServer('http://google.com/oauth/o/auth');
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(),
+ ));
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid audience (aud)');
+ }
+
+ public function testBadClientID()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, null, 'bad_client_id'),
+ ));
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid issuer (iss) or subject (sub) provided');
+ }
+
+ public function testBadSubject()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, 'anotheruser@ourdomain,com'),
+ ));
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid issuer (iss) or subject (sub) provided');
+ }
+
+ public function testMissingKey()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, null, 'Missing Key Cli,nt'),
+ ));
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid issuer (iss) or subject (sub) provided');
+ }
+
+ public function testValidJwt()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(), // valid assertion
+ ));
+
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testValidJwtWithScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, null, 'Test Client ID'), // valid assertion
+ 'scope' => 'scope1', // valid scope
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidJwtInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, null, 'Test Client ID'), // valid assertion
+ 'scope' => 'invalid-scope', // invalid scope
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'An unsupported scope was requested');
+ }
+
+ public function testValidJti()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, 'testuser@ourdomain.com', 'Test Client ID', 'unused_jti'), // valid assertion with invalid scope
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testInvalidJti()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(99999999900, null, 'testuser@ourdomain.com', 'Test Client ID', 'used_jti'), // valid assertion with invalid scope
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JSON Token Identifier (jti) has already been used');
+ }
+
+ public function testJtiReplayAttack()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(99999999900, null, 'testuser@ourdomain.com', 'Test Client ID', 'totally_new_jti'), // valid assertion with invalid scope
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+
+ //Replay the same request
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JSON Token Identifier (jti) has already been used');
+ }
+
+ /**
+ * Generates a JWT
+ * @param $exp The expiration date. If the current time is greater than the exp, the JWT is invalid.
+ * @param $nbf The "not before" time. If the current time is less than the nbf, the JWT is invalid.
+ * @param $sub The subject we are acting on behalf of. This could be the email address of the user in the system.
+ * @param $iss The issuer, usually the client_id.
+ * @return string
+ */
+ private function getJWT($exp = null, $nbf = null, $sub = null, $iss = 'Test Client ID', $jti = null)
+ {
+ if (!$exp) {
+ $exp = time() + 1000;
+ }
+
+ if (!$sub) {
+ $sub = "testuser@ourdomain.com";
+ }
+
+ $params = array(
+ 'iss' => $iss,
+ 'exp' => $exp,
+ 'iat' => time(),
+ 'sub' => $sub,
+ 'aud' => 'http://myapp.com/oauth/auth',
+ );
+
+ if ($nbf) {
+ $params['nbf'] = $nbf;
+ }
+
+ if ($jti) {
+ $params['jti'] = $jti;
+ }
+
+ $jwtUtil = new Jwt();
+
+ return $jwtUtil->encode($params, $this->privateKey, 'RS256');
+ }
+
+ private function getTestServer($audience = 'http://myapp.com/oauth/auth')
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new JwtBearer($storage, $audience, new Jwt()));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/GrantType/RefreshTokenTest.php b/library/oauth2/test/OAuth2/GrantType/RefreshTokenTest.php
new file mode 100644
index 000000000..a458aad8a
--- /dev/null
+++ b/library/oauth2/test/OAuth2/GrantType/RefreshTokenTest.php
@@ -0,0 +1,204 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class RefreshTokenTest extends \PHPUnit_Framework_TestCase
+{
+ private $storage;
+
+ public function testNoRefreshToken()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameter: "refresh_token" is required');
+ }
+
+ public function testInvalidRefreshToken()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'fake-token', // invalid refresh token
+ ));
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid refresh token');
+ }
+
+ public function testValidRefreshTokenWithNewRefreshTokenInResponse()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage, array('always_issue_new_refresh_token' => true)));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertTrue(isset($token['refresh_token']), 'refresh token should always refresh');
+
+ $refresh_token = $this->storage->getRefreshToken($token['refresh_token']);
+ $this->assertNotNull($refresh_token);
+ $this->assertEquals($refresh_token['refresh_token'], $token['refresh_token']);
+ $this->assertEquals($refresh_token['client_id'], $request->request('client_id'));
+ $this->assertTrue($token['refresh_token'] != 'test-refreshtoken', 'the refresh token returned is not the one used');
+ $used_token = $this->storage->getRefreshToken('test-refreshtoken');
+ $this->assertFalse($used_token, 'the refresh token used is no longer valid');
+ }
+
+ public function testValidRefreshTokenDoesNotUnsetToken()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage, array(
+ 'always_issue_new_refresh_token' => true,
+ 'unset_refresh_token_after_use' => false,
+ )));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertTrue(isset($token['refresh_token']), 'refresh token should always refresh');
+
+ $used_token = $this->storage->getRefreshToken('test-refreshtoken');
+ $this->assertNotNull($used_token, 'the refresh token used is still valid');
+ }
+
+ public function testValidRefreshTokenWithNoRefreshTokenInResponse()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage, array('always_issue_new_refresh_token' => false)));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertFalse(isset($token['refresh_token']), 'refresh token should not be returned');
+
+ $used_token = $this->storage->getRefreshToken('test-refreshtoken');
+ $this->assertNotNull($used_token, 'the refresh token used is still valid');
+ }
+
+ public function testValidRefreshTokenSameScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
+ 'scope' => 'scope2 scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope2 scope1');
+ }
+
+ public function testValidRefreshTokenLessScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
+ 'scope' => 'scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidRefreshTokenDifferentScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
+ 'scope' => 'scope3',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testValidRefreshTokenInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
+ 'scope' => 'invalid-scope',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testValidClientDifferentRefreshToken()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Some Other Client', // valid client id
+ 'client_secret' => 'TestSecret3', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'refresh_token doesn\'t exist or is invalid for the client');
+ }
+
+ private function getTestServer()
+ {
+ $this->storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($this->storage);
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/GrantType/UserCredentialsTest.php b/library/oauth2/test/OAuth2/GrantType/UserCredentialsTest.php
new file mode 100644
index 000000000..18943d055
--- /dev/null
+++ b/library/oauth2/test/OAuth2/GrantType/UserCredentialsTest.php
@@ -0,0 +1,172 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class UserCredentialsTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoUsername()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'password' => 'testpass', // valid password
+ ));
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "username" and "password" required');
+ }
+
+ public function testNoPassword()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ ));
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "username" and "password" required');
+ }
+
+ public function testInvalidUsername()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'fake-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid username and password combination');
+ }
+
+ public function testInvalidPassword()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'fakepass', // invalid password
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid username and password combination');
+ }
+
+ public function testValidCredentials()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testValidCredentialsWithScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ 'scope' => 'scope1', // valid scope
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidCredentialsInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ 'scope' => 'invalid-scope',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'An unsupported scope was requested');
+ }
+
+ public function testNoSecretWithPublicClient()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID Empty Secret', // valid public client
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testNoSecretWithConfidentialClient()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid public client
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'This client is invalid or must authenticate using a client secret');
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new UserCredentials($storage));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php b/library/oauth2/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php
new file mode 100644
index 000000000..46de936d8
--- /dev/null
+++ b/library/oauth2/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php
@@ -0,0 +1,182 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class AuthorizeControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testValidateAuthorizeRequest()
+ {
+ $server = $this->getTestServer();
+
+ $response = new Response();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'id_token',
+ 'state' => 'af0ifjsldkj',
+ 'nonce' => 'n-0S6_WzA2Mj',
+ ));
+
+ // Test valid id_token request
+ $server->handleAuthorizeRequest($request, $response, true);
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['fragment'], $query);
+
+ $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
+ $this->assertEquals($query['state'], 'af0ifjsldkj');
+
+ $this->assertArrayHasKey('id_token', $query);
+ $this->assertArrayHasKey('state', $query);
+ $this->assertArrayNotHasKey('access_token', $query);
+ $this->assertArrayNotHasKey('expires_in', $query);
+ $this->assertArrayNotHasKey('token_type', $query);
+
+ // Test valid token id_token request
+ $request->query['response_type'] = 'id_token token';
+ $server->handleAuthorizeRequest($request, $response, true);
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['fragment'], $query);
+
+ $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
+ $this->assertEquals($query['state'], 'af0ifjsldkj');
+
+ $this->assertArrayHasKey('access_token', $query);
+ $this->assertArrayHasKey('expires_in', $query);
+ $this->assertArrayHasKey('token_type', $query);
+ $this->assertArrayHasKey('state', $query);
+ $this->assertArrayHasKey('id_token', $query);
+
+ // assert that with multiple-valued response types, order does not matter
+ $request->query['response_type'] = 'token id_token';
+ $server->handleAuthorizeRequest($request, $response, true);
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['fragment'], $query);
+
+ $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
+ $this->assertEquals($query['state'], 'af0ifjsldkj');
+
+ $this->assertArrayHasKey('access_token', $query);
+ $this->assertArrayHasKey('expires_in', $query);
+ $this->assertArrayHasKey('token_type', $query);
+ $this->assertArrayHasKey('state', $query);
+ $this->assertArrayHasKey('id_token', $query);
+
+ // assert that with multiple-valued response types with extra spaces do not matter
+ $request->query['response_type'] = ' token id_token ';
+ $server->handleAuthorizeRequest($request, $response, true);
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['fragment'], $query);
+
+ $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
+ $this->assertEquals($query['state'], 'af0ifjsldkj');
+
+ $this->assertArrayHasKey('access_token', $query);
+ $this->assertArrayHasKey('expires_in', $query);
+ $this->assertArrayHasKey('token_type', $query);
+ $this->assertArrayHasKey('state', $query);
+ $this->assertArrayHasKey('id_token', $query);
+ }
+
+ public function testMissingNonce()
+ {
+ $server = $this->getTestServer();
+ $authorize = $server->getAuthorizeController();
+
+ $response = new Response();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'id_token',
+ 'state' => 'xyz',
+ ));
+
+ // Test missing nonce for 'id_token' response type
+ $server->handleAuthorizeRequest($request, $response, true);
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'invalid_nonce');
+ $this->assertEquals($params['error_description'], 'This application requires you specify a nonce parameter');
+
+ // Test missing nonce for 'id_token token' response type
+ $request->query['response_type'] = 'id_token token';
+ $server->handleAuthorizeRequest($request, $response, true);
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'invalid_nonce');
+ $this->assertEquals($params['error_description'], 'This application requires you specify a nonce parameter');
+ }
+
+ public function testNotGrantedApplication()
+ {
+ $server = $this->getTestServer();
+
+ $response = new Response();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'id_token',
+ 'state' => 'af0ifjsldkj',
+ 'nonce' => 'n-0S6_WzA2Mj',
+ ));
+
+ // Test not approved application
+ $server->handleAuthorizeRequest($request, $response, false);
+
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'consent_required');
+ $this->assertEquals($params['error_description'], 'The user denied access to your application');
+
+ // Test not approved application with prompt parameter
+ $request->query['prompt'] = 'none';
+ $server->handleAuthorizeRequest($request, $response, false);
+
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'login_required');
+ $this->assertEquals($params['error_description'], 'The user must log in');
+
+ // Test not approved application with user_id set
+ $request->query['prompt'] = 'none';
+ $server->handleAuthorizeRequest($request, $response, false, 'some-user-id');
+
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'interaction_required');
+ $this->assertEquals($params['error_description'], 'The user must grant access to your application');
+ }
+
+ public function testNeedsIdToken()
+ {
+ $server = $this->getTestServer();
+ $authorize = $server->getAuthorizeController();
+
+ $this->assertTrue($authorize->needsIdToken('openid'));
+ $this->assertTrue($authorize->needsIdToken('openid profile'));
+ $this->assertFalse($authorize->needsIdToken(''));
+ $this->assertFalse($authorize->needsIdToken('some-scope'));
+ }
+
+ private function getTestServer($config = array())
+ {
+ $config += array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'phpunit',
+ 'allow_implicit' => true
+ );
+
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php b/library/oauth2/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php
new file mode 100644
index 000000000..b1b687077
--- /dev/null
+++ b/library/oauth2/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class UserInfoControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testCreateController()
+ {
+ $tokenType = new \OAuth2\TokenType\Bearer();
+ $storage = new \OAuth2\Storage\Memory();
+ $controller = new UserInfoController($tokenType, $storage, $storage);
+
+ $response = new Response();
+ $controller->handleUserInfoRequest(new Request(), $response);
+ $this->assertEquals(401, $response->getStatusCode());
+ }
+
+ public function testValidToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-openid-connect';
+ $response = new Response();
+
+ $server->handleUserInfoRequest($request, $response);
+ $parameters = $response->getParameters();
+ $this->assertEquals($parameters['sub'], 'testuser');
+ $this->assertEquals($parameters['email'], 'testuser@test.com');
+ $this->assertEquals($parameters['email_verified'], true);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php b/library/oauth2/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php
new file mode 100644
index 000000000..776002d1e
--- /dev/null
+++ b/library/oauth2/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace OAuth2\OpenID\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class AuthorizationCodeTest extends \PHPUnit_Framework_TestCase
+{
+ public function testValidCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-openid', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('id_token', $token);
+ $this->assertEquals('test_id_token', $token['id_token']);
+
+ // this is only true if "offline_access" was requested
+ $this->assertFalse(isset($token['refresh_token']));
+ }
+
+ public function testOfflineAccess()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-openid', // valid code
+ 'scope' => 'offline_access', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('id_token', $token);
+ $this->assertEquals('test_id_token', $token['id_token']);
+ $this->assertTrue(isset($token['refresh_token']));
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, array('use_openid_connect' => true));
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php b/library/oauth2/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php
new file mode 100644
index 000000000..b0311434a
--- /dev/null
+++ b/library/oauth2/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php
@@ -0,0 +1,182 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\GrantType\ClientCredentials;
+
+class CodeIdTokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function testHandleAuthorizeRequest()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+
+ $request = new Request(array(
+ 'response_type' => 'code id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayHasKey('code', $params);
+
+ // validate ID Token
+ $parts = explode('.', $params['id_token']);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayHasKey('iss', $claims);
+ $this->assertArrayHasKey('sub', $claims);
+ $this->assertArrayHasKey('aud', $claims);
+ $this->assertArrayHasKey('iat', $claims);
+ $this->assertArrayHasKey('exp', $claims);
+ $this->assertArrayHasKey('auth_time', $claims);
+ $this->assertArrayHasKey('nonce', $claims);
+
+ // only exists if an access token was granted along with the id_token
+ $this->assertArrayNotHasKey('at_hash', $claims);
+
+ $this->assertEquals($claims['iss'], 'test');
+ $this->assertEquals($claims['aud'], 'Test Client ID');
+ $this->assertEquals($claims['nonce'], 'test');
+ $duration = $claims['exp'] - $claims['iat'];
+ $this->assertEquals($duration, 3600);
+ }
+
+ public function testUserClaimsWithUserId()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+
+ $request = new Request(array(
+ 'response_type' => 'code id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid email',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $userId = 'testuser';
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $userId);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayHasKey('code', $params);
+
+ // validate ID Token
+ $parts = explode('.', $params['id_token']);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayHasKey('email', $claims);
+ $this->assertArrayHasKey('email_verified', $claims);
+ $this->assertNotNull($claims['email']);
+ $this->assertNotNull($claims['email_verified']);
+ }
+
+ public function testUserClaimsWithoutUserId()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+
+ $request = new Request(array(
+ 'response_type' => 'code id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid email',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $userId = null;
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $userId);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayHasKey('code', $params);
+
+ // validate ID Token
+ $parts = explode('.', $params['id_token']);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayNotHasKey('email', $claims);
+ $this->assertArrayNotHasKey('email_verified', $claims);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $config += array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'test',
+ 'id_lifetime' => 3600,
+ 'allow_implicit' => true,
+ );
+
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $memoryStorage->supportedScopes[] = 'email';
+ $responseTypes = array(
+ 'code' => $code = new AuthorizationCode($memoryStorage),
+ 'id_token' => $idToken = new IdToken($memoryStorage, $memoryStorage, $config),
+ 'code id_token' => new CodeIdToken($code, $idToken),
+ );
+
+ $server = new Server($memoryStorage, $config, array(), $responseTypes);
+ $server->addGrantType(new ClientCredentials($memoryStorage));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTest.php b/library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTest.php
new file mode 100644
index 000000000..e772f6be4
--- /dev/null
+++ b/library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTest.php
@@ -0,0 +1,184 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\Encryption\Jwt;
+
+class IdTokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function testValidateAuthorizeRequest()
+ {
+ $query = array(
+ 'response_type' => 'id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid',
+ 'state' => 'test',
+ );
+
+ // attempt to do the request without a nonce.
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request($query);
+ $valid = $server->validateAuthorizeRequest($request, $response = new Response());
+
+ // Add a nonce and retry.
+ $query['nonce'] = 'test';
+ $request = new Request($query);
+ $valid = $server->validateAuthorizeRequest($request, $response = new Response());
+ $this->assertTrue($valid);
+ }
+
+ public function testHandleAuthorizeRequest()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'response_type' => 'id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid email',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $user_id = 'testuser';
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $user_id);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('fragment', $parts);
+ $this->assertFalse(isset($parts['query']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['fragment'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayNotHasKey('access_token', $params);
+ $this->validateIdToken($params['id_token']);
+ }
+
+ public function testPassInAuthTime()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'response_type' => 'id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid email',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ // test with a scalar user id
+ $user_id = 'testuser123';
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $user_id);
+
+ list($header, $payload, $signature) = $this->extractTokenDataFromResponse($response);
+
+ $this->assertTrue(is_array($payload));
+ $this->assertArrayHasKey('sub', $payload);
+ $this->assertEquals($user_id, $payload['sub']);
+ $this->assertArrayHasKey('auth_time', $payload);
+
+ // test with an array of user info
+ $userInfo = array(
+ 'user_id' => 'testuser1234',
+ 'auth_time' => date('Y-m-d H:i:s', strtotime('20 minutes ago')
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $userInfo);
+
+ list($header, $payload, $signature) = $this->extractTokenDataFromResponse($response);
+
+ $this->assertTrue(is_array($payload));
+ $this->assertArrayHasKey('sub', $payload);
+ $this->assertEquals($userInfo['user_id'], $payload['sub']);
+ $this->assertArrayHasKey('auth_time', $payload);
+ $this->assertEquals($userInfo['auth_time'], $payload['auth_time']);
+ }
+
+ private function extractTokenDataFromResponse(Response $response)
+ {
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('fragment', $parts);
+ $this->assertFalse(isset($parts['query']));
+
+ parse_str($parts['fragment'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayNotHasKey('access_token', $params);
+
+ list($headb64, $payloadb64, $signature) = explode('.', $params['id_token']);
+
+ $jwt = new Jwt();
+ $header = json_decode($jwt->urlSafeB64Decode($headb64), true);
+ $payload = json_decode($jwt->urlSafeB64Decode($payloadb64), true);
+
+ return array($header, $payload, $signature);
+ }
+
+ private function validateIdToken($id_token)
+ {
+ $parts = explode('.', $id_token);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayHasKey('iss', $claims);
+ $this->assertArrayHasKey('sub', $claims);
+ $this->assertArrayHasKey('aud', $claims);
+ $this->assertArrayHasKey('iat', $claims);
+ $this->assertArrayHasKey('exp', $claims);
+ $this->assertArrayHasKey('auth_time', $claims);
+ $this->assertArrayHasKey('nonce', $claims);
+ $this->assertArrayHasKey('email', $claims);
+ $this->assertArrayHasKey('email_verified', $claims);
+
+ $this->assertEquals($claims['iss'], 'test');
+ $this->assertEquals($claims['aud'], 'Test Client ID');
+ $this->assertEquals($claims['nonce'], 'test');
+ $this->assertEquals($claims['email'], 'testuser@test.com');
+ $duration = $claims['exp'] - $claims['iat'];
+ $this->assertEquals($duration, 3600);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $config += array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'test',
+ 'id_lifetime' => 3600,
+ );
+
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $memoryStorage->supportedScopes[] = 'email';
+ $storage = array(
+ 'client' => $memoryStorage,
+ 'scope' => $memoryStorage,
+ );
+ $responseTypes = array(
+ 'id_token' => new IdToken($memoryStorage, $memoryStorage, $config),
+ );
+
+ $server = new Server($storage, $config, array(), $responseTypes);
+ $server->addGrantType(new ClientCredentials($memoryStorage));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php b/library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php
new file mode 100644
index 000000000..bc564d37b
--- /dev/null
+++ b/library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\ResponseType\AccessToken;
+
+class IdTokenTokenTest extends \PHPUnit_Framework_TestCase
+{
+
+ public function testHandleAuthorizeRequest()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer(array('allow_implicit' => true));
+
+ $request = new Request(array(
+ 'response_type' => 'id_token token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('fragment', $parts);
+ $this->assertFalse(isset($parts['query']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['fragment'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayHasKey('access_token', $params);
+
+ // validate ID Token
+ $parts = explode('.', $params['id_token']);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayHasKey('iss', $claims);
+ $this->assertArrayHasKey('sub', $claims);
+ $this->assertArrayHasKey('aud', $claims);
+ $this->assertArrayHasKey('iat', $claims);
+ $this->assertArrayHasKey('exp', $claims);
+ $this->assertArrayHasKey('auth_time', $claims);
+ $this->assertArrayHasKey('nonce', $claims);
+ $this->assertArrayHasKey('at_hash', $claims);
+
+ $this->assertEquals($claims['iss'], 'test');
+ $this->assertEquals($claims['aud'], 'Test Client ID');
+ $this->assertEquals($claims['nonce'], 'test');
+ $duration = $claims['exp'] - $claims['iat'];
+ $this->assertEquals($duration, 3600);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $config += array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'test',
+ 'id_lifetime' => 3600,
+ );
+
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $responseTypes = array(
+ 'token' => $token = new AccessToken($memoryStorage, $memoryStorage),
+ 'id_token' => $idToken = new IdToken($memoryStorage, $memoryStorage, $config),
+ 'id_token token' => new IdTokenToken($token, $idToken),
+ );
+
+ $server = new Server($memoryStorage, $config, array(), $responseTypes);
+ $server->addGrantType(new ClientCredentials($memoryStorage));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php b/library/oauth2/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php
new file mode 100644
index 000000000..bdfb085e3
--- /dev/null
+++ b/library/oauth2/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace OAuth2\OpenID\Storage;
+
+use OAuth2\Storage\BaseTest;
+use OAuth2\Storage\NullStorage;
+
+class AuthorizationCodeTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testCreateAuthorizationCode($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof AuthorizationCodeInterface) {
+ return;
+ }
+
+ // assert code we are about to add does not exist
+ $code = $storage->getAuthorizationCode('new-openid-code');
+ $this->assertFalse($code);
+
+ // add new code
+ $expires = time() + 20;
+ $scope = null;
+ $id_token = 'fake_id_token';
+ $success = $storage->setAuthorizationCode('new-openid-code', 'client ID', 'SOMEUSERID', 'http://example.com', $expires, $scope, $id_token);
+ $this->assertTrue($success);
+
+ $code = $storage->getAuthorizationCode('new-openid-code');
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertArrayHasKey('client_id', $code);
+ $this->assertArrayHasKey('user_id', $code);
+ $this->assertArrayHasKey('redirect_uri', $code);
+ $this->assertArrayHasKey('expires', $code);
+ $this->assertEquals($code['authorization_code'], 'new-openid-code');
+ $this->assertEquals($code['client_id'], 'client ID');
+ $this->assertEquals($code['user_id'], 'SOMEUSERID');
+ $this->assertEquals($code['redirect_uri'], 'http://example.com');
+ $this->assertEquals($code['expires'], $expires);
+ $this->assertEquals($code['id_token'], $id_token);
+
+ // change existing code
+ $expires = time() + 42;
+ $new_id_token = 'fake_id_token-2';
+ $success = $storage->setAuthorizationCode('new-openid-code', 'client ID2', 'SOMEOTHERID', 'http://example.org', $expires, $scope, $new_id_token);
+ $this->assertTrue($success);
+
+ $code = $storage->getAuthorizationCode('new-openid-code');
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertArrayHasKey('client_id', $code);
+ $this->assertArrayHasKey('user_id', $code);
+ $this->assertArrayHasKey('redirect_uri', $code);
+ $this->assertArrayHasKey('expires', $code);
+ $this->assertEquals($code['authorization_code'], 'new-openid-code');
+ $this->assertEquals($code['client_id'], 'client ID2');
+ $this->assertEquals($code['user_id'], 'SOMEOTHERID');
+ $this->assertEquals($code['redirect_uri'], 'http://example.org');
+ $this->assertEquals($code['expires'], $expires);
+ $this->assertEquals($code['id_token'], $new_id_token);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testRemoveIdTokenFromAuthorizationCode($storage)
+ {
+ // add new code
+ $expires = time() + 20;
+ $scope = null;
+ $id_token = 'fake_id_token_to_remove';
+ $authcode = 'new-openid-code-'.rand();
+ $success = $storage->setAuthorizationCode($authcode, 'client ID', 'SOMEUSERID', 'http://example.com', $expires, $scope, $id_token);
+ $this->assertTrue($success);
+
+ // verify params were set
+ $code = $storage->getAuthorizationCode($authcode);
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('id_token', $code);
+ $this->assertEquals($code['id_token'], $id_token);
+
+ // remove the id_token
+ $success = $storage->setAuthorizationCode($authcode, 'client ID', 'SOMEUSERID', 'http://example.com', $expires, $scope, null);
+
+ // verify the "id_token" is now null
+ $code = $storage->getAuthorizationCode($authcode);
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('id_token', $code);
+ $this->assertEquals($code['id_token'], null);
+ }
+}
diff --git a/library/oauth2/test/OAuth2/OpenID/Storage/UserClaimsTest.php b/library/oauth2/test/OAuth2/OpenID/Storage/UserClaimsTest.php
new file mode 100644
index 000000000..840f6c566
--- /dev/null
+++ b/library/oauth2/test/OAuth2/OpenID/Storage/UserClaimsTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace OAuth2\OpenID\Storage;
+
+use OAuth2\Storage\BaseTest;
+use OAuth2\Storage\NullStorage;
+
+class UserClaimsTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testGetUserClaims($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof UserClaimsInterface) {
+ // incompatible storage
+ return;
+ }
+
+ // invalid user
+ $claims = $storage->getUserClaims('fake-user', '');
+ $this->assertFalse($claims);
+
+ // valid user (no scope)
+ $claims = $storage->getUserClaims('testuser', '');
+
+ /* assert the decoded token is the same */
+ $this->assertFalse(isset($claims['email']));
+
+ // valid user
+ $claims = $storage->getUserClaims('testuser', 'email');
+
+ /* assert the decoded token is the same */
+ $this->assertEquals($claims['email'], "testuser@test.com");
+ $this->assertEquals($claims['email_verified'], true);
+ }
+}
diff --git a/library/oauth2/test/OAuth2/RequestTest.php b/library/oauth2/test/OAuth2/RequestTest.php
new file mode 100644
index 000000000..10db3215c
--- /dev/null
+++ b/library/oauth2/test/OAuth2/RequestTest.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Request\TestRequest;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\GrantType\AuthorizationCode;
+
+class RequestTest extends \PHPUnit_Framework_TestCase
+{
+ public function testRequestOverride()
+ {
+ $request = new TestRequest();
+ $server = $this->getTestServer();
+
+ // Smoke test for override request class
+ // $server->handleTokenRequest($request, $response = new Response());
+ // $this->assertInstanceOf('Response', $response);
+ // $server->handleAuthorizeRequest($request, $response = new Response(), true);
+ // $this->assertInstanceOf('Response', $response);
+ // $response = $server->verifyResourceRequest($request, $response = new Response());
+ // $this->assertTrue(is_bool($response));
+
+ /*** make some valid requests ***/
+
+ // Valid Token Request
+ $request->setPost(array(
+ 'grant_type' => 'authorization_code',
+ 'client_id' => 'Test Client ID',
+ 'client_secret' => 'TestSecret',
+ 'code' => 'testcode',
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNotNUll($response->getParameter('access_token'));
+ }
+
+ public function testHeadersReturnsValueByKey()
+ {
+ $request = new Request(
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array('AUTHORIZATION' => 'Basic secret')
+ );
+
+ $this->assertEquals('Basic secret', $request->headers('AUTHORIZATION'));
+ }
+
+ public function testHeadersReturnsDefaultIfHeaderNotPresent()
+ {
+ $request = new Request();
+
+ $this->assertEquals('Bearer', $request->headers('AUTHORIZATION', 'Bearer'));
+ }
+
+ public function testHeadersIsCaseInsensitive()
+ {
+ $request = new Request(
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array('AUTHORIZATION' => 'Basic secret')
+ );
+
+ $this->assertEquals('Basic secret', $request->headers('Authorization'));
+ }
+
+ public function testRequestReturnsPostParamIfNoQueryParamAvailable()
+ {
+ $request = new Request(
+ array(),
+ array('client_id' => 'correct')
+ );
+
+ $this->assertEquals('correct', $request->query('client_id', $request->request('client_id')));
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ // Add the two types supported for authorization grant
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/ResponseTest.php b/library/oauth2/test/OAuth2/ResponseTest.php
new file mode 100644
index 000000000..b8149005d
--- /dev/null
+++ b/library/oauth2/test/OAuth2/ResponseTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace OAuth2;
+
+class ResponseTest extends \PHPUnit_Framework_TestCase
+{
+ public function testRenderAsXml()
+ {
+ $response = new Response(array(
+ 'foo' => 'bar',
+ 'halland' => 'oates',
+ ));
+
+ $string = $response->getResponseBody('xml');
+ $this->assertContains('<response><foo>bar</foo><halland>oates</halland></response>', $string);
+ }
+}
diff --git a/library/oauth2/test/OAuth2/ResponseType/AccessTokenTest.php b/library/oauth2/test/OAuth2/ResponseType/AccessTokenTest.php
new file mode 100644
index 000000000..0ed1c82fc
--- /dev/null
+++ b/library/oauth2/test/OAuth2/ResponseType/AccessTokenTest.php
@@ -0,0 +1,107 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Storage\Memory;
+
+class AccessTokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function testRevokeAccessTokenWithTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'access_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
+ $accessToken = new AccessToken($tokenStorage);
+ $accessToken->revokeToken('revoke', 'access_token');
+ $this->assertFalse($tokenStorage->getAccessToken('revoke'));
+ }
+
+ public function testRevokeAccessTokenWithoutTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'access_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
+ $accessToken = new AccessToken($tokenStorage);
+ $accessToken->revokeToken('revoke');
+ $this->assertFalse($tokenStorage->getAccessToken('revoke'));
+ }
+
+ public function testRevokeRefreshTokenWithTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'refresh_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getRefreshToken('revoke'));
+ $accessToken = new AccessToken(new Memory, $tokenStorage);
+ $accessToken->revokeToken('revoke', 'refresh_token');
+ $this->assertFalse($tokenStorage->getRefreshToken('revoke'));
+ }
+
+ public function testRevokeRefreshTokenWithoutTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'refresh_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getRefreshToken('revoke'));
+ $accessToken = new AccessToken(new Memory, $tokenStorage);
+ $accessToken->revokeToken('revoke');
+ $this->assertFalse($tokenStorage->getRefreshToken('revoke'));
+ }
+
+ public function testRevokeAccessTokenWithRefreshTokenTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'access_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
+ $accessToken = new AccessToken($tokenStorage);
+ $accessToken->revokeToken('revoke', 'refresh_token');
+ $this->assertFalse($tokenStorage->getAccessToken('revoke'));
+ }
+
+ public function testRevokeAccessTokenWithBogusTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'access_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
+ $accessToken = new AccessToken($tokenStorage);
+ $accessToken->revokeToken('revoke', 'foo');
+ $this->assertFalse($tokenStorage->getAccessToken('revoke'));
+ }
+
+ public function testRevokeRefreshTokenWithBogusTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'refresh_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getRefreshToken('revoke'));
+ $accessToken = new AccessToken(new Memory, $tokenStorage);
+ $accessToken->revokeToken('revoke', 'foo');
+ $this->assertFalse($tokenStorage->getRefreshToken('revoke'));
+ }
+}
diff --git a/library/oauth2/test/OAuth2/ResponseType/JwtAccessTokenTest.php b/library/oauth2/test/OAuth2/ResponseType/JwtAccessTokenTest.php
new file mode 100644
index 000000000..51b01a927
--- /dev/null
+++ b/library/oauth2/test/OAuth2/ResponseType/JwtAccessTokenTest.php
@@ -0,0 +1,160 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Response;
+use OAuth2\Request\TestRequest;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Storage\JwtAccessToken as JwtAccessTokenStorage;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\GrantType\UserCredentials;
+use OAuth2\GrantType\RefreshToken;
+use OAuth2\Encryption\Jwt;
+
+class JwtAccessTokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function testCreateAccessToken()
+ {
+ $server = $this->getTestServer();
+ $jwtResponseType = $server->getResponseType('token');
+
+ $accessToken = $jwtResponseType->createAccessToken('Test Client ID', 123, 'test', false);
+ $jwt = new Jwt;
+ $decodedAccessToken = $jwt->decode($accessToken['access_token'], null, false);
+
+ $this->assertArrayHasKey('id', $decodedAccessToken);
+ $this->assertArrayHasKey('jti', $decodedAccessToken);
+ $this->assertArrayHasKey('iss', $decodedAccessToken);
+ $this->assertArrayHasKey('aud', $decodedAccessToken);
+ $this->assertArrayHasKey('exp', $decodedAccessToken);
+ $this->assertArrayHasKey('iat', $decodedAccessToken);
+ $this->assertArrayHasKey('token_type', $decodedAccessToken);
+ $this->assertArrayHasKey('scope', $decodedAccessToken);
+
+ $this->assertEquals('https://api.example.com', $decodedAccessToken['iss']);
+ $this->assertEquals('Test Client ID', $decodedAccessToken['aud']);
+ $this->assertEquals(123, $decodedAccessToken['sub']);
+ $delta = $decodedAccessToken['exp'] - $decodedAccessToken['iat'];
+ $this->assertEquals(3600, $delta);
+ $this->assertEquals($decodedAccessToken['id'], $decodedAccessToken['jti']);
+ }
+
+ public function testGrantJwtAccessToken()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertNotNull($response->getParameter('access_token'));
+ $this->assertEquals(2, substr_count($response->getParameter('access_token'), '.'));
+ }
+
+ public function testAccessResourceWithJwtAccessToken()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertNotNull($JwtAccessToken = $response->getParameter('access_token'));
+
+ // make a call to the resource server using the crypto token
+ $request = TestRequest::createPost(array(
+ 'access_token' => $JwtAccessToken,
+ ));
+
+ $this->assertTrue($server->verifyResourceRequest($request));
+ }
+
+ public function testAccessResourceWithJwtAccessTokenUsingSecondaryStorage()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertNotNull($JwtAccessToken = $response->getParameter('access_token'));
+
+ // make a call to the resource server using the crypto token
+ $request = TestRequest::createPost(array(
+ 'access_token' => $JwtAccessToken,
+ ));
+
+ // create a resource server with the "memory" storage from the grant server
+ $resourceServer = new Server($server->getStorage('client_credentials'));
+
+ $this->assertTrue($resourceServer->verifyResourceRequest($request));
+ }
+
+ public function testJwtAccessTokenWithRefreshToken()
+ {
+ $server = $this->getTestServer();
+
+ // add "UserCredentials" grant type and "JwtAccessToken" response type
+ // and ensure "JwtAccessToken" response type has "RefreshToken" storage
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $server->addGrantType(new UserCredentials($memoryStorage));
+ $server->addGrantType(new RefreshToken($memoryStorage));
+ $server->addResponseType(new JwtAccessToken($memoryStorage, $memoryStorage, $memoryStorage), 'token');
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+
+ // make the call to grant a crypto token
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertNotNull($JwtAccessToken = $response->getParameter('access_token'));
+ $this->assertNotNull($refreshToken = $response->getParameter('refresh_token'));
+
+ // decode token and make sure refresh_token isn't set
+ list($header, $payload, $signature) = explode('.', $JwtAccessToken);
+ $decodedToken = json_decode(base64_decode($payload), true);
+ $this->assertFalse(array_key_exists('refresh_token', $decodedToken));
+
+ // use the refresh token to get another access token
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token',
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => $refreshToken,
+ ));
+
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertNotNull($response->getParameter('access_token'));
+ }
+
+ private function getTestServer()
+ {
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+
+ $storage = array(
+ 'access_token' => new JwtAccessTokenStorage($memoryStorage),
+ 'client' => $memoryStorage,
+ 'client_credentials' => $memoryStorage,
+ );
+ $server = new Server($storage);
+ $server->addGrantType(new ClientCredentials($memoryStorage));
+
+ // make the "token" response type a JwtAccessToken
+ $config = array('issuer' => 'https://api.example.com');
+ $server->addResponseType(new JwtAccessToken($memoryStorage, $memoryStorage, null, $config));
+
+ return $server;
+ }
+}
diff --git a/library/oauth2/test/OAuth2/ScopeTest.php b/library/oauth2/test/OAuth2/ScopeTest.php
new file mode 100644
index 000000000..99f9cf6eb
--- /dev/null
+++ b/library/oauth2/test/OAuth2/ScopeTest.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Storage\Memory;
+
+class ScopeTest extends \PHPUnit_Framework_TestCase
+{
+ public function testCheckScope()
+ {
+ $scopeUtil = new Scope();
+
+ $this->assertFalse($scopeUtil->checkScope('invalid', 'list of scopes'));
+ $this->assertTrue($scopeUtil->checkScope('valid', 'valid and-some other-scopes'));
+ $this->assertTrue($scopeUtil->checkScope('valid another-valid', 'valid another-valid and-some other-scopes'));
+ // all scopes must match
+ $this->assertFalse($scopeUtil->checkScope('valid invalid', 'valid and-some other-scopes'));
+ $this->assertFalse($scopeUtil->checkScope('valid valid2 invalid', 'valid valid2 and-some other-scopes'));
+ }
+
+ public function testScopeStorage()
+ {
+ $scopeUtil = new Scope();
+ $this->assertEquals($scopeUtil->getDefaultScope(), null);
+
+ $scopeUtil = new Scope(array(
+ 'default_scope' => 'default',
+ 'supported_scopes' => array('this', 'that', 'another'),
+ ));
+ $this->assertEquals($scopeUtil->getDefaultScope(), 'default');
+ $this->assertTrue($scopeUtil->scopeExists('this that another', 'client_id'));
+
+ $memoryStorage = new Memory(array(
+ 'default_scope' => 'base',
+ 'supported_scopes' => array('only-this-one'),
+ ));
+ $scopeUtil = new Scope($memoryStorage);
+
+ $this->assertEquals($scopeUtil->getDefaultScope(), 'base');
+ $this->assertTrue($scopeUtil->scopeExists('only-this-one', 'client_id'));
+ }
+}
diff --git a/library/oauth2/test/OAuth2/ServerTest.php b/library/oauth2/test/OAuth2/ServerTest.php
new file mode 100644
index 000000000..747e120f5
--- /dev/null
+++ b/library/oauth2/test/OAuth2/ServerTest.php
@@ -0,0 +1,684 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Request\TestRequest;
+use OAuth2\ResponseType\AuthorizationCode;
+use OAuth2\Storage\Bootstrap;
+
+class ServerTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @expectedException LogicException OAuth2\Storage\ClientInterface
+ **/
+ public function testGetAuthorizeControllerWithNoClientStorageThrowsException()
+ {
+ // must set Client Storage
+ $server = new Server();
+ $server->getAuthorizeController();
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\AccessTokenInterface
+ **/
+ public function testGetAuthorizeControllerWithNoAccessTokenStorageThrowsException()
+ {
+ // must set AccessToken or AuthorizationCode
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->getAuthorizeController();
+ }
+
+ public function testGetAuthorizeControllerWithClientStorageAndAccessTokenResponseType()
+ {
+ // must set AccessToken or AuthorizationCode
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addResponseType($this->getMock('OAuth2\ResponseType\AccessTokenInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ public function testGetAuthorizeControllerWithClientStorageAndAuthorizationCodeResponseType()
+ {
+ // must set AccessToken or AuthorizationCode
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addResponseType($this->getMock('OAuth2\ResponseType\AuthorizationCodeInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ /**
+ * @expectedException LogicException allow_implicit
+ **/
+ public function testGetAuthorizeControllerWithClientStorageAndAccessTokenStorageThrowsException()
+ {
+ // must set AuthorizationCode or AccessToken / implicit
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ public function testGetAuthorizeControllerWithClientStorageAndAccessTokenStorage()
+ {
+ // must set AuthorizationCode or AccessToken / implicit
+ $server = new Server(array(), array('allow_implicit' => true));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ public function testGetAuthorizeControllerWithClientStorageAndAuthorizationCodeStorage()
+ {
+ // must set AccessToken or AuthorizationCode
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\AuthorizationCodeInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ /**
+ * @expectedException LogicException grant_types
+ **/
+ public function testGetTokenControllerWithGrantTypeStorageThrowsException()
+ {
+ $server = new Server();
+ $server->getTokenController();
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\ClientCredentialsInterface
+ **/
+ public function testGetTokenControllerWithNoClientCredentialsStorageThrowsException()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\UserCredentialsInterface'));
+ $server->getTokenController();
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\AccessTokenInterface
+ **/
+ public function testGetTokenControllerWithNoAccessTokenStorageThrowsException()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+ $server->getTokenController();
+ }
+
+ public function testGetTokenControllerWithAccessTokenAndClientCredentialsStorage()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+ $server->getTokenController();
+ }
+
+ public function testGetTokenControllerAccessTokenStorageAndClientCredentialsStorageAndGrantTypes()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+ $server->addGrantType($this->getMockBuilder('OAuth2\GrantType\AuthorizationCode')->disableOriginalConstructor()->getMock());
+ $server->getTokenController();
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\AccessTokenInterface
+ **/
+ public function testGetResourceControllerWithNoAccessTokenStorageThrowsException()
+ {
+ $server = new Server();
+ $server->getResourceController();
+ }
+
+ public function testGetResourceControllerWithAccessTokenStorage()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+ $server->getResourceController();
+ }
+
+ /**
+ * @expectedException InvalidArgumentException OAuth2\Storage\AccessTokenInterface
+ **/
+ public function testAddingStorageWithInvalidClass()
+ {
+ $server = new Server();
+ $server->addStorage(new \StdClass());
+ }
+
+ /**
+ * @expectedException InvalidArgumentException access_token
+ **/
+ public function testAddingStorageWithInvalidKey()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'), 'nonexistant_storage');
+ }
+
+ /**
+ * @expectedException InvalidArgumentException OAuth2\Storage\AuthorizationCodeInterface
+ **/
+ public function testAddingStorageWithInvalidKeyStorageCombination()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'), 'authorization_code');
+ }
+
+ public function testAddingStorageWithValidKeyOnlySetsThatKey()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\Memory'), 'access_token');
+
+ $reflection = new \ReflectionClass($server);
+ $prop = $reflection->getProperty('storages');
+ $prop->setAccessible(true);
+
+ $storages = $prop->getValue($server); // get the private "storages" property
+
+ $this->assertEquals(1, count($storages));
+ $this->assertTrue(isset($storages['access_token']));
+ $this->assertFalse(isset($storages['authorization_code']));
+ }
+
+ public function testAddingClientStorageSetsClientCredentialsStorageByDefault()
+ {
+ $server = new Server();
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+ $server->addStorage($memory, 'client');
+
+ $client_credentials = $server->getStorage('client_credentials');
+
+ $this->assertNotNull($client_credentials);
+ $this->assertEquals($client_credentials, $memory);
+ }
+
+ public function testAddStorageWithNullValue()
+ {
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+ $server = new Server($memory);
+ $server->addStorage(null, 'refresh_token');
+
+ $client_credentials = $server->getStorage('client_credentials');
+
+ $this->assertNotNull($client_credentials);
+ $this->assertEquals($client_credentials, $memory);
+
+ $refresh_token = $server->getStorage('refresh_token');
+
+ $this->assertNull($refresh_token);
+ }
+
+ public function testNewServerWithNullStorageValue()
+ {
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+ $server = new Server(array(
+ 'client_credentials' => $memory,
+ 'refresh_token' => null,
+ ));
+
+ $client_credentials = $server->getStorage('client_credentials');
+
+ $this->assertNotNull($client_credentials);
+ $this->assertEquals($client_credentials, $memory);
+
+ $refresh_token = $server->getStorage('refresh_token');
+
+ $this->assertNull($refresh_token);
+ }
+
+ public function testAddingClientCredentialsStorageSetsClientStorageByDefault()
+ {
+ $server = new Server();
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+ $server->addStorage($memory, 'client_credentials');
+
+ $client = $server->getStorage('client');
+
+ $this->assertNotNull($client);
+ $this->assertEquals($client, $memory);
+ }
+
+ public function testSettingClientStorageByDefaultDoesNotOverrideSetStorage()
+ {
+ $server = new Server();
+ $pdo = $this->getMockBuilder('OAuth2\Storage\Pdo')
+ ->disableOriginalConstructor()->getMock();
+
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+
+ $server->addStorage($pdo, 'client');
+ $server->addStorage($memory, 'client_credentials');
+
+ $client = $server->getStorage('client');
+ $client_credentials = $server->getStorage('client_credentials');
+
+ $this->assertEquals($client, $pdo);
+ $this->assertEquals($client_credentials, $memory);
+ }
+
+ public function testAddingResponseType()
+ {
+ $storage = $this->getMock('OAuth2\Storage\Memory');
+ $storage
+ ->expects($this->any())
+ ->method('getClientDetails')
+ ->will($this->returnValue(array('client_id' => 'some_client')));
+ $storage
+ ->expects($this->any())
+ ->method('checkRestrictedGrantType')
+ ->will($this->returnValue(true));
+
+ // add with the "code" key explicitly set
+ $codeType = new AuthorizationCode($storage);
+ $server = new Server();
+ $server->addStorage($storage);
+ $server->addResponseType($codeType);
+ $request = new Request(array(
+ 'response_type' => 'code',
+ 'client_id' => 'some_client',
+ 'redirect_uri' => 'http://example.com',
+ 'state' => 'xyx',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ // the response is successful
+ $this->assertEquals($response->getStatusCode(), 302);
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['query'], $query);
+ $this->assertTrue(isset($query['code']));
+ $this->assertFalse(isset($query['error']));
+
+ // add with the "code" key not set
+ $codeType = new AuthorizationCode($storage);
+ $server = new Server(array($storage), array(), array(), array($codeType));
+ $request = new Request(array(
+ 'response_type' => 'code',
+ 'client_id' => 'some_client',
+ 'redirect_uri' => 'http://example.com',
+ 'state' => 'xyx',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ // the response is successful
+ $this->assertEquals($response->getStatusCode(), 302);
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['query'], $query);
+ $this->assertTrue(isset($query['code']));
+ $this->assertFalse(isset($query['error']));
+ }
+
+ public function testCustomClientAssertionType()
+ {
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code',
+ 'client_id' =>'Test Client ID',
+ 'code' => 'testcode',
+ ));
+ // verify the mock clientAssertionType was called as expected
+ $clientAssertionType = $this->getMock('OAuth2\ClientAssertionType\ClientAssertionTypeInterface', array('validateRequest', 'getClientId'));
+ $clientAssertionType
+ ->expects($this->once())
+ ->method('validateRequest')
+ ->will($this->returnValue(true));
+ $clientAssertionType
+ ->expects($this->once())
+ ->method('getClientId')
+ ->will($this->returnValue('Test Client ID'));
+
+ // create mock storage
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server(array($storage), array(), array(), array(), null, null, $clientAssertionType);
+ $server->handleTokenRequest($request, $response = new Response());
+ }
+
+ public function testHttpBasicConfig()
+ {
+ // create mock storage
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server(array($storage), array(
+ 'allow_credentials_in_request_body' => false,
+ 'allow_public_clients' => false
+ ));
+ $server->getTokenController();
+ $httpBasic = $server->getClientAssertionType();
+
+ $reflection = new \ReflectionClass($httpBasic);
+ $prop = $reflection->getProperty('config');
+ $prop->setAccessible(true);
+
+ $config = $prop->getValue($httpBasic); // get the private "config" property
+
+ $this->assertEquals($config['allow_credentials_in_request_body'], false);
+ $this->assertEquals($config['allow_public_clients'], false);
+ }
+
+ public function testRefreshTokenConfig()
+ {
+ // create mock storage
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server1 = new Server(array($storage));
+ $server2 = new Server(array($storage), array('always_issue_new_refresh_token' => true, 'unset_refresh_token_after_use' => false));
+
+ $server1->getTokenController();
+ $refreshToken1 = $server1->getGrantType('refresh_token');
+
+ $server2->getTokenController();
+ $refreshToken2 = $server2->getGrantType('refresh_token');
+
+ $reflection1 = new \ReflectionClass($refreshToken1);
+ $prop1 = $reflection1->getProperty('config');
+ $prop1->setAccessible(true);
+
+ $reflection2 = new \ReflectionClass($refreshToken2);
+ $prop2 = $reflection2->getProperty('config');
+ $prop2->setAccessible(true);
+
+ // get the private "config" property
+ $config1 = $prop1->getValue($refreshToken1);
+ $config2 = $prop2->getValue($refreshToken2);
+
+ $this->assertEquals($config1['always_issue_new_refresh_token'], false);
+ $this->assertEquals($config2['always_issue_new_refresh_token'], true);
+
+ $this->assertEquals($config1['unset_refresh_token_after_use'], true);
+ $this->assertEquals($config2['unset_refresh_token_after_use'], false);
+ }
+
+ /**
+ * Test setting "always_issue_new_refresh_token" on a server level
+ *
+ * @see test/OAuth2/GrantType/RefreshTokenTest::testValidRefreshTokenWithNewRefreshTokenInResponse
+ **/
+ public function testValidRefreshTokenWithNewRefreshTokenInResponse()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, array('always_issue_new_refresh_token' => true));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertTrue(isset($token['refresh_token']), 'refresh token should always refresh');
+
+ $refresh_token = $storage->getRefreshToken($token['refresh_token']);
+ $this->assertNotNull($refresh_token);
+ $this->assertEquals($refresh_token['refresh_token'], $token['refresh_token']);
+ $this->assertEquals($refresh_token['client_id'], $request->request('client_id'));
+ $this->assertTrue($token['refresh_token'] != 'test-refreshtoken', 'the refresh token returned is not the one used');
+ $used_token = $storage->getRefreshToken('test-refreshtoken');
+ $this->assertFalse($used_token, 'the refresh token used is no longer valid');
+ }
+
+ /**
+ * @expectedException InvalidArgumentException OAuth2\ResponseType\AuthorizationCodeInterface
+ **/
+ public function testAddingUnknownResponseTypeThrowsException()
+ {
+ $server = new Server();
+ $server->addResponseType($this->getMock('OAuth2\ResponseType\ResponseTypeInterface'));
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\PublicKeyInterface
+ **/
+ public function testUsingJwtAccessTokensWithoutPublicKeyStorageThrowsException()
+ {
+ $server = new Server(array(), array('use_jwt_access_tokens' => true));
+ $server->addGrantType($this->getMock('OAuth2\GrantType\GrantTypeInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+
+ $server->getTokenController();
+ }
+
+ public function testUsingJustJwtAccessTokenStorageWithResourceControllerIsOkay()
+ {
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($pubkey), array('use_jwt_access_tokens' => true));
+
+ $this->assertNotNull($server->getResourceController());
+ $this->assertInstanceOf('OAuth2\Storage\PublicKeyInterface', $server->getStorage('public_key'));
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\ClientInterface
+ **/
+ public function testUsingJustJwtAccessTokenStorageWithAuthorizeControllerThrowsException()
+ {
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($pubkey), array('use_jwt_access_tokens' => true));
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ /**
+ * @expectedException LogicException grant_types
+ **/
+ public function testUsingJustJwtAccessTokenStorageWithTokenControllerThrowsException()
+ {
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($pubkey), array('use_jwt_access_tokens' => true));
+ $server->getTokenController();
+ }
+
+ public function testUsingJwtAccessTokenAndClientStorageWithAuthorizeControllerIsOkay()
+ {
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $server = new Server(array($pubkey, $client), array('use_jwt_access_tokens' => true, 'allow_implicit' => true));
+ $this->assertNotNull($server->getAuthorizeController());
+
+ $this->assertInstanceOf('OAuth2\ResponseType\JwtAccessToken', $server->getResponseType('token'));
+ }
+
+ /**
+ * @expectedException LogicException UserClaims
+ **/
+ public function testUsingOpenIDConnectWithoutUserClaimsThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $server = new Server($client, array('use_openid_connect' => true));
+
+ $server->getAuthorizeController();
+ }
+
+ /**
+ * @expectedException LogicException PublicKeyInterface
+ **/
+ public function testUsingOpenIDConnectWithoutPublicKeyThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OPenID\Storage\UserClaimsInterface');
+ $server = new Server(array($client, $userclaims), array('use_openid_connect' => true));
+
+ $server->getAuthorizeController();
+ }
+
+ /**
+ * @expectedException LogicException issuer
+ **/
+ public function testUsingOpenIDConnectWithoutIssuerThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array('use_openid_connect' => true));
+
+ $server->getAuthorizeController();
+ }
+
+ public function testUsingOpenIDConnectWithIssuerPublicKeyAndUserClaimsIsOkay()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ ));
+
+ $server->getAuthorizeController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
+ $this->assertNull($server->getResponseType('id_token token'));
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\ResponseType\AccessTokenInterface
+ **/
+ public function testUsingOpenIDConnectWithAllowImplicitWithoutTokenStorageThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ 'allow_implicit' => true,
+ ));
+
+ $server->getAuthorizeController();
+ }
+
+ public function testUsingOpenIDConnectWithAllowImplicitAndUseJwtAccessTokensIsOkay()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ 'allow_implicit' => true,
+ 'use_jwt_access_tokens' => true,
+ ));
+
+ $server->getAuthorizeController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenTokenInterface', $server->getResponseType('id_token token'));
+ }
+
+ public function testUsingOpenIDConnectWithAllowImplicitAndAccessTokenStorageIsOkay()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
+ $server = new Server(array($client, $userclaims, $pubkey, $token), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ 'allow_implicit' => true,
+ ));
+
+ $server->getAuthorizeController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenTokenInterface', $server->getResponseType('id_token token'));
+ }
+
+ public function testUsingOpenIDConnectWithAllowImplicitAndAccessTokenResponseTypeIsOkay()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ // $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ 'allow_implicit' => true,
+ ));
+
+ $token = $this->getMock('OAuth2\ResponseType\AccessTokenInterface');
+ $server->addResponseType($token, 'token');
+
+ $server->getAuthorizeController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenTokenInterface', $server->getResponseType('id_token token'));
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\OpenID\Storage\AuthorizationCodeInterface
+ **/
+ public function testUsingOpenIDConnectWithAuthorizationCodeStorageThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientCredentialsInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
+ $authcode = $this->getMock('OAuth2\Storage\AuthorizationCodeInterface');
+
+ $server = new Server(array($client, $userclaims, $pubkey, $token, $authcode), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy'
+ ));
+
+ $server->getTokenController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\GrantType\AuthorizationCode', $server->getGrantType('authorization_code'));
+ }
+
+ public function testUsingOpenIDConnectWithOpenIDAuthorizationCodeStorageCreatesOpenIDAuthorizationCodeGrantType()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientCredentialsInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
+ $authcode = $this->getMock('OAuth2\OpenID\Storage\AuthorizationCodeInterface');
+
+ $server = new Server(array($client, $userclaims, $pubkey, $token, $authcode), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy'
+ ));
+
+ $server->getTokenController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\GrantType\AuthorizationCode', $server->getGrantType('authorization_code'));
+ }
+
+ public function testMultipleValuedResponseTypeOrderDoesntMatter()
+ {
+ $responseType = $this->getMock('OAuth2\OpenID\ResponseType\IdTokenTokenInterface');
+ $server = new Server(array(), array(), array(), array(
+ 'token id_token' => $responseType,
+ ));
+
+ $this->assertEquals($responseType, $server->getResponseType('id_token token'));
+ }
+
+ public function testAddGrantTypeWithoutKey()
+ {
+ $server = new Server();
+ $server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($this->getMock('OAuth2\Storage\AuthorizationCodeInterface')));
+
+ $grantTypes = $server->getGrantTypes();
+ $this->assertEquals('authorization_code', key($grantTypes));
+ }
+
+ public function testAddGrantTypeWithKey()
+ {
+ $server = new Server();
+ $server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($this->getMock('OAuth2\Storage\AuthorizationCodeInterface')), 'ac');
+
+ $grantTypes = $server->getGrantTypes();
+ $this->assertEquals('ac', key($grantTypes));
+ }
+
+ public function testAddGrantTypeWithKeyNotString()
+ {
+ $server = new Server();
+ $server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($this->getMock('OAuth2\Storage\AuthorizationCodeInterface')), 42);
+
+ $grantTypes = $server->getGrantTypes();
+ $this->assertEquals('authorization_code', key($grantTypes));
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Storage/AccessTokenTest.php b/library/oauth2/test/OAuth2/Storage/AccessTokenTest.php
new file mode 100644
index 000000000..b34e0bfc0
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Storage/AccessTokenTest.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class AccessTokenTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testSetAccessToken(AccessTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert token we are about to add does not exist
+ $token = $storage->getAccessToken('newtoken');
+ $this->assertFalse($token);
+
+ // add new token
+ $expires = time() + 20;
+ $success = $storage->setAccessToken('newtoken', 'client ID', 'SOMEUSERID', $expires);
+ $this->assertTrue($success);
+
+ $token = $storage->getAccessToken('newtoken');
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('client_id', $token);
+ $this->assertArrayHasKey('user_id', $token);
+ $this->assertArrayHasKey('expires', $token);
+ $this->assertEquals($token['access_token'], 'newtoken');
+ $this->assertEquals($token['client_id'], 'client ID');
+ $this->assertEquals($token['user_id'], 'SOMEUSERID');
+ $this->assertEquals($token['expires'], $expires);
+
+ // change existing token
+ $expires = time() + 42;
+ $success = $storage->setAccessToken('newtoken', 'client ID2', 'SOMEOTHERID', $expires);
+ $this->assertTrue($success);
+
+ $token = $storage->getAccessToken('newtoken');
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('client_id', $token);
+ $this->assertArrayHasKey('user_id', $token);
+ $this->assertArrayHasKey('expires', $token);
+ $this->assertEquals($token['access_token'], 'newtoken');
+ $this->assertEquals($token['client_id'], 'client ID2');
+ $this->assertEquals($token['user_id'], 'SOMEOTHERID');
+ $this->assertEquals($token['expires'], $expires);
+
+ // add token with scope having an empty string value
+ $expires = time() + 42;
+ $success = $storage->setAccessToken('newtoken', 'client ID', 'SOMEOTHERID', $expires, '');
+ $this->assertTrue($success);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testUnsetAccessToken(AccessTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage || !method_exists($storage, 'unsetAccessToken')) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert token we are about to unset does not exist
+ $token = $storage->getAccessToken('revokabletoken');
+ $this->assertFalse($token);
+
+ // add new token
+ $expires = time() + 20;
+ $success = $storage->setAccessToken('revokabletoken', 'client ID', 'SOMEUSERID', $expires);
+ $this->assertTrue($success);
+
+ // assert unsetAccessToken returns true
+ $result = $storage->unsetAccessToken('revokabletoken');
+ $this->assertTrue($result);
+
+ // assert token we unset does not exist
+ $token = $storage->getAccessToken('revokabletoken');
+ $this->assertFalse($token);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testUnsetAccessTokenReturnsFalse(AccessTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage || !method_exists($storage, 'unsetAccessToken')) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert token we are about to unset does not exist
+ $token = $storage->getAccessToken('nonexistanttoken');
+ $this->assertFalse($token);
+
+ // assert unsetAccessToken returns false
+ $result = $storage->unsetAccessToken('nonexistanttoken');
+ $this->assertFalse($result);
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Storage/AuthorizationCodeTest.php b/library/oauth2/test/OAuth2/Storage/AuthorizationCodeTest.php
new file mode 100644
index 000000000..2d901b501
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Storage/AuthorizationCodeTest.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class AuthorizationCodeTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testGetAuthorizationCode(AuthorizationCodeInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $details = $storage->getAuthorizationCode('faketoken');
+ $this->assertFalse($details);
+
+ // valid client_id
+ $details = $storage->getAuthorizationCode('testtoken');
+ $this->assertNotNull($details);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testSetAuthorizationCode(AuthorizationCodeInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert code we are about to add does not exist
+ $code = $storage->getAuthorizationCode('newcode');
+ $this->assertFalse($code);
+
+ // add new code
+ $expires = time() + 20;
+ $success = $storage->setAuthorizationCode('newcode', 'client ID', 'SOMEUSERID', 'http://example.com', $expires);
+ $this->assertTrue($success);
+
+ $code = $storage->getAuthorizationCode('newcode');
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertArrayHasKey('client_id', $code);
+ $this->assertArrayHasKey('user_id', $code);
+ $this->assertArrayHasKey('redirect_uri', $code);
+ $this->assertArrayHasKey('expires', $code);
+ $this->assertEquals($code['authorization_code'], 'newcode');
+ $this->assertEquals($code['client_id'], 'client ID');
+ $this->assertEquals($code['user_id'], 'SOMEUSERID');
+ $this->assertEquals($code['redirect_uri'], 'http://example.com');
+ $this->assertEquals($code['expires'], $expires);
+
+ // change existing code
+ $expires = time() + 42;
+ $success = $storage->setAuthorizationCode('newcode', 'client ID2', 'SOMEOTHERID', 'http://example.org', $expires);
+ $this->assertTrue($success);
+
+ $code = $storage->getAuthorizationCode('newcode');
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertArrayHasKey('client_id', $code);
+ $this->assertArrayHasKey('user_id', $code);
+ $this->assertArrayHasKey('redirect_uri', $code);
+ $this->assertArrayHasKey('expires', $code);
+ $this->assertEquals($code['authorization_code'], 'newcode');
+ $this->assertEquals($code['client_id'], 'client ID2');
+ $this->assertEquals($code['user_id'], 'SOMEOTHERID');
+ $this->assertEquals($code['redirect_uri'], 'http://example.org');
+ $this->assertEquals($code['expires'], $expires);
+
+ // add new code with scope having an empty string value
+ $expires = time() + 20;
+ $success = $storage->setAuthorizationCode('newcode', 'client ID', 'SOMEUSERID', 'http://example.com', $expires, '');
+ $this->assertTrue($success);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testExpireAccessToken(AccessTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // create a valid code
+ $expires = time() + 20;
+ $success = $storage->setAuthorizationCode('code-to-expire', 'client ID', 'SOMEUSERID', 'http://example.com', time() + 20);
+ $this->assertTrue($success);
+
+ // verify the new code exists
+ $code = $storage->getAuthorizationCode('code-to-expire');
+ $this->assertNotNull($code);
+
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertEquals($code['authorization_code'], 'code-to-expire');
+
+ // now expire the code and ensure it's no longer available
+ $storage->expireAuthorizationCode('code-to-expire');
+ $code = $storage->getAuthorizationCode('code-to-expire');
+ $this->assertFalse($code);
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Storage/ClientCredentialsTest.php b/library/oauth2/test/OAuth2/Storage/ClientCredentialsTest.php
new file mode 100644
index 000000000..15289af30
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Storage/ClientCredentialsTest.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class ClientCredentialsTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testCheckClientCredentials(ClientCredentialsInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $pass = $storage->checkClientCredentials('fakeclient', 'testpass');
+ $this->assertFalse($pass);
+
+ // invalid password
+ $pass = $storage->checkClientCredentials('oauth_test_client', 'invalidcredentials');
+ $this->assertFalse($pass);
+
+ // valid credentials
+ $pass = $storage->checkClientCredentials('oauth_test_client', 'testpass');
+ $this->assertTrue($pass);
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Storage/ClientTest.php b/library/oauth2/test/OAuth2/Storage/ClientTest.php
new file mode 100644
index 000000000..6a5cc0b49
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Storage/ClientTest.php
@@ -0,0 +1,110 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class ClientTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testGetClientDetails(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $details = $storage->getClientDetails('fakeclient');
+ $this->assertFalse($details);
+
+ // valid client_id
+ $details = $storage->getClientDetails('oauth_test_client');
+ $this->assertNotNull($details);
+ $this->assertArrayHasKey('client_id', $details);
+ $this->assertArrayHasKey('client_secret', $details);
+ $this->assertArrayHasKey('redirect_uri', $details);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testCheckRestrictedGrantType(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // Check invalid
+ $pass = $storage->checkRestrictedGrantType('oauth_test_client', 'authorization_code');
+ $this->assertFalse($pass);
+
+ // Check valid
+ $pass = $storage->checkRestrictedGrantType('oauth_test_client', 'implicit');
+ $this->assertTrue($pass);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testGetAccessToken(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $details = $storage->getAccessToken('faketoken');
+ $this->assertFalse($details);
+
+ // valid client_id
+ $details = $storage->getAccessToken('testtoken');
+ $this->assertNotNull($details);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testIsPublicClient(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ $publicClientId = 'public-client-'.rand();
+ $confidentialClientId = 'confidential-client-'.rand();
+
+ // create a new client
+ $success1 = $storage->setClientDetails($publicClientId, '');
+ $success2 = $storage->setClientDetails($confidentialClientId, 'some-secret');
+ $this->assertTrue($success1);
+ $this->assertTrue($success2);
+
+ // assert isPublicClient for both
+ $this->assertTrue($storage->isPublicClient($publicClientId));
+ $this->assertFalse($storage->isPublicClient($confidentialClientId));
+ }
+
+ /** @dataProvider provideStorage */
+ public function testSaveClient(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ $clientId = 'some-client-'.rand();
+
+ // create a new client
+ $success = $storage->setClientDetails($clientId, 'somesecret', 'http://test.com', 'client_credentials', 'clientscope1', 'brent@brentertainment.com');
+ $this->assertTrue($success);
+
+ // valid client_id
+ $details = $storage->getClientDetails($clientId);
+ $this->assertEquals($details['client_secret'], 'somesecret');
+ $this->assertEquals($details['redirect_uri'], 'http://test.com');
+ $this->assertEquals($details['grant_types'], 'client_credentials');
+ $this->assertEquals($details['scope'], 'clientscope1');
+ $this->assertEquals($details['user_id'], 'brent@brentertainment.com');
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Storage/DynamoDBTest.php b/library/oauth2/test/OAuth2/Storage/DynamoDBTest.php
new file mode 100644
index 000000000..2147f0914
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Storage/DynamoDBTest.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class DynamoDBTest extends BaseTest
+{
+ public function testGetDefaultScope()
+ {
+ $client = $this->getMockBuilder('\Aws\DynamoDb\DynamoDbClient')
+ ->disableOriginalConstructor()
+ ->setMethods(array('query'))
+ ->getMock();
+
+ $return = $this->getMockBuilder('\Guzzle\Service\Resource\Model')
+ ->setMethods(array('count', 'toArray'))
+ ->getMock();
+
+ $data = array(
+ 'Items' => array(),
+ 'Count' => 0,
+ 'ScannedCount'=> 0
+ );
+
+ $return->expects($this->once())
+ ->method('count')
+ ->will($this->returnValue(count($data)));
+
+ $return->expects($this->once())
+ ->method('toArray')
+ ->will($this->returnValue($data));
+
+ // should return null default scope if none is set in database
+ $client->expects($this->once())
+ ->method('query')
+ ->will($this->returnValue($return));
+
+ $storage = new DynamoDB($client);
+ $this->assertNull($storage->getDefaultScope());
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Storage/JwtAccessTokenTest.php b/library/oauth2/test/OAuth2/Storage/JwtAccessTokenTest.php
new file mode 100644
index 000000000..a6acbea1f
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Storage/JwtAccessTokenTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\Encryption\Jwt;
+
+class JwtAccessTokenTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testSetAccessToken($storage)
+ {
+ if (!$storage instanceof PublicKey) {
+ // incompatible storage
+ return;
+ }
+
+ $crypto = new jwtAccessToken($storage);
+
+ $publicKeyStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $encryptionUtil = new Jwt();
+
+ $jwtAccessToken = array(
+ 'access_token' => rand(),
+ 'expires' => time() + 100,
+ 'scope' => 'foo',
+ );
+
+ $token = $encryptionUtil->encode($jwtAccessToken, $storage->getPrivateKey(), $storage->getEncryptionAlgorithm());
+
+ $this->assertNotNull($token);
+
+ $tokenData = $crypto->getAccessToken($token);
+
+ $this->assertTrue(is_array($tokenData));
+
+ /* assert the decoded token is the same */
+ $this->assertEquals($tokenData['access_token'], $jwtAccessToken['access_token']);
+ $this->assertEquals($tokenData['expires'], $jwtAccessToken['expires']);
+ $this->assertEquals($tokenData['scope'], $jwtAccessToken['scope']);
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Storage/JwtBearerTest.php b/library/oauth2/test/OAuth2/Storage/JwtBearerTest.php
new file mode 100644
index 000000000..d0ab9b899
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Storage/JwtBearerTest.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class JwtBearerTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testGetClientKey(JwtBearerInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $key = $storage->getClientKey('this-is-not-real', 'nor-is-this');
+ $this->assertFalse($key);
+
+ // valid client_id and subject
+ $key = $storage->getClientKey('oauth_test_client', 'test_subject');
+ $this->assertNotNull($key);
+ $this->assertEquals($key, Bootstrap::getInstance()->getTestPublicKey());
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Storage/PdoTest.php b/library/oauth2/test/OAuth2/Storage/PdoTest.php
new file mode 100644
index 000000000..57eb39072
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Storage/PdoTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class PdoTest extends BaseTest
+{
+ public function testCreatePdoStorageUsingPdoClass()
+ {
+ $pdo = new \PDO(sprintf('sqlite://%s', Bootstrap::getInstance()->getSqliteDir()));
+ $storage = new Pdo($pdo);
+
+ $this->assertNotNull($storage->getClientDetails('oauth_test_client'));
+ }
+
+ public function testCreatePdoStorageUsingDSN()
+ {
+ $dsn = sprintf('sqlite://%s', Bootstrap::getInstance()->getSqliteDir());
+ $storage = new Pdo($dsn);
+
+ $this->assertNotNull($storage->getClientDetails('oauth_test_client'));
+ }
+
+ public function testCreatePdoStorageUsingConfig()
+ {
+ $config = array('dsn' => sprintf('sqlite://%s', Bootstrap::getInstance()->getSqliteDir()));
+ $storage = new Pdo($config);
+
+ $this->assertNotNull($storage->getClientDetails('oauth_test_client'));
+ }
+
+ /**
+ * @expectedException InvalidArgumentException dsn
+ */
+ public function testCreatePdoStorageWithoutDSNThrowsException()
+ {
+ $config = array('username' => 'brent', 'password' => 'brentisaballer');
+ $storage = new Pdo($config);
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Storage/PublicKeyTest.php b/library/oauth2/test/OAuth2/Storage/PublicKeyTest.php
new file mode 100644
index 000000000..f85195870
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Storage/PublicKeyTest.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class PublicKeyTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testSetAccessToken($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof PublicKeyInterface) {
+ // incompatible storage
+ return;
+ }
+
+ $configDir = Bootstrap::getInstance()->getConfigDir();
+ $globalPublicKey = file_get_contents($configDir.'/keys/id_rsa.pub');
+ $globalPrivateKey = file_get_contents($configDir.'/keys/id_rsa');
+
+ /* assert values from storage */
+ $this->assertEquals($storage->getPublicKey(), $globalPublicKey);
+ $this->assertEquals($storage->getPrivateKey(), $globalPrivateKey);
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Storage/RefreshTokenTest.php b/library/oauth2/test/OAuth2/Storage/RefreshTokenTest.php
new file mode 100644
index 000000000..314c93195
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Storage/RefreshTokenTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class RefreshTokenTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testSetRefreshToken(RefreshTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert token we are about to add does not exist
+ $token = $storage->getRefreshToken('refreshtoken');
+ $this->assertFalse($token);
+
+ // add new token
+ $expires = time() + 20;
+ $success = $storage->setRefreshToken('refreshtoken', 'client ID', 'SOMEUSERID', $expires);
+ $this->assertTrue($success);
+
+ $token = $storage->getRefreshToken('refreshtoken');
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('refresh_token', $token);
+ $this->assertArrayHasKey('client_id', $token);
+ $this->assertArrayHasKey('user_id', $token);
+ $this->assertArrayHasKey('expires', $token);
+ $this->assertEquals($token['refresh_token'], 'refreshtoken');
+ $this->assertEquals($token['client_id'], 'client ID');
+ $this->assertEquals($token['user_id'], 'SOMEUSERID');
+ $this->assertEquals($token['expires'], $expires);
+
+ // add token with scope having an empty string value
+ $expires = time() + 20;
+ $success = $storage->setRefreshToken('refreshtoken2', 'client ID', 'SOMEUSERID', $expires, '');
+ $this->assertTrue($success);
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Storage/ScopeTest.php b/library/oauth2/test/OAuth2/Storage/ScopeTest.php
new file mode 100644
index 000000000..fd1edeb93
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Storage/ScopeTest.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\Scope;
+
+class ScopeTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testScopeExists($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof ScopeInterface) {
+ // incompatible storage
+ return;
+ }
+
+ //Test getting scopes
+ $scopeUtil = new Scope($storage);
+ $this->assertTrue($scopeUtil->scopeExists('supportedscope1'));
+ $this->assertTrue($scopeUtil->scopeExists('supportedscope1 supportedscope2 supportedscope3'));
+ $this->assertFalse($scopeUtil->scopeExists('fakescope'));
+ $this->assertFalse($scopeUtil->scopeExists('supportedscope1 supportedscope2 supportedscope3 fakescope'));
+ }
+
+ /** @dataProvider provideStorage */
+ public function testGetDefaultScope($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof ScopeInterface) {
+ // incompatible storage
+ return;
+ }
+
+ // test getting default scope
+ $scopeUtil = new Scope($storage);
+ $expected = explode(' ', $scopeUtil->getDefaultScope());
+ $actual = explode(' ', 'defaultscope1 defaultscope2');
+ sort($expected);
+ sort($actual);
+ $this->assertEquals($expected, $actual);
+ }
+}
diff --git a/library/oauth2/test/OAuth2/Storage/UserCredentialsTest.php b/library/oauth2/test/OAuth2/Storage/UserCredentialsTest.php
new file mode 100644
index 000000000..65655a6b2
--- /dev/null
+++ b/library/oauth2/test/OAuth2/Storage/UserCredentialsTest.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class UserCredentialsTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testCheckUserCredentials(UserCredentialsInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // create a new user for testing
+ $success = $storage->setUser('testusername', 'testpass', 'Test', 'User');
+ $this->assertTrue($success);
+
+ // correct credentials
+ $this->assertTrue($storage->checkUserCredentials('testusername', 'testpass'));
+ // invalid password
+ $this->assertFalse($storage->checkUserCredentials('testusername', 'fakepass'));
+ // invalid username
+ $this->assertFalse($storage->checkUserCredentials('fakeusername', 'testpass'));
+
+ // invalid username
+ $this->assertFalse($storage->getUserDetails('fakeusername'));
+
+ // ensure all properties are set
+ $user = $storage->getUserDetails('testusername');
+ $this->assertTrue($user !== false);
+ $this->assertArrayHasKey('user_id', $user);
+ $this->assertArrayHasKey('first_name', $user);
+ $this->assertArrayHasKey('last_name', $user);
+ $this->assertEquals($user['user_id'], 'testusername');
+ $this->assertEquals($user['first_name'], 'Test');
+ $this->assertEquals($user['last_name'], 'User');
+ }
+}
diff --git a/library/oauth2/test/OAuth2/TokenType/BearerTest.php b/library/oauth2/test/OAuth2/TokenType/BearerTest.php
new file mode 100644
index 000000000..a2e000e22
--- /dev/null
+++ b/library/oauth2/test/OAuth2/TokenType/BearerTest.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace OAuth2\TokenType;
+
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class BearerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testValidContentTypeWithCharset()
+ {
+ $bearer = new Bearer();
+ $request = TestRequest::createPost(array(
+ 'access_token' => 'ThisIsMyAccessToken'
+ ));
+ $request->server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=UTF-8';
+
+ $param = $bearer->getAccessTokenParameter($request, $response = new Response());
+ $this->assertEquals($param, 'ThisIsMyAccessToken');
+ }
+
+ public function testInvalidContentType()
+ {
+ $bearer = new Bearer();
+ $request = TestRequest::createPost(array(
+ 'access_token' => 'ThisIsMyAccessToken'
+ ));
+ $request->server['CONTENT_TYPE'] = 'application/json; charset=UTF-8';
+
+ $param = $bearer->getAccessTokenParameter($request, $response = new Response());
+ $this->assertNull($param);
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'The content type for POST requests must be "application/x-www-form-urlencoded"');
+ }
+
+ public function testValidRequestUsingAuthorizationHeader()
+ {
+ $bearer = new Bearer();
+ $request = new TestRequest();
+ $request->headers['AUTHORIZATION'] = 'Bearer MyToken';
+ $request->server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=UTF-8';
+
+ $param = $bearer->getAccessTokenParameter($request, $response = new Response());
+ $this->assertEquals('MyToken', $param);
+ }
+
+ public function testValidRequestUsingAuthorizationHeaderCaseInsensitive()
+ {
+ $bearer = new Bearer();
+ $request = new TestRequest();
+ $request->server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=UTF-8';
+ $request->headers['Authorization'] = 'Bearer MyToken';
+
+ $param = $bearer->getAccessTokenParameter($request, $response = new Response());
+ $this->assertEquals('MyToken', $param);
+ }
+}
diff --git a/library/oauth2/test/bootstrap.php b/library/oauth2/test/bootstrap.php
new file mode 100644
index 000000000..0a4af0716
--- /dev/null
+++ b/library/oauth2/test/bootstrap.php
@@ -0,0 +1,12 @@
+<?php
+
+require_once(dirname(__FILE__).'/../src/OAuth2/Autoloader.php');
+OAuth2\Autoloader::register();
+
+// register test classes
+OAuth2\Autoloader::register(dirname(__FILE__).'/lib');
+
+// register vendors if possible
+if (file_exists(__DIR__.'/../vendor/autoload.php')) {
+ require_once(__DIR__.'/../vendor/autoload.php');
+}
diff --git a/library/oauth2/test/cleanup.php b/library/oauth2/test/cleanup.php
new file mode 100644
index 000000000..8663a901b
--- /dev/null
+++ b/library/oauth2/test/cleanup.php
@@ -0,0 +1,15 @@
+<?php
+
+require_once(dirname(__FILE__).'/../src/OAuth2/Autoloader.php');
+OAuth2\Autoloader::register();
+
+// register test classes
+OAuth2\Autoloader::register(dirname(__FILE__).'/lib');
+
+// register vendors if possible
+if (file_exists(__DIR__.'/../vendor/autoload.php')) {
+ require_once(__DIR__.'/../vendor/autoload.php');
+}
+
+// remove the dynamoDB database that was created for this build
+OAuth2\Storage\Bootstrap::getInstance()->cleanupTravisDynamoDb();
diff --git a/library/oauth2/test/config/keys/id_rsa b/library/oauth2/test/config/keys/id_rsa
new file mode 100644
index 000000000..e8b9eff2d
--- /dev/null
+++ b/library/oauth2/test/config/keys/id_rsa
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLsNjP+uAt2eO0cc5J9H5XV
+8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdwizIum8j0KzpsGYH5qReN
+QDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJuBe+FQpZTs8DewwIDAQAB
+AoGARfNxNknmtx/n1bskZ/01iZRzAge6BLEE0LV6Q4gS7mkRZu/Oyiv39Sl5vUlA
++WdGxLjkBwKNjxGN8Vxw9/ASd8rSsqeAUYIwAeifXrHhj5DBPQT/pDPkeFnp9B1w
+C6jo+3AbBQ4/b0ONSIEnCL2xGGglSIAxO17T1ViXp7lzXPECQQDe63nkRdWM0OCb
+oaHQPT3E26224maIstrGFUdt9yw3yJf4bOF7TtiPLlLuHsTTge3z+fG6ntC0xG56
+1cl37C3ZAkEA2HdVcRGugNp/qmVz4LJTpD+WZKi73PLAO47wDOrYh9Pn2I6fcEH0
+CPnggt1ko4ujvGzFTvRH64HXa6aPCv1j+wJBAMQMah3VQPNf/DlDVFEUmw9XeBZg
+VHaifX851aEjgXLp6qVj9IYCmLiLsAmVa9rr6P7p8asD418nZlaHUHE0eDkCQQCr
+uxis6GMx1Ka971jcJX2X696LoxXPd0KsvXySMupv79yagKPa8mgBiwPjrnK+EPVo
+cj6iochA/bSCshP/mwFrAkBHEKPi6V6gb94JinCT7x3weahbdp6bJ6/nzBH/p9VA
+HoT1JtwNFhGv9BCjmDydshQHfSWpY9NxlccBKL7ITm8R
+-----END RSA PRIVATE KEY----- \ No newline at end of file
diff --git a/library/oauth2/test/config/keys/id_rsa.pub b/library/oauth2/test/config/keys/id_rsa.pub
new file mode 100644
index 000000000..1ac15f5eb
--- /dev/null
+++ b/library/oauth2/test/config/keys/id_rsa.pub
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICiDCCAfGgAwIBAgIBADANBgkqhkiG9w0BAQQFADA9MQswCQYDVQQGEwJVUzEL
+MAkGA1UECBMCVVQxITAfBgNVBAoTGFZpZ25ldHRlIENvcnBvcmF0aW9uIFNCWDAe
+Fw0xMTEwMTUwMzE4MjdaFw0zMTEwMTAwMzE4MjdaMD0xCzAJBgNVBAYTAlVTMQsw
+CQYDVQQIEwJVVDEhMB8GA1UEChMYVmlnbmV0dGUgQ29ycG9yYXRpb24gU0JYMIGf
+MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLs
+NjP+uAt2eO0cc5J9H5XV8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdw
+izIum8j0KzpsGYH5qReNQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJu
+Be+FQpZTs8DewwIDAQABo4GXMIGUMB0GA1UdDgQWBBRe8hrEXm+Yim4YlD5Nx+1K
+vCYs9DBlBgNVHSMEXjBcgBRe8hrEXm+Yim4YlD5Nx+1KvCYs9KFBpD8wPTELMAkG
+A1UEBhMCVVMxCzAJBgNVBAgTAlVUMSEwHwYDVQQKExhWaWduZXR0ZSBDb3Jwb3Jh
+dGlvbiBTQliCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBjhyRD
+lM7vnLn6drgQVftW5V9nDFAyPAuiGvMIKFSbiAf1PxXCRn5sfJquwWKsJUi4ZGNl
+aViXdFmN6/F13PSM+yg63tpKy0fYqMbTM+Oe5WuSHkSW1VuYNHV+24adgNk/FRDL
+FRrlM1f6s9VTLWvwGItjfrof0Ba8Uq7ZDSb9Xg==
+-----END CERTIFICATE----- \ No newline at end of file
diff --git a/library/oauth2/test/config/storage.json b/library/oauth2/test/config/storage.json
new file mode 100644
index 000000000..a31d3bca2
--- /dev/null
+++ b/library/oauth2/test/config/storage.json
@@ -0,0 +1,181 @@
+{
+ "authorization_codes": {
+ "testcode": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "9999999999",
+ "id_token": "IDTOKEN"
+ },
+ "testcode-with-scope": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "9999999999",
+ "scope": "scope1 scope2"
+ },
+ "testcode-expired": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "1356998400"
+ },
+ "testcode-empty-secret": {
+ "client_id": "Test Client ID Empty Secret",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "9999999999"
+ },
+ "testcode-openid": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "9999999999",
+ "id_token": "test_id_token"
+ }
+ },
+ "client_credentials" : {
+ "Test Client ID": {
+ "client_secret": "TestSecret"
+ },
+ "Test Client ID with Redirect Uri": {
+ "client_secret": "TestSecret2",
+ "redirect_uri": "http://brentertainment.com"
+ },
+ "Test Client ID with Buggy Redirect Uri": {
+ "client_secret": "TestSecret2",
+ "redirect_uri": " http://brentertainment.com"
+ },
+ "Test Client ID with Multiple Redirect Uris": {
+ "client_secret": "TestSecret3",
+ "redirect_uri": "http://brentertainment.com http://morehazards.com"
+ },
+ "Test Client ID with Redirect Uri Parts": {
+ "client_secret": "TestSecret4",
+ "redirect_uri": "http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true"
+ },
+ "Test Some Other Client": {
+ "client_secret": "TestSecret3"
+ },
+ "Test Client ID Empty Secret": {
+ "client_secret": ""
+ },
+ "Test Client ID For Password Grant": {
+ "grant_types": "password",
+ "client_secret": ""
+ },
+ "Client ID With User ID": {
+ "client_secret": "TestSecret",
+ "user_id": "brent@brentertainment.com"
+ },
+ "oauth_test_client": {
+ "client_secret": "testpass",
+ "grant_types": "implicit password"
+ }
+ },
+ "user_credentials" : {
+ "test-username": {
+ "password": "testpass"
+ },
+ "testusername": {
+ "password": "testpass"
+ },
+ "testuser": {
+ "password": "password",
+ "email": "testuser@test.com",
+ "email_verified": true
+ },
+ "johndoe": {
+ "password": "password"
+ }
+ },
+ "refresh_tokens" : {
+ "test-refreshtoken": {
+ "refresh_token": "test-refreshtoken",
+ "client_id": "Test Client ID",
+ "user_id": "test-username",
+ "expires": 0,
+ "scope": null
+ },
+ "test-refreshtoken-with-scope": {
+ "refresh_token": "test-refreshtoken",
+ "client_id": "Test Client ID",
+ "user_id": "test-username",
+ "expires": 0,
+ "scope": "scope1 scope2"
+ }
+ },
+ "access_tokens" : {
+ "accesstoken-expired": {
+ "access_token": "accesstoken-expired",
+ "client_id": "Test Client ID",
+ "expires": 1234567,
+ "scope": null
+ },
+ "accesstoken-scope": {
+ "access_token": "accesstoken-scope",
+ "client_id": "Test Client ID",
+ "expires": 99999999900,
+ "scope": "testscope"
+ },
+ "accesstoken-openid-connect": {
+ "access_token": "accesstoken-openid-connect",
+ "client_id": "Test Client ID",
+ "user_id": "testuser",
+ "expires": 99999999900,
+ "scope": "openid email"
+ },
+ "accesstoken-malformed": {
+ "access_token": "accesstoken-mallformed",
+ "expires": 99999999900,
+ "scope": "testscope"
+ }
+ },
+ "jwt": {
+ "Test Client ID": {
+ "key": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5/SxVlE8gnpFqCxgl2wjhzY7u\ncEi00s0kUg3xp7lVEvgLgYcAnHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1o\nwR0p4d9pOaJK07d01+RzoQLOIQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8\nUlvdRKBxriRnlP3qJQIDAQAB\n-----END PUBLIC KEY-----",
+ "subject": "testuser@ourdomain.com"
+ },
+ "Test Client ID PHP-5.2": {
+ "key": "mysecretkey",
+ "subject": "testuser@ourdomain.com"
+ },
+ "Missing Key Client": {
+ "key": null,
+ "subject": "testuser@ourdomain.com"
+ },
+ "Missing Key Client PHP-5.2": {
+ "key": null,
+ "subject": "testuser@ourdomain.com"
+ },
+ "oauth_test_client": {
+ "key": "-----BEGIN CERTIFICATE-----\nMIICiDCCAfGgAwIBAgIBADANBgkqhkiG9w0BAQQFADA9MQswCQYDVQQGEwJVUzEL\nMAkGA1UECBMCVVQxITAfBgNVBAoTGFZpZ25ldHRlIENvcnBvcmF0aW9uIFNCWDAe\nFw0xMTEwMTUwMzE4MjdaFw0zMTEwMTAwMzE4MjdaMD0xCzAJBgNVBAYTAlVTMQsw\nCQYDVQQIEwJVVDEhMB8GA1UEChMYVmlnbmV0dGUgQ29ycG9yYXRpb24gU0JYMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLs\nNjP+uAt2eO0cc5J9H5XV8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdw\nizIum8j0KzpsGYH5qReNQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJu\nBe+FQpZTs8DewwIDAQABo4GXMIGUMB0GA1UdDgQWBBRe8hrEXm+Yim4YlD5Nx+1K\nvCYs9DBlBgNVHSMEXjBcgBRe8hrEXm+Yim4YlD5Nx+1KvCYs9KFBpD8wPTELMAkG\nA1UEBhMCVVMxCzAJBgNVBAgTAlVUMSEwHwYDVQQKExhWaWduZXR0ZSBDb3Jwb3Jh\ndGlvbiBTQliCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBjhyRD\nlM7vnLn6drgQVftW5V9nDFAyPAuiGvMIKFSbiAf1PxXCRn5sfJquwWKsJUi4ZGNl\naViXdFmN6/F13PSM+yg63tpKy0fYqMbTM+Oe5WuSHkSW1VuYNHV+24adgNk/FRDL\nFRrlM1f6s9VTLWvwGItjfrof0Ba8Uq7ZDSb9Xg==\n-----END CERTIFICATE-----",
+ "subject": "test_subject"
+ }
+ },
+ "jti": [
+ {
+ "issuer": "Test Client ID",
+ "subject": "testuser@ourdomain.com",
+ "audience": "http://myapp.com/oauth/auth",
+ "expires": 99999999900,
+ "jti": "used_jti"
+ }
+ ],
+ "supported_scopes" : [
+ "scope1",
+ "scope2",
+ "scope3",
+ "clientscope1",
+ "clientscope2",
+ "clientscope3",
+ "supportedscope1",
+ "supportedscope2",
+ "supportedscope3",
+ "supportedscope4"
+ ],
+ "keys": {
+ "public_key": "-----BEGIN CERTIFICATE-----\nMIICiDCCAfGgAwIBAgIBADANBgkqhkiG9w0BAQQFADA9MQswCQYDVQQGEwJVUzEL\nMAkGA1UECBMCVVQxITAfBgNVBAoTGFZpZ25ldHRlIENvcnBvcmF0aW9uIFNCWDAe\nFw0xMTEwMTUwMzE4MjdaFw0zMTEwMTAwMzE4MjdaMD0xCzAJBgNVBAYTAlVTMQsw\nCQYDVQQIEwJVVDEhMB8GA1UEChMYVmlnbmV0dGUgQ29ycG9yYXRpb24gU0JYMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLs\nNjP+uAt2eO0cc5J9H5XV8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdw\nizIum8j0KzpsGYH5qReNQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJu\nBe+FQpZTs8DewwIDAQABo4GXMIGUMB0GA1UdDgQWBBRe8hrEXm+Yim4YlD5Nx+1K\nvCYs9DBlBgNVHSMEXjBcgBRe8hrEXm+Yim4YlD5Nx+1KvCYs9KFBpD8wPTELMAkG\nA1UEBhMCVVMxCzAJBgNVBAgTAlVUMSEwHwYDVQQKExhWaWduZXR0ZSBDb3Jwb3Jh\ndGlvbiBTQliCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBjhyRD\nlM7vnLn6drgQVftW5V9nDFAyPAuiGvMIKFSbiAf1PxXCRn5sfJquwWKsJUi4ZGNl\naViXdFmN6/F13PSM+yg63tpKy0fYqMbTM+Oe5WuSHkSW1VuYNHV+24adgNk/FRDL\nFRrlM1f6s9VTLWvwGItjfrof0Ba8Uq7ZDSb9Xg==\n-----END CERTIFICATE-----",
+ "private_key": "-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLsNjP+uAt2eO0cc5J9H5XV\n8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdwizIum8j0KzpsGYH5qReN\nQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJuBe+FQpZTs8DewwIDAQAB\nAoGARfNxNknmtx/n1bskZ/01iZRzAge6BLEE0LV6Q4gS7mkRZu/Oyiv39Sl5vUlA\n+WdGxLjkBwKNjxGN8Vxw9/ASd8rSsqeAUYIwAeifXrHhj5DBPQT/pDPkeFnp9B1w\nC6jo+3AbBQ4/b0ONSIEnCL2xGGglSIAxO17T1ViXp7lzXPECQQDe63nkRdWM0OCb\noaHQPT3E26224maIstrGFUdt9yw3yJf4bOF7TtiPLlLuHsTTge3z+fG6ntC0xG56\n1cl37C3ZAkEA2HdVcRGugNp/qmVz4LJTpD+WZKi73PLAO47wDOrYh9Pn2I6fcEH0\nCPnggt1ko4ujvGzFTvRH64HXa6aPCv1j+wJBAMQMah3VQPNf/DlDVFEUmw9XeBZg\nVHaifX851aEjgXLp6qVj9IYCmLiLsAmVa9rr6P7p8asD418nZlaHUHE0eDkCQQCr\nuxis6GMx1Ka971jcJX2X696LoxXPd0KsvXySMupv79yagKPa8mgBiwPjrnK+EPVo\ncj6iochA/bSCshP/mwFrAkBHEKPi6V6gb94JinCT7x3weahbdp6bJ6/nzBH/p9VA\nHoT1JtwNFhGv9BCjmDydshQHfSWpY9NxlccBKL7ITm8R\n-----END RSA PRIVATE KEY-----"
+ }
+}
diff --git a/library/oauth2/test/lib/OAuth2/Request/TestRequest.php b/library/oauth2/test/lib/OAuth2/Request/TestRequest.php
new file mode 100644
index 000000000..7bbce28a4
--- /dev/null
+++ b/library/oauth2/test/lib/OAuth2/Request/TestRequest.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace OAuth2\Request;
+
+use OAuth2\Request;
+use OAuth2\RequestInterface;
+
+/**
+*
+*/
+class TestRequest extends Request implements RequestInterface
+{
+ public $query, $request, $server, $headers;
+
+ public function __construct()
+ {
+ $this->query = $_GET;
+ $this->request = $_POST;
+ $this->server = $_SERVER;
+ $this->headers = array();
+ }
+
+ public function query($name, $default = null)
+ {
+ return isset($this->query[$name]) ? $this->query[$name] : $default;
+ }
+
+ public function request($name, $default = null)
+ {
+ return isset($this->request[$name]) ? $this->request[$name] : $default;
+ }
+
+ public function server($name, $default = null)
+ {
+ return isset($this->server[$name]) ? $this->server[$name] : $default;
+ }
+
+ public function getAllQueryParameters()
+ {
+ return $this->query;
+ }
+
+ public function setQuery(array $query)
+ {
+ $this->query = $query;
+ }
+
+ public function setPost(array $params)
+ {
+ $this->server['REQUEST_METHOD'] = 'POST';
+ $this->request = $params;
+ }
+
+ public static function createPost(array $params = array())
+ {
+ $request = new self();
+ $request->setPost($params);
+
+ return $request;
+ }
+}
diff --git a/library/oauth2/test/lib/OAuth2/Storage/BaseTest.php b/library/oauth2/test/lib/OAuth2/Storage/BaseTest.php
new file mode 100755
index 000000000..921d52500
--- /dev/null
+++ b/library/oauth2/test/lib/OAuth2/Storage/BaseTest.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace OAuth2\Storage;
+
+abstract class BaseTest extends \PHPUnit_Framework_TestCase
+{
+ public function provideStorage()
+ {
+ $memory = Bootstrap::getInstance()->getMemoryStorage();
+ $sqlite = Bootstrap::getInstance()->getSqlitePdo();
+ $mysql = Bootstrap::getInstance()->getMysqlPdo();
+ $postgres = Bootstrap::getInstance()->getPostgresPdo();
+ $mongo = Bootstrap::getInstance()->getMongo();
+ $redis = Bootstrap::getInstance()->getRedisStorage();
+ $cassandra = Bootstrap::getInstance()->getCassandraStorage();
+ $dynamodb = Bootstrap::getInstance()->getDynamoDbStorage();
+ $couchbase = Bootstrap::getInstance()->getCouchbase();
+
+ /* hack until we can fix "default_scope" dependencies in other tests */
+ $memory->defaultScope = 'defaultscope1 defaultscope2';
+
+ return array(
+ array($memory),
+ array($sqlite),
+ array($mysql),
+ array($postgres),
+ array($mongo),
+ array($redis),
+ array($cassandra),
+ array($dynamodb),
+ array($couchbase),
+ );
+ }
+}
diff --git a/library/oauth2/test/lib/OAuth2/Storage/Bootstrap.php b/library/oauth2/test/lib/OAuth2/Storage/Bootstrap.php
new file mode 100755
index 000000000..4ac9022b1
--- /dev/null
+++ b/library/oauth2/test/lib/OAuth2/Storage/Bootstrap.php
@@ -0,0 +1,888 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class Bootstrap
+{
+ const DYNAMODB_PHP_VERSION = 'none';
+
+ protected static $instance;
+ private $mysql;
+ private $sqlite;
+ private $postgres;
+ private $mongo;
+ private $redis;
+ private $cassandra;
+ private $configDir;
+ private $dynamodb;
+ private $couchbase;
+
+ public function __construct()
+ {
+ $this->configDir = __DIR__.'/../../../config';
+ }
+
+ public static function getInstance()
+ {
+ if (!self::$instance) {
+ self::$instance = new self();
+ }
+
+ return self::$instance;
+ }
+
+ public function getSqlitePdo()
+ {
+ if (!$this->sqlite) {
+ $this->removeSqliteDb();
+ $pdo = new \PDO(sprintf('sqlite://%s', $this->getSqliteDir()));
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+ $this->createSqliteDb($pdo);
+
+ $this->sqlite = new Pdo($pdo);
+ }
+
+ return $this->sqlite;
+ }
+
+ public function getPostgresPdo()
+ {
+ if (!$this->postgres) {
+ if (in_array('pgsql', \PDO::getAvailableDrivers())) {
+ $this->removePostgresDb();
+ $this->createPostgresDb();
+ if ($pdo = $this->getPostgresDriver()) {
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+ $this->populatePostgresDb($pdo);
+ $this->postgres = new Pdo($pdo);
+ }
+ } else {
+ $this->postgres = new NullStorage('Postgres', 'Missing postgres PDO extension.');
+ }
+ }
+
+ return $this->postgres;
+ }
+
+ public function getPostgresDriver()
+ {
+ try {
+ $pdo = new \PDO('pgsql:host=localhost;dbname=oauth2_server_php', 'postgres');
+
+ return $pdo;
+ } catch (\PDOException $e) {
+ $this->postgres = new NullStorage('Postgres', $e->getMessage());
+ }
+ }
+
+ public function getMemoryStorage()
+ {
+ return new Memory(json_decode(file_get_contents($this->configDir. '/storage.json'), true));
+ }
+
+ public function getRedisStorage()
+ {
+ if (!$this->redis) {
+ if (class_exists('Predis\Client')) {
+ $redis = new \Predis\Client();
+ if ($this->testRedisConnection($redis)) {
+ $redis->flushdb();
+ $this->redis = new Redis($redis);
+ $this->createRedisDb($this->redis);
+ } else {
+ $this->redis = new NullStorage('Redis', 'Unable to connect to redis server on port 6379');
+ }
+ } else {
+ $this->redis = new NullStorage('Redis', 'Missing redis library. Please run "composer.phar require predis/predis:dev-master"');
+ }
+ }
+
+ return $this->redis;
+ }
+
+ private function testRedisConnection(\Predis\Client $redis)
+ {
+ try {
+ $redis->connect();
+ } catch (\Predis\CommunicationException $exception) {
+ // we were unable to connect to the redis server
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getMysqlPdo()
+ {
+ if (!$this->mysql) {
+ $pdo = null;
+ try {
+ $pdo = new \PDO('mysql:host=localhost;', 'root');
+ } catch (\PDOException $e) {
+ $this->mysql = new NullStorage('MySQL', 'Unable to connect to MySQL on root@localhost');
+ }
+
+ if ($pdo) {
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+ $this->removeMysqlDb($pdo);
+ $this->createMysqlDb($pdo);
+
+ $this->mysql = new Pdo($pdo);
+ }
+ }
+
+ return $this->mysql;
+ }
+
+ public function getMongo()
+ {
+ if (!$this->mongo) {
+ $skipMongo = $this->getEnvVar('SKIP_MONGO_TESTS');
+ if (!$skipMongo && class_exists('MongoClient')) {
+ $mongo = new \MongoClient('mongodb://localhost:27017', array('connect' => false));
+ if ($this->testMongoConnection($mongo)) {
+ $db = $mongo->oauth2_server_php;
+ $this->removeMongoDb($db);
+ $this->createMongoDb($db);
+
+ $this->mongo = new Mongo($db);
+ } else {
+ $this->mongo = new NullStorage('Mongo', 'Unable to connect to mongo server on "localhost:27017"');
+ }
+ } else {
+ $this->mongo = new NullStorage('Mongo', 'Missing mongo php extension. Please install mongo.so');
+ }
+ }
+
+ return $this->mongo;
+ }
+
+ private function testMongoConnection(\MongoClient $mongo)
+ {
+ try {
+ $mongo->connect();
+ } catch (\MongoConnectionException $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getCouchbase()
+ {
+ if (!$this->couchbase) {
+ if ($this->getEnvVar('SKIP_COUCHBASE_TESTS')) {
+ $this->couchbase = new NullStorage('Couchbase', 'Skipping Couchbase tests');
+ } elseif (!class_exists('Couchbase')) {
+ $this->couchbase = new NullStorage('Couchbase', 'Missing Couchbase php extension. Please install couchbase.so');
+ } else {
+ // round-about way to make sure couchbase is working
+ // this is required because it throws a "floating point exception" otherwise
+ $code = "new \Couchbase(array('localhost:8091'), '', '', 'auth', false);";
+ $exec = sprintf('php -r "%s"', $code);
+ $ret = exec($exec, $test, $var);
+ if ($ret != 0) {
+ $couchbase = new \Couchbase(array('localhost:8091'), '', '', 'auth', false);
+ if ($this->testCouchbaseConnection($couchbase)) {
+ $this->clearCouchbase($couchbase);
+ $this->createCouchbaseDB($couchbase);
+
+ $this->couchbase = new CouchbaseDB($couchbase);
+ } else {
+ $this->couchbase = new NullStorage('Couchbase', 'Unable to connect to Couchbase server on "localhost:8091"');
+ }
+ } else {
+ $this->couchbase = new NullStorage('Couchbase', 'Error while trying to connect to Couchbase');
+ }
+ }
+ }
+
+ return $this->couchbase;
+ }
+
+ private function testCouchbaseConnection(\Couchbase $couchbase)
+ {
+ try {
+ if (count($couchbase->getServers()) > 0) {
+ return true;
+ }
+ } catch (\CouchbaseException $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getCassandraStorage()
+ {
+ if (!$this->cassandra) {
+ if (class_exists('phpcassa\ColumnFamily')) {
+ $cassandra = new \phpcassa\Connection\ConnectionPool('oauth2_test', array('127.0.0.1:9160'));
+ if ($this->testCassandraConnection($cassandra)) {
+ $this->removeCassandraDb();
+ $this->cassandra = new Cassandra($cassandra);
+ $this->createCassandraDb($this->cassandra);
+ } else {
+ $this->cassandra = new NullStorage('Cassandra', 'Unable to connect to cassandra server on "127.0.0.1:9160"');
+ }
+ } else {
+ $this->cassandra = new NullStorage('Cassandra', 'Missing cassandra library. Please run "composer.phar require thobbs/phpcassa:dev-master"');
+ }
+ }
+
+ return $this->cassandra;
+ }
+
+ private function testCassandraConnection(\phpcassa\Connection\ConnectionPool $cassandra)
+ {
+ try {
+ new \phpcassa\SystemManager('localhost:9160');
+ } catch (\Exception $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ private function removeCassandraDb()
+ {
+ $sys = new \phpcassa\SystemManager('localhost:9160');
+
+ try {
+ $sys->drop_keyspace('oauth2_test');
+ } catch (\cassandra\InvalidRequestException $e) {
+
+ }
+ }
+
+ private function createCassandraDb(Cassandra $storage)
+ {
+ // create the cassandra keyspace and column family
+ $sys = new \phpcassa\SystemManager('localhost:9160');
+
+ $sys->create_keyspace('oauth2_test', array(
+ "strategy_class" => \phpcassa\Schema\StrategyClass::SIMPLE_STRATEGY,
+ "strategy_options" => array('replication_factor' => '1')
+ ));
+
+ $sys->create_column_family('oauth2_test', 'auth');
+ $cassandra = new \phpcassa\Connection\ConnectionPool('oauth2_test', array('127.0.0.1:9160'));
+ $cf = new \phpcassa\ColumnFamily($cassandra, 'auth');
+
+ // populate the data
+ $storage->setClientDetails("oauth_test_client", "testpass", "http://example.com", 'implicit password');
+ $storage->setAccessToken("testtoken", "Some Client", '', time() + 1000);
+ $storage->setAuthorizationCode("testcode", "Some Client", '', '', time() + 1000);
+
+ $storage->setScope('supportedscope1 supportedscope2 supportedscope3 supportedscope4');
+ $storage->setScope('defaultscope1 defaultscope2', null, 'default');
+
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID');
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID', 'default');
+
+ $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Client ID 2');
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID 2', 'default');
+
+ $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID');
+ $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID', 'default');
+
+ $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Default Scope Client ID 2');
+ $storage->setScope('clientscope3', 'Test Default Scope Client ID 2', 'default');
+
+ $storage->setClientKey('oauth_test_client', $this->getTestPublicKey(), 'test_subject');
+
+ $cf->insert("oauth_public_keys:ClientID_One", array('__data' => json_encode(array("public_key" => "client_1_public", "private_key" => "client_1_private", "encryption_algorithm" => "RS256"))));
+ $cf->insert("oauth_public_keys:ClientID_Two", array('__data' => json_encode(array("public_key" => "client_2_public", "private_key" => "client_2_private", "encryption_algorithm" => "RS256"))));
+ $cf->insert("oauth_public_keys:", array('__data' => json_encode(array("public_key" => $this->getTestPublicKey(), "private_key" => $this->getTestPrivateKey(), "encryption_algorithm" => "RS256"))));
+
+ $cf->insert("oauth_users:testuser", array('__data' =>json_encode(array("password" => "password", "email" => "testuser@test.com", "email_verified" => true))));
+
+ }
+
+ private function createSqliteDb(\PDO $pdo)
+ {
+ $this->runPdoSql($pdo);
+ }
+
+ private function removeSqliteDb()
+ {
+ if (file_exists($this->getSqliteDir())) {
+ unlink($this->getSqliteDir());
+ }
+ }
+
+ private function createMysqlDb(\PDO $pdo)
+ {
+ $pdo->exec('CREATE DATABASE oauth2_server_php');
+ $pdo->exec('USE oauth2_server_php');
+ $this->runPdoSql($pdo);
+ }
+
+ private function removeMysqlDb(\PDO $pdo)
+ {
+ $pdo->exec('DROP DATABASE IF EXISTS oauth2_server_php');
+ }
+
+ private function createPostgresDb()
+ {
+ if (!`psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='postgres'"`) {
+ `createuser -s -r postgres`;
+ }
+
+ `createdb -O postgres oauth2_server_php`;
+ }
+
+ private function populatePostgresDb(\PDO $pdo)
+ {
+ $this->runPdoSql($pdo);
+ }
+
+ private function removePostgresDb()
+ {
+ if (trim(`psql -l | grep oauth2_server_php | wc -l`)) {
+ `dropdb oauth2_server_php`;
+ }
+ }
+
+ public function runPdoSql(\PDO $pdo)
+ {
+ $storage = new Pdo($pdo);
+ foreach (explode(';', $storage->getBuildSql()) as $statement) {
+ $result = $pdo->exec($statement);
+ }
+
+ // set up scopes
+ $sql = 'INSERT INTO oauth_scopes (scope) VALUES (?)';
+ foreach (explode(' ', 'supportedscope1 supportedscope2 supportedscope3 supportedscope4 clientscope1 clientscope2 clientscope3') as $supportedScope) {
+ $pdo->prepare($sql)->execute(array($supportedScope));
+ }
+
+ $sql = 'INSERT INTO oauth_scopes (scope, is_default) VALUES (?, ?)';
+ foreach (array('defaultscope1', 'defaultscope2') as $defaultScope) {
+ $pdo->prepare($sql)->execute(array($defaultScope, true));
+ }
+
+ // set up clients
+ $sql = 'INSERT INTO oauth_clients (client_id, client_secret, scope, grant_types) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('Test Client ID', 'TestSecret', 'clientscope1 clientscope2', null));
+ $pdo->prepare($sql)->execute(array('Test Client ID 2', 'TestSecret', 'clientscope1 clientscope2 clientscope3', null));
+ $pdo->prepare($sql)->execute(array('Test Default Scope Client ID', 'TestSecret', 'clientscope1 clientscope2', null));
+ $pdo->prepare($sql)->execute(array('oauth_test_client', 'testpass', null, 'implicit password'));
+
+ // set up misc
+ $sql = 'INSERT INTO oauth_access_tokens (access_token, client_id, expires, user_id) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('testtoken', 'Some Client', date('Y-m-d H:i:s', strtotime('+1 hour')), null));
+ $pdo->prepare($sql)->execute(array('accesstoken-openid-connect', 'Some Client', date('Y-m-d H:i:s', strtotime('+1 hour')), 'testuser'));
+
+ $sql = 'INSERT INTO oauth_authorization_codes (authorization_code, client_id, expires) VALUES (?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('testcode', 'Some Client', date('Y-m-d H:i:s', strtotime('+1 hour'))));
+
+ $sql = 'INSERT INTO oauth_users (username, password, email, email_verified) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('testuser', 'password', 'testuser@test.com', true));
+
+ $sql = 'INSERT INTO oauth_public_keys (client_id, public_key, private_key, encryption_algorithm) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('ClientID_One', 'client_1_public', 'client_1_private', 'RS256'));
+ $pdo->prepare($sql)->execute(array('ClientID_Two', 'client_2_public', 'client_2_private', 'RS256'));
+
+ $sql = 'INSERT INTO oauth_public_keys (client_id, public_key, private_key, encryption_algorithm) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array(null, $this->getTestPublicKey(), $this->getTestPrivateKey(), 'RS256'));
+
+ $sql = 'INSERT INTO oauth_jwt (client_id, subject, public_key) VALUES (?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('oauth_test_client', 'test_subject', $this->getTestPublicKey()));
+ }
+
+ public function getSqliteDir()
+ {
+ return $this->configDir. '/test.sqlite';
+ }
+
+ public function getConfigDir()
+ {
+ return $this->configDir;
+ }
+
+ private function createCouchbaseDB(\Couchbase $db)
+ {
+ $db->set('oauth_clients-oauth_test_client',json_encode(array(
+ 'client_id' => "oauth_test_client",
+ 'client_secret' => "testpass",
+ 'redirect_uri' => "http://example.com",
+ 'grant_types' => 'implicit password'
+ )));
+
+ $db->set('oauth_access_tokens-testtoken',json_encode(array(
+ 'access_token' => "testtoken",
+ 'client_id' => "Some Client"
+ )));
+
+ $db->set('oauth_authorization_codes-testcode',json_encode(array(
+ 'access_token' => "testcode",
+ 'client_id' => "Some Client"
+ )));
+
+ $db->set('oauth_users-testuser',json_encode(array(
+ 'username' => 'testuser',
+ 'password' => 'password',
+ 'email' => 'testuser@test.com',
+ 'email_verified' => true,
+ )));
+
+ $db->set('oauth_jwt-oauth_test_client',json_encode(array(
+ 'client_id' => 'oauth_test_client',
+ 'key' => $this->getTestPublicKey(),
+ 'subject' => 'test_subject',
+ )));
+ }
+
+ private function clearCouchbase(\Couchbase $cb)
+ {
+ $cb->delete('oauth_authorization_codes-new-openid-code');
+ $cb->delete('oauth_access_tokens-newtoken');
+ $cb->delete('oauth_authorization_codes-newcode');
+ $cb->delete('oauth_refresh_tokens-refreshtoken');
+ }
+
+ private function createMongoDb(\MongoDB $db)
+ {
+ $db->oauth_clients->insert(array(
+ 'client_id' => "oauth_test_client",
+ 'client_secret' => "testpass",
+ 'redirect_uri' => "http://example.com",
+ 'grant_types' => 'implicit password'
+ ));
+
+ $db->oauth_access_tokens->insert(array(
+ 'access_token' => "testtoken",
+ 'client_id' => "Some Client"
+ ));
+
+ $db->oauth_authorization_codes->insert(array(
+ 'authorization_code' => "testcode",
+ 'client_id' => "Some Client"
+ ));
+
+ $db->oauth_users->insert(array(
+ 'username' => 'testuser',
+ 'password' => 'password',
+ 'email' => 'testuser@test.com',
+ 'email_verified' => true,
+ ));
+
+ $db->oauth_jwt->insert(array(
+ 'client_id' => 'oauth_test_client',
+ 'key' => $this->getTestPublicKey(),
+ 'subject' => 'test_subject',
+ ));
+ }
+
+ private function createRedisDb(Redis $storage)
+ {
+ $storage->setClientDetails("oauth_test_client", "testpass", "http://example.com", 'implicit password');
+ $storage->setAccessToken("testtoken", "Some Client", '', time() + 1000);
+ $storage->setAuthorizationCode("testcode", "Some Client", '', '', time() + 1000);
+ $storage->setUser("testuser", "password");
+
+ $storage->setScope('supportedscope1 supportedscope2 supportedscope3 supportedscope4');
+ $storage->setScope('defaultscope1 defaultscope2', null, 'default');
+
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID');
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID', 'default');
+
+ $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Client ID 2');
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID 2', 'default');
+
+ $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID');
+ $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID', 'default');
+
+ $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Default Scope Client ID 2');
+ $storage->setScope('clientscope3', 'Test Default Scope Client ID 2', 'default');
+
+ $storage->setClientKey('oauth_test_client', $this->getTestPublicKey(), 'test_subject');
+ }
+
+ public function removeMongoDb(\MongoDB $db)
+ {
+ $db->drop();
+ }
+
+ public function getTestPublicKey()
+ {
+ return file_get_contents(__DIR__.'/../../../config/keys/id_rsa.pub');
+ }
+
+ private function getTestPrivateKey()
+ {
+ return file_get_contents(__DIR__.'/../../../config/keys/id_rsa');
+ }
+
+ public function getDynamoDbStorage()
+ {
+ if (!$this->dynamodb) {
+ // only run once per travis build
+ if (true == $this->getEnvVar('TRAVIS')) {
+ if (self::DYNAMODB_PHP_VERSION != $this->getEnvVar('TRAVIS_PHP_VERSION')) {
+ $this->dynamodb = new NullStorage('DynamoDb', 'Skipping for travis.ci - only run once per build');
+
+ return;
+ }
+ }
+ if (class_exists('\Aws\DynamoDb\DynamoDbClient')) {
+ if ($client = $this->getDynamoDbClient()) {
+ // travis runs a unique set of tables per build, to avoid conflict
+ $prefix = '';
+ if ($build_id = $this->getEnvVar('TRAVIS_JOB_NUMBER')) {
+ $prefix = sprintf('build_%s_', $build_id);
+ } else {
+ if (!$this->deleteDynamoDb($client, $prefix, true)) {
+ return $this->dynamodb = new NullStorage('DynamoDb', 'Timed out while waiting for DynamoDB deletion (30 seconds)');
+ }
+ }
+ $this->createDynamoDb($client, $prefix);
+ $this->populateDynamoDb($client, $prefix);
+ $config = array(
+ 'client_table' => $prefix.'oauth_clients',
+ 'access_token_table' => $prefix.'oauth_access_tokens',
+ 'refresh_token_table' => $prefix.'oauth_refresh_tokens',
+ 'code_table' => $prefix.'oauth_authorization_codes',
+ 'user_table' => $prefix.'oauth_users',
+ 'jwt_table' => $prefix.'oauth_jwt',
+ 'scope_table' => $prefix.'oauth_scopes',
+ 'public_key_table' => $prefix.'oauth_public_keys',
+ );
+ $this->dynamodb = new DynamoDB($client, $config);
+ } elseif (!$this->dynamodb) {
+ $this->dynamodb = new NullStorage('DynamoDb', 'unable to connect to DynamoDB');
+ }
+ } else {
+ $this->dynamodb = new NullStorage('DynamoDb', 'Missing DynamoDB library. Please run "composer.phar require aws/aws-sdk-php:dev-master');
+ }
+ }
+
+ return $this->dynamodb;
+ }
+
+ private function getDynamoDbClient()
+ {
+ $config = array();
+ // check for environment variables
+ if (($key = $this->getEnvVar('AWS_ACCESS_KEY_ID')) && ($secret = $this->getEnvVar('AWS_SECRET_KEY'))) {
+ $config['key'] = $key;
+ $config['secret'] = $secret;
+ } else {
+ // fall back on ~/.aws/credentials file
+ // @see http://docs.aws.amazon.com/aws-sdk-php/guide/latest/credentials.html#credential-profiles
+ if (!file_exists($this->getEnvVar('HOME') . '/.aws/credentials')) {
+ $this->dynamodb = new NullStorage('DynamoDb', 'No aws credentials file found, and no AWS_ACCESS_KEY_ID or AWS_SECRET_KEY environment variable set');
+
+ return;
+ }
+
+ // set profile in AWS_PROFILE environment variable, defaults to "default"
+ $config['profile'] = $this->getEnvVar('AWS_PROFILE', 'default');
+ }
+
+ // set region in AWS_REGION environment variable, defaults to "us-east-1"
+ $config['region'] = $this->getEnvVar('AWS_REGION', \Aws\Common\Enum\Region::US_EAST_1);
+
+ return \Aws\DynamoDb\DynamoDbClient::factory($config);
+ }
+
+ private function deleteDynamoDb(\Aws\DynamoDb\DynamoDbClient $client, $prefix = null, $waitForDeletion = false)
+ {
+ $tablesList = explode(' ', 'oauth_access_tokens oauth_authorization_codes oauth_clients oauth_jwt oauth_public_keys oauth_refresh_tokens oauth_scopes oauth_users');
+ $nbTables = count($tablesList);
+
+ // Delete all table.
+ foreach ($tablesList as $key => $table) {
+ try {
+ $client->deleteTable(array('TableName' => $prefix.$table));
+ } catch (\Aws\DynamoDb\Exception\DynamoDbException $e) {
+ // Table does not exist : nothing to do
+ }
+ }
+
+ // Wait for deleting
+ if ($waitForDeletion) {
+ $retries = 5;
+ $nbTableDeleted = 0;
+ while ($nbTableDeleted != $nbTables) {
+ $nbTableDeleted = 0;
+ foreach ($tablesList as $key => $table) {
+ try {
+ $result = $client->describeTable(array('TableName' => $prefix.$table));
+ } catch (\Aws\DynamoDb\Exception\DynamoDbException $e) {
+ // Table does not exist : nothing to do
+ $nbTableDeleted++;
+ }
+ }
+ if ($nbTableDeleted != $nbTables) {
+ if ($retries < 0) {
+ // we are tired of waiting
+ return false;
+ }
+ sleep(5);
+ echo "Sleeping 5 seconds for DynamoDB ($retries more retries)...\n";
+ $retries--;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ private function createDynamoDb(\Aws\DynamoDb\DynamoDbClient $client, $prefix = null)
+ {
+ $tablesList = explode(' ', 'oauth_access_tokens oauth_authorization_codes oauth_clients oauth_jwt oauth_public_keys oauth_refresh_tokens oauth_scopes oauth_users');
+ $nbTables = count($tablesList);
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_access_tokens',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'access_token','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'access_token','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_authorization_codes',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'authorization_code','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'authorization_code','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'client_id','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'client_id','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_jwt',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'client_id','AttributeType' => 'S'),
+ array('AttributeName' => 'subject','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(
+ array('AttributeName' => 'client_id','KeyType' => 'HASH'),
+ array('AttributeName' => 'subject','KeyType' => 'RANGE')
+ ),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_public_keys',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'client_id','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'client_id','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_refresh_tokens',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'refresh_token','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'refresh_token','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_scopes',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'scope','AttributeType' => 'S'),
+ array('AttributeName' => 'is_default','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'scope','KeyType' => 'HASH')),
+ 'GlobalSecondaryIndexes' => array(
+ array(
+ 'IndexName' => 'is_default-index',
+ 'KeySchema' => array(array('AttributeName' => 'is_default', 'KeyType' => 'HASH')),
+ 'Projection' => array('ProjectionType' => 'ALL'),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ),
+ ),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_users',
+ 'AttributeDefinitions' => array(array('AttributeName' => 'username','AttributeType' => 'S')),
+ 'KeySchema' => array(array('AttributeName' => 'username','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ // Wait for creation
+ $nbTableCreated = 0;
+ while ($nbTableCreated != $nbTables) {
+ $nbTableCreated = 0;
+ foreach ($tablesList as $key => $table) {
+ try {
+ $result = $client->describeTable(array('TableName' => $prefix.$table));
+ if ($result['Table']['TableStatus'] == 'ACTIVE') {
+ $nbTableCreated++;
+ }
+ } catch (\Aws\DynamoDb\Exception\DynamoDbException $e) {
+ // Table does not exist : nothing to do
+ $nbTableCreated++;
+ }
+ }
+ if ($nbTableCreated != $nbTables) {
+ sleep(1);
+ }
+ }
+ }
+
+ private function populateDynamoDb($client, $prefix = null)
+ {
+ // set up scopes
+ foreach (explode(' ', 'supportedscope1 supportedscope2 supportedscope3 supportedscope4 clientscope1 clientscope2 clientscope3') as $supportedScope) {
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_scopes',
+ 'Item' => array('scope' => array('S' => $supportedScope))
+ ));
+ }
+
+ foreach (array('defaultscope1', 'defaultscope2') as $defaultScope) {
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_scopes',
+ 'Item' => array('scope' => array('S' => $defaultScope), 'is_default' => array('S' => "true"))
+ ));
+ }
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'Item' => array(
+ 'client_id' => array('S' => 'Test Client ID'),
+ 'client_secret' => array('S' => 'TestSecret'),
+ 'scope' => array('S' => 'clientscope1 clientscope2')
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'Item' => array(
+ 'client_id' => array('S' => 'Test Client ID 2'),
+ 'client_secret' => array('S' => 'TestSecret'),
+ 'scope' => array('S' => 'clientscope1 clientscope2 clientscope3')
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'Item' => array(
+ 'client_id' => array('S' => 'Test Default Scope Client ID'),
+ 'client_secret' => array('S' => 'TestSecret'),
+ 'scope' => array('S' => 'clientscope1 clientscope2')
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'Item' => array(
+ 'client_id' => array('S' => 'oauth_test_client'),
+ 'client_secret' => array('S' => 'testpass'),
+ 'grant_types' => array('S' => 'implicit password')
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_access_tokens',
+ 'Item' => array(
+ 'access_token' => array('S' => 'testtoken'),
+ 'client_id' => array('S' => 'Some Client'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_access_tokens',
+ 'Item' => array(
+ 'access_token' => array('S' => 'accesstoken-openid-connect'),
+ 'client_id' => array('S' => 'Some Client'),
+ 'user_id' => array('S' => 'testuser'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_authorization_codes',
+ 'Item' => array(
+ 'authorization_code' => array('S' => 'testcode'),
+ 'client_id' => array('S' => 'Some Client'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_users',
+ 'Item' => array(
+ 'username' => array('S' => 'testuser'),
+ 'password' => array('S' => 'password'),
+ 'email' => array('S' => 'testuser@test.com'),
+ 'email_verified' => array('S' => 'true'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_public_keys',
+ 'Item' => array(
+ 'client_id' => array('S' => 'ClientID_One'),
+ 'public_key' => array('S' => 'client_1_public'),
+ 'private_key' => array('S' => 'client_1_private'),
+ 'encryption_algorithm' => array('S' => 'RS256'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_public_keys',
+ 'Item' => array(
+ 'client_id' => array('S' => 'ClientID_Two'),
+ 'public_key' => array('S' => 'client_2_public'),
+ 'private_key' => array('S' => 'client_2_private'),
+ 'encryption_algorithm' => array('S' => 'RS256'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_public_keys',
+ 'Item' => array(
+ 'client_id' => array('S' => '0'),
+ 'public_key' => array('S' => $this->getTestPublicKey()),
+ 'private_key' => array('S' => $this->getTestPrivateKey()),
+ 'encryption_algorithm' => array('S' => 'RS256'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_jwt',
+ 'Item' => array(
+ 'client_id' => array('S' => 'oauth_test_client'),
+ 'subject' => array('S' => 'test_subject'),
+ 'public_key' => array('S' => $this->getTestPublicKey()),
+ )
+ ));
+ }
+
+ public function cleanupTravisDynamoDb($prefix = null)
+ {
+ if (is_null($prefix)) {
+ // skip this when not applicable
+ if (!$this->getEnvVar('TRAVIS') || self::DYNAMODB_PHP_VERSION != $this->getEnvVar('TRAVIS_PHP_VERSION')) {
+ return;
+ }
+
+ $prefix = sprintf('build_%s_', $this->getEnvVar('TRAVIS_JOB_NUMBER'));
+ }
+
+ $client = $this->getDynamoDbClient();
+ $this->deleteDynamoDb($client, $prefix);
+ }
+
+ private function getEnvVar($var, $default = null)
+ {
+ return isset($_SERVER[$var]) ? $_SERVER[$var] : (getenv($var) ?: $default);
+ }
+}
diff --git a/library/oauth2/test/lib/OAuth2/Storage/NullStorage.php b/library/oauth2/test/lib/OAuth2/Storage/NullStorage.php
new file mode 100644
index 000000000..6caa62068
--- /dev/null
+++ b/library/oauth2/test/lib/OAuth2/Storage/NullStorage.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+*
+*/
+class NullStorage extends Memory
+{
+ private $name;
+ private $description;
+
+ public function __construct($name, $description = null)
+ {
+ $this->name = $name;
+ $this->description = $description;
+ }
+
+ public function __toString()
+ {
+ return $this->name;
+ }
+
+ public function getMessage()
+ {
+ if ($this->description) {
+ return $this->description;
+ }
+
+ return $this->name;
+ }
+}
diff --git a/library/sticky-kit/sticky-kit.js b/library/sticky-kit/sticky-kit.js
new file mode 100644
index 000000000..eb2ea8a26
--- /dev/null
+++ b/library/sticky-kit/sticky-kit.js
@@ -0,0 +1,265 @@
+// Generated by CoffeeScript 1.10.0
+
+/**
+@license Sticky-kit v1.1.3 | MIT | Leaf Corcoran 2015 | http://leafo.net
+ */
+
+(function() {
+ var $, win;
+
+ $ = window.jQuery;
+
+ win = $(window);
+
+ $.fn.stick_in_parent = function(opts) {
+ var doc, elm, enable_bottoming, fn, i, inner_scrolling, len, manual_spacer, offset_top, outer_width, parent_selector, recalc_every, sticky_class;
+ if (opts == null) {
+ opts = {};
+ }
+ sticky_class = opts.sticky_class, inner_scrolling = opts.inner_scrolling, recalc_every = opts.recalc_every, parent_selector = opts.parent, offset_top = opts.offset_top, manual_spacer = opts.spacer, enable_bottoming = opts.bottoming;
+ if (offset_top == null) {
+ offset_top = 0;
+ }
+ if (parent_selector == null) {
+ parent_selector = void 0;
+ }
+ if (inner_scrolling == null) {
+ inner_scrolling = true;
+ }
+ if (sticky_class == null) {
+ sticky_class = "is_stuck";
+ }
+ doc = $(document);
+ if (enable_bottoming == null) {
+ enable_bottoming = true;
+ }
+ outer_width = function(el) {
+ var _el, computed, w;
+ if (window.getComputedStyle) {
+ _el = el[0];
+ computed = window.getComputedStyle(el[0]);
+ w = parseFloat(computed.getPropertyValue("width")) + parseFloat(computed.getPropertyValue("margin-left")) + parseFloat(computed.getPropertyValue("margin-right"));
+ if (computed.getPropertyValue("box-sizing") !== "border-box") {
+ w += parseFloat(computed.getPropertyValue("border-left-width")) + parseFloat(computed.getPropertyValue("border-right-width")) + parseFloat(computed.getPropertyValue("padding-left")) + parseFloat(computed.getPropertyValue("padding-right"));
+ }
+ return w;
+ } else {
+ return el.outerWidth(true);
+ }
+ };
+ fn = function(elm, padding_bottom, parent_top, parent_height, top, height, el_float, detached) {
+ var bottomed, detach, fixed, last_pos, last_scroll_height, offset, parent, recalc, recalc_and_tick, recalc_counter, spacer, tick;
+ if (elm.data("sticky_kit")) {
+ return;
+ }
+ elm.data("sticky_kit", true);
+ last_scroll_height = doc.height();
+ parent = elm.parent();
+ if (parent_selector != null) {
+ parent = parent.closest(parent_selector);
+ }
+ if (!parent.length) {
+ throw "failed to find stick parent";
+ }
+ fixed = false;
+ bottomed = false;
+ spacer = manual_spacer != null ? manual_spacer && elm.closest(manual_spacer) : $("<div />");
+ if (spacer) {
+ spacer.css('position', elm.css('position'));
+ }
+ recalc = function() {
+ var border_top, padding_top, restore;
+ if (detached) {
+ return;
+ }
+ last_scroll_height = doc.height();
+ border_top = parseInt(parent.css("border-top-width"), 10);
+ padding_top = parseInt(parent.css("padding-top"), 10);
+ padding_bottom = parseInt(parent.css("padding-bottom"), 10);
+ parent_top = parent.offset().top + border_top + padding_top;
+ parent_height = parent.outerHeight(true);
+ if (fixed) {
+ fixed = false;
+ bottomed = false;
+ if (manual_spacer == null) {
+ elm.insertAfter(spacer);
+ spacer.detach();
+ }
+ elm.css({
+ position: "",
+ top: "",
+ width: "",
+ bottom: ""
+ }).removeClass(sticky_class);
+ restore = true;
+ }
+ top = elm.offset().top - (parseInt(elm.css("margin-top"), 10) || 0) - offset_top;
+ height = elm.outerHeight(true);
+ el_float = elm.css("float");
+ if (spacer) {
+ spacer.css({
+ width: outer_width(elm),
+ height: height,
+ display: elm.css("display"),
+ "vertical-align": elm.css("vertical-align"),
+ "float": el_float
+ });
+ }
+ if (restore) {
+ return tick();
+ }
+ };
+ recalc();
+ if (height === parent_height) {
+ return;
+ }
+ last_pos = void 0;
+ offset = offset_top;
+ recalc_counter = recalc_every;
+ tick = function() {
+ var css, delta, recalced, scroll, will_bottom, win_height;
+ if (detached) {
+ return;
+ }
+ recalced = false;
+ if (recalc_counter != null) {
+ recalc_counter -= 1;
+ if (recalc_counter <= 0) {
+ recalc_counter = recalc_every;
+ recalc();
+ recalced = true;
+ }
+ }
+ if (!recalced && doc.height() !== last_scroll_height) {
+ recalc();
+ recalced = true;
+ }
+ scroll = win.scrollTop();
+ if (last_pos != null) {
+ delta = scroll - last_pos;
+ }
+ last_pos = scroll;
+ if (fixed) {
+ if (enable_bottoming) {
+ will_bottom = scroll + height + offset > parent_height + parent_top;
+ if (bottomed && !will_bottom) {
+ bottomed = false;
+ elm.css({
+ position: "fixed",
+ bottom: "",
+ top: offset
+ }).trigger("sticky_kit:unbottom");
+ }
+ }
+ if (scroll < top) {
+ fixed = false;
+ offset = offset_top;
+ if (manual_spacer == null) {
+ if (el_float === "left" || el_float === "right") {
+ elm.insertAfter(spacer);
+ }
+ spacer.detach();
+ }
+ css = {
+ position: "",
+ width: "",
+ top: ""
+ };
+ elm.css(css).removeClass(sticky_class).trigger("sticky_kit:unstick");
+ }
+ if (inner_scrolling) {
+ win_height = win.height();
+ if (height + offset_top > win_height) {
+ if (!bottomed) {
+ offset -= delta;
+ offset = Math.max(win_height - height, offset);
+ offset = Math.min(offset_top, offset);
+ if (fixed) {
+ elm.css({
+ top: offset + "px"
+ });
+ }
+ }
+ }
+ }
+ } else {
+ if (scroll > top) {
+ fixed = true;
+ css = {
+ position: "fixed",
+ top: offset
+ };
+ css.width = elm.css("box-sizing") === "border-box" ? elm.outerWidth() + "px" : elm.width() + "px";
+ elm.css(css).addClass(sticky_class);
+ if (manual_spacer == null) {
+ elm.after(spacer);
+ if (el_float === "left" || el_float === "right") {
+ spacer.append(elm);
+ }
+ }
+ elm.trigger("sticky_kit:stick");
+ }
+ }
+ if (fixed && enable_bottoming) {
+ if (will_bottom == null) {
+ will_bottom = scroll + height + offset > parent_height + parent_top;
+ }
+ if (!bottomed && will_bottom) {
+ bottomed = true;
+ if (parent.css("position") === "static") {
+ parent.css({
+ position: "relative"
+ });
+ }
+ return elm.css({
+ position: "absolute",
+ bottom: padding_bottom,
+ top: "auto"
+ }).trigger("sticky_kit:bottom");
+ }
+ }
+ };
+ recalc_and_tick = function() {
+ recalc();
+ return tick();
+ };
+ detach = function() {
+ detached = true;
+ win.off("touchmove", tick);
+ win.off("scroll", tick);
+ win.off("resize", recalc_and_tick);
+ $(document.body).off("sticky_kit:recalc", recalc_and_tick);
+ elm.off("sticky_kit:detach", detach);
+ elm.removeData("sticky_kit");
+ elm.css({
+ position: "",
+ bottom: "",
+ top: "",
+ width: ""
+ });
+ parent.position("position", "");
+ if (fixed) {
+ if (manual_spacer == null) {
+ if (el_float === "left" || el_float === "right") {
+ elm.insertAfter(spacer);
+ }
+ spacer.remove();
+ }
+ return elm.removeClass(sticky_class);
+ }
+ };
+ win.on("touchmove", tick);
+ win.on("scroll", tick);
+ win.on("resize", recalc_and_tick);
+ $(document.body).on("sticky_kit:recalc", recalc_and_tick);
+ elm.on("sticky_kit:detach", detach);
+ return setTimeout(tick, 0);
+ };
+ for (i = 0, len = this.length; i < len; i++) {
+ elm = this[i];
+ fn($(elm));
+ }
+ return this;
+ };
+
+}).call(this);
diff --git a/library/sticky-kit/sticky-kit.min.js b/library/sticky-kit/sticky-kit.min.js
new file mode 100644
index 000000000..c4d7f2e3b
--- /dev/null
+++ b/library/sticky-kit/sticky-kit.min.js
@@ -0,0 +1,10 @@
+/*
+ Sticky-kit v1.1.3 | MIT | Leaf Corcoran 2015 | http://leafo.net
+*/
+(function(){var c,f;c=window.jQuery;f=c(window);c.fn.stick_in_parent=function(b){var A,w,J,n,B,K,p,q,L,k,E,t;null==b&&(b={});t=b.sticky_class;B=b.inner_scrolling;E=b.recalc_every;k=b.parent;q=b.offset_top;p=b.spacer;w=b.bottoming;null==q&&(q=0);null==k&&(k=void 0);null==B&&(B=!0);null==t&&(t="is_stuck");A=c(document);null==w&&(w=!0);L=function(a){var b;return window.getComputedStyle?(a=window.getComputedStyle(a[0]),b=parseFloat(a.getPropertyValue("width"))+parseFloat(a.getPropertyValue("margin-left"))+
+parseFloat(a.getPropertyValue("margin-right")),"border-box"!==a.getPropertyValue("box-sizing")&&(b+=parseFloat(a.getPropertyValue("border-left-width"))+parseFloat(a.getPropertyValue("border-right-width"))+parseFloat(a.getPropertyValue("padding-left"))+parseFloat(a.getPropertyValue("padding-right"))),b):a.outerWidth(!0)};J=function(a,b,n,C,F,u,r,G){var v,H,m,D,I,d,g,x,y,z,h,l;if(!a.data("sticky_kit")){a.data("sticky_kit",!0);I=A.height();g=a.parent();null!=k&&(g=g.closest(k));if(!g.length)throw"failed to find stick parent";
+v=m=!1;(h=null!=p?p&&a.closest(p):c("<div />"))&&h.css("position",a.css("position"));x=function(){var d,f,e;if(!G&&(I=A.height(),d=parseInt(g.css("border-top-width"),10),f=parseInt(g.css("padding-top"),10),b=parseInt(g.css("padding-bottom"),10),n=g.offset().top+d+f,C=g.height(),m&&(v=m=!1,null==p&&(a.insertAfter(h),h.detach()),a.css({position:"",top:"",width:"",bottom:""}).removeClass(t),e=!0),F=a.offset().top-(parseInt(a.css("margin-top"),10)||0)-q,u=a.outerHeight(!0),r=a.css("float"),h&&h.css({width:L(a),
+height:u,display:a.css("display"),"vertical-align":a.css("vertical-align"),"float":r}),e))return l()};x();if(u!==C)return D=void 0,d=q,z=E,l=function(){var c,l,e,k;if(!G&&(e=!1,null!=z&&(--z,0>=z&&(z=E,x(),e=!0)),e||A.height()===I||x(),e=f.scrollTop(),null!=D&&(l=e-D),D=e,m?(w&&(k=e+u+d>C+n,v&&!k&&(v=!1,a.css({position:"fixed",bottom:"",top:d}).trigger("sticky_kit:unbottom"))),e<F&&(m=!1,d=q,null==p&&("left"!==r&&"right"!==r||a.insertAfter(h),h.detach()),c={position:"",width:"",top:""},a.css(c).removeClass(t).trigger("sticky_kit:unstick")),
+B&&(c=f.height(),u+q>c&&!v&&(d-=l,d=Math.max(c-u,d),d=Math.min(q,d),m&&a.css({top:d+"px"})))):e>F&&(m=!0,c={position:"fixed",top:d},c.width="border-box"===a.css("box-sizing")?a.outerWidth()+"px":a.width()+"px",a.css(c).addClass(t),null==p&&(a.after(h),"left"!==r&&"right"!==r||h.append(a)),a.trigger("sticky_kit:stick")),m&&w&&(null==k&&(k=e+u+d>C+n),!v&&k)))return v=!0,"static"===g.css("position")&&g.css({position:"relative"}),a.css({position:"absolute",bottom:b,top:"auto"}).trigger("sticky_kit:bottom")},
+y=function(){x();return l()},H=function(){G=!0;f.off("touchmove",l);f.off("scroll",l);f.off("resize",y);c(document.body).off("sticky_kit:recalc",y);a.off("sticky_kit:detach",H);a.removeData("sticky_kit");a.css({position:"",bottom:"",top:"",width:""});g.position("position","");if(m)return null==p&&("left"!==r&&"right"!==r||a.insertAfter(h),h.remove()),a.removeClass(t)},f.on("touchmove",l),f.on("scroll",l),f.on("resize",y),c(document.body).on("sticky_kit:recalc",y),a.on("sticky_kit:detach",H),setTimeout(l,
+0)}};n=0;for(K=this.length;n<K;n++)b=this[n],J(c(b));return this}}).call(this);
diff --git a/tests/README.md b/tests/README.md
new file mode 100644
index 000000000..395333159
--- /dev/null
+++ b/tests/README.md
@@ -0,0 +1,25 @@
+The folder tests/ contains resources for automated testing tools.
+
+Here you will find PHPUnit, Behat, etc. files to test the functionaly
+of Hubzilla. Right now it only contains some basic tests to see if feasable
+this can help improve the project.
+
+# Contents
+
+* unit/ PHPUnit tests
+These are unit tests to check the smallest parts, like single functions.
+It uses the tool PHPUnit https://phpunit.de/
+
+* acceptance/ functional/acceptance testing
+These are behavioral or so called functional/acceptance testing. They
+are used to test business logic. They are written in Gherkin and use
+the tool Behat http://behat.org/
+
+# How to use?
+You need the dev tools which are defined in the composer.json in the
+require-dev configuration.
+Run ```composer install``` without --no-dev to install these tools.
+
+To run unit tests run ```vendor/bin/phpunit tests/unit/```
+
+To run acceptance tests run ```vendor/bin/behat --config tests/acceptance/behat.yml```
diff --git a/tests/acceptance/behat.yml b/tests/acceptance/behat.yml
new file mode 100644
index 000000000..933571e5e
--- /dev/null
+++ b/tests/acceptance/behat.yml
@@ -0,0 +1,27 @@
+default:
+ suites:
+ default:
+ paths:
+ - %paths.base%/features
+ contexts:
+ - Behat\MinkExtension\Context\MinkContext
+ admin_features:
+ filters: { role: admin }
+ contexts:
+ - AdminContext
+ api_features:
+ paths:
+ - %paths.base%/features/api
+ filters:
+ tags: "@api"
+ contexts:
+ - ApiContext
+ gherkin:
+ filters:
+ tags: ~@wip
+ extensions:
+ Behat\MinkExtension:
+ base_url: 'http://localhost'
+ sessions:
+ default:
+ goutte: ~
diff --git a/tests/acceptance/features/bootstrap/AdminContext.php b/tests/acceptance/features/bootstrap/AdminContext.php
new file mode 100644
index 000000000..aa4dced67
--- /dev/null
+++ b/tests/acceptance/features/bootstrap/AdminContext.php
@@ -0,0 +1,23 @@
+<?php
+
+use Behat\Behat\Context\Context;
+use Behat\Behat\Context\SnippetAcceptingContext;
+use Behat\Gherkin\Node\PyStringNode;
+use Behat\Gherkin\Node\TableNode;
+
+/**
+ * Defines application features from the specific context.
+ */
+class AdminContext implements Context, SnippetAcceptingContext
+{
+ /**
+ * Initializes context.
+ *
+ * Every scenario gets its own context instance.
+ * You can also pass arbitrary arguments to the
+ * context constructor through behat.yml.
+ */
+ public function __construct()
+ {
+ }
+}
diff --git a/tests/acceptance/features/bootstrap/ApiContext.php b/tests/acceptance/features/bootstrap/ApiContext.php
new file mode 100644
index 000000000..9b772b209
--- /dev/null
+++ b/tests/acceptance/features/bootstrap/ApiContext.php
@@ -0,0 +1,23 @@
+<?php
+
+use Behat\Behat\Context\Context;
+use Behat\Behat\Context\SnippetAcceptingContext;
+use Behat\Gherkin\Node\PyStringNode;
+use Behat\Gherkin\Node\TableNode;
+
+/**
+ * Defines application features from the specific context.
+ */
+class ApiContext implements Context, SnippetAcceptingContext
+{
+ /**
+ * Initializes context.
+ *
+ * Every scenario gets its own context instance.
+ * You can also pass arbitrary arguments to the
+ * context constructor through behat.yml.
+ */
+ public function __construct()
+ {
+ }
+}
diff --git a/tests/acceptance/features/bootstrap/FeatureContext.php b/tests/acceptance/features/bootstrap/FeatureContext.php
new file mode 100644
index 000000000..2ec02da85
--- /dev/null
+++ b/tests/acceptance/features/bootstrap/FeatureContext.php
@@ -0,0 +1,23 @@
+<?php
+
+use Behat\Behat\Context\Context;
+use Behat\Behat\Context\SnippetAcceptingContext;
+use Behat\Gherkin\Node\PyStringNode;
+use Behat\Gherkin\Node\TableNode;
+
+/**
+ * Defines application features from the specific context.
+ */
+class FeatureContext implements Context, SnippetAcceptingContext
+{
+ /**
+ * Initializes context.
+ *
+ * Every scenario gets its own context instance.
+ * You can also pass arbitrary arguments to the
+ * context constructor through behat.yml.
+ */
+ public function __construct()
+ {
+ }
+}
diff --git a/tests/acceptance/features/login_local.feature b/tests/acceptance/features/login_local.feature
new file mode 100644
index 000000000..a7814b8f6
--- /dev/null
+++ b/tests/acceptance/features/login_local.feature
@@ -0,0 +1,18 @@
+Feature: Local login
+ In order to login locally
+ As a member
+ I need to successfully authenticate
+
+ Scenario: Provide wrong credentials
+ Given I am on "/login"
+ When I fill in "id_username" with "foo"
+ And I fill in "id_password" with "bar"
+ And I press "submit"
+ Then I should be on "/login"
+
+ Scenario: Provide correct credentials
+ Given I am on "/login"
+ When I fill in "id_username" with "behat"
+ And I fill in "id_password" with "behat"
+ And I press "submit"
+ Then I should be on "/apps"
diff --git a/tests/xss_filter_test.php b/tests/unit/AntiXSSTest.php
index 3fb6ac310..b45042a1e 100644
--- a/tests/xss_filter_test.php
+++ b/tests/unit/AntiXSSTest.php
@@ -1,13 +1,15 @@
<?php
/**
* tests several functions which are used to prevent xss attacks
- *
+ *
* @package test.util
*/
+use PHPUnit\Framework\TestCase;
+
require_once('include/text.php');
-class AntiXSSTest extends PHPUnit_Framework_TestCase {
+class AntiXSSTest extends TestCase {
/**
* test, that tags are escaped
@@ -27,31 +29,31 @@ class AntiXSSTest extends PHPUnit_Framework_TestCase {
*/
public function testXmlify() {
$text="<tag>I want to break\n this!11!<?hard?></tag>";
- $xml=xmlify($text);
+ $xml=xmlify($text);
$retext=unxmlify($text);
$this->assertEquals($text, $retext);
}
-
- /**
- * xmlify and put in a document
- */
- public function testXmlifyDocument() {
- $tag="<tag>I want to break</tag>";
+
+ /**
+ * xmlify and put in a document
+ */
+ public function testXmlifyDocument() {
+ $tag="<tag>I want to break</tag>";
$xml=xmlify($tag);
- $text='<text>'.$xml.'</text>';
-
- $xml_parser=xml_parser_create();
+ $text='<text>'.$xml.'</text>';
+
+ $xml_parser=xml_parser_create();
//should be possible to parse it
- $values=array(); $index=array();
- $this->assertEquals(1, xml_parse_into_struct($xml_parser, $text, $values, $index));
-
- $this->assertEquals(array('TEXT'=>array(0)),
- $index);
- $this->assertEquals(array(array('tag'=>'TEXT', 'type'=>'complete', 'level'=>1, 'value'=>$tag)),
+ $values=array(); $index=array();
+ $this->assertEquals(1, xml_parse_into_struct($xml_parser, $text, $values, $index));
+
+ $this->assertEquals(array('TEXT'=>array(0)),
+ $index);
+ $this->assertEquals(array(array('tag'=>'TEXT', 'type'=>'complete', 'level'=>1, 'value'=>$tag)),
$values);
-
- xml_parser_free($xml_parser);
+
+ xml_parser_free($xml_parser);
}
/**
diff --git a/tests/autoname_test.php b/tests/unit/AutonameTest.php
index 702e05bef..9f92f736f 100644
--- a/tests/autoname_test.php
+++ b/tests/unit/AutonameTest.php
@@ -1,76 +1,78 @@
<?php
/**
* this file contains tests for the autoname function
- *
+ *
* @package test.util
*/
+use PHPUnit\Framework\TestCase;
+
/** required, it is the file under test */
require_once('include/text.php');
/**
* TestCase for the autoname function
- *
+ *
* @author Alexander Kampmann
* @package test.util
*/
-class AutonameTest extends PHPUnit_Framework_TestCase {
- /**
- *autonames should be random, even length
- */
- public function testAutonameEven() {
- $autoname1=autoname(10);
- $autoname2=autoname(10);
-
- $this->assertNotEquals($autoname1, $autoname2);
- }
-
- /**
- *autonames should be random, odd length
- */
- public function testAutonameOdd() {
- $autoname1=autoname(9);
- $autoname2=autoname(9);
-
- $this->assertNotEquals($autoname1, $autoname2);
- }
-
- /**
- * try to fail autonames
- */
- public function testAutonameNoLength() {
- $autoname1=autoname(0);
- $this->assertEquals(0, strlen($autoname1));
- }
-
+class AutonameTest extends TestCase {
+ /**
+ *autonames should be random, even length
+ */
+ public function testAutonameEven() {
+ $autoname1=autoname(10);
+ $autoname2=autoname(10);
+
+ $this->assertNotEquals($autoname1, $autoname2);
+ }
+
+ /**
+ *autonames should be random, odd length
+ */
+ public function testAutonameOdd() {
+ $autoname1=autoname(9);
+ $autoname2=autoname(9);
+
+ $this->assertNotEquals($autoname1, $autoname2);
+ }
+
+ /**
+ * try to fail autonames
+ */
+ public function testAutonameNoLength() {
+ $autoname1=autoname(0);
+ $this->assertEquals(0, strlen($autoname1));
+ }
+
/**
* try to fail it with invalid input
- *
+ *
* TODO: What's corect behaviour here? An exception?
- */
- public function testAutonameNegativeLength() {
- $autoname1=autoname(-23);
- $this->assertEquals(0, strlen($autoname1));
- }
-
- // public function testAutonameMaxLength() {
- // $autoname2=autoname(PHP_INT_MAX);
- // $this->assertEquals(PHP_INT_MAX, count($autoname2));
- // }
-
+ */
+ public function testAutonameNegativeLength() {
+ $autoname1=autoname(-23);
+ $this->assertEquals(0, strlen($autoname1));
+ }
+
+ // public function testAutonameMaxLength() {
+ // $autoname2=autoname(PHP_INT_MAX);
+ // $this->assertEquals(PHP_INT_MAX, count($autoname2));
+ // }
+
/**
* test with a length, that may be too short
- */
- public function testAutonameLength1() {
- $autoname1=autoname(1);
+ */
+ public function testAutonameLength1() {
+ $autoname1=autoname(1);
$this->assertEquals(1, count($autoname1));
-
- $autoname2=autoname(1);
+
+ $autoname2=autoname(1);
$this->assertEquals(1, count($autoname2));
// The following test is problematic, with only 26 possibilities
// generating the same thing twice happens often aka
// birthday paradox
-// $this->assertFalse($autoname1==$autoname2);
+// $this->assertFalse($autoname1==$autoname2);
}
} \ No newline at end of file
diff --git a/tests/contains_attribute_test.php b/tests/unit/ContainsAttributeTest.php
index b0bb06acf..0930d9837 100644
--- a/tests/contains_attribute_test.php
+++ b/tests/unit/ContainsAttributeTest.php
@@ -1,51 +1,53 @@
<?php
-/**
- * this test tests the contains_attribute function
- *
- * @package test.util
- */
-
-/** required, it is the file under test */
-require_once('include/text.php');
-
-/**
- * TestCase for the contains_attribute function
- *
- * @author Alexander Kampmann
- * @package test.util
- */
-class ContainsAttributeTest extends PHPUnit_Framework_TestCase {
- /**
- * test attribute contains
- */
- public function testAttributeContains1() {
- $testAttr="class1 notclass2 class3";
- $this->assertTrue(attribute_contains($testAttr, "class3"));
- $this->assertFalse(attribute_contains($testAttr, "class2"));
- }
-
- /**
- * test attribute contains
- */
- public function testAttributeContains2() {
- $testAttr="class1 not-class2 class3";
- $this->assertTrue(attribute_contains($testAttr, "class3"));
- $this->assertFalse(attribute_contains($testAttr, "class2"));
- }
-
+/**
+ * this test tests the contains_attribute function
+ *
+ * @package test.util
+ */
+
+use PHPUnit\Framework\TestCase;
+
+/** required, it is the file under test */
+require_once('include/text.php');
+
+/**
+ * TestCase for the contains_attribute function
+ *
+ * @author Alexander Kampmann
+ * @package test.util
+ */
+class ContainsAttributeTest extends TestCase {
+ /**
+ * test attribute contains
+ */
+ public function testAttributeContains1() {
+ $testAttr="class1 notclass2 class3";
+ $this->assertTrue(attribute_contains($testAttr, "class3"));
+ $this->assertFalse(attribute_contains($testAttr, "class2"));
+ }
+
+ /**
+ * test attribute contains
+ */
+ public function testAttributeContains2() {
+ $testAttr="class1 not-class2 class3";
+ $this->assertTrue(attribute_contains($testAttr, "class3"));
+ $this->assertFalse(attribute_contains($testAttr, "class2"));
+ }
+
/**
* test with empty input
- */
- public function testAttributeContainsEmpty() {
- $testAttr="";
- $this->assertFalse(attribute_contains($testAttr, "class2"));
- }
-
+ */
+ public function testAttributeContainsEmpty() {
+ $testAttr="";
+ $this->assertFalse(attribute_contains($testAttr, "class2"));
+ }
+
/**
* test input with special chars
- */
- public function testAttributeContainsSpecialChars() {
- $testAttr="--... %\$ä() /(=?}";
- $this->assertFalse(attribute_contains($testAttr, "class2"));
+ */
+ public function testAttributeContainsSpecialChars() {
+ $testAttr="--... %\$ä() /(=?}";
+ $this->assertFalse(attribute_contains($testAttr, "class2"));
}
} \ No newline at end of file
diff --git a/tests/unit/Lib/PermissionDescriptionTest.php b/tests/unit/Lib/PermissionDescriptionTest.php
new file mode 100644
index 000000000..b1da5a0fd
--- /dev/null
+++ b/tests/unit/Lib/PermissionDescriptionTest.php
@@ -0,0 +1,110 @@
+<?php
+/*
+ * Copyright (c) 2016 Hubzilla
+ *
+ * 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.
+ */
+
+// Global namespace for fully qualified \App class.
+namespace {
+ // General channel permissions in boot.php
+ // 0 = Only you
+ define ( 'PERMS_PUBLIC' , 0x0001 ); // anybody
+ define ( 'PERMS_NETWORK' , 0x0002 ); // anybody in this network
+ define ( 'PERMS_SITE' , 0x0004 ); // anybody on this site
+ define ( 'PERMS_CONTACTS' , 0x0008 ); // any of my connections
+ define ( 'PERMS_SPECIFIC' , 0x0080 ); // only specific connections
+ define ( 'PERMS_AUTHED' , 0x0100 ); // anybody authenticated (could include visitors from other networks)
+ define ( 'PERMS_PENDING' , 0x0200 ); // any connections including those who haven't yet been approved
+ // log levels in boot.php
+ define ( 'LOGGER_DEBUG', 2 );
+
+ // Stub global fully qualified \App class for static function calls
+ class App {
+ // Stub get_hostname()
+ public static function get_hostname() {
+ return 'phpunit';
+ }
+ }
+}
+
+// Stub global functions used in PermissionDescription with the help of
+// PHP's namespace resolution rules.
+namespace Zotlabs\Lib {
+ // Stub global translate function t()
+ function t($s) {
+ return $s;
+ }
+ // Stub global log function logger()
+ function logger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) {
+ // doesn't matter
+ }
+}
+
+// regular namespace for this unit test
+namespace Zotlabs\Tests\Unit\Lib {
+
+ use Zotlabs\Tests\Unit\UnitTestCase;
+ use Zotlabs\Lib\PermissionDescription;
+
+ /**
+ * @brief Unit Test case for ConnectionPool class.
+ */
+ class PermissionDescriptionTest extends UnitTestCase {
+
+ public function testFromDescription() {
+ $permDesc = PermissionDescription::fromDescription('test');
+ $permDesc2 = PermissionDescription::fromDescription('test');
+ $permDesc3 = PermissionDescription::fromDescription('test2');
+
+ $this->assertEquals($permDesc, $permDesc2);
+ $this->assertNotEquals($permDesc, $permDesc3);
+ }
+
+ public function testFromStandalonePermission() {
+ $permDescUnknown = PermissionDescription::fromStandalonePermission(-1);
+ $permDescSelf = PermissionDescription::fromStandalonePermission(0);
+
+ $this->assertNull($permDescUnknown);
+ $this->assertNotNull($permDescSelf);
+ }
+
+ public function testFromGlobalPermission() {
+ //$permDesc = PermissionDescription::fromGlobalPermission('view_profile');
+
+ $this->markTestIncomplete(
+ 'For this test we need more stubs...'
+ );
+ }
+
+ public function testGetPermissionDescription() {
+
+ // fromStandalonePermission uses get_permission_description(), so that will not help
+ //$permDescSelf = PermissionDescription::fromStandalonePermission(0);
+ //$permDescPublic = PermissionDescription::fromStandalonePermission(PERMS_PUBLIC);
+
+ $this->markTestIncomplete(
+ 'For this test we need a mock of PermissionDescription...'
+ );
+ //$permDescSelf =
+ //$this->assertEquals($permDescSelf->, 'Only me');
+ //$this->assertEquals($permDescPublic, 'Public');
+ }
+ }
+}
diff --git a/tests/text_test.php b/tests/unit/TextTest.php
index d1e210b68..48c04bc54 100644
--- a/tests/text_test.php
+++ b/tests/unit/TextTest.php
@@ -1,20 +1,22 @@
<?php
/**
* this file contains tests for text.php
- *
+ *
* @package test.util
*/
+use PHPUnit\Framework\TestCase;
+
/** required, it is the file under test */
require_once('include/text.php');
/**
* TestCase for the texter
- *
+ *
* @author ken restivo
* @package test.util
*/
-class TextTest extends PHPUnit_Framework_TestCase {
+class TextTest extends TestCase {
public function testGoodEmail() {
$this->assertTrue(valid_email_regex('ken@spaz.org'));
}
diff --git a/tests/unit/UnitTestCase.php b/tests/unit/UnitTestCase.php
new file mode 100644
index 000000000..7d706d5be
--- /dev/null
+++ b/tests/unit/UnitTestCase.php
@@ -0,0 +1,38 @@
+<?php
+/* Copyright (c) 2016 Hubzilla
+ *
+ * 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.
+ */
+
+namespace Zotlabs\Tests\Unit;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @brief Base class for our Unit Tests.
+ *
+ * Empty class at the moment, but you should extend this class for unit test
+ * cases, so we could and for sure we will need to implement basic behaviour
+ * for all of our unit tests.
+ *
+ * @author Klaus Weidenbach
+ */
+abstract class UnitTestCase extends TestCase {
+ // when needed we can define functionality here which is used in UnitTests.
+}
diff --git a/tests/upload_test.php b/tests/unit/UploadTest.php
index 031315fba..ab9d0e50a 100644
--- a/tests/upload_test.php
+++ b/tests/unit/UploadTest.php
@@ -1,20 +1,22 @@
<?php
/**
* this file contains tests for the uploader
- *
+ *
* @package test.util
*/
+use PHPUnit\Framework\TestCase;
+
/** required, it is the file under test */
require_once('include/attach.php');
/**
* TestCase for the uploader
- *
+ *
* @author ken restivo
* @package test.util
*/
-class UploadTest extends PHPUnit_Framework_TestCase {
+class UploadTest extends TestCase {
public function testFileNameMutipleDots() {
$multidots = "foo.bar.baz.0.1.3.ogg";
$this->assertEquals("audio/ogg", z_mime_content_type($multidots));
diff --git a/tests/expand_acl_test.php b/tests/unit/expand_acl_test.php
index 154bc921d..154bc921d 100644
--- a/tests/expand_acl_test.php
+++ b/tests/unit/expand_acl_test.php
diff --git a/tests/get_tags_test.php b/tests/unit/get_tags_test.php
index 40f016747..40f016747 100644
--- a/tests/get_tags_test.php
+++ b/tests/unit/get_tags_test.php
diff --git a/tests/template_test.php b/tests/unit/template_test.php
index 1f9f80531..1f9f80531 100644
--- a/tests/template_test.php
+++ b/tests/unit/template_test.php
diff --git a/util/Doxyfile b/util/Doxyfile
index 55acd46eb..f6c0692ee 100644
--- a/util/Doxyfile
+++ b/util/Doxyfile
@@ -1,8 +1,8 @@
-INPUT = README.md index.php boot.php mod/ include/ util/ view/ version.inc
+INPUT = README.md index.php boot.php include/ install/ util/ view/ Zotlabs/
RECURSIVE = YES
PROJECT_NAME = "The Hubzilla"
PROJECT_LOGO = images/rm-64.png
-EXCLUDE = .htconfig.php library/ doc/ vendor/ .git/ util/zotsh/easywebdav/
+EXCLUDE = .htconfig.php library/ doc/ store/ vendor/ .git/ util/zotsh/easywebdav/ util/generate-hooks-index/
EXCLUDE_PATTERNS = *smarty3* *strings.php *.out *test*
OUTPUT_DIRECTORY = doc
GENERATE_HTML = YES
@@ -21,3 +21,5 @@ ALIASES += "fixme=\xrefitem fixme \"Fixme\" \"Fixme List\""
ALIASES += "FIXME=\fixme"
ALIASES += "TODO=\todo"
ALIASES += "BUG=\bug"
+ALIASES += "hooks=\xrefitem hooks \"Hooks\" \"Hooks List\""
+ALIASES += "HOOKS=\hooks"
diff --git a/util/connect b/util/connect
new file mode 100755
index 000000000..eed14961c
--- /dev/null
+++ b/util/connect
@@ -0,0 +1,64 @@
+#!/usr/bin/env php
+<?php
+
+// connect utility
+
+if(! file_exists('include/cli_startup.php')) {
+ echo t('Run from the top level $Projectname web directory, as util/connect <args>') . PHP_EOL;
+ exit(1);
+}
+
+require_once('include/cli_startup.php');
+require_once('include/follow.php');
+
+cli_startup();
+
+
+ if($argc != 3) {
+ echo t('Usage: util/connect channel_id|channel_address channel[@hub]');
+ exit(1);
+ }
+
+ if(ctype_digit($argv[1])) {
+ $c = channelx_by_n($argv[1]);
+ }
+ else {
+ $c = channelx_by_nick($argv[1]);
+ }
+
+ if(! $c) {
+ echo t('Source channel not found.');
+ exit(1);
+ }
+
+ $result = new_contact($c['channel_id'],$argv[2],$c,false,false);
+
+ if($result['success'] == false) {
+ echo $result['message'];
+ exit(1);
+ }
+
+ $clone = array();
+ foreach($result['abook'] as $k => $v) {
+ if(strpos($k,'abook_') === 0) {
+ $clone[$k] = $v;
+ }
+ }
+ unset($clone['abook_id']);
+ unset($clone['abook_account']);
+ unset($clone['abook_channel']);
+
+ $abconfig = load_abconfig($c['channel_id'],$clone['abook_xchan']);
+ if($abconfig)
+ $clone['abconfig'] = $abconfig;
+ build_sync_packet($c['channel_id'], array('abook' => array($clone)), true);
+
+ $can_view_stream = intval(get_abconfig($c['channel_id'],$clone['abook_xchan'],'their_perms','view_stream'));
+
+ // If we can view their stream, pull in some posts
+
+ if(($can_view_stream) || ($result['abook']['xchan_network'] === 'rss'))
+ \Zotlabs\Daemon\Master::Summon(array('Onepoll',$result['abook']['abook_id']));
+
+
+ exit(0);
diff --git a/util/hmessages.po b/util/hmessages.po
index 737d7c385..5d0ffd75a 100644
--- a/util/hmessages.po
+++ b/util/hmessages.po
@@ -1,14 +1,14 @@
-# Hubzilla Project
-# Copyright (C) 2012-2014 the Hubzilla Project
-# This file is distributed under the same license as the Red package.
+# hubzilla
+# Copyright (C) 2012-2016 hubzilla
+# This file is distributed under the same license as the hubzilla package.
# Mike Macgirvin, 2012
#
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: \n"
+"Project-Id-Version: 1.15.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-10-14 00:02-0700\n"
+"POT-Creation-Date: 2016-12-09 00:05-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,151 +17,155 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../../Zotlabs/Access/PermissionRoles.php:182
+#: ../../Zotlabs/Access/PermissionRoles.php:227
#: ../../include/permissions.php:945
msgid "Social Networking"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:183
+#: ../../Zotlabs/Access/PermissionRoles.php:228
#: ../../include/permissions.php:945
msgid "Social - Mostly Public"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:184
+#: ../../Zotlabs/Access/PermissionRoles.php:229
#: ../../include/permissions.php:945
msgid "Social - Restricted"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:185
+#: ../../Zotlabs/Access/PermissionRoles.php:230
#: ../../include/permissions.php:945
msgid "Social - Private"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:188
+#: ../../Zotlabs/Access/PermissionRoles.php:233
#: ../../include/permissions.php:946
msgid "Community Forum"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:189
+#: ../../Zotlabs/Access/PermissionRoles.php:234
#: ../../include/permissions.php:946
msgid "Forum - Mostly Public"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:190
+#: ../../Zotlabs/Access/PermissionRoles.php:235
#: ../../include/permissions.php:946
msgid "Forum - Restricted"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:191
+#: ../../Zotlabs/Access/PermissionRoles.php:236
#: ../../include/permissions.php:946
msgid "Forum - Private"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:194
+#: ../../Zotlabs/Access/PermissionRoles.php:239
#: ../../include/permissions.php:947
msgid "Feed Republish"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:195
+#: ../../Zotlabs/Access/PermissionRoles.php:240
#: ../../include/permissions.php:947
msgid "Feed - Mostly Public"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:196
+#: ../../Zotlabs/Access/PermissionRoles.php:241
#: ../../include/permissions.php:947
msgid "Feed - Restricted"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:199
+#: ../../Zotlabs/Access/PermissionRoles.php:244
#: ../../include/permissions.php:948
msgid "Special Purpose"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:200
+#: ../../Zotlabs/Access/PermissionRoles.php:245
#: ../../include/permissions.php:948
msgid "Special - Celebrity/Soapbox"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:201
+#: ../../Zotlabs/Access/PermissionRoles.php:246
#: ../../include/permissions.php:948
msgid "Special - Group Repository"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:204
-#: ../../Zotlabs/Module/Settings/Channel.php:442
+#: ../../Zotlabs/Access/PermissionRoles.php:249
#: ../../Zotlabs/Module/Register.php:213
-#: ../../Zotlabs/Module/New_channel.php:132 ../../include/selectors.php:49
-#: ../../include/selectors.php:66 ../../include/selectors.php:104
-#: ../../include/selectors.php:140 ../../include/permissions.php:949
+#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Settings/Channel.php:445
+#: ../../extend/addon/addon/cdav/cdav.php:277
+#: ../../extend/addon/addon/cdav/cdav.php:284
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1148
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+#: ../../include/selectors.php:104 ../../include/selectors.php:140
+#: ../../include/permissions.php:949
msgid "Other"
msgstr ""
-#: ../../Zotlabs/Access/PermissionRoles.php:205
+#: ../../Zotlabs/Access/PermissionRoles.php:250
#: ../../include/permissions.php:949
msgid "Custom/Expert Mode"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:30
+#: ../../Zotlabs/Access/Permissions.php:46
msgid "Can view my channel stream and posts"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:31 ../../include/permissions.php:42
+#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
msgid "Can send me their channel stream and posts"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:32 ../../include/permissions.php:36
+#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
msgid "Can view my default channel profile"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:33 ../../include/permissions.php:37
+#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
msgid "Can view my connections"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:34 ../../include/permissions.php:38
+#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
msgid "Can view my file storage and photos"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:35
+#: ../../Zotlabs/Access/Permissions.php:51
msgid "Can upload/modify my file storage and photos"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:36
+#: ../../Zotlabs/Access/Permissions.php:52
msgid "Can view my channel webpages"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:37
+#: ../../Zotlabs/Access/Permissions.php:53
msgid "Can create/edit my channel webpages"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:38
+#: ../../Zotlabs/Access/Permissions.php:54
msgid "Can post on my channel (wall) page"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:39 ../../include/permissions.php:44
+#: ../../Zotlabs/Access/Permissions.php:55 ../../include/permissions.php:44
msgid "Can comment on or like my posts"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:40 ../../include/permissions.php:45
+#: ../../Zotlabs/Access/Permissions.php:56 ../../include/permissions.php:45
msgid "Can send me private mail messages"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:41
+#: ../../Zotlabs/Access/Permissions.php:57
msgid "Can like/dislike profiles and profile things"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:42
+#: ../../Zotlabs/Access/Permissions.php:58
msgid "Can forward to all my channel connections via @+ mentions in posts"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:43
+#: ../../Zotlabs/Access/Permissions.php:59
msgid "Can chat with me"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:44 ../../include/permissions.php:53
+#: ../../Zotlabs/Access/Permissions.php:60 ../../include/permissions.php:53
msgid "Can source my public posts in derived channels"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:45
+#: ../../Zotlabs/Access/Permissions.php:61
msgid "Can administer my channel"
msgstr ""
@@ -169,7 +173,7 @@ msgstr ""
msgid "parent"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2723
+#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2682
msgid "Collection"
msgstr ""
@@ -196,14 +200,17 @@ msgstr ""
#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Module/Photos.php:789
#: ../../Zotlabs/Module/Photos.php:1249
#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:490
-#: ../../Zotlabs/Lib/Apps.php:565 ../../include/widgets.php:1682
-#: ../../include/conversation.php:1031
+#: ../../Zotlabs/Lib/Apps.php:565
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
+#: ../../include/widgets.php:1754 ../../include/conversation.php:1047
msgid "Unknown"
msgstr ""
#: ../../Zotlabs/Storage/Browser.php:224 ../../Zotlabs/Module/Fbrowser.php:85
#: ../../Zotlabs/Lib/Apps.php:217 ../../include/nav.php:96
-#: ../../include/conversation.php:1679
+#: ../../include/conversation.php:1699
msgid "Files"
msgstr ""
@@ -217,33 +224,43 @@ msgstr ""
#: ../../Zotlabs/Storage/Browser.php:228 ../../Zotlabs/Storage/Browser.php:321
#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/New_channel.php:147
-#: ../../Zotlabs/Module/Webpages.php:239 ../../Zotlabs/Module/Blocks.php:159
-#: ../../Zotlabs/Module/Layouts.php:184
+#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Layouts.php:184
+#: ../../Zotlabs/Module/Webpages.php:239
+#: ../../extend/addon/addon/cdav/include/widgets.php:127
+#: ../../extend/addon/addon/cdav/include/widgets.php:164
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1151
+#: ../../include/widgets.php:969
msgid "Create"
msgstr ""
#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:323
#: ../../Zotlabs/Module/Cover_photo.php:357
-#: ../../Zotlabs/Module/Profile_photo.php:390
#: ../../Zotlabs/Module/Photos.php:816 ../../Zotlabs/Module/Photos.php:1370
-#: ../../Zotlabs/Module/Embedphotos.php:157 ../../include/widgets.php:1695
+#: ../../Zotlabs/Module/Profile_photo.php:410
+#: ../../Zotlabs/Module/Embedphotos.php:157
+#: ../../extend/addon/addon/cdav/include/widgets.php:132
+#: ../../extend/addon/addon/cdav/include/widgets.php:168
+#: ../../include/widgets.php:1767
msgid "Upload"
msgstr ""
#: ../../Zotlabs/Storage/Browser.php:233
+#: ../../Zotlabs/Module/Admin/Channels.php:159
+#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Wiki.php:151
#: ../../Zotlabs/Module/Settings/Oauth.php:89
#: ../../Zotlabs/Module/Settings/Oauth.php:115
-#: ../../Zotlabs/Module/Admin/Channels.php:159
-#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Chat.php:250
+#: ../../Zotlabs/Module/Chat.php:250
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1136
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:132
msgid "Name"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:234
+#: ../../Zotlabs/Storage/Browser.php:234 ../../Zotlabs/Module/Wiki.php:152
msgid "Type"
msgstr ""
#: ../../Zotlabs/Storage/Browser.php:235
-#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1397
+#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1390
msgid "Size"
msgstr ""
@@ -255,35 +272,40 @@ msgstr ""
#: ../../Zotlabs/Storage/Browser.php:238
#: ../../Zotlabs/Module/Connections.php:290
#: ../../Zotlabs/Module/Connections.php:310
-#: ../../Zotlabs/Module/Settings/Oauth.php:149
+#: ../../Zotlabs/Module/Admin/Profs.php:154
#: ../../Zotlabs/Module/Editlayout.php:114
#: ../../Zotlabs/Module/Editwebpage.php:145 ../../Zotlabs/Module/Menu.php:112
-#: ../../Zotlabs/Module/Editpost.php:84
-#: ../../Zotlabs/Module/Admin/Profs.php:154
-#: ../../Zotlabs/Module/Editblock.php:109
-#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Blocks.php:160
-#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Thing.php:260
-#: ../../Zotlabs/Lib/Apps.php:341 ../../Zotlabs/Lib/ThreadItem.php:106
+#: ../../Zotlabs/Module/Editblock.php:109 ../../Zotlabs/Module/Editpost.php:84
+#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:192
+#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Wiki.php:144
+#: ../../Zotlabs/Module/Wiki.php:252
+#: ../../Zotlabs/Module/Settings/Oauth.php:149
+#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Lib/Apps.php:341
+#: ../../Zotlabs/Lib/ThreadItem.php:106
+#: ../../extend/addon/addon/cdav/include/widgets.php:125
+#: ../../extend/addon/addon/cdav/include/widgets.php:161
+#: ../../include/channel.php:961 ../../include/channel.php:965
#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
-#: ../../include/menu.php:113 ../../include/channel.php:961
-#: ../../include/channel.php:965
+#: ../../include/menu.php:113 ../../include/widgets.php:965
msgid "Edit"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:239
+#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Module/Connedit.php:635
#: ../../Zotlabs/Module/Connections.php:263
-#: ../../Zotlabs/Module/Settings/Oauth.php:150
-#: ../../Zotlabs/Module/Editlayout.php:137
-#: ../../Zotlabs/Module/Editwebpage.php:170
-#: ../../Zotlabs/Module/Connedit.php:607
#: ../../Zotlabs/Module/Admin/Profs.php:155
#: ../../Zotlabs/Module/Admin/Accounts.php:173
#: ../../Zotlabs/Module/Admin/Channels.php:149
-#: ../../Zotlabs/Module/Editblock.php:134
-#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Module/Blocks.php:162
-#: ../../Zotlabs/Module/Group.php:177 ../../Zotlabs/Module/Thing.php:261
-#: ../../Zotlabs/Module/Photos.php:1179 ../../Zotlabs/Lib/Apps.php:342
-#: ../../Zotlabs/Lib/ThreadItem.php:126 ../../include/conversation.php:660
+#: ../../Zotlabs/Module/Editlayout.php:137
+#: ../../Zotlabs/Module/Editwebpage.php:170
+#: ../../Zotlabs/Module/Editblock.php:134 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Photos.php:1179 ../../Zotlabs/Module/Blocks.php:162
+#: ../../Zotlabs/Module/Webpages.php:242
+#: ../../Zotlabs/Module/Settings/Oauth.php:150
+#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Lib/Apps.php:342
+#: ../../Zotlabs/Lib/ThreadItem.php:126
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:864
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1153
+#: ../../include/conversation.php:676
msgid "Delete"
msgstr ""
@@ -313,105 +335,117 @@ msgstr ""
msgid "Drop files here to immediately upload"
msgstr ""
-#: ../../Zotlabs/Web/WebServer.php:127
-#: ../../Zotlabs/Module/Import_items.php:114 ../../Zotlabs/Module/Like.php:283
-#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68
-#: ../../Zotlabs/Module/Group.php:72 ../../Zotlabs/Module/Subthread.php:62
-#: ../../Zotlabs/Module/Profperm.php:28 ../../include/items.php:399
-msgid "Permission denied"
-msgstr ""
-
-#: ../../Zotlabs/Web/WebServer.php:128 ../../Zotlabs/Web/Router.php:67
-#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Rate.php:113
-#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Network.php:15
-#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Invite.php:17
-#: ../../Zotlabs/Module/Invite.php:94 ../../Zotlabs/Module/Manage.php:10
-#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
+#: ../../Zotlabs/Web/Router.php:67 ../../Zotlabs/Web/WebServer.php:128
+#: ../../Zotlabs/Module/Achievements.php:34
+#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Connedit.php:397
+#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Bookmarks.php:61
+#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Page.php:35
+#: ../../Zotlabs/Module/Page.php:91 ../../Zotlabs/Module/Manage.php:10
#: ../../Zotlabs/Module/Connections.php:33
#: ../../Zotlabs/Module/Cover_photo.php:277
-#: ../../Zotlabs/Module/Cover_photo.php:290 ../../Zotlabs/Module/Item.php:216
-#: ../../Zotlabs/Module/Item.php:224 ../../Zotlabs/Module/Item.php:1072
+#: ../../Zotlabs/Module/Cover_photo.php:290
#: ../../Zotlabs/Module/Editlayout.php:67
#: ../../Zotlabs/Module/Editlayout.php:90
#: ../../Zotlabs/Module/Editwebpage.php:68
#: ../../Zotlabs/Module/Editwebpage.php:89
#: ../../Zotlabs/Module/Editwebpage.php:104
-#: ../../Zotlabs/Module/Editwebpage.php:126 ../../Zotlabs/Module/Menu.php:78
-#: ../../Zotlabs/Module/Appman.php:75 ../../Zotlabs/Module/Register.php:77
-#: ../../Zotlabs/Module/Connedit.php:395
+#: ../../Zotlabs/Module/Editwebpage.php:126
+#: ../../Zotlabs/Module/Channel.php:107 ../../Zotlabs/Module/Channel.php:237
+#: ../../Zotlabs/Module/Channel.php:277 ../../Zotlabs/Module/Network.php:15
+#: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Appman.php:75
#: ../../Zotlabs/Module/Filestorage.php:23
#: ../../Zotlabs/Module/Filestorage.php:78
#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120
-#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Editpost.php:17
-#: ../../Zotlabs/Module/Profiles.php:197 ../../Zotlabs/Module/Profiles.php:595
-#: ../../Zotlabs/Module/Channel.php:106 ../../Zotlabs/Module/Channel.php:231
-#: ../../Zotlabs/Module/Channel.php:271 ../../Zotlabs/Module/Block.php:26
-#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Mail.php:121
-#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Item.php:220
+#: ../../Zotlabs/Module/Item.php:230 ../../Zotlabs/Module/Item.php:1098
+#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Mail.php:135
+#: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76
+#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94
+#: ../../Zotlabs/Module/Editblock.php:67 ../../Zotlabs/Module/Group.php:13
#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Message.php:18
-#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Setup.php:218
-#: ../../Zotlabs/Module/Editblock.php:67
+#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Photos.php:73
+#: ../../Zotlabs/Module/Setup.php:212 ../../Zotlabs/Module/Editpost.php:17
#: ../../Zotlabs/Module/New_channel.php:77
#: ../../Zotlabs/Module/New_channel.php:104
#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Module/Poke.php:137
-#: ../../Zotlabs/Module/Webpages.php:116 ../../Zotlabs/Module/Profile.php:68
-#: ../../Zotlabs/Module/Profile.php:76 ../../Zotlabs/Module/Blocks.php:73
-#: ../../Zotlabs/Module/Blocks.php:80 ../../Zotlabs/Module/Layouts.php:71
-#: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89
-#: ../../Zotlabs/Module/Settings.php:59
-#: ../../Zotlabs/Module/Profile_photo.php:265
-#: ../../Zotlabs/Module/Profile_photo.php:278
-#: ../../Zotlabs/Module/Events.php:264 ../../Zotlabs/Module/Common.php:39
-#: ../../Zotlabs/Module/Api.php:12 ../../Zotlabs/Module/Regmod.php:21
-#: ../../Zotlabs/Module/Group.php:13
+#: ../../Zotlabs/Module/Profiles.php:197 ../../Zotlabs/Module/Profiles.php:595
+#: ../../Zotlabs/Module/Profile.php:68 ../../Zotlabs/Module/Profile.php:76
+#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
+#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
+#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Rate.php:113
+#: ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Profile_photo.php:273
+#: ../../Zotlabs/Module/Profile_photo.php:286
+#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Api.php:24
+#: ../../Zotlabs/Module/Regmod.php:21 ../../Zotlabs/Module/Pdledit.php:29
#: ../../Zotlabs/Module/Service_limits.php:11
-#: ../../Zotlabs/Module/Thing.php:274 ../../Zotlabs/Module/Thing.php:294
-#: ../../Zotlabs/Module/Thing.php:335 ../../Zotlabs/Module/Sharedwithme.php:11
-#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Suggest.php:30
-#: ../../Zotlabs/Module/Photos.php:73
+#: ../../Zotlabs/Module/Webpages.php:116
+#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Wiki.php:189
+#: ../../Zotlabs/Module/Wiki.php:302 ../../Zotlabs/Module/Sources.php:74
+#: ../../Zotlabs/Module/Suggest.php:30 ../../Zotlabs/Module/Thing.php:274
+#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
#: ../../Zotlabs/Module/Viewconnections.php:28
#: ../../Zotlabs/Module/Viewconnections.php:33
#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Chat.php:100
-#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Lib/Chatroom.php:137
-#: ../../include/photos.php:27 ../../include/items.php:3490
-#: ../../include/attach.php:142 ../../include/attach.php:189
-#: ../../include/attach.php:253 ../../include/attach.php:267
-#: ../../include/attach.php:274 ../../include/attach.php:341
-#: ../../include/attach.php:355 ../../include/attach.php:362
-#: ../../include/attach.php:439 ../../include/attach.php:900
-#: ../../include/attach.php:971 ../../include/attach.php:1123
+#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Module/Events.php:267
+#: ../../Zotlabs/Lib/Chatroom.php:137
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:55
+#: ../../extend/addon/addon/keepout/keepout.php:36
+#: ../../extend/addon/addon/pumpio/pumpio.php:40
+#: ../../extend/addon/addon/openid/Mod_Id.php:53
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:58
+#: ../../include/items.php:3422 ../../include/attach.php:142
+#: ../../include/attach.php:189 ../../include/attach.php:253
+#: ../../include/attach.php:267 ../../include/attach.php:274
+#: ../../include/attach.php:341 ../../include/attach.php:355
+#: ../../include/attach.php:362 ../../include/attach.php:439
+#: ../../include/attach.php:906 ../../include/attach.php:977
+#: ../../include/attach.php:1135 ../../include/photos.php:27
msgid "Permission denied."
msgstr ""
-#: ../../Zotlabs/Web/Router.php:148 ../../include/help.php:62
+#: ../../Zotlabs/Web/Router.php:148 ../../include/help.php:63
msgid "Not Found"
msgstr ""
#: ../../Zotlabs/Web/Router.php:151 ../../Zotlabs/Module/Page.php:94
-#: ../../Zotlabs/Module/Block.php:79 ../../Zotlabs/Module/Display.php:120
-#: ../../include/help.php:65
+#: ../../Zotlabs/Module/Display.php:120 ../../Zotlabs/Module/Block.php:79
+#: ../../include/help.php:66
msgid "Page not found."
msgstr ""
+#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Dreport.php:10
+#: ../../Zotlabs/Module/Dreport.php:68
+#: ../../Zotlabs/Module/Import_items.php:114 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Like.php:283
+#: ../../Zotlabs/Module/Subthread.php:62
+#: ../../extend/addon/addon/frphotos/frphotos.php:81
+#: ../../extend/addon/addon/redfiles/redfiles.php:109
+#: ../../extend/addon/addon/redphotos/redphotos.php:119
+#: ../../include/items.php:327
+msgid "Permission denied"
+msgstr ""
+
#: ../../Zotlabs/Zot/Auth.php:138
msgid ""
"Remote authentication blocked. You are logged into this site locally. Please "
"logout and retry."
msgstr ""
-#: ../../Zotlabs/Zot/Auth.php:246
+#: ../../Zotlabs/Zot/Auth.php:250
+#: ../../extend/addon/addon/openid/Mod_Openid.php:76
+#: ../../extend/addon/addon/openid/Mod_Openid.php:183
#, php-format
msgid "Welcome %s. Remote authentication successful."
msgstr ""
#: ../../Zotlabs/Module/Achievements.php:15
-#: ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editlayout.php:31
#: ../../Zotlabs/Module/Editwebpage.php:32
-#: ../../Zotlabs/Module/Filestorage.php:59 ../../Zotlabs/Module/Connect.php:17
+#: ../../Zotlabs/Module/Filestorage.php:59
#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Hcard.php:12
-#: ../../Zotlabs/Module/Webpages.php:33 ../../Zotlabs/Module/Profile.php:20
-#: ../../Zotlabs/Module/Blocks.php:33 ../../Zotlabs/Module/Layouts.php:31
+#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Blocks.php:33
+#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Webpages.php:33
#: ../../include/channel.php:862
msgid "Requested profile is not available."
msgstr ""
@@ -428,1704 +462,6 @@ msgstr ""
msgid "Online"
msgstr ""
-#: ../../Zotlabs/Module/Rate.php:155 ../../Zotlabs/Module/Connedit.php:762
-#: ../../include/js_strings.php:20
-msgid "Rating"
-msgstr ""
-
-#: ../../Zotlabs/Module/Rate.php:156
-msgid "Website:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Rate.php:159
-#, php-format
-msgid "Remote Channel [%s] (not yet known on this site)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Rate.php:160
-msgid "Rating (this information is public)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Rate.php:161
-msgid "Optionally explain your rating (this information is public)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Rate.php:166 ../../Zotlabs/Module/Invite.php:149
-#: ../../Zotlabs/Module/Settings/Display.php:194
-#: ../../Zotlabs/Module/Settings/Features.php:47
-#: ../../Zotlabs/Module/Settings/Oauth.php:87
-#: ../../Zotlabs/Module/Settings/Tokens.php:167
-#: ../../Zotlabs/Module/Settings/Account.php:118
-#: ../../Zotlabs/Module/Settings/Channel.php:452
-#: ../../Zotlabs/Module/Appman.php:126 ../../Zotlabs/Module/Connedit.php:779
-#: ../../Zotlabs/Module/Filestorage.php:165
-#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Profiles.php:681
-#: ../../Zotlabs/Module/Admin/Features.php:66
-#: ../../Zotlabs/Module/Admin/Logs.php:84
-#: ../../Zotlabs/Module/Admin/Plugins.php:429
-#: ../../Zotlabs/Module/Admin/Profs.php:157
-#: ../../Zotlabs/Module/Admin/Security.php:104
-#: ../../Zotlabs/Module/Admin/Themes.php:156
-#: ../../Zotlabs/Module/Admin/Account_edit.php:74
-#: ../../Zotlabs/Module/Admin/Accounts.php:166
-#: ../../Zotlabs/Module/Admin/Channels.php:147
-#: ../../Zotlabs/Module/Admin/Site.php:258
-#: ../../Zotlabs/Module/Import_items.php:122 ../../Zotlabs/Module/Mail.php:370
-#: ../../Zotlabs/Module/Locs.php:121 ../../Zotlabs/Module/Mitem.php:243
-#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Setup.php:315
-#: ../../Zotlabs/Module/Setup.php:363 ../../Zotlabs/Module/Connect.php:98
-#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Pconfig.php:107
-#: ../../Zotlabs/Module/Events.php:484 ../../Zotlabs/Module/Import.php:543
-#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Thing.php:320
-#: ../../Zotlabs/Module/Thing.php:370 ../../Zotlabs/Module/Sources.php:114
-#: ../../Zotlabs/Module/Sources.php:149 ../../Zotlabs/Module/Photos.php:668
-#: ../../Zotlabs/Module/Photos.php:1058 ../../Zotlabs/Module/Photos.php:1098
-#: ../../Zotlabs/Module/Photos.php:1216 ../../Zotlabs/Module/Chat.php:196
-#: ../../Zotlabs/Module/Chat.php:241 ../../Zotlabs/Module/Xchan.php:15
-#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Lib/ThreadItem.php:725
-#: ../../include/widgets.php:796 ../../include/js_strings.php:22
-#: ../../view/theme/redbasic/php/config.php:106
-msgid "Submit"
-msgstr ""
-
-#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
-#, php-format
-msgid "Fetching URL returns error: %1$s"
-msgstr ""
-
-#: ../../Zotlabs/Module/Attach.php:13
-msgid "Item not available."
-msgstr ""
-
-#: ../../Zotlabs/Module/Acl.php:313
-msgid "network"
-msgstr ""
-
-#: ../../Zotlabs/Module/Acl.php:323
-msgid "RSS"
-msgstr ""
-
-#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
-#: ../../Zotlabs/Module/Settings/Oauth.php:88
-#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../Zotlabs/Module/Fbrowser.php:66 ../../Zotlabs/Module/Fbrowser.php:88
-#: ../../Zotlabs/Module/Admin/Plugins.php:414
-#: ../../Zotlabs/Module/Wiki.php:171 ../../Zotlabs/Module/Wiki.php:211
-#: ../../include/conversation.php:1248 ../../include/conversation.php:1297
-msgid "Cancel"
-msgstr ""
-
-#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
-msgid "Tag removed"
-msgstr ""
-
-#: ../../Zotlabs/Module/Tagrm.php:123
-msgid "Remove Item Tag"
-msgstr ""
-
-#: ../../Zotlabs/Module/Tagrm.php:125
-msgid "Select a tag to remove: "
-msgstr ""
-
-#: ../../Zotlabs/Module/Tagrm.php:137
-#: ../../Zotlabs/Module/Admin/Plugins.php:445
-#: ../../Zotlabs/Module/Photos.php:989
-msgid "Remove"
-msgstr ""
-
-#: ../../Zotlabs/Module/Network.php:95
-msgid "No such group"
-msgstr ""
-
-#: ../../Zotlabs/Module/Network.php:135
-msgid "No such channel"
-msgstr ""
-
-#: ../../Zotlabs/Module/Network.php:140
-msgid "forum"
-msgstr ""
-
-#: ../../Zotlabs/Module/Network.php:152
-msgid "Search Results For:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Network.php:218
-msgid "Privacy group is empty"
-msgstr ""
-
-#: ../../Zotlabs/Module/Network.php:227
-msgid "Privacy group: "
-msgstr ""
-
-#: ../../Zotlabs/Module/Network.php:253
-msgid "Invalid connection."
-msgstr ""
-
-#: ../../Zotlabs/Module/Bookmarks.php:53
-msgid "Bookmark added"
-msgstr ""
-
-#: ../../Zotlabs/Module/Bookmarks.php:75
-msgid "My Bookmarks"
-msgstr ""
-
-#: ../../Zotlabs/Module/Bookmarks.php:86
-msgid "My Connections Bookmarks"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:60 ../../Zotlabs/Module/Filestorage.php:32
-#: ../../Zotlabs/Module/Admin/Plugins.php:254
-#: ../../Zotlabs/Module/Admin/Themes.php:69
-#: ../../Zotlabs/Module/Display.php:40 ../../Zotlabs/Module/Thing.php:89
-#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3411
-msgid "Item not found."
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:94
-msgid "# Accounts"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:95
-msgid "# blocked accounts"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:96
-msgid "# expired accounts"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:97
-msgid "# expiring accounts"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:108
-msgid "# Channels"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:109
-msgid "# primary"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:110
-msgid "# clones"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:116
-msgid "Message queues"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:133
-msgid "Your software should be updated"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:137 ../../Zotlabs/Module/Admin/Logs.php:82
-#: ../../Zotlabs/Module/Admin/Plugins.php:336
-#: ../../Zotlabs/Module/Admin/Plugins.php:427
-#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin/Themes.php:120
-#: ../../Zotlabs/Module/Admin/Themes.php:154
-#: ../../Zotlabs/Module/Admin/Accounts.php:164
-#: ../../Zotlabs/Module/Admin/Channels.php:145
-#: ../../Zotlabs/Module/Admin/Site.php:256
-msgid "Administration"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:138
-msgid "Summary"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:141
-msgid "Registered accounts"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:142
-msgid "Pending registrations"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:143
-msgid "Registered channels"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:144
-msgid "Active plugins"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:145
-msgid "Version"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:146
-msgid "Repository version (master)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:147
-msgid "Repository version (dev)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:29
-msgid "Total invitation limit exceeded."
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:53
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:67
-msgid "Please join us on $Projectname"
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:77
-msgid "Invitation limit exceeded. Please contact your site administrator."
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:82
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:86
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../Zotlabs/Module/Invite.php:105
-msgid "You have no more invitations available"
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:136
-msgid "Send invitations"
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:137
-msgid "Enter email addresses, one per line:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:241
-msgid "Your message:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:139
-msgid "Please join my community on $Projectname."
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:141
-msgid "You will need to supply this invitation code:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:142
-msgid "1. Register at any $Projectname location (they are all inter-connected)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:144
-msgid "2. Enter my $Projectname network address into the site searchbar."
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:145
-msgid "or visit"
-msgstr ""
-
-#: ../../Zotlabs/Module/Invite.php:147
-msgid "3. Click [Connect]"
-msgstr ""
-
-#: ../../Zotlabs/Module/Manage.php:136
-#: ../../Zotlabs/Module/New_channel.php:121
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
-msgstr ""
-
-#: ../../Zotlabs/Module/Manage.php:143
-msgid "Create a new channel"
-msgstr ""
-
-#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:772
-#: ../../Zotlabs/Module/Chat.php:255
-msgid "Create New"
-msgstr ""
-
-#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:214
-#: ../../include/nav.php:211
-msgid "Channel Manager"
-msgstr ""
-
-#: ../../Zotlabs/Module/Manage.php:165
-msgid "Current Channel"
-msgstr ""
-
-#: ../../Zotlabs/Module/Manage.php:167
-msgid "Switch to one of your channels by selecting it."
-msgstr ""
-
-#: ../../Zotlabs/Module/Manage.php:168
-msgid "Default Channel"
-msgstr ""
-
-#: ../../Zotlabs/Module/Manage.php:169
-msgid "Make Default"
-msgstr ""
-
-#: ../../Zotlabs/Module/Manage.php:172
-#, php-format
-msgid "%d new messages"
-msgstr ""
-
-#: ../../Zotlabs/Module/Manage.php:173
-#, php-format
-msgid "%d new introductions"
-msgstr ""
-
-#: ../../Zotlabs/Module/Manage.php:175
-msgid "Delegated Channel"
-msgstr ""
-
-#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
-msgid "Invalid item."
-msgstr ""
-
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Block.php:43
-#: ../../Zotlabs/Module/Wall_upload.php:33 ../../Zotlabs/Module/Cal.php:62
-msgid "Channel not found."
-msgstr ""
-
-#: ../../Zotlabs/Module/Page.php:131
-msgid ""
-"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
-"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
-"quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
-"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
-"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
-"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-msgstr ""
-
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "Save to Folder:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "- select -"
-msgstr ""
-
-#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin/Profs.php:74
-#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
-#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/text.php:994
-#: ../../include/text.php:1006 ../../include/widgets.php:201
-msgid "Save"
-msgstr ""
-
-#: ../../Zotlabs/Module/Apps.php:46 ../../include/nav.php:168
-#: ../../include/widgets.php:102
-msgid "Apps"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:56
-#: ../../Zotlabs/Module/Connections.php:161
-#: ../../Zotlabs/Module/Connections.php:242
-msgid "Blocked"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:61
-#: ../../Zotlabs/Module/Connections.php:168
-#: ../../Zotlabs/Module/Connections.php:241
-msgid "Ignored"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:66
-#: ../../Zotlabs/Module/Connections.php:182
-#: ../../Zotlabs/Module/Connections.php:240
-msgid "Hidden"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:71
-#: ../../Zotlabs/Module/Connections.php:175
-#: ../../Zotlabs/Module/Connections.php:239
-msgid "Archived"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:76
-#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1573
-msgid "New"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:92
-#: ../../Zotlabs/Module/Connections.php:107
-#: ../../Zotlabs/Module/Connedit.php:629 ../../include/widgets.php:533
-msgid "All"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:138
-msgid "New Connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:141
-msgid "Show pending (new) connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:145
-#: ../../Zotlabs/Module/Profperm.php:144
-msgid "All Connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:148
-msgid "Show all connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:164
-msgid "Only show blocked connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:171
-msgid "Only show ignored connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:178
-msgid "Only show archived connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:185
-msgid "Only show hidden connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:238
-msgid "Pending approval"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:254
-#, php-format
-msgid "%1$s [%2$s]"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:255
-msgid "Edit connection"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:256
-msgid "Delete connection"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:265
-msgid "Channel address"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:267
-msgid "Network"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:270
-msgid "Status"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:272
-msgid "Connected"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:274
-msgid "Approve connection"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:275
-#: ../../Zotlabs/Module/Admin/Accounts.php:171
-msgid "Approve"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:276
-msgid "Ignore connection"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:277
-#: ../../Zotlabs/Module/Connedit.php:583
-msgid "Ignore"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:278
-msgid "Recent activity"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:302 ../../Zotlabs/Lib/Apps.php:209
-#: ../../include/nav.php:191 ../../include/text.php:923
-msgid "Connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44
-#: ../../Zotlabs/Lib/Apps.php:230 ../../include/nav.php:170
-#: ../../include/text.php:993 ../../include/text.php:1005
-#: ../../include/widgets.php:315 ../../include/acl_selectors.php:177
-msgid "Search"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:307
-msgid "Search your connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:308
-msgid "Connections search"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:309
-#: ../../Zotlabs/Module/Directory.php:391
-#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
-msgid "Find"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:58
-#: ../../Zotlabs/Module/Profile_photo.php:61
-msgid "Image uploaded but image cropping failed."
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:134
-#: ../../Zotlabs/Module/Cover_photo.php:181
-msgid "Cover Photos"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:154
-#: ../../Zotlabs/Module/Profile_photo.php:135
-msgid "Image resize failed."
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:168
-#: ../../Zotlabs/Module/Profile_photo.php:196 ../../include/photos.php:148
-msgid "Unable to process image"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:192
-#: ../../Zotlabs/Module/Profile_photo.php:223
-msgid "Image upload failed."
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:210
-#: ../../Zotlabs/Module/Profile_photo.php:242
-msgid "Unable to process image."
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4325
-msgid "female"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4326
-#, php-format
-msgid "%1$s updated her %2$s"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4327
-msgid "male"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4328
-#, php-format
-msgid "%1$s updated his %2$s"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4330
-#, php-format
-msgid "%1$s updated their %2$s"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1738
-msgid "cover photo"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:303
-#: ../../Zotlabs/Module/Cover_photo.php:318
-#: ../../Zotlabs/Module/Profile_photo.php:300
-#: ../../Zotlabs/Module/Profile_photo.php:341
-msgid "Photo not available."
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:354
-#: ../../Zotlabs/Module/Profile_photo.php:387
-msgid "Upload File:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:355
-#: ../../Zotlabs/Module/Profile_photo.php:388
-msgid "Select a profile:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:356
-msgid "Upload Cover Photo"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Settings/Channel.php:399
-#: ../../Zotlabs/Module/Profile_photo.php:396
-msgid "or"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:396
-msgid "skip this step"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:396
-msgid "select a photo from your photo albums"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:377
-#: ../../Zotlabs/Module/Profile_photo.php:415
-msgid "Crop Image"
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:378
-#: ../../Zotlabs/Module/Profile_photo.php:416
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr ""
-
-#: ../../Zotlabs/Module/Cover_photo.php:380
-#: ../../Zotlabs/Module/Profile_photo.php:418
-msgid "Done Editing"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:101
-#: ../../Zotlabs/Module/Settings/Channel.php:289
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-#: ../../Zotlabs/Module/Connedit.php:408 ../../Zotlabs/Module/Connedit.php:686
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168
-#: ../../Zotlabs/Module/Profiles.php:641
-#: ../../Zotlabs/Module/Admin/Site.php:216
-#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Events.php:462
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:472
-#: ../../Zotlabs/Module/Api.php:85 ../../Zotlabs/Module/Photos.php:653
-#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1743
-msgid "No"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:101
-#: ../../Zotlabs/Module/Settings/Channel.php:289
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-#: ../../Zotlabs/Module/Connedit.php:408
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168
-#: ../../Zotlabs/Module/Profiles.php:641
-#: ../../Zotlabs/Module/Admin/Site.php:218
-#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Events.php:462
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:472
-#: ../../Zotlabs/Module/Api.php:84 ../../Zotlabs/Module/Photos.php:653
-#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1743
-msgid "Yes"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:135
-msgid "No special theme for mobile devices"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:138
-#, php-format
-msgid "%s - (Experimental)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:141
-#: ../../Zotlabs/Module/Admin/Site.php:167
-msgid "mobile"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:189
-msgid "Display Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:190
-msgid "Theme Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:191
-msgid "Custom Theme Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:192
-msgid "Content Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:198
-msgid "Display Theme:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:199
-msgid "Select scheme"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:201
-msgid "Mobile Theme:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:202
-msgid "Preload images before rendering the page"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:202
-msgid ""
-"The subjective page load time will be longer but the page will be ready when "
-"displayed"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:203
-msgid "Enable user zoom on mobile devices"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:204
-msgid "Update browser every xx seconds"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:204
-msgid "Minimum of 10 seconds, no maximum"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:205
-msgid "Maximum number of conversations to load at any time:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:205
-msgid "Maximum of 100 items"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:206
-msgid "Show emoticons (smilies) as images"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:207
-msgid "Link post titles to source"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:208
-msgid "System Page Layout Editor - (advanced)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:211
-msgid "Use blog/list mode on channel page"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:211
-#: ../../Zotlabs/Module/Settings/Display.php:212
-msgid "(comments displayed separately)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:212
-msgid "Use blog/list mode on grid page"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:213
-msgid "Channel page max height of content (in pixels)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:213
-#: ../../Zotlabs/Module/Settings/Display.php:214
-msgid "click to expand content exceeding this height"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Display.php:214
-msgid "Grid page max height of content (in pixels)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Features.php:38
-#: ../../Zotlabs/Module/Admin/Features.php:55
-#: ../../Zotlabs/Module/Admin/Features.php:56
-msgid "Off"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Features.php:38
-#: ../../Zotlabs/Module/Admin/Features.php:55
-#: ../../Zotlabs/Module/Admin/Features.php:56
-msgid "On"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Features.php:45
-msgid "Additional Features"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:34
-msgid "Name is required"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:38
-msgid "Key and Secret are required"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:42
-#: ../../Zotlabs/Module/Settings/Oauth.php:113
-#: ../../Zotlabs/Module/Admin/Plugins.php:443 ../../Zotlabs/Lib/Apps.php:334
-msgid "Update"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:86
-#: ../../Zotlabs/Module/Settings/Oauth.php:112
-#: ../../Zotlabs/Module/Settings/Oauth.php:148
-msgid "Add application"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-msgid "Name of application"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:116
-msgid "Consumer Key"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-msgid "Automatically generated - change if desired. Max length 20"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-#: ../../Zotlabs/Module/Settings/Oauth.php:117
-msgid "Consumer Secret"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-#: ../../Zotlabs/Module/Settings/Oauth.php:118
-msgid "Redirect"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-msgid ""
-"Redirect URI - leave blank unless your application specifically requires this"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-#: ../../Zotlabs/Module/Settings/Oauth.php:119
-msgid "Icon url"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
-msgid "Optional"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:104
-msgid "Application not found."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:147
-msgid "Connected Apps"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:151
-msgid "Client key starts with"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:152
-msgid "No name"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Oauth.php:153
-msgid "Remove authorization"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:31
-#, php-format
-msgid "This channel is limited to %d tokens"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:37
-msgid "Name and Password are required."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:77
-msgid "Token saved."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:113
-msgid ""
-"Use this form to create temporary access identifiers to share things with "
-"non-members. These identities may be used in Access Control Lists and "
-"visitors may login using these credentials to access private content."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:115
-msgid ""
-"You may also provide <em>dropbox</em> style access links to friends and "
-"associates by adding the Login Password to any specific site URL as shown. "
-"Examples:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:647
-msgid "Guest Access Tokens"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:157
-msgid "Login Name"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:158
-msgid "Login Password"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:159
-msgid "Expires (yyyy-mm-dd)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:160
-#: ../../Zotlabs/Module/Connedit.php:782
-msgid "Their Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:161
-#: ../../Zotlabs/Module/Connedit.php:783
-msgid "My Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:163
-#: ../../Zotlabs/Module/Connedit.php:778
-msgid "inherited"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:165
-#: ../../Zotlabs/Module/Connedit.php:785
-msgid "Individual Permissions"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:166
-#: ../../Zotlabs/Module/Connedit.php:786
-msgid ""
-"Some permissions may be inherited from your channel's <a href=\"settings"
-"\"><strong>privacy settings</strong></a>, which have higher priority than "
-"individual settings. You can <strong>not</strong> change those settings here."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:20
-msgid "Not valid email."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:23
-msgid "Protected email address. Cannot change to that email."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:32
-msgid "System failure storing new email. Please try again."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:40
-msgid "Technical skill level updated"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:56
-msgid "Password verification failed."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:63
-msgid "Passwords do not match. Password unchanged."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:67
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:81
-msgid "Password changed."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:83
-msgid "Password update failed. Please try again."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:112
-msgid "Account Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:113
-msgid "Current Password"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:114
-msgid "Enter New Password"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:115
-msgid "Confirm New Password"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:115
-msgid "Leave password fields blank unless changing"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:116
-msgid "Your technical skill level"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:116
-msgid "Used to provide a member experience matched to your comfort level"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:119
-#: ../../Zotlabs/Module/Settings/Channel.php:459
-msgid "Email Address:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:120
-#: ../../Zotlabs/Module/Removeaccount.php:61
-msgid "Remove Account"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Account.php:121
-msgid "Remove this account including all its channels"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:61
-#: ../../Zotlabs/Module/Settings/Channel.php:65
-#: ../../Zotlabs/Module/Settings/Channel.php:66
-#: ../../Zotlabs/Module/Settings/Channel.php:69
-#: ../../Zotlabs/Module/Settings/Channel.php:80
-#: ../../Zotlabs/Module/Connedit.php:627 ../../include/widgets.php:531
-#: ../../include/selectors.php:123 ../../include/channel.php:402
-#: ../../include/channel.php:403 ../../include/channel.php:410
-msgid "Friends"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:246
-msgid "Settings updated."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:307
-msgid "Nobody except yourself"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:308
-msgid "Only those you specifically allow"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:309
-msgid "Approved connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:310
-msgid "Any connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:311
-msgid "Anybody on this website"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:312
-msgid "Anybody in this network"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:313
-msgid "Anybody authenticated"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:314
-msgid "Anybody on the internet"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:390
-msgid "Publish your default profile in the network directory"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:395
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:404
-msgid "Your channel address is"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:450
-msgid "Channel Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:457
-msgid "Basic Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:458
-#: ../../include/channel.php:1172
-msgid "Full Name:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:460
-msgid "Your Timezone:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:461
-msgid "Default Post Location:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:461
-msgid "Geographical location to display on your posts"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:462
-msgid "Use Browser Location:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:464
-msgid "Adult Content"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:464
-msgid ""
-"This channel frequently or regularly publishes adult content. (Please tag "
-"any adult material and/or nudity with #NSFW)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:466
-msgid "Security and Privacy Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:469
-msgid "Your permissions are already configured. Click to view/adjust"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:471
-msgid "Hide my online presence"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:471
-msgid "Prevents displaying in your profile that you are online"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:473
-msgid "Simple Privacy Settings:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:474
-msgid ""
-"Very Public - <em>extremely permissive (should be used with caution)</em>"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:475
-msgid ""
-"Typical - <em>default public, privacy when desired (similar to social "
-"network permissions but with improved privacy)</em>"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:476
-msgid "Private - <em>default private, never open or public</em>"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:477
-msgid "Blocked - <em>default blocked to/from everybody</em>"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:479
-msgid "Allow others to tag your posts"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:479
-msgid ""
-"Often used by the community to retro-actively flag inappropriate content"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:481
-msgid "Channel Permission Limits"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:483
-msgid "Expire other channel content after this many days"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:483
-msgid "0 or blank to use the website limit."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:483
-#, php-format
-msgid "This website expires after %d days."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:483
-msgid "This website does not expire imported content."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:483
-msgid "The website limit takes precedence if lower than your limit."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:484
-msgid "Maximum Friend Requests/Day:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:484
-msgid "May reduce spam activity"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:485
-msgid "Default Access Control List (ACL)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:486
-#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-msgid "(click to open/close)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:487
-msgid "Use my default audience setting for the type of object published"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:494
-msgid "Channel permissions category:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:500
-msgid "Maximum private messages per day from unknown people:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:500
-msgid "Useful to reduce spamming"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:503
-msgid "Notification Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:504
-msgid "By default post a status message when:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:505
-msgid "accepting a friend request"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:506
-msgid "joining a forum/community"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:507
-msgid "making an <em>interesting</em> profile change"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:508
-msgid "Send a notification email when:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:509
-msgid "You receive a connection request"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:510
-msgid "Your connections are confirmed"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:511
-msgid "Someone writes on your profile wall"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:512
-msgid "Someone writes a followup comment"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:513
-msgid "You receive a private message"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:514
-msgid "You receive a friend suggestion"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:515
-msgid "You are tagged in a post"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:516
-msgid "You are poked/prodded/etc. in a post"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:519
-msgid "Show visual notifications including:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:521
-msgid "Unseen grid activity"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:522
-msgid "Unseen channel activity"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:523
-msgid "Unseen private messages"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:523
-#: ../../Zotlabs/Module/Settings/Channel.php:528
-#: ../../Zotlabs/Module/Settings/Channel.php:529
-#: ../../Zotlabs/Module/Settings/Channel.php:530
-msgid "Recommended"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:524
-msgid "Upcoming events"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:525
-msgid "Events today"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:526
-msgid "Upcoming birthdays"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:526
-msgid "Not available in all themes"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:527
-msgid "System (personal) notifications"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:528
-msgid "System info messages"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:529
-msgid "System critical alerts"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:530
-msgid "New connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:531
-msgid "System Registrations"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:532
-msgid ""
-"Also show new wall posts, private messages and connections under Notices"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:534
-msgid "Notify me of events this many days in advance"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:534
-msgid "Must be greater than 0"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:536
-msgid "Advanced Account/Page Type Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:537
-msgid "Change the behaviour of this account for special situations"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:539
-msgid "Miscellaneous Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:540
-msgid "Default photo upload folder"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:540
-#: ../../Zotlabs/Module/Settings/Channel.php:541
-msgid "%Y - current year, %m - current month"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:541
-msgid "Default file upload folder"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:543
-msgid "Personal menu to display in your channel pages"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:544
-#: ../../Zotlabs/Module/Removeme.php:64
-msgid "Remove Channel"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:545
-msgid "Remove this channel."
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:546
-msgid "Firefox Share $Projectname provider"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Channel.php:547
-msgid "Start calendar week on monday"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Featured.php:24
-msgid "No feature settings configured"
-msgstr ""
-
-#: ../../Zotlabs/Module/Settings/Featured.php:31
-msgid "Feature/Addon Settings"
-msgstr ""
-
-#: ../../Zotlabs/Module/Item.php:182
-msgid "Unable to locate original post."
-msgstr ""
-
-#: ../../Zotlabs/Module/Item.php:435
-msgid "Empty post discarded."
-msgstr ""
-
-#: ../../Zotlabs/Module/Item.php:475
-msgid "Executable content type not permitted to this channel."
-msgstr ""
-
-#: ../../Zotlabs/Module/Item.php:855
-msgid "Duplicate post suppressed."
-msgstr ""
-
-#: ../../Zotlabs/Module/Item.php:990
-msgid "System error. Post not saved."
-msgstr ""
-
-#: ../../Zotlabs/Module/Item.php:1111
-msgid "Unable to obtain post information from database."
-msgstr ""
-
-#: ../../Zotlabs/Module/Item.php:1118
-#, php-format
-msgid "You have reached your limit of %1$.0f top level posts."
-msgstr ""
-
-#: ../../Zotlabs/Module/Item.php:1125
-#, php-format
-msgid "You have reached your limit of %1$.0f webpages."
-msgstr ""
-
-#: ../../Zotlabs/Module/Ping.php:254
-msgid "sent you a private message"
-msgstr ""
-
-#: ../../Zotlabs/Module/Ping.php:302
-msgid "added your channel"
-msgstr ""
-
-#: ../../Zotlabs/Module/Ping.php:312
-msgid "g A l F d"
-msgstr ""
-
-#: ../../Zotlabs/Module/Ping.php:334
-msgid "[today]"
-msgstr ""
-
-#: ../../Zotlabs/Module/Ping.php:343
-msgid "posted an event"
-msgstr ""
-
-#: ../../Zotlabs/Module/Editlayout.php:79
-#: ../../Zotlabs/Module/Editwebpage.php:80
-#: ../../Zotlabs/Module/Editpost.php:24 ../../Zotlabs/Module/Editblock.php:79
-#: ../../Zotlabs/Module/Editblock.php:95
-msgid "Item not found"
-msgstr ""
-
-#: ../../Zotlabs/Module/Editlayout.php:127
-#: ../../Zotlabs/Module/Layouts.php:128 ../../Zotlabs/Module/Layouts.php:188
-msgid "Layout Name"
-msgstr ""
-
-#: ../../Zotlabs/Module/Editlayout.php:128
-#: ../../Zotlabs/Module/Layouts.php:131
-msgid "Layout Description (Optional)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Editlayout.php:136
-msgid "Edit Layout"
-msgstr ""
-
-#: ../../Zotlabs/Module/Editwebpage.php:142
-msgid "Page link"
-msgstr ""
-
-#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:244
-#: ../../Zotlabs/Module/Mail.php:369 ../../Zotlabs/Module/Editblock.php:111
-#: ../../Zotlabs/Module/Chat.php:207 ../../include/conversation.php:1149
-msgid "Insert web link"
-msgstr ""
-
-#: ../../Zotlabs/Module/Editwebpage.php:169
-msgid "Edit Webpage"
-msgstr ""
-
-#: ../../Zotlabs/Module/Magic.php:71
-msgid "Hub not found."
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:49
-msgid "Unable to update menu."
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:60
-msgid "Unable to create menu."
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
-msgid "Menu Name"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:98
-msgid "Unique name (not visible on webpage) - required"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
-msgid "Menu Title"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:99
-msgid "Visible on webpage - leave empty for no title"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:100
-msgid "Allow Bookmarks"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-msgid "Menu may be used to store saved bookmarks"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
-msgid "Submit and proceed"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2312
-msgid "Menus"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:113 ../../Zotlabs/Module/Locs.php:120
-msgid "Drop"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Webpages.php:251
-#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Layouts.php:190
-#: ../../include/page_widgets.php:47
-msgid "Created"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Webpages.php:252
-#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Layouts.php:191
-#: ../../include/page_widgets.php:48
-msgid "Edited"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:117
-msgid "Bookmarks allowed"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:119
-msgid "Delete this menu"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
-msgid "Edit menu contents"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:121
-msgid "Edit this menu"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:136
-msgid "Menu could not be deleted."
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:144 ../../Zotlabs/Module/Mitem.php:28
-msgid "Menu not found."
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:149
-msgid "Edit Menu"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:153
-msgid "Add or remove entries to this menu"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Menu name"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Must be unique, only seen by you"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title as seen by others"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:157
-msgid "Allow bookmarks"
-msgstr ""
-
-#: ../../Zotlabs/Module/Menu.php:166 ../../Zotlabs/Module/Mitem.php:120
-#: ../../Zotlabs/Module/Xchan.php:41
-msgid "Not found."
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:37 ../../Zotlabs/Module/Appman.php:53
-msgid "App installed."
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:46
-msgid "Malformed app."
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:104
-msgid "Embed code"
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:110 ../../include/widgets.php:107
-msgid "Edit App"
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:110
-msgid "Create App"
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:115
-msgid "Name of app"
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:115 ../../Zotlabs/Module/Appman.php:116
-#: ../../Zotlabs/Module/Profiles.php:703 ../../Zotlabs/Module/Profiles.php:707
-#: ../../Zotlabs/Module/Events.php:452 ../../Zotlabs/Module/Events.php:457
-#: ../../include/datetime.php:259
-msgid "Required"
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:116
-msgid "Location (URL) of app"
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:117 ../../Zotlabs/Module/Events.php:465
-#: ../../Zotlabs/Module/Rbmark.php:101
-msgid "Description"
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:118
-msgid "Photo icon URL"
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:118
-msgid "80 x 80 pixels - optional"
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:119
-msgid "Categories (optional, comma separated list)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:120
-msgid "Version ID"
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:121
-msgid "Price of app"
-msgstr ""
-
-#: ../../Zotlabs/Module/Appman.php:122
-msgid "Location (URL) to purchase app"
-msgstr ""
-
#: ../../Zotlabs/Module/Register.php:49
msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
msgstr ""
@@ -2170,7 +506,7 @@ msgid ""
"Please try again tomorrow."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:221
+#: ../../Zotlabs/Module/Register.php:221 ../../Zotlabs/Module/Siteinfo.php:27
msgid "Terms of Service"
msgstr ""
@@ -2249,7 +585,7 @@ msgid "yes"
msgstr ""
#: ../../Zotlabs/Module/Register.php:253
-#: ../../Zotlabs/Module/Admin/Site.php:259
+#: ../../Zotlabs/Module/Admin/Site.php:261
msgid "Registration"
msgstr ""
@@ -2257,8 +593,8 @@ msgstr ""
msgid "Membership on this site is by invitation only."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:152
-#: ../../boot.php:1721
+#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:150
+#: ../../boot.php:1701
msgid "Register"
msgstr ""
@@ -2268,259 +604,547 @@ msgid ""
"are returned to a login page, please check your email for instructions."
msgstr ""
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:222
-#: ../../include/nav.php:95 ../../include/conversation.php:1672
-msgid "Photos"
+#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
+#, php-format
+msgid "Fetching URL returns error: %1$s"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:80
+#: ../../Zotlabs/Module/Match.php:26
+msgid "Profile Match"
+msgstr ""
+
+#: ../../Zotlabs/Module/Match.php:35
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr ""
+
+#: ../../Zotlabs/Module/Match.php:67
+msgid "is interested in:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Match.php:68 ../../Zotlabs/Module/Directory.php:328
+#: ../../Zotlabs/Module/Suggest.php:56 ../../include/channel.php:1036
+#: ../../include/connections.php:78 ../../include/widgets.php:147
+#: ../../include/widgets.php:184 ../../include/conversation.php:971
+msgid "Connect"
+msgstr ""
+
+#: ../../Zotlabs/Module/Match.php:74
+msgid "No matches"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:82
msgid "Could not access contact record."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:104
+#: ../../Zotlabs/Module/Connedit.php:106
msgid "Could not locate selected profile."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:256
+#: ../../Zotlabs/Module/Connedit.php:258
msgid "Connection updated."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:258
+#: ../../Zotlabs/Module/Connedit.php:260
msgid "Failed to update connection record."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:308
+#: ../../Zotlabs/Module/Connedit.php:310
msgid "is now connected to"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:440
+#: ../../Zotlabs/Module/Connedit.php:411 ../../Zotlabs/Module/Connedit.php:716
+#: ../../Zotlabs/Module/Admin/Site.php:218 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
+#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653
+#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:97
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:159
+#: ../../Zotlabs/Module/Settings/Channel.php:289
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+#: ../../extend/addon/addon/libertree/libertree.php:69
+#: ../../extend/addon/addon/libertree/libertree.php:81
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+#: ../../extend/addon/addon/nofed/nofed.php:72
+#: ../../extend/addon/addon/nofed/nofed.php:76
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+#: ../../extend/addon/addon/planets/planets.php:153
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+#: ../../extend/addon/addon/redred/redred.php:95
+#: ../../extend/addon/addon/redred/redred.php:99
+#: ../../extend/addon/addon/rtof/rtof.php:81
+#: ../../extend/addon/addon/rtof/rtof.php:85
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../extend/addon/addon/twitter/twitter.php:246
+#: ../../extend/addon/addon/twitter/twitter.php:255
+#: ../../extend/addon/addon/visage/visage.php:166
+#: ../../extend/addon/addon/wppost/wppost.php:82
+#: ../../extend/addon/addon/wppost/wppost.php:105
+#: ../../extend/addon/addon/wppost/wppost.php:109
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+#: ../../extend/addon/addon/cdav/cdav.php:234 ../../include/dir_fns.php:143
+#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
+#: ../../include/widgets.php:978 ../../view/theme/redbasic/php/config.php:111
+#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1723
+msgid "No"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:411
+#: ../../Zotlabs/Module/Admin/Site.php:220 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
+#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653
+#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:96
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:159
+#: ../../Zotlabs/Module/Settings/Channel.php:289
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+#: ../../extend/addon/addon/libertree/libertree.php:69
+#: ../../extend/addon/addon/libertree/libertree.php:81
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+#: ../../extend/addon/addon/nofed/nofed.php:72
+#: ../../extend/addon/addon/nofed/nofed.php:76
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+#: ../../extend/addon/addon/planets/planets.php:153
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+#: ../../extend/addon/addon/redred/redred.php:95
+#: ../../extend/addon/addon/redred/redred.php:99
+#: ../../extend/addon/addon/rtof/rtof.php:81
+#: ../../extend/addon/addon/rtof/rtof.php:85
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../extend/addon/addon/twitter/twitter.php:246
+#: ../../extend/addon/addon/twitter/twitter.php:255
+#: ../../extend/addon/addon/visage/visage.php:166
+#: ../../extend/addon/addon/wppost/wppost.php:82
+#: ../../extend/addon/addon/wppost/wppost.php:105
+#: ../../extend/addon/addon/wppost/wppost.php:109
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+#: ../../extend/addon/addon/cdav/cdav.php:234 ../../include/dir_fns.php:143
+#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
+#: ../../include/widgets.php:978 ../../view/theme/redbasic/php/config.php:111
+#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1723
+msgid "Yes"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:443
msgid "Could not access address book record."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:460
+#: ../../Zotlabs/Module/Connedit.php:463
msgid "Refresh failed - channel is currently unavailable."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:475 ../../Zotlabs/Module/Connedit.php:484
-#: ../../Zotlabs/Module/Connedit.php:493 ../../Zotlabs/Module/Connedit.php:502
-#: ../../Zotlabs/Module/Connedit.php:515
+#: ../../Zotlabs/Module/Connedit.php:478 ../../Zotlabs/Module/Connedit.php:487
+#: ../../Zotlabs/Module/Connedit.php:496 ../../Zotlabs/Module/Connedit.php:505
+#: ../../Zotlabs/Module/Connedit.php:518
msgid "Unable to set address book parameters."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:538
+#: ../../Zotlabs/Module/Connedit.php:542
msgid "Connection has been removed."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:554 ../../Zotlabs/Lib/Apps.php:221
-#: ../../include/nav.php:89 ../../include/conversation.php:953
+#: ../../Zotlabs/Module/Connedit.php:582 ../../Zotlabs/Lib/Apps.php:221
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
+#: ../../include/nav.php:89 ../../include/conversation.php:969
msgid "View Profile"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:557
+#: ../../Zotlabs/Module/Connedit.php:585
#, php-format
msgid "View %s's profile"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:561
+#: ../../Zotlabs/Module/Connedit.php:589
msgid "Refresh Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:564
+#: ../../Zotlabs/Module/Connedit.php:592
msgid "Fetch updated permissions"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:568
+#: ../../Zotlabs/Module/Connedit.php:596
msgid "Recent Activity"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:571
+#: ../../Zotlabs/Module/Connedit.php:599
msgid "View recent posts and comments"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:575
+#: ../../Zotlabs/Module/Connedit.php:603
#: ../../Zotlabs/Module/Admin/Accounts.php:175
msgid "Unblock"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:575
+#: ../../Zotlabs/Module/Connedit.php:603
#: ../../Zotlabs/Module/Admin/Accounts.php:174
msgid "Block"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:578
+#: ../../Zotlabs/Module/Connedit.php:606
msgid "Block (or Unblock) all communications with this connection"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:579
+#: ../../Zotlabs/Module/Connedit.php:607
msgid "This connection is blocked!"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:583
+#: ../../Zotlabs/Module/Connedit.php:611
msgid "Unignore"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:586
+#: ../../Zotlabs/Module/Connedit.php:611
+#: ../../Zotlabs/Module/Connections.php:277
+msgid "Ignore"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:614
msgid "Ignore (or Unignore) all inbound communications from this connection"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:587
+#: ../../Zotlabs/Module/Connedit.php:615
msgid "This connection is ignored!"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:591
+#: ../../Zotlabs/Module/Connedit.php:619
msgid "Unarchive"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:591
+#: ../../Zotlabs/Module/Connedit.php:619
msgid "Archive"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:594
+#: ../../Zotlabs/Module/Connedit.php:622
msgid ""
"Archive (or Unarchive) this connection - mark channel dead but keep content"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:595
+#: ../../Zotlabs/Module/Connedit.php:623
msgid "This connection is archived!"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:599
+#: ../../Zotlabs/Module/Connedit.php:627
msgid "Unhide"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:599
+#: ../../Zotlabs/Module/Connedit.php:627
msgid "Hide"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:602
+#: ../../Zotlabs/Module/Connedit.php:630
msgid "Hide or Unhide this connection from your other connections"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:603
+#: ../../Zotlabs/Module/Connedit.php:631
msgid "This connection is hidden!"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:610
+#: ../../Zotlabs/Module/Connedit.php:638
msgid "Delete this connection"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:625 ../../include/widgets.php:529
+#: ../../Zotlabs/Module/Connedit.php:655 ../../include/widgets.php:529
msgid "Me"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:626 ../../include/widgets.php:530
+#: ../../Zotlabs/Module/Connedit.php:656 ../../include/widgets.php:530
msgid "Family"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:628 ../../include/widgets.php:532
+#: ../../Zotlabs/Module/Connedit.php:657
+#: ../../Zotlabs/Module/Settings/Channel.php:61
+#: ../../Zotlabs/Module/Settings/Channel.php:65
+#: ../../Zotlabs/Module/Settings/Channel.php:66
+#: ../../Zotlabs/Module/Settings/Channel.php:69
+#: ../../Zotlabs/Module/Settings/Channel.php:80
+#: ../../include/selectors.php:123 ../../include/channel.php:402
+#: ../../include/channel.php:403 ../../include/channel.php:410
+#: ../../include/widgets.php:531
+msgid "Friends"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:658 ../../include/widgets.php:532
msgid "Acquaintances"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:686
+#: ../../Zotlabs/Module/Connedit.php:659
+#: ../../Zotlabs/Module/Connections.php:92
+#: ../../Zotlabs/Module/Connections.php:107 ../../include/widgets.php:533
+msgid "All"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:716
msgid "Approve this connection"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:686
+#: ../../Zotlabs/Module/Connedit.php:716
msgid "Accept connection to allow communication"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:691
+#: ../../Zotlabs/Module/Connedit.php:721
msgid "Set Affinity"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:694
+#: ../../Zotlabs/Module/Connedit.php:724
msgid "Set Profile"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:697
+#: ../../Zotlabs/Module/Connedit.php:727
msgid "Set Affinity & Profile"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:746
+#: ../../Zotlabs/Module/Connedit.php:776
msgid "none"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:750 ../../include/widgets.php:656
+#: ../../Zotlabs/Module/Connedit.php:780 ../../include/widgets.php:656
msgid "Connection Default Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:750 ../../include/items.php:3977
+#: ../../Zotlabs/Module/Connedit.php:780 ../../include/items.php:3909
#, php-format
msgid "Connection: %s"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:751
+#: ../../Zotlabs/Module/Connedit.php:781
msgid "Apply these permissions automatically"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:751
+#: ../../Zotlabs/Module/Connedit.php:781
msgid "Connection requests will be approved without your interaction"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:753
+#: ../../Zotlabs/Module/Connedit.php:784
msgid "This connection's primary address is"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:754
+#: ../../Zotlabs/Module/Connedit.php:785
msgid "Available locations:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:758
+#: ../../Zotlabs/Module/Connedit.php:789
msgid ""
"The permissions indicated on this page will be applied to all new "
"connections."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:759
+#: ../../Zotlabs/Module/Connedit.php:790
msgid "Connection Tools"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:761
+#: ../../Zotlabs/Module/Connedit.php:792
msgid "Slide to adjust your degree of friendship"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:763
+#: ../../Zotlabs/Module/Connedit.php:793 ../../Zotlabs/Module/Rate.php:155
+#: ../../include/js_strings.php:20
+msgid "Rating"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:794
msgid "Slide to adjust your rating"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:764 ../../Zotlabs/Module/Connedit.php:769
+#: ../../Zotlabs/Module/Connedit.php:795 ../../Zotlabs/Module/Connedit.php:800
msgid "Optionally explain your rating"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:766
+#: ../../Zotlabs/Module/Connedit.php:797
msgid "Custom Filter"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:767
+#: ../../Zotlabs/Module/Connedit.php:798
msgid "Only import posts with this text"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:767 ../../Zotlabs/Module/Connedit.php:768
+#: ../../Zotlabs/Module/Connedit.php:798 ../../Zotlabs/Module/Connedit.php:799
msgid ""
"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
"all posts"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:768
+#: ../../Zotlabs/Module/Connedit.php:799
msgid "Do not import posts with this text"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:770
+#: ../../Zotlabs/Module/Connedit.php:801
msgid "This information is public!"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:775
+#: ../../Zotlabs/Module/Connedit.php:806
msgid "Connection Pending Approval"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:780
+#: ../../Zotlabs/Module/Connedit.php:809
+#: ../../Zotlabs/Module/Settings/Tokens.php:163
+msgid "inherited"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:810 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Connect.php:98
+#: ../../Zotlabs/Module/Admin/Features.php:66
+#: ../../Zotlabs/Module/Admin/Logs.php:84
+#: ../../Zotlabs/Module/Admin/Plugins.php:429
+#: ../../Zotlabs/Module/Admin/Profs.php:157
+#: ../../Zotlabs/Module/Admin/Security.php:104
+#: ../../Zotlabs/Module/Admin/Themes.php:156
+#: ../../Zotlabs/Module/Admin/Account_edit.php:74
+#: ../../Zotlabs/Module/Admin/Accounts.php:166
+#: ../../Zotlabs/Module/Admin/Channels.php:147
+#: ../../Zotlabs/Module/Admin/Site.php:260 ../../Zotlabs/Module/Appman.php:126
+#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Mail.php:384
+#: ../../Zotlabs/Module/Import_items.php:122
+#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Group.php:85
+#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Mood.php:139
+#: ../../Zotlabs/Module/Photos.php:668 ../../Zotlabs/Module/Photos.php:1058
+#: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1216
+#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Pconfig.php:107 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Cal.php:342
+#: ../../Zotlabs/Module/Wiki.php:148 ../../Zotlabs/Module/Sources.php:114
+#: ../../Zotlabs/Module/Sources.php:149
+#: ../../Zotlabs/Module/Settings/Features.php:47
+#: ../../Zotlabs/Module/Settings/Oauth.php:87
+#: ../../Zotlabs/Module/Settings/Tokens.php:167
+#: ../../Zotlabs/Module/Settings/Account.php:118
+#: ../../Zotlabs/Module/Settings/Channel.php:455
+#: ../../Zotlabs/Module/Settings/Display.php:196
+#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
+#: ../../Zotlabs/Module/Import.php:543 ../../Zotlabs/Module/Chat.php:196
+#: ../../Zotlabs/Module/Chat.php:241 ../../Zotlabs/Module/Xchan.php:15
+#: ../../Zotlabs/Module/Events.php:484 ../../Zotlabs/Lib/ThreadItem.php:729
+#: ../../extend/addon/addon/chords/Mod_Chords.php:60
+#: ../../extend/addon/addon/diaspora/diaspora.php:710
+#: ../../extend/addon/addon/dwpost/dwpost.php:89
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
+#: ../../extend/addon/addon/friendica/friendica.php:128
+#: ../../extend/addon/addon/frphotos/frphotos.php:96
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
+#: ../../extend/addon/addon/hubwall/hubwall.php:95
+#: ../../extend/addon/addon/ijpost/ijpost.php:89
+#: ../../extend/addon/addon/irc/irc.php:53
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
+#: ../../extend/addon/addon/libertree/libertree.php:85
+#: ../../extend/addon/addon/ljpost/ljpost.php:86
+#: ../../extend/addon/addon/logrot/logrot.php:35
+#: ../../extend/addon/addon/mailhost/mailhost.php:40
+#: ../../extend/addon/addon/nofed/nofed.php:80
+#: ../../extend/addon/addon/nsabait/nsabait.php:161
+#: ../../extend/addon/addon/nsfw/nsfw.php:92
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:52
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:168
+#: ../../extend/addon/addon/pageheader/pageheader.php:48
+#: ../../extend/addon/addon/piwik/piwik.php:95
+#: ../../extend/addon/addon/planets/planets.php:157
+#: ../../extend/addon/addon/pumpio/pumpio.php:237
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
+#: ../../extend/addon/addon/redfiles/redfiles.php:124
+#: ../../extend/addon/addon/redphotos/redphotos.php:136
+#: ../../extend/addon/addon/redred/redred.php:119
+#: ../../extend/addon/addon/rtof/rtof.php:101
+#: ../../extend/addon/addon/skeleton/skeleton.php:65
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
+#: ../../extend/addon/addon/startpage/startpage.php:113
+#: ../../extend/addon/addon/statusnet/statusnet.php:322
+#: ../../extend/addon/addon/statusnet/statusnet.php:380
+#: ../../extend/addon/addon/statusnet/statusnet.php:432
+#: ../../extend/addon/addon/statusnet/statusnet.php:899
+#: ../../extend/addon/addon/superblock/superblock.php:114
+#: ../../extend/addon/addon/twitter/twitter.php:217
+#: ../../extend/addon/addon/twitter/twitter.php:259
+#: ../../extend/addon/addon/visage/visage.php:170
+#: ../../extend/addon/addon/wppost/wppost.php:113
+#: ../../extend/addon/addon/xmpp/xmpp.php:69
+#: ../../extend/addon/addon/cdav/cdav.php:246
+#: ../../extend/addon/addon/likebanner/likebanner.php:57
+#: ../../extend/addon/addon/mailtest/mailtest.php:100
+#: ../../include/js_strings.php:22 ../../include/widgets.php:796
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Submit"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:811
#, php-format
msgid ""
"Please choose the profile you would like to display to %s when viewing your "
"profile securely."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:787
+#: ../../Zotlabs/Module/Connedit.php:813
+#: ../../Zotlabs/Module/Settings/Tokens.php:160
+msgid "Their Settings"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:814
+#: ../../Zotlabs/Module/Settings/Tokens.php:161
+msgid "My Settings"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:816
+#: ../../Zotlabs/Module/Settings/Tokens.php:165
+msgid "Individual Permissions"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:817
+#: ../../Zotlabs/Module/Settings/Tokens.php:166
+msgid ""
+"Some permissions may be inherited from your channel's <a href=\"settings"
+"\"><strong>privacy settings</strong></a>, which have higher priority than "
+"individual settings. You can <strong>not</strong> change those settings here."
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:818
msgid ""
"Some permissions may be inherited from your channel's <a href=\"settings"
"\"><strong>privacy settings</strong></a>, which have higher priority than "
@@ -2528,422 +1152,548 @@ msgid ""
"any impact unless the inherited setting changes."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:788
+#: ../../Zotlabs/Module/Connedit.php:819
msgid "Last update:"
msgstr ""
-#: ../../Zotlabs/Module/Ffsapi.php:12
-msgid "Share content from Firefox to $Projectname"
+#: ../../Zotlabs/Module/Dreport.php:45
+msgid "Invalid message"
msgstr ""
-#: ../../Zotlabs/Module/Ffsapi.php:15
-msgid "Activate the Firefox $Projectname provider"
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "no results"
msgstr ""
-#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Directory.php:64
-#: ../../Zotlabs/Module/Display.php:17 ../../Zotlabs/Module/Ratings.php:83
-#: ../../Zotlabs/Module/Photos.php:509
-#: ../../Zotlabs/Module/Viewconnections.php:23
-msgid "Public access denied."
+#: ../../Zotlabs/Module/Dreport.php:93
+msgid "channel sync processed"
msgstr ""
-#: ../../Zotlabs/Module/Search.php:216
-#, php-format
-msgid "Items tagged with: %s"
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "queued"
msgstr ""
-#: ../../Zotlabs/Module/Search.php:218
-#, php-format
-msgid "Search results for: %s"
+#: ../../Zotlabs/Module/Dreport.php:101
+msgid "posted"
msgstr ""
-#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
-#: ../../Zotlabs/Module/Siteinfo.php:48
-msgid "$Projectname"
+#: ../../Zotlabs/Module/Dreport.php:105
+msgid "accepted for delivery"
msgstr ""
-#: ../../Zotlabs/Module/Home.php:92
+#: ../../Zotlabs/Module/Dreport.php:109
+msgid "updated"
+msgstr ""
+
+#: ../../Zotlabs/Module/Dreport.php:112
+msgid "update ignored"
+msgstr ""
+
+#: ../../Zotlabs/Module/Dreport.php:115
+msgid "permission denied"
+msgstr ""
+
+#: ../../Zotlabs/Module/Dreport.php:119
+msgid "recipient not found"
+msgstr ""
+
+#: ../../Zotlabs/Module/Dreport.php:122
+msgid "mail recalled"
+msgstr ""
+
+#: ../../Zotlabs/Module/Dreport.php:125
+msgid "duplicate mail received"
+msgstr ""
+
+#: ../../Zotlabs/Module/Dreport.php:128
+msgid "mail delivered"
+msgstr ""
+
+#: ../../Zotlabs/Module/Dreport.php:148
#, php-format
-msgid "Welcome to %s"
+msgid "Delivery report for %1$s"
msgstr ""
-#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49
-msgid "This site is not a directory server"
+#: ../../Zotlabs/Module/Dreport.php:151
+msgid "Options"
msgstr ""
-#: ../../Zotlabs/Module/Dirsearch.php:33
-msgid "This directory server requires an access token"
+#: ../../Zotlabs/Module/Dreport.php:152
+msgid "Redeliver"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:87
-msgid "Permission Denied."
+#: ../../Zotlabs/Module/Bookmarks.php:53
+msgid "Bookmark added"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:103
-msgid "File not found."
+#: ../../Zotlabs/Module/Bookmarks.php:75
+msgid "My Bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:146
-msgid "Edit file permissions"
+#: ../../Zotlabs/Module/Bookmarks.php:86
+msgid "My Connections Bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:152 ../../Zotlabs/Module/Thing.php:313
-#: ../../Zotlabs/Module/Thing.php:363 ../../Zotlabs/Module/Photos.php:658
-#: ../../Zotlabs/Module/Photos.php:1047 ../../Zotlabs/Module/Chat.php:234
-#: ../../include/acl_selectors.php:182
-msgid "Permissions"
+#: ../../Zotlabs/Module/Acl.php:313
+msgid "network"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:159
-msgid "Set/edit permissions"
+#: ../../Zotlabs/Module/Acl.php:323
+msgid "RSS"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:160
-msgid "Include all files and sub folders"
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:161
-msgid "Return to file list"
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:163
-msgid "Copy/paste this code to attach file to a post"
+#: ../../Zotlabs/Module/Locs.php:66
+msgid ""
+"Please select another location to become primary before removing the primary "
+"location."
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:164
-msgid "Copy/paste this URL to link file from a web page"
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:166
-msgid "Share this file"
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:167
-msgid "Show URL to this file"
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:168
-msgid "Notify your contacts about this file"
+#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
+#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:692
+#: ../../Zotlabs/Module/Events.php:468
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839
+#: ../../include/js_strings.php:25
+msgid "Location"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:21
-msgid "Layout updated."
+#: ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Profiles.php:464
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143
+msgid "Address"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:218
-msgid "Feature disabled."
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
-msgid "Edit System Page Description"
+#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
+msgid "Drop"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:64
-msgid "Layout not found."
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:70
-msgid "Module Name:"
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:71
-msgid "Layout Help"
+#: ../../Zotlabs/Module/Locs.php:124
+msgid ""
+"When possible, drop a location by logging into that website/hub and removing "
+"your channel."
msgstr ""
-#: ../../Zotlabs/Module/Editpost.php:35
-msgid "Item is not editable"
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
msgstr ""
-#: ../../Zotlabs/Module/Editpost.php:106 ../../Zotlabs/Module/Rpost.php:138
-msgid "Edit post"
+#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
+msgid "Continue"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:183
-#: ../../Zotlabs/Module/Profiles.php:240 ../../Zotlabs/Module/Profiles.php:619
-msgid "Profile not found."
+#: ../../Zotlabs/Module/Connect.php:90
+msgid "Premium Channel Setup"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:44
-msgid "Profile deleted."
+#: ../../Zotlabs/Module/Connect.php:92
+msgid "Enable premium channel connection restrictions"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:104
-msgid "Profile-"
+#: ../../Zotlabs/Module/Connect.php:93
+msgid ""
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:89 ../../Zotlabs/Module/Profiles.php:126
-msgid "New profile created."
+#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:110
-msgid "Profile unavailable to clone."
+#: ../../Zotlabs/Module/Connect.php:96
+msgid ""
+"Potential connections will then see the following text before proceeding:"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:145
-msgid "Profile unavailable to export."
+#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
+msgid ""
+"By continuing, I certify that I have complied with any instructions provided "
+"on this page."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:250
-msgid "Profile Name is required."
+#: ../../Zotlabs/Module/Connect.php:106
+msgid "(No specific instructions have been provided by the channel owner.)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:421
-msgid "Marital Status"
+#: ../../Zotlabs/Module/Connect.php:114
+msgid "Restricted or Premium Channel"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:425
-msgid "Romantic Partner"
+#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
+msgid "Invalid item."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:429 ../../Zotlabs/Module/Profiles.php:730
-msgid "Likes"
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Chanview.php:96
+#: ../../Zotlabs/Module/Block.php:43 ../../Zotlabs/Module/Cal.php:62
+#: ../../Zotlabs/Module/Wall_upload.php:31
+msgid "Channel not found."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:433 ../../Zotlabs/Module/Profiles.php:731
-msgid "Dislikes"
+#: ../../Zotlabs/Module/Page.php:131
+msgid ""
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
+"quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
+"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:437 ../../Zotlabs/Module/Profiles.php:738
-msgid "Work/Employment"
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "Save to Folder:"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:440
-msgid "Religion"
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "- select -"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:444
-msgid "Political Views"
+#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin/Profs.php:74
+#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/text.php:987
+#: ../../include/text.php:999 ../../include/widgets.php:201
+msgid "Save"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:448
-msgid "Gender"
+#: ../../Zotlabs/Module/Manage.php:136
+#: ../../Zotlabs/Module/New_channel.php:121
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:452
-msgid "Sexual Preference"
+#: ../../Zotlabs/Module/Manage.php:143
+msgid "Create a new channel"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:456
-msgid "Homepage"
+#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:772
+#: ../../Zotlabs/Module/Wiki.php:147 ../../Zotlabs/Module/Chat.php:255
+msgid "Create New"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:460
-msgid "Interests"
+#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:214
+#: ../../include/nav.php:209
+msgid "Channel Manager"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:464
-#: ../../Zotlabs/Module/Admin/Channels.php:160
-#: ../../Zotlabs/Module/Locs.php:118
-msgid "Address"
+#: ../../Zotlabs/Module/Manage.php:165
+msgid "Current Channel"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:692
-#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
-#: ../../Zotlabs/Module/Events.php:467 ../../include/js_strings.php:25
-msgid "Location"
+#: ../../Zotlabs/Module/Manage.php:167
+msgid "Switch to one of your channels by selecting it."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:554
-msgid "Profile updated."
+#: ../../Zotlabs/Module/Manage.php:168
+msgid "Default Channel"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:638
-msgid "Hide your connections list from viewers of this profile"
+#: ../../Zotlabs/Module/Manage.php:169
+msgid "Make Default"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:680
-msgid "Edit Profile Details"
+#: ../../Zotlabs/Module/Manage.php:172
+#, php-format
+msgid "%d new messages"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:682
-msgid "View this profile"
+#: ../../Zotlabs/Module/Manage.php:173
+#, php-format
+msgid "%d new introductions"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:683 ../../Zotlabs/Module/Profiles.php:765
-#: ../../include/channel.php:983
-msgid "Edit visibility"
+#: ../../Zotlabs/Module/Manage.php:175
+msgid "Delegated Channel"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:684
-msgid "Profile Tools"
+#: ../../Zotlabs/Module/Connections.php:56
+#: ../../Zotlabs/Module/Connections.php:161
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Blocked"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:685
-msgid "Change cover photo"
+#: ../../Zotlabs/Module/Connections.php:61
+#: ../../Zotlabs/Module/Connections.php:168
+#: ../../Zotlabs/Module/Connections.php:241
+msgid "Ignored"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:686 ../../include/channel.php:954
-msgid "Change profile photo"
+#: ../../Zotlabs/Module/Connections.php:66
+#: ../../Zotlabs/Module/Connections.php:182
+#: ../../Zotlabs/Module/Connections.php:240
+msgid "Hidden"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:687
-msgid "Create a new profile using these settings"
+#: ../../Zotlabs/Module/Connections.php:71
+#: ../../Zotlabs/Module/Connections.php:175
+#: ../../Zotlabs/Module/Connections.php:239
+msgid "Archived"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:688
-msgid "Clone this profile"
+#: ../../Zotlabs/Module/Connections.php:76
+#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1594
+msgid "New"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:689
-msgid "Delete this profile"
+#: ../../Zotlabs/Module/Connections.php:138
+msgid "New Connections"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:690
-msgid "Add profile things"
+#: ../../Zotlabs/Module/Connections.php:141
+msgid "Show pending (new) connections"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:691 ../../include/widgets.php:105
-#: ../../include/conversation.php:1564
-msgid "Personal"
+#: ../../Zotlabs/Module/Connections.php:145
+#: ../../Zotlabs/Module/Profperm.php:144
+msgid "All Connections"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:693
-msgid "Relation"
+#: ../../Zotlabs/Module/Connections.php:148
+msgid "Show all connections"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:694 ../../include/datetime.php:55
-msgid "Miscellaneous"
+#: ../../Zotlabs/Module/Connections.php:164
+msgid "Only show blocked connections"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:696
-msgid "Import profile from file"
+#: ../../Zotlabs/Module/Connections.php:171
+msgid "Only show ignored connections"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:697
-msgid "Export profile to file"
+#: ../../Zotlabs/Module/Connections.php:178
+msgid "Only show archived connections"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:698
-msgid "Your gender"
+#: ../../Zotlabs/Module/Connections.php:185
+msgid "Only show hidden connections"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:699
-msgid "Marital status"
+#: ../../Zotlabs/Module/Connections.php:238
+msgid "Pending approval"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:700
-msgid "Sexual preference"
+#: ../../Zotlabs/Module/Connections.php:254
+#, php-format
+msgid "%1$s [%2$s]"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:703
-msgid "Profile name"
+#: ../../Zotlabs/Module/Connections.php:255
+msgid "Edit connection"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:705
-msgid "This is your default profile."
+#: ../../Zotlabs/Module/Connections.php:256
+msgid "Delete connection"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:707
-msgid "Your full name"
+#: ../../Zotlabs/Module/Connections.php:265
+msgid "Channel address"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:708
-msgid "Title/Description"
+#: ../../Zotlabs/Module/Connections.php:267
+msgid "Network"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:711
-msgid "Street address"
+#: ../../Zotlabs/Module/Connections.php:270
+msgid "Status"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:712
-msgid "Locality/City"
+#: ../../Zotlabs/Module/Connections.php:272
+msgid "Connected"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:713
-msgid "Region/State"
+#: ../../Zotlabs/Module/Connections.php:274
+msgid "Approve connection"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:714
-msgid "Postal/Zip code"
+#: ../../Zotlabs/Module/Connections.php:275
+#: ../../Zotlabs/Module/Admin/Accounts.php:171
+msgid "Approve"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:715
-msgid "Country"
+#: ../../Zotlabs/Module/Connections.php:276
+msgid "Ignore connection"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:720
-msgid "Who (if applicable)"
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Recent activity"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:720
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+#: ../../Zotlabs/Module/Connections.php:302 ../../Zotlabs/Lib/Apps.php:209
+#: ../../include/nav.php:189 ../../include/text.php:916
+msgid "Connections"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:721
-msgid "Since (date)"
+#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44
+#: ../../Zotlabs/Lib/Apps.php:230 ../../include/nav.php:168
+#: ../../include/text.php:986 ../../include/text.php:998
+#: ../../include/widgets.php:315 ../../include/acl_selectors.php:203
+msgid "Search"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:724
-msgid "Tell us about yourself"
+#: ../../Zotlabs/Module/Connections.php:307
+msgid "Search your connections"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:725
-msgid "Homepage URL"
+#: ../../Zotlabs/Module/Connections.php:308
+msgid "Connections search"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:726
-msgid "Hometown"
+#: ../../Zotlabs/Module/Connections.php:309
+#: ../../Zotlabs/Module/Directory.php:391
+#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
+msgid "Find"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:727
-msgid "Political views"
+#: ../../Zotlabs/Module/Cover_photo.php:58
+#: ../../Zotlabs/Module/Profile_photo.php:61
+msgid "Image uploaded but image cropping failed."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:728
-msgid "Religious views"
+#: ../../Zotlabs/Module/Cover_photo.php:134
+#: ../../Zotlabs/Module/Cover_photo.php:181
+msgid "Cover Photos"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:729
-msgid "Keywords used in directory listings"
+#: ../../Zotlabs/Module/Cover_photo.php:154
+#: ../../Zotlabs/Module/Profile_photo.php:135
+msgid "Image resize failed."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:729
-msgid "Example: fishing photography software"
+#: ../../Zotlabs/Module/Cover_photo.php:168
+#: ../../Zotlabs/Module/Profile_photo.php:196 ../../include/photos.php:149
+msgid "Unable to process image"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:732
-msgid "Musical interests"
+#: ../../Zotlabs/Module/Cover_photo.php:192
+#: ../../Zotlabs/Module/Profile_photo.php:231
+msgid "Image upload failed."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:733
-msgid "Books, literature"
+#: ../../Zotlabs/Module/Cover_photo.php:210
+#: ../../Zotlabs/Module/Profile_photo.php:250
+msgid "Unable to process image."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:734
-msgid "Television"
+#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4253
+msgid "female"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:735
-msgid "Film/Dance/Culture/Entertainment"
+#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4254
+#, php-format
+msgid "%1$s updated her %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:736
-msgid "Hobbies/Interests"
+#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4255
+msgid "male"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:737
-msgid "Love/Romance"
+#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4256
+#, php-format
+msgid "%1$s updated his %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:739
-msgid "School/Education"
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4258
+#, php-format
+msgid "%1$s updated their %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:740
-msgid "Contact information and social networks"
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1677
+msgid "cover photo"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:741
-msgid "My other channels"
+#: ../../Zotlabs/Module/Cover_photo.php:303
+#: ../../Zotlabs/Module/Cover_photo.php:318
+#: ../../Zotlabs/Module/Profile_photo.php:311
+#: ../../Zotlabs/Module/Profile_photo.php:352
+msgid "Photo not available."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:761 ../../include/channel.php:979
-msgid "Profile Image"
+#: ../../Zotlabs/Module/Cover_photo.php:354
+#: ../../Zotlabs/Module/Profile_photo.php:407
+msgid "Upload File:"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:771 ../../include/nav.php:91
-#: ../../include/channel.php:961
-msgid "Edit Profiles"
+#: ../../Zotlabs/Module/Cover_photo.php:355
+#: ../../Zotlabs/Module/Profile_photo.php:408
+msgid "Select a profile:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cover_photo.php:356
+msgid "Upload Cover Photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:416
+#: ../../Zotlabs/Module/Settings/Channel.php:399
+msgid "or"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:416
+msgid "skip this step"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:416
+msgid "select a photo from your photo albums"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cover_photo.php:377
+#: ../../Zotlabs/Module/Profile_photo.php:435
+msgid "Crop Image"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cover_photo.php:378
+#: ../../Zotlabs/Module/Profile_photo.php:436
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr ""
+
+#: ../../Zotlabs/Module/Cover_photo.php:380
+#: ../../Zotlabs/Module/Profile_photo.php:438
+msgid "Done Editing"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Features.php:55
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#: ../../Zotlabs/Module/Settings/Features.php:38
+msgid "Off"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Features.php:55
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#: ../../Zotlabs/Module/Settings/Features.php:38
+msgid "On"
msgstr ""
#: ../../Zotlabs/Module/Admin/Features.php:56
@@ -2959,8 +1709,20 @@ msgstr ""
msgid "Log settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1586
-#: ../../include/widgets.php:1596
+#: ../../Zotlabs/Module/Admin/Logs.php:82
+#: ../../Zotlabs/Module/Admin/Plugins.php:336
+#: ../../Zotlabs/Module/Admin/Plugins.php:427
+#: ../../Zotlabs/Module/Admin/Security.php:86
+#: ../../Zotlabs/Module/Admin/Themes.php:120
+#: ../../Zotlabs/Module/Admin/Themes.php:154
+#: ../../Zotlabs/Module/Admin/Accounts.php:164
+#: ../../Zotlabs/Module/Admin/Channels.php:145
+#: ../../Zotlabs/Module/Admin/Site.php:258 ../../Zotlabs/Module/Admin.php:137
+msgid "Administration"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1658
+#: ../../include/widgets.php:1668
msgid "Logs"
msgstr ""
@@ -2986,6 +1748,14 @@ msgstr ""
msgid "Log level"
msgstr ""
+#: ../../Zotlabs/Module/Admin/Plugins.php:254
+#: ../../Zotlabs/Module/Admin/Themes.php:69
+#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Display.php:40
+#: ../../Zotlabs/Module/Admin.php:60 ../../Zotlabs/Module/Thing.php:89
+#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3343
+msgid "Item not found."
+msgstr ""
+
#: ../../Zotlabs/Module/Admin/Plugins.php:284
#, php-format
msgid "Plugin %s disabled."
@@ -3007,7 +1777,7 @@ msgid "Enable"
msgstr ""
#: ../../Zotlabs/Module/Admin/Plugins.php:337
-#: ../../Zotlabs/Module/Admin/Plugins.php:428 ../../include/widgets.php:1564
+#: ../../Zotlabs/Module/Admin/Plugins.php:428 ../../include/widgets.php:1636
msgid "Plugins"
msgstr ""
@@ -3018,7 +1788,7 @@ msgstr ""
#: ../../Zotlabs/Module/Admin/Plugins.php:339
#: ../../Zotlabs/Module/Admin/Themes.php:123 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/nav.php:213 ../../include/widgets.php:680
+#: ../../include/nav.php:211 ../../include/widgets.php:680
msgid "Settings"
msgstr ""
@@ -3085,6 +1855,20 @@ msgstr ""
msgid "Install"
msgstr ""
+#: ../../Zotlabs/Module/Admin/Plugins.php:414
+#: ../../Zotlabs/Module/Fbrowser.php:66 ../../Zotlabs/Module/Fbrowser.php:88
+#: ../../Zotlabs/Module/Wiki.php:242 ../../Zotlabs/Module/Wiki.php:277
+#: ../../Zotlabs/Module/Settings/Oauth.php:88
+#: ../../Zotlabs/Module/Settings/Oauth.php:114
+#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
+#: ../../extend/addon/addon/friendica/dfrn_request.php:879
+#: ../../extend/addon/addon/js_upload/js_upload.php:46
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154
+#: ../../include/conversation.php:1264 ../../include/conversation.php:1313
+msgid "Cancel"
+msgstr ""
+
#: ../../Zotlabs/Module/Admin/Plugins.php:435
msgid "Manage Repos"
msgstr ""
@@ -3097,10 +1881,23 @@ msgstr ""
msgid "Install a New Plugin Repository"
msgstr ""
+#: ../../Zotlabs/Module/Admin/Plugins.php:443
+#: ../../Zotlabs/Module/Settings/Oauth.php:42
+#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:334
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152
+msgid "Update"
+msgstr ""
+
#: ../../Zotlabs/Module/Admin/Plugins.php:444
msgid "Switch branch"
msgstr ""
+#: ../../Zotlabs/Module/Admin/Plugins.php:445
+#: ../../Zotlabs/Module/Photos.php:989 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../extend/addon/addon/superblock/superblock.php:110
+msgid "Remove"
+msgstr ""
+
#: ../../Zotlabs/Module/Admin/Profs.php:69
msgid "New Profile Field"
msgstr ""
@@ -3148,7 +1945,7 @@ msgstr ""
msgid "Edit Profile Field"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1567
+#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1639
msgid "Profile Fields"
msgstr ""
@@ -3228,7 +2025,7 @@ msgid ""
"embedded content from that site is explicitly blocked."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1562
+#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1634
msgid "Security"
msgstr ""
@@ -3328,7 +2125,7 @@ msgid "Screenshot"
msgstr ""
#: ../../Zotlabs/Module/Admin/Themes.php:121
-#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1565
+#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1637
msgid "Themes"
msgstr ""
@@ -3411,7 +2208,7 @@ msgid "Account '%s' unblocked"
msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:165
-#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1560
+#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1632
msgid "Accounts"
msgstr ""
@@ -3429,7 +2226,13 @@ msgid "Request date"
msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:169
-#: ../../Zotlabs/Module/Admin/Accounts.php:181 ../../include/network.php:2212
+#: ../../Zotlabs/Module/Admin/Accounts.php:181
+#: ../../extend/addon/addon/redred/redred.php:107
+#: ../../extend/addon/addon/rtof/rtof.php:93
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1140
+#: ../../extend/addon/addon/openid/MysqlProvider.php:56
+#: ../../extend/addon/addon/openid/MysqlProvider.php:57
+#: ../../include/network.php:2237
msgid "Email"
msgstr ""
@@ -3477,46 +2280,6 @@ msgid ""
"this site will be permanently deleted!\\n\\nAre you sure?"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Dbsync.php:19
-msgid "Update has been marked successful"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:29
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:32
-#, php-format
-msgid "Update %s was successfully applied."
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:36
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:39
-#, php-format
-msgid "Update function %s could not be found."
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:55
-msgid "No failed updates."
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:59
-msgid "Failed Updates"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:61
-msgid "Mark success (if update was manually applied)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:62
-msgid "Attempt to execute this update step automatically"
-msgstr ""
-
#: ../../Zotlabs/Module/Admin/Channels.php:31
#, php-format
msgid "%s channel censored/uncensored"
@@ -3567,7 +2330,7 @@ msgstr ""
msgid "Channel '%s' code disallowed"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1561
+#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1633
msgid "Channels"
msgstr ""
@@ -3588,7 +2351,7 @@ msgid "Disallow Code"
msgstr ""
#: ../../Zotlabs/Module/Admin/Channels.php:154
-#: ../../include/conversation.php:1651
+#: ../../include/conversation.php:1671
msgid "Channel"
msgstr ""
@@ -3608,361 +2371,508 @@ msgid ""
"channel on this site will be permanently deleted!\\n\\nAre you sure?"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:131
+#: ../../Zotlabs/Module/Admin/Dbsync.php:19
+msgid "Update has been marked successful"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:29
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:32
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:36
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:39
+#, php-format
+msgid "Update function %s could not be found."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:55
+msgid "No failed updates."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:59
+msgid "Failed Updates"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:61
+msgid "Mark success (if update was manually applied)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:62
+msgid "Attempt to execute this update step automatically"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:133
msgid "Site settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:157 ../../include/text.php:2959
+#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2918
msgid "Default"
msgstr ""
#: ../../Zotlabs/Module/Admin/Site.php:169
-msgid "experimental"
+#: ../../Zotlabs/Module/Settings/Display.php:143
+msgid "mobile"
msgstr ""
#: ../../Zotlabs/Module/Admin/Site.php:171
+msgid "experimental"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:173
msgid "unsupported"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:217
+#: ../../Zotlabs/Module/Admin/Site.php:219
msgid "Yes - with approval"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:223
+#: ../../Zotlabs/Module/Admin/Site.php:225
msgid "My site is not a public server"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:224
+#: ../../Zotlabs/Module/Admin/Site.php:226
msgid "My site has paid access only"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:225
+#: ../../Zotlabs/Module/Admin/Site.php:227
msgid "My site has free access only"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:226
+#: ../../Zotlabs/Module/Admin/Site.php:228
msgid "My site offers free accounts with optional paid upgrades"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:237 ../../Zotlabs/Module/Setup.php:334
+#: ../../Zotlabs/Module/Admin/Site.php:239 ../../Zotlabs/Module/Setup.php:328
msgid "Basic/Minimal Social Networking"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:238 ../../Zotlabs/Module/Setup.php:335
+#: ../../Zotlabs/Module/Admin/Site.php:240 ../../Zotlabs/Module/Setup.php:329
msgid "Standard Configuration (default)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:239 ../../Zotlabs/Module/Setup.php:336
+#: ../../Zotlabs/Module/Admin/Site.php:241 ../../Zotlabs/Module/Setup.php:330
msgid "Professional"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:243 ../../Zotlabs/Lib/Techlevels.php:10
+#: ../../Zotlabs/Module/Admin/Site.php:245 ../../Zotlabs/Lib/Techlevels.php:10
msgid "Beginner/Basic"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:244 ../../Zotlabs/Lib/Techlevels.php:11
+#: ../../Zotlabs/Module/Admin/Site.php:246 ../../Zotlabs/Lib/Techlevels.php:11
msgid "Novice - not skilled but willing to learn"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:245 ../../Zotlabs/Lib/Techlevels.php:12
+#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Lib/Techlevels.php:12
msgid "Intermediate - somewhat comfortable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:246 ../../Zotlabs/Lib/Techlevels.php:13
+#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Lib/Techlevels.php:13
msgid "Advanced - very comfortable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Lib/Techlevels.php:14
+#: ../../Zotlabs/Module/Admin/Site.php:249 ../../Zotlabs/Lib/Techlevels.php:14
msgid "Expert - I can write computer code"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Lib/Techlevels.php:15
+#: ../../Zotlabs/Module/Admin/Site.php:250 ../../Zotlabs/Lib/Techlevels.php:15
msgid "Wizard - I probably know more than you do"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:257 ../../include/widgets.php:1559
+#: ../../Zotlabs/Module/Admin/Site.php:259 ../../include/widgets.php:1631
msgid "Site"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:260
+#: ../../Zotlabs/Module/Admin/Site.php:262
msgid "File upload"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:261
+#: ../../Zotlabs/Module/Admin/Site.php:263
msgid "Policies"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:262
+#: ../../Zotlabs/Module/Admin/Site.php:264
#: ../../include/contact_widgets.php:16
msgid "Advanced"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:266
+#: ../../Zotlabs/Module/Admin/Site.php:268
+#: ../../extend/addon/addon/statusnet/statusnet.php:890
msgid "Site name"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:268 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Module/Setup.php:351
msgid "Server Configuration/Role"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:270
+#: ../../Zotlabs/Module/Admin/Site.php:272
msgid "Site default technical skill level"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:270
+#: ../../Zotlabs/Module/Admin/Site.php:272
msgid "Used to provide a member experience matched to technical comfort level"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Admin/Site.php:274
msgid "Lock the technical skill level setting"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Admin/Site.php:274
msgid "Members can set their own technical comfort level by default"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:274
+#: ../../Zotlabs/Module/Admin/Site.php:276
msgid "Banner/Logo"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:275
+#: ../../Zotlabs/Module/Admin/Site.php:277
msgid "Administrator Information"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:275
+#: ../../Zotlabs/Module/Admin/Site.php:277
msgid ""
"Contact information for site administrators. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:276
+#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Siteinfo.php:23
+msgid "Site Information"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:278
+msgid ""
+"Publicly visible description of this site. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:279
msgid "System language"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:280
msgid "System theme"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:280
msgid ""
"Default system theme - may be over-ridden by user profiles - <a href='#' "
"id='cnftheme'>change theme settings</a>"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Mobile system theme"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Theme for mobile devices"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "Allow Feeds as Connections"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "(Heavy system resource usage)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:284
msgid "Maximum image size"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:284
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:282
+#: ../../Zotlabs/Module/Admin/Site.php:285
msgid "Does this site allow new member registration?"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid "Invitation only"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid ""
"Only allow new member registrations with an invitation code. Above register "
"policy must be set to Yes."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:287
msgid "Which best describes the types of account offered by this hub?"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:288
msgid "Register text"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:288
msgid "Will be displayed prominently on the registration page."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid "Site homepage to show visitors (default: login box)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid ""
"example: 'public' to show public stream, 'page/sys/home' to show a system "
"webpage called 'home' or 'include:home.html' to include a file."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid "Preserve site homepage URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid ""
"Present the site homepage in a frame at the original location instead of "
"redirecting"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Accounts abandoned after x days"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid "Allowed friend domains"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid ""
"Comma separated list of domains which are allowed to establish friendships "
"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Verify Email Addresses"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid ""
"Check to verify email addresses used in account registration (recommended)."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:294
msgid "Force publish"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:294
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid "Import Public Streams"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid ""
"Import and allow access to public content pulled from other sites. Warning: "
"this content is unmoderated."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Login on Homepage"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid ""
"Present a login box to visitors on the home page if no other content has "
"been configured."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid "Enable context help"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid ""
"Display contextual help for the current page when the help button is pressed."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "Directory Server URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "Default directory server"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:298
+#: ../../Zotlabs/Module/Admin/Site.php:301
msgid "Proxy user"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "Proxy URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Network timeout"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid "Delivery interval"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid ""
"Delay background delivery processes by this many seconds to reduce system "
"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
"for large dedicated servers."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid "Deliveries per process"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid ""
"Number of deliveries to attempt in a single operating system process. Adjust "
"if necessary to tune system performance. Recommend: 1-5."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid "Poll interval"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid ""
"Delay background polling processes by this many seconds to reduce system "
"load. If 0, use delivery interval."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Maximum Load Average"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default 50."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "Expiration period in days for imported (grid/network) content"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "0 for no expiration of imported content"
msgstr ""
+#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1454
+msgid "Public Hubs"
+msgstr ""
+
+#: ../../Zotlabs/Module/Pubsites.php:27
+msgid ""
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
+msgstr ""
+
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Hub URL"
+msgstr ""
+
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Access Type"
+msgstr ""
+
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Registration Policy"
+msgstr ""
+
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Stats"
+msgstr ""
+
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Software"
+msgstr ""
+
+#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
+#: ../../include/conversation.php:974
+msgid "Ratings"
+msgstr ""
+
+#: ../../Zotlabs/Module/Pubsites.php:48
+msgid "Rate"
+msgstr ""
+
+#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166
+#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Webpages.php:246
+#: ../../Zotlabs/Module/Wiki.php:146 ../../Zotlabs/Module/Events.php:685
+#: ../../include/page_widgets.php:42 ../../include/widgets.php:967
+msgid "View"
+msgstr ""
+
+#: ../../Zotlabs/Module/Editlayout.php:79
+#: ../../Zotlabs/Module/Editwebpage.php:80
+#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
+#: ../../Zotlabs/Module/Editpost.php:24
+msgid "Item not found"
+msgstr ""
+
+#: ../../Zotlabs/Module/Editlayout.php:127
+#: ../../Zotlabs/Module/Layouts.php:128 ../../Zotlabs/Module/Layouts.php:188
+msgid "Layout Name"
+msgstr ""
+
+#: ../../Zotlabs/Module/Editlayout.php:128
+#: ../../Zotlabs/Module/Layouts.php:131
+msgid "Layout Description (Optional)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Editlayout.php:136
+msgid "Edit Layout"
+msgstr ""
+
+#: ../../Zotlabs/Module/Editwebpage.php:142
+msgid "Page link"
+msgstr ""
+
+#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:258
+#: ../../Zotlabs/Module/Mail.php:383 ../../Zotlabs/Module/Editblock.php:111
+#: ../../Zotlabs/Module/Chat.php:207 ../../include/conversation.php:1165
+msgid "Insert web link"
+msgstr ""
+
+#: ../../Zotlabs/Module/Editwebpage.php:169
+msgid "Edit Webpage"
+msgstr ""
+
+#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:222
+#: ../../include/nav.php:95 ../../include/conversation.php:1692
+msgid "Photos"
+msgstr ""
+
#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Wiki.php:20
#: ../../Zotlabs/Module/Chat.php:25
+#: ../../extend/addon/addon/chess/chess.php:400
msgid "You must be logged in to see this page."
msgstr ""
@@ -3974,71 +2884,452 @@ msgstr ""
msgid "Only posts"
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:103
+#: ../../Zotlabs/Module/Channel.php:104
msgid "Insufficient permissions. Request redirected to profile page."
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
-msgid "webpage"
+#: ../../Zotlabs/Module/Network.php:96
+msgid "No such group"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
-msgid "block"
+#: ../../Zotlabs/Module/Network.php:136
+msgid "No such channel"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
-msgid "layout"
+#: ../../Zotlabs/Module/Network.php:141
+msgid "forum"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
-msgid "menu"
+#: ../../Zotlabs/Module/Network.php:153
+msgid "Search Results For:"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:191
-#, php-format
-msgid "%s element installed"
+#: ../../Zotlabs/Module/Network.php:221
+msgid "Privacy group is empty"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:194
+#: ../../Zotlabs/Module/Network.php:230
+msgid "Privacy group: "
+msgstr ""
+
+#: ../../Zotlabs/Module/Network.php:256
+msgid "Invalid connection."
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:49
+msgid "Unable to update menu."
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:60
+msgid "Unable to create menu."
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
+msgid "Menu Name"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:98
+msgid "Unique name (not visible on webpage) - required"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
+msgid "Menu Title"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:99
+msgid "Visible on webpage - leave empty for no title"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:100
+msgid "Allow Bookmarks"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+msgid "Menu may be used to store saved bookmarks"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
+msgid "Submit and proceed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2271
+msgid "Menus"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Blocks.php:157
+#: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Webpages.php:251
+#: ../../include/page_widgets.php:47
+msgid "Created"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Blocks.php:158
+#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:252
+#: ../../include/page_widgets.php:48
+msgid "Edited"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:117
+msgid "Bookmarks allowed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:119
+msgid "Delete this menu"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
+msgid "Edit menu contents"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:121
+msgid "Edit this menu"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:136
+msgid "Menu could not be deleted."
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:144 ../../Zotlabs/Module/Mitem.php:28
+msgid "Menu not found."
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:149
+msgid "Edit Menu"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:153
+msgid "Add or remove entries to this menu"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Menu name"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Must be unique, only seen by you"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title as seen by others"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:157
+msgid "Allow bookmarks"
+msgstr ""
+
+#: ../../Zotlabs/Module/Menu.php:166 ../../Zotlabs/Module/Mitem.php:120
+#: ../../Zotlabs/Module/Xchan.php:41
+msgid "Not found."
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:37 ../../Zotlabs/Module/Appman.php:53
+msgid "App installed."
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:46
+msgid "Malformed app."
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:104
+msgid "Embed code"
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:110 ../../include/widgets.php:107
+msgid "Edit App"
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:110
+msgid "Create App"
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:115
+msgid "Name of app"
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:115 ../../Zotlabs/Module/Appman.php:116
+#: ../../Zotlabs/Module/Profiles.php:703 ../../Zotlabs/Module/Profiles.php:707
+#: ../../Zotlabs/Module/Events.php:453 ../../Zotlabs/Module/Events.php:458
+#: ../../include/datetime.php:259
+msgid "Required"
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:116
+msgid "Location (URL) of app"
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:117 ../../Zotlabs/Module/Rbmark.php:101
+#: ../../Zotlabs/Module/Events.php:466
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:133
+msgid "Description"
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:118
+msgid "Photo icon URL"
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:118
+msgid "80 x 80 pixels - optional"
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:119
+msgid "Categories (optional, comma separated list)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:120
+msgid "Version ID"
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:121
+msgid "Price of app"
+msgstr ""
+
+#: ../../Zotlabs/Module/Appman.php:122
+msgid "Location (URL) to purchase app"
+msgstr ""
+
+#: ../../Zotlabs/Module/Rpost.php:138 ../../Zotlabs/Module/Editpost.php:107
+msgid "Edit post"
+msgstr ""
+
+#: ../../Zotlabs/Module/Help.php:23
+msgid "Documentation Search"
+msgstr ""
+
+#: ../../Zotlabs/Module/Help.php:82
+msgid "$Projectname Documentation"
+msgstr ""
+
+#: ../../Zotlabs/Module/Ffsapi.php:12
+msgid "Share content from Firefox to $Projectname"
+msgstr ""
+
+#: ../../Zotlabs/Module/Ffsapi.php:15
+msgid "Activate the Firefox $Projectname provider"
+msgstr ""
+
+#: ../../Zotlabs/Module/Apps.php:46 ../../include/nav.php:166
+#: ../../include/widgets.php:102
+msgid "Apps"
+msgstr ""
+
+#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
+msgid "$Projectname"
+msgstr ""
+
+#: ../../Zotlabs/Module/Home.php:92
#, php-format
-msgid "%s element installation failed"
+msgid "Welcome to %s"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:42 ../../Zotlabs/Module/Import.php:71
-msgid "Nothing to import."
+#: ../../Zotlabs/Module/Filestorage.php:87
+msgid "Permission Denied."
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:66 ../../Zotlabs/Module/Import.php:83
-#: ../../Zotlabs/Module/Import.php:98
-msgid "Unable to download data from old server"
+#: ../../Zotlabs/Module/Filestorage.php:103
+msgid "File not found."
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:72
-#: ../../Zotlabs/Module/Import.php:105
-msgid "Imported file is empty."
+#: ../../Zotlabs/Module/Filestorage.php:146
+msgid "Edit file permissions"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:88
-#: ../../Zotlabs/Module/Import.php:127
+#: ../../Zotlabs/Module/Filestorage.php:152
+#: ../../Zotlabs/Module/Photos.php:658 ../../Zotlabs/Module/Photos.php:1047
+#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
+#: ../../Zotlabs/Module/Chat.php:234 ../../include/acl_selectors.php:208
+msgid "Permissions"
+msgstr ""
+
+#: ../../Zotlabs/Module/Filestorage.php:159
+msgid "Set/edit permissions"
+msgstr ""
+
+#: ../../Zotlabs/Module/Filestorage.php:160
+msgid "Include all files and sub folders"
+msgstr ""
+
+#: ../../Zotlabs/Module/Filestorage.php:161
+msgid "Return to file list"
+msgstr ""
+
+#: ../../Zotlabs/Module/Filestorage.php:163
+msgid "Copy/paste this code to attach file to a post"
+msgstr ""
+
+#: ../../Zotlabs/Module/Filestorage.php:164
+msgid "Copy/paste this URL to link file from a web page"
+msgstr ""
+
+#: ../../Zotlabs/Module/Filestorage.php:166
+msgid "Share this file"
+msgstr ""
+
+#: ../../Zotlabs/Module/Filestorage.php:167
+msgid "Show URL to this file"
+msgstr ""
+
+#: ../../Zotlabs/Module/Filestorage.php:168
+msgid "Notify your contacts about this file"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:64 ../../Zotlabs/Module/Display.php:17
+#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Photos.php:509
+#: ../../Zotlabs/Module/Search.php:17
+#: ../../Zotlabs/Module/Viewconnections.php:23
+#: ../../extend/addon/addon/friendica/dfrn_request.php:794
+msgid "Public access denied."
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:245
#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
+msgid "%d rating"
+msgid_plural "%d ratings"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../Zotlabs/Module/Directory.php:256
+msgid "Gender: "
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:104
-msgid "Import completed"
+#: ../../Zotlabs/Module/Directory.php:258
+msgid "Status: "
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:119
-msgid "Import Items"
+#: ../../Zotlabs/Module/Directory.php:260
+msgid "Homepage: "
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:120
-msgid "Use this form to import existing posts and content from an export file."
+#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1215
+msgid "Age:"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:121
-#: ../../Zotlabs/Module/Import.php:532
-msgid "File to Upload"
+#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1051
+#: ../../include/event.php:52 ../../include/event.php:84
+#: ../../include/bb2diaspora.php:520
+msgid "Location:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:320
+msgid "Description:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1231
+msgid "Hometown:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1239
+msgid "About:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:329
+msgid "Public Forum:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:332
+msgid "Keywords: "
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:335
+msgid "Don't suggest"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:337
+msgid "Common connections:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Global Directory"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Local Directory"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:392
+msgid "Finding:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:64
+#: ../../include/contact_widgets.php:24
+msgid "Channel Suggestions"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "next page"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "previous page"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "Sort options"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:399
+msgid "Alphabetic"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:400
+msgid "Reverse Alphabetic"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:401
+msgid "Newest to Oldest"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:402
+msgid "Oldest to Newest"
+msgstr ""
+
+#: ../../Zotlabs/Module/Directory.php:419
+msgid "No entries (some entries may be hidden)."
+msgstr ""
+
+#: ../../Zotlabs/Module/Item.php:184
+msgid "Unable to locate original post."
+msgstr ""
+
+#: ../../Zotlabs/Module/Item.php:447
+msgid "Empty post discarded."
+msgstr ""
+
+#: ../../Zotlabs/Module/Item.php:489
+msgid "Executable content type not permitted to this channel."
+msgstr ""
+
+#: ../../Zotlabs/Module/Item.php:871
+msgid "Duplicate post suppressed."
+msgstr ""
+
+#: ../../Zotlabs/Module/Item.php:1013
+msgid "System error. Post not saved."
+msgstr ""
+
+#: ../../Zotlabs/Module/Item.php:1137
+msgid "Unable to obtain post information from database."
+msgstr ""
+
+#: ../../Zotlabs/Module/Item.php:1144
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr ""
+
+#: ../../Zotlabs/Module/Item.php:1151
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr ""
+
+#: ../../Zotlabs/Module/Chanview.php:134
+msgid "toggle full screen mode"
+msgstr ""
+
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
msgstr ""
#: ../../Zotlabs/Module/Mail.php:38
@@ -4057,291 +3348,318 @@ msgstr ""
msgid "Selected channel has private message restrictions. Send failed."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:135
+#: ../../Zotlabs/Module/Mail.php:149
msgid "Messages"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:170
+#: ../../Zotlabs/Module/Mail.php:184
msgid "Message recalled."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:183
+#: ../../Zotlabs/Module/Mail.php:197
msgid "Conversation removed."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:197 ../../Zotlabs/Module/Mail.php:306
-#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1184
+#: ../../Zotlabs/Module/Mail.php:211 ../../Zotlabs/Module/Mail.php:320
+#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1200
msgid "Please enter a link URL:"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:198 ../../Zotlabs/Module/Mail.php:307
+#: ../../Zotlabs/Module/Mail.php:212 ../../Zotlabs/Module/Mail.php:321
msgid "Expires YYYY-MM-DD HH:MM"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:226
+#: ../../Zotlabs/Module/Mail.php:240
msgid "Requested channel is not in this network"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:234
+#: ../../Zotlabs/Module/Mail.php:248
msgid "Send Private Message"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:235 ../../Zotlabs/Module/Mail.php:360
+#: ../../Zotlabs/Module/Mail.php:249 ../../Zotlabs/Module/Mail.php:374
msgid "To:"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:238 ../../Zotlabs/Module/Mail.php:362
+#: ../../Zotlabs/Module/Mail.php:252 ../../Zotlabs/Module/Mail.php:376
msgid "Subject:"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:243 ../../Zotlabs/Module/Mail.php:368
-#: ../../include/conversation.php:1244
+#: ../../Zotlabs/Module/Mail.php:255 ../../Zotlabs/Module/Invite.php:138
+msgid "Your message:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Mail.php:257 ../../Zotlabs/Module/Mail.php:382
+#: ../../include/conversation.php:1260
msgid "Attach file"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:245
+#: ../../Zotlabs/Module/Mail.php:259
msgid "Send"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:248 ../../Zotlabs/Module/Mail.php:373
-#: ../../include/conversation.php:1289
+#: ../../Zotlabs/Module/Mail.php:262 ../../Zotlabs/Module/Mail.php:387
+#: ../../include/conversation.php:1305
msgid "Set expiration date"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:250 ../../Zotlabs/Module/Mail.php:375
-#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:737
-#: ../../include/conversation.php:1294
+#: ../../Zotlabs/Module/Mail.php:264 ../../Zotlabs/Module/Mail.php:389
+#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:741
+#: ../../include/conversation.php:1310
msgid "Encrypt text"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:332
+#: ../../Zotlabs/Module/Mail.php:346
msgid "Delete message"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:333
+#: ../../Zotlabs/Module/Mail.php:347
msgid "Delivery report"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:334
+#: ../../Zotlabs/Module/Mail.php:348
msgid "Recall message"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:336
+#: ../../Zotlabs/Module/Mail.php:350
msgid "Message has been recalled."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:353
+#: ../../Zotlabs/Module/Mail.php:367
msgid "Delete Conversation"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:355
+#: ../../Zotlabs/Module/Mail.php:369
msgid ""
"No secure communications available. You <strong>may</strong> be able to "
"respond from the sender's profile page."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:359
+#: ../../Zotlabs/Module/Mail.php:373
msgid "Send Reply"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:364
+#: ../../Zotlabs/Module/Mail.php:378
#, php-format
msgid "Your message for %s (%s):"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
-msgid "Location not found."
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
+msgid "webpage"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:62
-msgid "Location lookup failed."
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
+msgid "block"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:66
-msgid ""
-"Please select another location to become primary before removing the primary "
-"location."
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
+msgid "layout"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:95
-msgid "Syncing locations"
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
+msgid "menu"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:105
-msgid "No locations found."
+#: ../../Zotlabs/Module/Impel.php:191
+#, php-format
+msgid "%s element installed"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:116
-msgid "Manage Channel Locations"
+#: ../../Zotlabs/Module/Impel.php:194
+#, php-format
+msgid "%s element installation failed"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:119
-msgid "Primary"
+#: ../../Zotlabs/Module/Import_items.php:42 ../../Zotlabs/Module/Import.php:71
+msgid "Nothing to import."
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:122
-msgid "Sync Now"
+#: ../../Zotlabs/Module/Import_items.php:66 ../../Zotlabs/Module/Import.php:83
+#: ../../Zotlabs/Module/Import.php:98
+msgid "Unable to download data from old server"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:123
-msgid "Please wait several minutes between consecutive operations."
+#: ../../Zotlabs/Module/Import_items.php:72
+#: ../../Zotlabs/Module/Import.php:105
+msgid "Imported file is empty."
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:124
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing "
-"your channel."
+#: ../../Zotlabs/Module/Import_items.php:88
+#: ../../Zotlabs/Module/Import.php:127
+#, php-format
+msgid "Warning: Database versions differ by %1$d updates."
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:125
-msgid "Use this form to drop the location if the hub is no longer operating."
+#: ../../Zotlabs/Module/Import_items.php:104
+msgid "Import completed"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:35
-msgid ""
-"Channel removals are not allowed within 48 hours of changing the account "
-"password."
+#: ../../Zotlabs/Module/Import_items.php:119
+msgid "Import Items"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:60
-msgid "Remove This Channel"
+#: ../../Zotlabs/Module/Import_items.php:120
+msgid "Use this form to import existing posts and content from an export file."
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:61
-#: ../../Zotlabs/Module/Removeaccount.php:58
-msgid "WARNING: "
+#: ../../Zotlabs/Module/Import_items.php:121
+#: ../../Zotlabs/Module/Import.php:532
+msgid "File to Upload"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This channel will be completely removed from the network. "
+#: ../../Zotlabs/Module/Invite.php:29
+msgid "Total invitation limit exceeded."
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:61
-#: ../../Zotlabs/Module/Removeaccount.php:58
-msgid "This action is permanent and can not be undone!"
+#: ../../Zotlabs/Module/Invite.php:53
+#, php-format
+msgid "%s : Not a valid email address."
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:62
-#: ../../Zotlabs/Module/Removeaccount.php:59
-msgid "Please enter your password for verification:"
+#: ../../Zotlabs/Module/Invite.php:67
+msgid "Please join us on $Projectname"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid "Remove this channel and all its clones from the network"
+#: ../../Zotlabs/Module/Invite.php:77
+msgid "Invitation limit exceeded. Please contact your site administrator."
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid ""
-"By default only the instance of the channel located on this hub will be "
-"removed from the network"
+#: ../../Zotlabs/Module/Invite.php:82
+#, php-format
+msgid "%s : Message delivery failed."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:19
-msgid "Like/Dislike"
+#: ../../Zotlabs/Module/Invite.php:86
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../Zotlabs/Module/Invite.php:105
+msgid "You have no more invitations available"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:24
-msgid "This action is restricted to members."
+#: ../../Zotlabs/Module/Invite.php:136
+msgid "Send invitations"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:25
-msgid ""
-"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a href="
-"\"register\">register as a new $Projectname member</a> to continue."
+#: ../../Zotlabs/Module/Invite.php:137
+msgid "Enter email addresses, one per line:"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
-#: ../../Zotlabs/Module/Like.php:169
-msgid "Invalid request."
+#: ../../Zotlabs/Module/Invite.php:139
+msgid "Please join my community on $Projectname."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
-msgid "channel"
+#: ../../Zotlabs/Module/Invite.php:141
+msgid "You will need to supply this invitation code:"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:146
-msgid "thing"
+#: ../../Zotlabs/Module/Invite.php:142
+msgid "1. Register at any $Projectname location (they are all inter-connected)"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:192
-msgid "Channel unavailable."
+#: ../../Zotlabs/Module/Invite.php:144
+msgid "2. Enter my $Projectname network address into the site searchbar."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:240
-msgid "Previous action reversed."
+#: ../../Zotlabs/Module/Invite.php:145
+msgid "or visit"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../Zotlabs/Module/Tagger.php:47 ../../include/text.php:1984
-#: ../../include/conversation.php:120
-msgid "photo"
+#: ../../Zotlabs/Module/Invite.php:147
+msgid "3. Click [Connect]"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../include/text.php:1990 ../../include/conversation.php:148
-msgid "status"
+#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
+#: ../../Zotlabs/Module/Blocks.php:155
+msgid "Block Name"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Events.php:253
-#: ../../Zotlabs/Module/Tagger.php:51 ../../include/text.php:1987
-#: ../../include/conversation.php:123 ../../include/event.php:961
-msgid "event"
+#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1276
+msgid "Title (optional)"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:419 ../../include/conversation.php:164
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
+#: ../../Zotlabs/Module/Editblock.php:133
+msgid "Edit Block"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
+#: ../../Zotlabs/Module/Group.php:24
+msgid "Privacy group created."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:423
-#, php-format
-msgid "%1$s agrees with %2$s's %3$s"
+#: ../../Zotlabs/Module/Group.php:30
+msgid "Could not create privacy group."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:425
-#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
+#: ../../include/items.php:3876
+msgid "Privacy group not found."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:427
-#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
+#: ../../Zotlabs/Module/Group.php:58
+msgid "Privacy group updated."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:429
-#, php-format
-msgid "%1$s is attending %2$s's %3$s"
+#: ../../Zotlabs/Module/Group.php:90
+msgid "Create a group of channels."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:431
-#, php-format
-msgid "%1$s is not attending %2$s's %3$s"
+#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+msgid "Privacy group name: "
msgstr ""
-#: ../../Zotlabs/Module/Like.php:433
-#, php-format
-msgid "%1$s may attend %2$s's %3$s"
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+msgid "Members are visible to other channels"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:538
-msgid "Action completed."
+#: ../../Zotlabs/Module/Group.php:111
+msgid "Privacy group removed."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:539
-msgid "Thank you."
+#: ../../Zotlabs/Module/Group.php:113
+msgid "Unable to remove privacy group."
msgstr ""
-#: ../../Zotlabs/Module/Help.php:23
-msgid "Documentation Search"
+#: ../../Zotlabs/Module/Group.php:183
+msgid "Privacy group editor"
msgstr ""
-#: ../../Zotlabs/Module/Help.php:51
-msgid "$Projectname Documentation"
+#: ../../Zotlabs/Module/Group.php:197
+msgid "Members"
+msgstr ""
+
+#: ../../Zotlabs/Module/Group.php:199
+msgid "All Connected Channels"
+msgstr ""
+
+#: ../../Zotlabs/Module/Group.php:231
+msgid "Click on a channel to add or remove."
+msgstr ""
+
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
+msgstr ""
+
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Profile Visibility Editor"
+msgstr ""
+
+#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1282
+msgid "Profile"
+msgstr ""
+
+#: ../../Zotlabs/Module/Profperm.php:119
+msgid "Click on a contact to add or remove."
+msgstr ""
+
+#: ../../Zotlabs/Module/Profperm.php:128
+msgid "Visible To"
+msgstr ""
+
+#: ../../Zotlabs/Module/Magic.php:71
+msgid "Hub not found."
msgstr ""
#: ../../Zotlabs/Module/Mitem.php:52
@@ -4360,6 +3678,11 @@ msgstr ""
msgid "Menu Item Permissions"
msgstr ""
+#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
+#: ../../Zotlabs/Module/Settings/Channel.php:489
+msgid "(click to open/close)"
+msgstr ""
+
#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
msgid "Link Name"
msgstr ""
@@ -4456,472 +3779,752 @@ msgstr ""
msgid "Link text"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1391
-msgid "Public Hubs"
+#: ../../Zotlabs/Module/Ratings.php:70
+msgid "No ratings"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:27
-msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
+#: ../../Zotlabs/Module/Ratings.php:98
+msgid "Rating: "
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Hub URL"
+#: ../../Zotlabs/Module/Ratings.php:99
+msgid "Website: "
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Access Type"
+#: ../../Zotlabs/Module/Ratings.php:101
+msgid "Description: "
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Registration Policy"
+#: ../../Zotlabs/Module/Attach.php:13
+msgid "Item not available."
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Stats"
+#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
+#, php-format
+msgctxt "mood"
+msgid "%1$s is %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Software"
+#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:227
+msgid "Mood"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
-#: ../../include/conversation.php:958
-msgid "Ratings"
+#: ../../Zotlabs/Module/Mood.php:136
+msgid "Set your current mood and tell your friends"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:48
-msgid "Rate"
+#: ../../Zotlabs/Module/Notify.php:57
+#: ../../Zotlabs/Module/Notifications.php:35
+msgid "No more system notifications."
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Webpages.php:246
-#: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Layouts.php:197
-#: ../../Zotlabs/Module/Events.php:680 ../../include/page_widgets.php:42
-msgid "View"
+#: ../../Zotlabs/Module/Notify.php:61
+#: ../../Zotlabs/Module/Notifications.php:39
+msgid "System Notifications"
msgstr ""
-#: ../../Zotlabs/Module/Match.php:26
-msgid "Profile Match"
+#: ../../Zotlabs/Module/Photos.php:82
+msgid "Page owner information could not be retrieved."
msgstr ""
-#: ../../Zotlabs/Module/Match.php:35
-msgid "No keywords to match. Please add keywords to your default profile."
+#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:734
+#: ../../Zotlabs/Module/Profile_photo.php:115
+#: ../../Zotlabs/Module/Profile_photo.php:219
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:225
+#: ../../include/photo/photo_driver.php:728
+msgid "Profile Photos"
msgstr ""
-#: ../../Zotlabs/Module/Match.php:67
-msgid "is interested in:"
+#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
+msgid "Album not found."
msgstr ""
-#: ../../Zotlabs/Module/Match.php:68 ../../Zotlabs/Module/Directory.php:328
-#: ../../Zotlabs/Module/Suggest.php:56 ../../include/widgets.php:147
-#: ../../include/widgets.php:184 ../../include/connections.php:78
-#: ../../include/conversation.php:955 ../../include/channel.php:1036
-msgid "Connect"
+#: ../../Zotlabs/Module/Photos.php:112
+msgid "Delete Album"
msgstr ""
-#: ../../Zotlabs/Module/Match.php:74
-msgid "No matches"
+#: ../../Zotlabs/Module/Photos.php:133
+msgid ""
+"Multiple storage folders exist with this album name, but within different "
+"directories. Please remove the desired folder or folders using the Files "
+"manager"
msgstr ""
-#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
+#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1059
+msgid "Delete Photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:520
+msgid "No photos selected"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:569
+msgid "Access to this item is restricted."
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:608
#, php-format
-msgctxt "mood"
-msgid "%1$s is %2$s"
+msgid "%1$.2f MB of %2$.2f MB photo storage used."
msgstr ""
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:227
-msgid "Mood"
+#: ../../Zotlabs/Module/Photos.php:611
+#, php-format
+msgid "%1$.2f MB photo storage used."
msgstr ""
-#: ../../Zotlabs/Module/Mood.php:136
-msgid "Set your current mood and tell your friends"
+#: ../../Zotlabs/Module/Photos.php:647
+msgid "Upload Photos"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:651
+msgid "Enter an album name"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:652
+msgid "or select an existing album (doubleclick)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:653
+msgid "Create a status post for this upload"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:654
+msgid "Caption (optional):"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:655
+msgid "Description (optional):"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:686
+msgid "Album name could not be decoded"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:734
+msgid "Contact Photos"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:757
+msgid "Show Newest First"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:759
+msgid "Show Oldest First"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:783 ../../Zotlabs/Module/Photos.php:1337
+#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1748
+msgid "View Photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:814
+#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1765
+msgid "Edit Album"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:861
+msgid "Permission denied. Access to this item may be restricted."
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:863
+msgid "Photo not available"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:921
+msgid "Use as profile photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:922
+msgid "Use as cover photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:929
+msgid "Private Photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:940 ../../Zotlabs/Module/Cal.php:336
+#: ../../Zotlabs/Module/Cal.php:343 ../../Zotlabs/Module/Events.php:680
+#: ../../Zotlabs/Module/Events.php:689
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846
+msgid "Previous"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:944
+msgid "View Full Size"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:949 ../../Zotlabs/Module/Setup.php:264
+#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
+#: ../../Zotlabs/Module/Events.php:681 ../../Zotlabs/Module/Events.php:690
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847
+msgid "Next"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1033
+msgid "Edit photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1035
+msgid "Rotate CW (right)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1036
+msgid "Rotate CCW (left)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1039
+msgid "Move photo to album"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1040
+msgid "Enter a new album name"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1041
+msgid "or select an existing one (doubleclick)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1044
+msgid "Caption"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1046
+msgid "Add a Tag"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1054
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1057
+msgid "Flag as adult in album view"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1076 ../../Zotlabs/Lib/ThreadItem.php:268
+msgid "I like this (toggle)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1077 ../../Zotlabs/Lib/ThreadItem.php:269
+msgid "I don't like this (toggle)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1078 ../../Zotlabs/Module/Blocks.php:161
+#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Webpages.php:241
+#: ../../extend/addon/addon/cdav/include/widgets.php:123
+#: ../../include/conversation.php:1248
+msgid "Share"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1079 ../../Zotlabs/Lib/ThreadItem.php:409
+#: ../../include/conversation.php:757
+msgid "Please wait"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1095 ../../Zotlabs/Module/Photos.php:1213
+#: ../../Zotlabs/Lib/ThreadItem.php:726
+msgid "This is you"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1097 ../../Zotlabs/Module/Photos.php:1215
+#: ../../Zotlabs/Lib/ThreadItem.php:728 ../../include/js_strings.php:6
+msgid "Comment"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1099 ../../Zotlabs/Module/Webpages.php:247
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Lib/ThreadItem.php:738
+#: ../../include/page_widgets.php:43 ../../include/conversation.php:1217
+msgid "Preview"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:593
+msgctxt "title"
+msgid "Likes"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:593
+msgctxt "title"
+msgid "Dislikes"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:594
+msgctxt "title"
+msgid "Agree"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:594
+msgctxt "title"
+msgid "Disagree"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:594
+msgctxt "title"
+msgid "Abstain"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:595
+msgctxt "title"
+msgid "Attending"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:595
+msgctxt "title"
+msgid "Not attending"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:595
+msgctxt "title"
+msgid "Might attend"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1132 ../../Zotlabs/Module/Photos.php:1144
+#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
+#: ../../include/conversation.php:1783
+msgid "View all"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:190
+#: ../../include/channel.php:1190 ../../include/taxonomy.php:403
+#: ../../include/conversation.php:1807
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../Zotlabs/Module/Photos.php:1141 ../../Zotlabs/Lib/ThreadItem.php:195
+#: ../../include/conversation.php:1810
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../Zotlabs/Module/Photos.php:1241
+msgid "Photo Tools"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1250
+msgid "In This Photo:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1255
+msgid "Map"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1263 ../../Zotlabs/Lib/ThreadItem.php:398
+msgctxt "noun"
+msgid "Likes"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:399
+msgctxt "noun"
+msgid "Dislikes"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:182
+#: ../../Zotlabs/Module/Photos.php:1269 ../../Zotlabs/Lib/ThreadItem.php:404
+#: ../../include/acl_selectors.php:210
+msgid "Close"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1343
+msgid "View Album"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:1354 ../../Zotlabs/Module/Photos.php:1367
+#: ../../Zotlabs/Module/Photos.php:1368
+msgid "Recent Photos"
+msgstr ""
+
+#: ../../Zotlabs/Module/Setup.php:176
msgid "$Projectname Server - Setup"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:186
+#: ../../Zotlabs/Module/Setup.php:180
msgid "Could not connect to database."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:190
+#: ../../Zotlabs/Module/Setup.php:184
msgid ""
"Could not connect to specified site URL. Possible SSL certificate or DNS "
"issue."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:197
+#: ../../Zotlabs/Module/Setup.php:191
msgid "Could not create table."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:202
+#: ../../Zotlabs/Module/Setup.php:196
msgid "Your site database has been installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:206
+#: ../../Zotlabs/Module/Setup.php:200
msgid ""
"You may need to import the file \"install/schema_xxx.sql\" manually using a "
"database client."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:207 ../../Zotlabs/Module/Setup.php:269
-#: ../../Zotlabs/Module/Setup.php:740
+#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Setup.php:745
msgid "Please see the file \"install/INSTALL.txt\"."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:266
+#: ../../Zotlabs/Module/Setup.php:260
msgid "System check"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:270 ../../Zotlabs/Module/Events.php:676
-#: ../../Zotlabs/Module/Events.php:685 ../../Zotlabs/Module/Photos.php:949
-#: ../../Zotlabs/Module/Cal.php:333 ../../Zotlabs/Module/Cal.php:340
-msgid "Next"
-msgstr ""
-
-#: ../../Zotlabs/Module/Setup.php:271
+#: ../../Zotlabs/Module/Setup.php:265
msgid "Check again"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:293
+#: ../../Zotlabs/Module/Setup.php:287
msgid "Database connection"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:294
+#: ../../Zotlabs/Module/Setup.php:288
msgid ""
"In order to install $Projectname we need to know how to connect to your "
"database."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:295
+#: ../../Zotlabs/Module/Setup.php:289
msgid ""
"Please contact your hosting provider or site administrator if you have "
"questions about these settings."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:296
+#: ../../Zotlabs/Module/Setup.php:290
msgid ""
"The database you specify below should already exist. If it does not, please "
"create it before continuing."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:300
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Database Server Name"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:300
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Default is 127.0.0.1"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:301
+#: ../../Zotlabs/Module/Setup.php:295
msgid "Database Port"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:301
+#: ../../Zotlabs/Module/Setup.php:295
msgid "Communication port number - use 0 for default"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:302
+#: ../../Zotlabs/Module/Setup.php:296
msgid "Database Login Name"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:303
+#: ../../Zotlabs/Module/Setup.php:297
msgid "Database Login Password"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:304
+#: ../../Zotlabs/Module/Setup.php:298
msgid "Database Name"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:305
+#: ../../Zotlabs/Module/Setup.php:299
msgid "Database Type"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:307 ../../Zotlabs/Module/Setup.php:353
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
msgid "Site administrator email address"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:307 ../../Zotlabs/Module/Setup.php:353
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
msgid ""
"Your account email address must match this in order to use the web admin "
"panel."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:308 ../../Zotlabs/Module/Setup.php:355
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
msgid "Website URL"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:308 ../../Zotlabs/Module/Setup.php:355
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
msgid "Please use SSL (https) URL if available."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:359
+#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
msgid "Please select a default timezone for your website"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:342
+#: ../../Zotlabs/Module/Setup.php:336
msgid "Site settings"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:398
+#: ../../Zotlabs/Module/Setup.php:392
msgid "PHP version 5.5 or greater is required."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:399
+#: ../../Zotlabs/Module/Setup.php:393
msgid "PHP version"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:414
+#: ../../Zotlabs/Module/Setup.php:409
msgid "Could not find a command line version of PHP in the web server PATH."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:415
+#: ../../Zotlabs/Module/Setup.php:410
msgid ""
"If you don't have a command line version of PHP installed on server, you "
"will not be able to run background polling via cron."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:419
+#: ../../Zotlabs/Module/Setup.php:414
msgid "PHP executable path"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:419
+#: ../../Zotlabs/Module/Setup.php:414
msgid ""
"Enter full path to php executable. You can leave this blank to continue the "
"installation."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:424
+#: ../../Zotlabs/Module/Setup.php:419
msgid "Command line PHP"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:433
+#: ../../Zotlabs/Module/Setup.php:429
+msgid ""
+"Unable to check command line PHP, as shell_exec() is disabled. This is "
+"required."
+msgstr ""
+
+#: ../../Zotlabs/Module/Setup.php:432
msgid ""
"The command line version of PHP on your system does not have "
"\"register_argc_argv\" enabled."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:434
+#: ../../Zotlabs/Module/Setup.php:433
msgid "This is required for message delivery to work."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:437
+#: ../../Zotlabs/Module/Setup.php:436
msgid "PHP register_argc_argv"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:455
+#: ../../Zotlabs/Module/Setup.php:454
#, php-format
msgid ""
"Your max allowed total upload size is set to %s. Maximum size of one file to "
"upload is set to %s. You are allowed to upload up to %d files at once."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:460
-msgid "You can adjust these settings in the servers php.ini."
+#: ../../Zotlabs/Module/Setup.php:459
+msgid "You can adjust these settings in the server php.ini file."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:462
+#: ../../Zotlabs/Module/Setup.php:461
msgid "PHP upload limits"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:485
+#: ../../Zotlabs/Module/Setup.php:484
msgid ""
"Error: the \"openssl_pkey_new\" function on this system is not able to "
"generate encryption keys"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:486
+#: ../../Zotlabs/Module/Setup.php:485
msgid ""
"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
"installation.php\"."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:489
+#: ../../Zotlabs/Module/Setup.php:488
msgid "Generate encryption keys"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:501
+#: ../../Zotlabs/Module/Setup.php:500
msgid "libCurl PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:502
+#: ../../Zotlabs/Module/Setup.php:501
msgid "GD graphics PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:503
+#: ../../Zotlabs/Module/Setup.php:502
msgid "OpenSSL PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:504
-msgid "mysqli or postgres PHP module"
+#: ../../Zotlabs/Module/Setup.php:503
+msgid "PDO database PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:505
+#: ../../Zotlabs/Module/Setup.php:504
msgid "mb_string PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:506
+#: ../../Zotlabs/Module/Setup.php:505
msgid "xml PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:510 ../../Zotlabs/Module/Setup.php:512
+#: ../../Zotlabs/Module/Setup.php:509 ../../Zotlabs/Module/Setup.php:511
msgid "Apache mod_rewrite module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:510
+#: ../../Zotlabs/Module/Setup.php:509
msgid ""
"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:516 ../../Zotlabs/Module/Setup.php:519
-msgid "proc_open"
+#: ../../Zotlabs/Module/Setup.php:515 ../../Zotlabs/Module/Setup.php:518
+msgid "exec"
+msgstr ""
+
+#: ../../Zotlabs/Module/Setup.php:515
+msgid ""
+"Error: exec is required but is either not installed or has been disabled in "
+"php.ini"
+msgstr ""
+
+#: ../../Zotlabs/Module/Setup.php:521 ../../Zotlabs/Module/Setup.php:524
+msgid "shell_exec"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:516
+#: ../../Zotlabs/Module/Setup.php:521
msgid ""
-"Error: proc_open is required but is either not installed or has been "
+"Error: shell_exec is required but is either not installed or has been "
"disabled in php.ini"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:524
+#: ../../Zotlabs/Module/Setup.php:529
msgid "Error: libCURL PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:528
+#: ../../Zotlabs/Module/Setup.php:533
msgid ""
"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:532
+#: ../../Zotlabs/Module/Setup.php:537
msgid "Error: openssl PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:536
-msgid ""
-"Error: mysqli or postgres PHP module required but neither are installed."
+#: ../../Zotlabs/Module/Setup.php:541
+msgid "Error: PDO database PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:540
+#: ../../Zotlabs/Module/Setup.php:545
msgid "Error: mb_string PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:544
+#: ../../Zotlabs/Module/Setup.php:549
msgid "Error: xml PHP module required for DAV but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:562
+#: ../../Zotlabs/Module/Setup.php:567
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 ""
-#: ../../Zotlabs/Module/Setup.php:563
+#: ../../Zotlabs/Module/Setup.php:568
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 ""
-#: ../../Zotlabs/Module/Setup.php:564
+#: ../../Zotlabs/Module/Setup.php:569
msgid ""
"At the end of this procedure, we will give you a text to save in a file "
"named .htconfig.php in your Red top folder."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:565
+#: ../../Zotlabs/Module/Setup.php:570
msgid ""
"You can alternatively skip this procedure and perform a manual installation. "
"Please see the file \"install/INSTALL.txt\" for instructions."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:568
+#: ../../Zotlabs/Module/Setup.php:573
msgid ".htconfig.php is writable"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:582
+#: ../../Zotlabs/Module/Setup.php:587
msgid ""
-"Red uses the Smarty3 template engine to render its web views. Smarty3 "
-"compiles templates to PHP to speed up rendering."
+"This software uses the Smarty3 template engine to render its web views. "
+"Smarty3 compiles templates to PHP to speed up rendering."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:583
+#: ../../Zotlabs/Module/Setup.php:588
#, php-format
msgid ""
"In order to store these compiled templates, the web server needs to have "
"write access to the directory %s under the top level web folder."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:584 ../../Zotlabs/Module/Setup.php:605
+#: ../../Zotlabs/Module/Setup.php:589 ../../Zotlabs/Module/Setup.php:610
msgid ""
"Please ensure that the user that your web server runs as (e.g. www-data) has "
"write access to this folder."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:585
+#: ../../Zotlabs/Module/Setup.php:590
#, php-format
msgid ""
"Note: as a security measure, you should give the web server write access to "
"%s only--not the template files (.tpl) that it contains."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:588
+#: ../../Zotlabs/Module/Setup.php:593
#, php-format
msgid "%s is writable"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:604
+#: ../../Zotlabs/Module/Setup.php:609
msgid ""
"This software uses the store directory to save uploaded files. The web "
-"server needs to have write access to the store directory under the Red top "
-"level folder"
+"server needs to have write access to the store directory under the top level "
+"web folder"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:608
+#: ../../Zotlabs/Module/Setup.php:613
msgid "store is writable"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:641
+#: ../../Zotlabs/Module/Setup.php:646
msgid ""
"SSL certificate cannot be validated. Fix certificate or disable https access "
"to this site."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:642
+#: ../../Zotlabs/Module/Setup.php:647
msgid ""
"If you have https access to your website or allow connections to TCP port "
"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
"NOT use self-signed certificates!"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:643
+#: ../../Zotlabs/Module/Setup.php:648
msgid ""
"This restriction is incorporated because public posts from you may for "
"example contain references to images on your own hub."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:644
+#: ../../Zotlabs/Module/Setup.php:649
msgid ""
"If your certificate is not recognized, members of other sites (who may "
"themselves have valid certificates) will get a warning message on their own "
"site complaining about security issues."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:645
+#: ../../Zotlabs/Module/Setup.php:650
msgid ""
"This can cause usability issues elsewhere (not just on your own site) so we "
"must insist on this requirement."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:646
+#: ../../Zotlabs/Module/Setup.php:651
msgid ""
"Providers are available that issue free certificates which are browser-valid."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:648
+#: ../../Zotlabs/Module/Setup.php:653
msgid ""
"If you are confident that the certificate is valid and signed by a trusted "
"authority, check to see if you have failed to install an intermediate cert. "
@@ -4929,401 +4532,377 @@ msgid ""
"server communications."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:650
+#: ../../Zotlabs/Module/Setup.php:655
msgid "SSL certificate validation"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:656
+#: ../../Zotlabs/Module/Setup.php:661
msgid ""
"Url rewrite in .htaccess is not working. Check your server configuration."
"Test: "
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:659
+#: ../../Zotlabs/Module/Setup.php:664
msgid "Url rewrite is working"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:673
+#: ../../Zotlabs/Module/Setup.php:678
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 ""
-#: ../../Zotlabs/Module/Setup.php:697
+#: ../../Zotlabs/Module/Setup.php:702
+#: ../../extend/addon/addon/cdav/cdav.php:41
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:352
msgid "Errors encountered creating database tables."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:738
+#: ../../Zotlabs/Module/Setup.php:743
msgid "<h1>What next</h1>"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:739
+#: ../../Zotlabs/Module/Setup.php:744
msgid ""
"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
msgstr ""
-#: ../../Zotlabs/Module/Notify.php:57
-#: ../../Zotlabs/Module/Notifications.php:35
-msgid "No more system notifications."
-msgstr ""
-
-#: ../../Zotlabs/Module/Notify.php:61
-#: ../../Zotlabs/Module/Notifications.php:39
-msgid "System Notifications"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
-msgid "Continue"
+#: ../../Zotlabs/Module/Editpost.php:35
+msgid "Item is not editable"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:90
-msgid "Premium Channel Setup"
+#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
+msgid "This site is not a directory server"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:92
-msgid "Enable premium channel connection restrictions"
+#: ../../Zotlabs/Module/New_channel.php:140
+msgid "Create Channel"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:93
+#: ../../Zotlabs/Module/New_channel.php:141
msgid ""
-"Please enter your restrictions or conditions, such as paypal receipt, usage "
-"guidelines, etc."
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
+#: ../../Zotlabs/Module/New_channel.php:142
msgid ""
-"This channel may require additional steps or acknowledgement of the "
-"following conditions prior to connecting:"
+"or <a href=\"import\">import an existing channel</a> from another location."
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:96
-msgid ""
-"Potential connections will then see the following text before proceeding:"
+#: ../../Zotlabs/Module/Notifications.php:40 ../../include/nav.php:194
+msgid "Mark all system notifications seen"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
-msgid ""
-"By continuing, I certify that I have complied with any instructions provided "
-"on this page."
+#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:228
+#: ../../include/conversation.php:975
+msgid "Poke"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:106
-msgid "(No specific instructions have been provided by the channel owner.)"
+#: ../../Zotlabs/Module/Poke.php:169
+msgid "Poke somebody"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:114
-msgid "Restricted or Premium Channel"
+#: ../../Zotlabs/Module/Poke.php:172
+msgid "Poke/Prod"
msgstr ""
-#: ../../Zotlabs/Module/Follow.php:31
-msgid "Channel added."
+#: ../../Zotlabs/Module/Poke.php:173
+msgid "Poke, prod or do other things to somebody"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:45
-msgid "Invalid message"
+#: ../../Zotlabs/Module/Poke.php:180
+msgid "Recipient"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:78
-msgid "no results"
+#: ../../Zotlabs/Module/Poke.php:181
+msgid "Choose what you wish to do to recipient"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:93
-msgid "channel sync processed"
+#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+msgid "Make this post private"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:97
-msgid "queued"
+#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:183
+#: ../../Zotlabs/Module/Profiles.php:240 ../../Zotlabs/Module/Profiles.php:619
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62
+msgid "Profile not found."
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:101
-msgid "posted"
+#: ../../Zotlabs/Module/Profiles.php:44
+msgid "Profile deleted."
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:105
-msgid "accepted for delivery"
+#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:104
+msgid "Profile-"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:109
-msgid "updated"
+#: ../../Zotlabs/Module/Profiles.php:89 ../../Zotlabs/Module/Profiles.php:126
+msgid "New profile created."
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:112
-msgid "update ignored"
+#: ../../Zotlabs/Module/Profiles.php:110
+msgid "Profile unavailable to clone."
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:115
-msgid "permission denied"
+#: ../../Zotlabs/Module/Profiles.php:145
+msgid "Profile unavailable to export."
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:119
-msgid "recipient not found"
+#: ../../Zotlabs/Module/Profiles.php:250
+msgid "Profile Name is required."
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:122
-msgid "mail recalled"
+#: ../../Zotlabs/Module/Profiles.php:421
+msgid "Marital Status"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:125
-msgid "duplicate mail received"
+#: ../../Zotlabs/Module/Profiles.php:425
+msgid "Romantic Partner"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:128
-msgid "mail delivered"
+#: ../../Zotlabs/Module/Profiles.php:429 ../../Zotlabs/Module/Profiles.php:730
+msgid "Likes"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:148
-#, php-format
-msgid "Delivery report for %1$s"
+#: ../../Zotlabs/Module/Profiles.php:433 ../../Zotlabs/Module/Profiles.php:731
+msgid "Dislikes"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:151
-msgid "Options"
+#: ../../Zotlabs/Module/Profiles.php:437 ../../Zotlabs/Module/Profiles.php:738
+msgid "Work/Employment"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:152
-msgid "Redeliver"
+#: ../../Zotlabs/Module/Profiles.php:440
+msgid "Religion"
msgstr ""
-#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
-#: ../../Zotlabs/Module/Blocks.php:155
-msgid "Block Name"
+#: ../../Zotlabs/Module/Profiles.php:444
+msgid "Political Views"
msgstr ""
-#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1260
-msgid "Title (optional)"
+#: ../../Zotlabs/Module/Profiles.php:448
+#: ../../extend/addon/addon/openid/MysqlProvider.php:74
+msgid "Gender"
msgstr ""
-#: ../../Zotlabs/Module/Editblock.php:133
-msgid "Edit Block"
+#: ../../Zotlabs/Module/Profiles.php:452
+msgid "Sexual Preference"
msgstr ""
-#: ../../Zotlabs/Module/New_channel.php:140
-msgid "Create Channel"
+#: ../../Zotlabs/Module/Profiles.php:456
+msgid "Homepage"
msgstr ""
-#: ../../Zotlabs/Module/New_channel.php:141
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
+#: ../../Zotlabs/Module/Profiles.php:460
+msgid "Interests"
msgstr ""
-#: ../../Zotlabs/Module/New_channel.php:142
-msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
+#: ../../Zotlabs/Module/Profiles.php:554
+msgid "Profile updated."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:19
-msgid "No valid account found."
+#: ../../Zotlabs/Module/Profiles.php:638
+msgid "Hide your connections list from viewers of this profile"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:33
-msgid "Password reset request issued. Check your email."
+#: ../../Zotlabs/Module/Profiles.php:680
+msgid "Edit Profile Details"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
-#, php-format
-msgid "Site Member (%s)"
+#: ../../Zotlabs/Module/Profiles.php:682
+msgid "View this profile"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
-#, php-format
-msgid "Password reset requested at %s"
+#: ../../Zotlabs/Module/Profiles.php:683 ../../Zotlabs/Module/Profiles.php:765
+#: ../../include/channel.php:983
+msgid "Edit visibility"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:68
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
+#: ../../Zotlabs/Module/Profiles.php:684
+msgid "Profile Tools"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1747
-msgid "Password Reset"
+#: ../../Zotlabs/Module/Profiles.php:685
+msgid "Change cover photo"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:92
-msgid "Your password has been reset as requested."
+#: ../../Zotlabs/Module/Profiles.php:686 ../../include/channel.php:954
+msgid "Change profile photo"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:93
-msgid "Your new password is"
+#: ../../Zotlabs/Module/Profiles.php:687
+msgid "Create a new profile using these settings"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:94
-msgid "Save or copy your new password - and then"
+#: ../../Zotlabs/Module/Profiles.php:688
+msgid "Clone this profile"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:95
-msgid "click here to login"
+#: ../../Zotlabs/Module/Profiles.php:689
+msgid "Delete this profile"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:96
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
+#: ../../Zotlabs/Module/Profiles.php:690
+msgid "Add profile things"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:117
-#, php-format
-msgid "Your password has changed at %s"
+#: ../../Zotlabs/Module/Profiles.php:691 ../../include/widgets.php:105
+#: ../../include/conversation.php:1585
+msgid "Personal"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:130
-msgid "Forgot your Password?"
+#: ../../Zotlabs/Module/Profiles.php:693
+msgid "Relation"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:131
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
+#: ../../Zotlabs/Module/Profiles.php:694 ../../include/datetime.php:55
+msgid "Miscellaneous"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:132
-msgid "Email Address"
+#: ../../Zotlabs/Module/Profiles.php:696
+msgid "Import profile from file"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:133
-msgid "Reset"
+#: ../../Zotlabs/Module/Profiles.php:697
+msgid "Export profile to file"
msgstr ""
-#: ../../Zotlabs/Module/Notifications.php:40 ../../include/nav.php:196
-msgid "Mark all system notifications seen"
+#: ../../Zotlabs/Module/Profiles.php:698
+msgid "Your gender"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:228
-#: ../../include/conversation.php:959
-msgid "Poke"
+#: ../../Zotlabs/Module/Profiles.php:699
+msgid "Marital status"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:169
-msgid "Poke somebody"
+#: ../../Zotlabs/Module/Profiles.php:700
+msgid "Sexual preference"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:172
-msgid "Poke/Prod"
+#: ../../Zotlabs/Module/Profiles.php:703
+msgid "Profile name"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:173
-msgid "Poke, prod or do other things to somebody"
+#: ../../Zotlabs/Module/Profiles.php:705
+msgid "This is your default profile."
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:180
-msgid "Recipient"
+#: ../../Zotlabs/Module/Profiles.php:707
+msgid "Your full name"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:181
-msgid "Choose what you wish to do to recipient"
+#: ../../Zotlabs/Module/Profiles.php:708
+msgid "Title/Description"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
-msgid "Make this post private"
+#: ../../Zotlabs/Module/Profiles.php:711
+msgid "Street address"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:245
-#, php-format
-msgid "%d rating"
-msgid_plural "%d ratings"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../Zotlabs/Module/Profiles.php:712
+msgid "Locality/City"
+msgstr ""
-#: ../../Zotlabs/Module/Directory.php:256
-msgid "Gender: "
+#: ../../Zotlabs/Module/Profiles.php:713
+msgid "Region/State"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:258
-msgid "Status: "
+#: ../../Zotlabs/Module/Profiles.php:714
+msgid "Postal/Zip code"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:260
-msgid "Homepage: "
+#: ../../Zotlabs/Module/Profiles.php:715
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161
+msgid "Country"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1215
-msgid "Age:"
+#: ../../Zotlabs/Module/Profiles.php:720
+msgid "Who (if applicable)"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:314 ../../include/bb2diaspora.php:513
-#: ../../include/event.php:52 ../../include/event.php:84
-#: ../../include/channel.php:1051
-msgid "Location:"
+#: ../../Zotlabs/Module/Profiles.php:720
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:320
-msgid "Description:"
+#: ../../Zotlabs/Module/Profiles.php:721
+msgid "Since (date)"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1231
-msgid "Hometown:"
+#: ../../Zotlabs/Module/Profiles.php:724
+msgid "Tell us about yourself"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1239
-msgid "About:"
+#: ../../Zotlabs/Module/Profiles.php:725
+#: ../../extend/addon/addon/openid/MysqlProvider.php:68
+msgid "Homepage URL"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:329
-msgid "Public Forum:"
+#: ../../Zotlabs/Module/Profiles.php:726
+msgid "Hometown"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:332
-msgid "Keywords: "
+#: ../../Zotlabs/Module/Profiles.php:727
+msgid "Political views"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:335
-msgid "Don't suggest"
+#: ../../Zotlabs/Module/Profiles.php:728
+msgid "Religious views"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:337
-msgid "Common connections:"
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Keywords used in directory listings"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:386
-msgid "Global Directory"
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Example: fishing photography software"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:386
-msgid "Local Directory"
+#: ../../Zotlabs/Module/Profiles.php:732
+msgid "Musical interests"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:392
-msgid "Finding:"
+#: ../../Zotlabs/Module/Profiles.php:733
+msgid "Books, literature"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:64
-#: ../../include/contact_widgets.php:24
-msgid "Channel Suggestions"
+#: ../../Zotlabs/Module/Profiles.php:734
+msgid "Television"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:397
-msgid "next page"
+#: ../../Zotlabs/Module/Profiles.php:735
+msgid "Film/Dance/Culture/Entertainment"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:397
-msgid "previous page"
+#: ../../Zotlabs/Module/Profiles.php:736
+msgid "Hobbies/Interests"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:398
-msgid "Sort options"
+#: ../../Zotlabs/Module/Profiles.php:737
+msgid "Love/Romance"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:399
-msgid "Alphabetic"
+#: ../../Zotlabs/Module/Profiles.php:739
+msgid "School/Education"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:400
-msgid "Reverse Alphabetic"
+#: ../../Zotlabs/Module/Profiles.php:740
+msgid "Contact information and social networks"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:401
-msgid "Newest to Oldest"
+#: ../../Zotlabs/Module/Profiles.php:741
+msgid "My other channels"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:402
-msgid "Oldest to Newest"
+#: ../../Zotlabs/Module/Profiles.php:761 ../../include/channel.php:979
+msgid "Profile Image"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:419
-msgid "No entries (some entries may be hidden)."
+#: ../../Zotlabs/Module/Profiles.php:771 ../../include/channel.php:961
+#: ../../include/nav.php:91
+msgid "Edit Profiles"
msgstr ""
#: ../../Zotlabs/Module/Oexchange.php:27
@@ -5334,71 +4913,6 @@ msgstr ""
msgid "Post successful."
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:52
-msgid "Import Webpage Elements"
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:53
-msgid "Import selected"
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:76
-msgid "Export Webpage Elements"
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:77
-msgid "Export selected"
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:218
-#: ../../include/nav.php:109 ../../include/conversation.php:1725
-msgid "Webpages"
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:241 ../../Zotlabs/Module/Blocks.php:161
-#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Photos.php:1078
-#: ../../include/conversation.php:1232
-msgid "Share"
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Module/Events.php:473
-#: ../../Zotlabs/Module/Photos.php:1099 ../../Zotlabs/Lib/ThreadItem.php:734
-#: ../../include/page_widgets.php:43 ../../include/conversation.php:1201
-msgid "Preview"
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:248 ../../include/page_widgets.php:44
-msgid "Actions"
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:249 ../../include/page_widgets.php:45
-msgid "Page Link"
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:250
-msgid "Page Title"
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:280
-msgid "Invalid file type."
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:292
-msgid "Error opening zip file"
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:303
-msgid "Invalid folder path."
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:330
-msgid "No webpage elements detected."
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:405
-msgid "Import complete."
-msgstr ""
-
#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
msgid "This setting requires special processing and editing has been blocked."
msgstr ""
@@ -5414,65 +4928,7 @@ msgid ""
"to correctly use this feature."
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:19
-#, php-format
-msgid "Version %s"
-msgstr ""
-
-#: ../../Zotlabs/Module/Siteinfo.php:34
-msgid "Installed plugins/addons/apps:"
-msgstr ""
-
-#: ../../Zotlabs/Module/Siteinfo.php:36
-msgid "No installed plugins/addons/apps"
-msgstr ""
-
-#: ../../Zotlabs/Module/Siteinfo.php:49
-msgid ""
-"This is a hub of $Projectname - a global cooperative network of "
-"decentralized privacy enhanced websites."
-msgstr ""
-
-#: ../../Zotlabs/Module/Siteinfo.php:51
-msgid "Tag: "
-msgstr ""
-
-#: ../../Zotlabs/Module/Siteinfo.php:53
-msgid "Last background fetch: "
-msgstr ""
-
-#: ../../Zotlabs/Module/Siteinfo.php:55
-msgid "Current load average: "
-msgstr ""
-
-#: ../../Zotlabs/Module/Siteinfo.php:58
-msgid "Running at web location"
-msgstr ""
-
-#: ../../Zotlabs/Module/Siteinfo.php:59
-msgid ""
-"Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more "
-"about $Projectname."
-msgstr ""
-
-#: ../../Zotlabs/Module/Siteinfo.php:60
-msgid "Bug reports and issues: please visit"
-msgstr ""
-
-#: ../../Zotlabs/Module/Siteinfo.php:62
-msgid "$projectname issues"
-msgstr ""
-
-#: ../../Zotlabs/Module/Siteinfo.php:63
-msgid ""
-"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"
-msgstr ""
-
-#: ../../Zotlabs/Module/Siteinfo.php:65
-msgid "Site Administrators"
-msgstr ""
-
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2311
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2270
msgid "Blocks"
msgstr ""
@@ -5480,13 +4936,13 @@ msgstr ""
msgid "Block Title"
msgstr ""
-#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2313
+#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2272
msgid "Layouts"
msgstr ""
#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:225
-#: ../../include/nav.php:164 ../../include/help.php:53
-#: ../../include/help.php:58
+#: ../../include/nav.php:162 ../../include/help.php:53
+#: ../../include/help.php:59
msgid "Help"
msgstr ""
@@ -5502,290 +4958,318 @@ msgstr ""
msgid "Download PDL file"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:115
-#: ../../Zotlabs/Module/Profile_photo.php:212
-#: ../../Zotlabs/Module/Profile_photo.php:311
-#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:734
-#: ../../include/photo/photo_driver.php:728
-msgid "Profile Photos"
+#: ../../Zotlabs/Module/Rate.php:156
+msgid "Website:"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:186
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
+#: ../../Zotlabs/Module/Rate.php:159
+#, php-format
+msgid "Remote Channel [%s] (not yet known on this site)"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:389
-msgid "Upload Profile Photo"
+#: ../../Zotlabs/Module/Rate.php:160
+msgid "Rating (this information is public)"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:25
-msgid "Calendar entries imported."
+#: ../../Zotlabs/Module/Rate.php:161
+msgid "Optionally explain your rating (this information is public)"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:27
-msgid "No calendar entries found."
+#: ../../Zotlabs/Module/Like.php:19
+msgid "Like/Dislike"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:104
-msgid "Event can not end before it has started."
+#: ../../Zotlabs/Module/Like.php:24
+msgid "This action is restricted to members."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:106 ../../Zotlabs/Module/Events.php:115
-#: ../../Zotlabs/Module/Events.php:135
-msgid "Unable to generate preview."
+#: ../../Zotlabs/Module/Like.php:25
+msgid ""
+"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a href="
+"\"register\">register as a new $Projectname member</a> to continue."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:113
-msgid "Event title and start time are required."
+#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
+#: ../../Zotlabs/Module/Like.php:169
+msgid "Invalid request."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:133 ../../Zotlabs/Module/Events.php:258
-msgid "Event not found."
+#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
+msgid "channel"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:452
-msgid "Edit event title"
+#: ../../Zotlabs/Module/Like.php:146
+msgid "thing"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:452
-msgid "Event title"
+#: ../../Zotlabs/Module/Like.php:192
+msgid "Channel unavailable."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:454
-msgid "Categories (comma-separated list)"
+#: ../../Zotlabs/Module/Like.php:240
+msgid "Previous action reversed."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:455
-msgid "Edit Category"
+#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
+#: ../../Zotlabs/Module/Tagger.php:47
+#: ../../extend/addon/addon/diaspora/inbound.php:1792
+#: ../../extend/addon/addon/redphotos/redphotohelper.php:74
+#: ../../include/text.php:1940 ../../include/conversation.php:120
+msgid "photo"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:455
-msgid "Category"
+#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
+#: ../../extend/addon/addon/diaspora/inbound.php:1792
+#: ../../include/text.php:1946 ../../include/conversation.php:148
+msgid "status"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:458
-msgid "Edit start date and time"
+#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Tagger.php:51
+#: ../../Zotlabs/Module/Events.php:256 ../../include/text.php:1943
+#: ../../include/event.php:961 ../../include/conversation.php:123
+msgid "event"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:458
-msgid "Start date and time"
+#: ../../Zotlabs/Module/Like.php:419
+#: ../../extend/addon/addon/diaspora/inbound.php:1821
+#: ../../include/conversation.php:164
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:459 ../../Zotlabs/Module/Events.php:462
-msgid "Finish date and time are not known or not relevant"
+#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:461
-msgid "Edit finish date and time"
+#: ../../Zotlabs/Module/Like.php:423
+#, php-format
+msgid "%1$s agrees with %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:461
-msgid "Finish date and time"
+#: ../../Zotlabs/Module/Like.php:425
+#, php-format
+msgid "%1$s doesn't agree with %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
-msgid "Adjust for viewer timezone"
+#: ../../Zotlabs/Module/Like.php:427
+#, php-format
+msgid "%1$s abstains from a decision on %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:463
-msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
+#: ../../Zotlabs/Module/Like.php:429
+#, php-format
+msgid "%1$s is attending %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:465
-msgid "Edit Description"
+#: ../../Zotlabs/Module/Like.php:431
+#, php-format
+msgid "%1$s is not attending %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:467
-msgid "Edit Location"
+#: ../../Zotlabs/Module/Like.php:433
+#, php-format
+msgid "%1$s may attend %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:472
-msgid "Share this event"
+#: ../../Zotlabs/Module/Like.php:538
+msgid "Action completed."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:474 ../../include/conversation.php:1264
-msgid "Permission settings"
+#: ../../Zotlabs/Module/Like.php:539
+msgid "Thank you."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:485
-msgid "Advanced Options"
+#: ../../Zotlabs/Module/Profile_photo.php:186
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:293
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:597 ../../Zotlabs/Module/Cal.php:259
-msgid "l, F j"
+#: ../../Zotlabs/Module/Profile_photo.php:409
+msgid "Use Photo for Profile"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:619
-msgid "Edit event"
+#: ../../Zotlabs/Module/Profile_photo.php:409
+msgid "Upload Profile Photo"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:621
-msgid "Delete event"
+#: ../../Zotlabs/Module/Profile_photo.php:410
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:181
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:193
+msgid "Use"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:646 ../../Zotlabs/Module/Cal.php:308
-#: ../../include/text.php:1792
-msgid "Link to Source"
+#: ../../Zotlabs/Module/Search.php:223
+#, php-format
+msgid "Items tagged with: %s"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:655
-msgid "calendar"
+#: ../../Zotlabs/Module/Search.php:225
+#, php-format
+msgid "Search results for: %s"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:674 ../../Zotlabs/Module/Cal.php:331
-msgid "Edit Event"
+#: ../../Zotlabs/Module/Common.php:14
+msgid "No channel."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:674 ../../Zotlabs/Module/Cal.php:331
-msgid "Create Event"
+#: ../../Zotlabs/Module/Common.php:43
+msgid "Common connections"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:675 ../../Zotlabs/Module/Events.php:684
-#: ../../Zotlabs/Module/Photos.php:940 ../../Zotlabs/Module/Cal.php:332
-#: ../../Zotlabs/Module/Cal.php:339
-msgid "Previous"
+#: ../../Zotlabs/Module/Common.php:48
+msgid "No connections in common."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:677 ../../Zotlabs/Module/Cal.php:334
-msgid "Export"
+#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
+msgid "Authorize application connection"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:681
-msgid "Month"
+#: ../../Zotlabs/Module/Api.php:73
+msgid "Return to your app and insert this Security Code:"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:682
-msgid "Week"
+#: ../../Zotlabs/Module/Api.php:83
+msgid "Please login to continue."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:683
-msgid "Day"
+#: ../../Zotlabs/Module/Api.php:95
+msgid ""
+"Do you want to authorize this application to access your posts and contacts, "
+"and/or create new posts for you?"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:686 ../../Zotlabs/Module/Cal.php:341
-msgid "Today"
+#: ../../Zotlabs/Module/Ping.php:254
+msgid "sent you a private message"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:717
-msgid "Event removed"
+#: ../../Zotlabs/Module/Ping.php:302
+msgid "added your channel"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:720
-msgid "Failed to remove event"
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "g A l F d"
msgstr ""
-#: ../../Zotlabs/Module/Common.php:14
-msgid "No channel."
+#: ../../Zotlabs/Module/Ping.php:330
+msgid "[today]"
msgstr ""
-#: ../../Zotlabs/Module/Common.php:43
-msgid "Common connections"
+#: ../../Zotlabs/Module/Ping.php:339
+msgid "posted an event"
msgstr ""
-#: ../../Zotlabs/Module/Common.php:48
-msgid "No connections in common."
+#: ../../Zotlabs/Module/Siteinfo.php:20
+msgid "About this site"
msgstr ""
-#: ../../Zotlabs/Module/Api.php:60 ../../Zotlabs/Module/Api.php:81
-msgid "Authorize application connection"
+#: ../../Zotlabs/Module/Siteinfo.php:21
+msgid "Site Name"
msgstr ""
-#: ../../Zotlabs/Module/Api.php:61
-msgid "Return to your app and insert this Security Code:"
+#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1962
+msgid "Administrator"
msgstr ""
-#: ../../Zotlabs/Module/Api.php:71
-msgid "Please login to continue."
+#: ../../Zotlabs/Module/Siteinfo.php:28
+msgid "Software and Project information"
msgstr ""
-#: ../../Zotlabs/Module/Api.php:83
+#: ../../Zotlabs/Module/Siteinfo.php:29
+msgid "This site is powered by $Projectname"
+msgstr ""
+
+#: ../../Zotlabs/Module/Siteinfo.php:30
msgid ""
-"Do you want to authorize this application to access your posts and contacts, "
-"and/or create new posts for you?"
+"Federated and decentralised networking and identity services provided by Zot"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:33
+#: ../../Zotlabs/Module/Siteinfo.php:32
#, php-format
-msgid "Your service plan only allows %d channels."
+msgid "Version %s"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:157 ../../include/import.php:100
-msgid "Cloned channel not found. Import failed."
+#: ../../Zotlabs/Module/Siteinfo.php:33
+msgid "Project homepage"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:167
-msgid "No channel. Import failed."
+#: ../../Zotlabs/Module/Siteinfo.php:34
+msgid "Developer homepage"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:503
-#: ../../include/Import/import_diaspora.php:142
-msgid "Import completed."
+#: ../../Zotlabs/Module/Lostpass.php:19
+msgid "No valid account found."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:525
-msgid "You must be logged in to use this feature."
+#: ../../Zotlabs/Module/Lostpass.php:33
+msgid "Password reset request issued. Check your email."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:530
-msgid "Import Channel"
+#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
+#, php-format
+msgid "Site Member (%s)"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:531
+#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
+#, php-format
+msgid "Password reset requested at %s"
+msgstr ""
+
+#: ../../Zotlabs/Module/Lostpass.php:68
msgid ""
-"Use this form to import an existing channel from a different server/hub. You "
-"may retrieve the channel identity from the old server/hub via the network or "
-"provide an export file."
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:533
-msgid "Or provide the old server/hub details"
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1727
+msgid "Password Reset"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:534
-msgid "Your old identity address (xyz@example.com)"
+#: ../../Zotlabs/Module/Lostpass.php:92
+msgid "Your password has been reset as requested."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:535
-msgid "Your old login email address"
+#: ../../Zotlabs/Module/Lostpass.php:93
+msgid "Your new password is"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:536
-msgid "Your old login password"
+#: ../../Zotlabs/Module/Lostpass.php:94
+msgid "Save or copy your new password - and then"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:537
+#: ../../Zotlabs/Module/Lostpass.php:95
+msgid "click here to login"
+msgstr ""
+
+#: ../../Zotlabs/Module/Lostpass.php:96
msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be "
-"able to post from either location, but only one can be marked as the primary "
-"location for files, photos, and media."
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:538
-msgid "Make this hub my primary location"
+#: ../../Zotlabs/Module/Lostpass.php:117
+#, php-format
+msgid "Your password has changed at %s"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:539
-msgid ""
-"Import existing posts if possible (experimental - limited by available memory"
+#: ../../Zotlabs/Module/Lostpass.php:130
+msgid "Forgot your Password?"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:540
+#: ../../Zotlabs/Module/Lostpass.php:131
msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
msgstr ""
-#: ../../Zotlabs/Module/Lockview.php:75
-msgid "Remote privacy information not available."
+#: ../../Zotlabs/Module/Lostpass.php:132
+msgid "Email Address"
msgstr ""
-#: ../../Zotlabs/Module/Lockview.php:96
-msgid "Visible to:"
+#: ../../Zotlabs/Module/Lostpass.php:133
+msgid "Reset"
msgstr ""
#: ../../Zotlabs/Module/Rbmark.php:94
@@ -5804,6 +5288,10 @@ msgstr ""
msgid "Or enter new bookmark folder name"
msgstr ""
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
+msgstr ""
+
#: ../../Zotlabs/Module/Rmagic.php:35
msgid "Authentication failed."
msgstr ""
@@ -5835,11 +5323,26 @@ msgid "Remove This Account"
msgstr ""
#: ../../Zotlabs/Module/Removeaccount.php:58
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "WARNING: "
+msgstr ""
+
+#: ../../Zotlabs/Module/Removeaccount.php:58
msgid ""
"This account and all its channels will be completely removed from the "
"network. "
msgstr ""
+#: ../../Zotlabs/Module/Removeaccount.php:58
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "This action is permanent and can not be undone!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Removeaccount.php:59
+#: ../../Zotlabs/Module/Removeme.php:62
+msgid "Please enter your password for verification:"
+msgstr ""
+
#: ../../Zotlabs/Module/Removeaccount.php:60
msgid ""
"Remove this account, all its channels and all its channel clones from the "
@@ -5852,6 +5355,35 @@ msgid ""
"removed from the network"
msgstr ""
+#: ../../Zotlabs/Module/Removeaccount.php:61
+#: ../../Zotlabs/Module/Settings/Account.php:120
+msgid "Remove Account"
+msgstr ""
+
+#: ../../Zotlabs/Module/Pdledit.php:21
+msgid "Layout updated."
+msgstr ""
+
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:218
+msgid "Feature disabled."
+msgstr ""
+
+#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
+msgid "Edit System Page Description"
+msgstr ""
+
+#: ../../Zotlabs/Module/Pdledit.php:64
+msgid "Layout not found."
+msgstr ""
+
+#: ../../Zotlabs/Module/Pdledit.php:70
+msgid "Module Name:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Pdledit.php:71
+msgid "Layout Help"
+msgstr ""
+
#: ../../Zotlabs/Module/Uexport.php:55 ../../Zotlabs/Module/Uexport.php:56
msgid "Export Channel"
msgstr ""
@@ -5910,134 +5442,200 @@ msgid ""
"or restore these in date order (oldest first)."
msgstr ""
-#: ../../Zotlabs/Module/Group.php:24
-msgid "Privacy group created."
+#: ../../Zotlabs/Module/Cal.php:69
+msgid "Permissions denied."
msgstr ""
-#: ../../Zotlabs/Module/Group.php:30
-msgid "Could not create privacy group."
+#: ../../Zotlabs/Module/Cal.php:263 ../../Zotlabs/Module/Events.php:596
+msgid "l, F j"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3944
-msgid "Privacy group not found."
+#: ../../Zotlabs/Module/Cal.php:312 ../../Zotlabs/Module/Events.php:651
+#: ../../include/text.php:1748
+msgid "Link to Source"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:58
-msgid "Privacy group updated."
+#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679
+msgid "Edit Event"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:90
-msgid "Create a group of channels."
+#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679
+msgid "Create Event"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
-msgid "Privacy group name: "
+#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:682
+msgid "Export"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
-msgid "Members are visible to other channels"
+#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2294
+msgid "Import"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:111
-msgid "Privacy group removed."
+#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Events.php:691
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848
+msgid "Today"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:113
-msgid "Unable to remove privacy group."
+#: ../../Zotlabs/Module/Admin.php:94
+msgid "# Accounts"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:183
-msgid "Privacy group editor"
+#: ../../Zotlabs/Module/Admin.php:95
+msgid "# blocked accounts"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:197
-msgid "Members"
+#: ../../Zotlabs/Module/Admin.php:96
+msgid "# expired accounts"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:199
-msgid "All Connected Channels"
+#: ../../Zotlabs/Module/Admin.php:97
+msgid "# expiring accounts"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:231
-msgid "Click on a channel to add or remove."
+#: ../../Zotlabs/Module/Admin.php:108
+msgid "# Channels"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin.php:109
+msgid "# primary"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin.php:110
+msgid "# clones"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin.php:116
+msgid "Message queues"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin.php:133
+msgid "Your software should be updated"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin.php:138
+msgid "Summary"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin.php:141
+msgid "Registered accounts"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin.php:142
+msgid "Pending registrations"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin.php:143
+msgid "Registered channels"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin.php:144
+msgid "Active plugins"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin.php:145
+msgid "Version"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin.php:146
+msgid "Repository version (master)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin.php:147
+msgid "Repository version (dev)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Lockview.php:75
+msgid "Remote privacy information not available."
+msgstr ""
+
+#: ../../Zotlabs/Module/Lockview.php:96
+msgid "Visible to:"
msgstr ""
#: ../../Zotlabs/Module/Service_limits.php:23
msgid "No service class restrictions found."
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:114
-msgid "Thing updated"
+#: ../../Zotlabs/Module/Webpages.php:52
+msgid "Import Webpage Elements"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:166
-msgid "Object store: failed"
+#: ../../Zotlabs/Module/Webpages.php:53
+msgid "Import selected"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:170
-msgid "Thing added"
+#: ../../Zotlabs/Module/Webpages.php:76
+msgid "Export Webpage Elements"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:196
-#, php-format
-msgid "OBJ: %1$s %2$s %3$s"
+#: ../../Zotlabs/Module/Webpages.php:77
+msgid "Export selected"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:259
-msgid "Show Thing"
+#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:218
+#: ../../include/nav.php:109 ../../include/conversation.php:1745
+msgid "Webpages"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:266
-msgid "item not found."
+#: ../../Zotlabs/Module/Webpages.php:248 ../../include/page_widgets.php:44
+msgid "Actions"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:299
-msgid "Edit Thing"
+#: ../../Zotlabs/Module/Webpages.php:249 ../../include/page_widgets.php:45
+msgid "Page Link"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
-msgid "Select a profile"
+#: ../../Zotlabs/Module/Webpages.php:250
+msgid "Page Title"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Post an activity"
+#: ../../Zotlabs/Module/Webpages.php:280
+msgid "Invalid file type."
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Only sends to viewers of the applicable profile"
+#: ../../Zotlabs/Module/Webpages.php:292
+msgid "Error opening zip file"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
-msgid "Name of thing e.g. something"
+#: ../../Zotlabs/Module/Webpages.php:303
+msgid "Invalid folder path."
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
-msgid "URL of thing (optional)"
+#: ../../Zotlabs/Module/Webpages.php:330
+msgid "No webpage elements detected."
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
-msgid "URL for photo of thing (optional)"
+#: ../../Zotlabs/Module/Webpages.php:405
+msgid "Import complete."
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:353
-msgid "Add Thing to your Profile"
+#: ../../Zotlabs/Module/Removeme.php:35
+msgid ""
+"Channel removals are not allowed within 48 hours of changing the account "
+"password."
msgstr ""
-#: ../../Zotlabs/Module/Ratings.php:70
-msgid "No ratings"
+#: ../../Zotlabs/Module/Removeme.php:60
+msgid "Remove This Channel"
msgstr ""
-#: ../../Zotlabs/Module/Ratings.php:98
-msgid "Rating: "
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "This channel will be completely removed from the network. "
msgstr ""
-#: ../../Zotlabs/Module/Ratings.php:99
-msgid "Website: "
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid "Remove this channel and all its clones from the network"
msgstr ""
-#: ../../Zotlabs/Module/Ratings.php:101
-msgid "Description: "
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr ""
+
+#: ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings/Channel.php:547
+msgid "Remove Channel"
msgstr ""
#: ../../Zotlabs/Module/Sharedwithme.php:98
@@ -6060,79 +5658,128 @@ msgstr ""
msgid "Not found"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:97 ../../Zotlabs/Lib/Apps.php:219
-#: ../../include/nav.php:111 ../../include/features.php:99
-#: ../../include/conversation.php:1735 ../../include/conversation.php:1738
-msgid "Wiki"
+#: ../../Zotlabs/Module/Wiki.php:55
+msgid "Invalid channel"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:98
-msgid "Sandbox"
+#: ../../Zotlabs/Module/Wiki.php:100
+msgid "Error retrieving wiki"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:100
-msgid ""
-"\"# Wiki Sandbox\\n\\nContent you **edit** and **preview** here *will not be "
-"saved*.\""
+#: ../../Zotlabs/Module/Wiki.php:107
+msgid "Error creating zip file export folder"
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:125
+msgid "Error downloading wiki: "
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:139 ../../include/nav.php:111
+#: ../../include/conversation.php:1755
+msgid "Wikis"
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:145 ../../include/widgets.php:966
+msgid "Download"
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:149 ../../include/widgets.php:970
+msgid "Wiki name"
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:150
+msgid "Content type"
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:159
+msgid "Create a status post for this wiki"
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:178
+msgid "Wiki not found"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:169
+#: ../../Zotlabs/Module/Wiki.php:203
+msgid "Rename page"
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:207
+msgid "Error retrieving page content"
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:240
msgid "Revision Comparison"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:170
+#: ../../Zotlabs/Module/Wiki.php:241
msgid "Revert"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:201
-msgid "Enter the name of your new wiki:"
+#: ../../Zotlabs/Module/Wiki.php:250
+msgid "Choose an available wiki from the list on the left."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:202
-msgid "Enter the name of the new page:"
+#: ../../Zotlabs/Module/Wiki.php:252
+msgid "Source"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:203
-msgid "Enter the new name:"
+#: ../../Zotlabs/Module/Wiki.php:269
+msgid "New page name"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:209 ../../include/conversation.php:1153
+#: ../../Zotlabs/Module/Wiki.php:275 ../../include/conversation.php:1169
msgid "Embed image from photo albums"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:210 ../../include/conversation.php:1247
+#: ../../Zotlabs/Module/Wiki.php:276 ../../include/conversation.php:1263
msgid "Embed an image from your albums"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:212 ../../include/conversation.php:1249
-#: ../../include/conversation.php:1296
+#: ../../Zotlabs/Module/Wiki.php:278 ../../include/conversation.php:1265
+#: ../../include/conversation.php:1312
msgid "OK"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:213 ../../include/conversation.php:1189
+#: ../../Zotlabs/Module/Wiki.php:279 ../../include/conversation.php:1205
msgid "Choose images to embed"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:214 ../../include/conversation.php:1190
+#: ../../Zotlabs/Module/Wiki.php:280 ../../include/conversation.php:1206
msgid "Choose an album"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:215 ../../include/conversation.php:1191
+#: ../../Zotlabs/Module/Wiki.php:281 ../../include/conversation.php:1207
msgid "Choose a different album..."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:216 ../../include/conversation.php:1192
+#: ../../Zotlabs/Module/Wiki.php:282 ../../include/conversation.php:1208
msgid "Error getting album list"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:217 ../../include/conversation.php:1193
+#: ../../Zotlabs/Module/Wiki.php:283 ../../include/conversation.php:1209
msgid "Error getting photo link"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:218 ../../include/conversation.php:1194
+#: ../../Zotlabs/Module/Wiki.php:284 ../../include/conversation.php:1210
msgid "Error getting album"
msgstr ""
+#: ../../Zotlabs/Module/Wiki.php:348
+msgid "Error creating wiki. Invalid name."
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:359
+msgid "Wiki created, but error creating Home page."
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:364
+msgid "Error creating wiki"
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:410
+msgid "New page created"
+msgstr ""
+
#: ../../Zotlabs/Module/Sources.php:37
msgid "Failed to create source. No channel selected."
msgstr ""
@@ -6186,6 +5833,11 @@ msgid ""
"separated)"
msgstr ""
+#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+msgid "Optional"
+msgstr ""
+
#: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161
msgid "Source not found."
msgstr ""
@@ -6230,7 +5882,7 @@ msgstr ""
msgid "post"
msgstr ""
-#: ../../Zotlabs/Module/Tagger.php:57 ../../include/text.php:1992
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/text.php:1948
#: ../../include/conversation.php:150
msgid "comment"
msgstr ""
@@ -6240,301 +5892,827 @@ msgstr ""
msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:82
-msgid "Page owner information could not be retrieved."
+#: ../../Zotlabs/Module/Settings/Features.php:45
+msgid "Additional Features"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
-msgid "Album not found."
+#: ../../Zotlabs/Module/Settings/Oauth.php:34
+msgid "Name is required"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:112
-msgid "Delete Album"
+#: ../../Zotlabs/Module/Settings/Oauth.php:38
+msgid "Key and Secret are required"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:133
+#: ../../Zotlabs/Module/Settings/Oauth.php:86
+#: ../../Zotlabs/Module/Settings/Oauth.php:112
+#: ../../Zotlabs/Module/Settings/Oauth.php:148
+msgid "Add application"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+msgid "Name of application"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:116
+#: ../../extend/addon/addon/statusnet/statusnet.php:893
+#: ../../extend/addon/addon/twitter/twitter.php:775
+msgid "Consumer Key"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+#: ../../Zotlabs/Module/Settings/Oauth.php:117
+#: ../../extend/addon/addon/statusnet/statusnet.php:892
+#: ../../extend/addon/addon/twitter/twitter.php:776
+msgid "Consumer Secret"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+#: ../../Zotlabs/Module/Settings/Oauth.php:118
+msgid "Redirect"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
+"Redirect URI - leave blank unless your application specifically requires this"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1059
-msgid "Delete Photo"
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Settings/Oauth.php:119
+msgid "Icon url"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:520
-msgid "No photos selected"
+#: ../../Zotlabs/Module/Settings/Oauth.php:104
+msgid "Application not found."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:569
-msgid "Access to this item is restricted."
+#: ../../Zotlabs/Module/Settings/Oauth.php:147
+msgid "Connected Apps"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:608
+#: ../../Zotlabs/Module/Settings/Oauth.php:151
+msgid "Client key starts with"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:152
+msgid "No name"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Oauth.php:153
+msgid "Remove authorization"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:31
#, php-format
-msgid "%1$.2f MB of %2$.2f MB photo storage used."
+msgid "This channel is limited to %d tokens"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:611
+#: ../../Zotlabs/Module/Settings/Tokens.php:37
+msgid "Name and Password are required."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:77
+msgid "Token saved."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:113
+msgid ""
+"Use this form to create temporary access identifiers to share things with "
+"non-members. These identities may be used in Access Control Lists and "
+"visitors may login using these credentials to access private content."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:115
+msgid ""
+"You may also provide <em>dropbox</em> style access links to friends and "
+"associates by adding the Login Password to any specific site URL as shown. "
+"Examples:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:647
+msgid "Guest Access Tokens"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:157
+msgid "Login Name"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:158
+msgid "Login Password"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:159
+msgid "Expires (yyyy-mm-dd)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:20
+msgid "Not valid email."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:23
+msgid "Protected email address. Cannot change to that email."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:32
+msgid "System failure storing new email. Please try again."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:40
+msgid "Technical skill level updated"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:56
+msgid "Password verification failed."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:63
+msgid "Passwords do not match. Password unchanged."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:67
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:81
+msgid "Password changed."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:83
+msgid "Password update failed. Please try again."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:112
+msgid "Account Settings"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:113
+msgid "Current Password"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:114
+msgid "Enter New Password"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Confirm New Password"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Leave password fields blank unless changing"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Your technical skill level"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Used to provide a member experience matched to your comfort level"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:119
+#: ../../Zotlabs/Module/Settings/Channel.php:462
+msgid "Email Address:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Account.php:121
+msgid "Remove this account including all its channels"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:246
+#: ../../extend/addon/addon/logrot/logrot.php:54
+#: ../../extend/addon/addon/msgfooter/msgfooter.php:54
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:184
+#: ../../extend/addon/addon/piwik/piwik.php:116
+#: ../../extend/addon/addon/twitter/twitter.php:766
+#: ../../extend/addon/addon/xmpp/xmpp.php:102
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:82
+msgid "Settings updated."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:307
+msgid "Nobody except yourself"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:308
+msgid "Only those you specifically allow"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:309
+msgid "Approved connections"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:310
+msgid "Any connections"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:311
+msgid "Anybody on this website"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:312
+msgid "Anybody in this network"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:313
+msgid "Anybody authenticated"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:314
+msgid "Anybody on the internet"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:390
+msgid "Publish your default profile in the network directory"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:395
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:404
+msgid "Your channel address is"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:407
+msgid "Your files/photos are accessible via WebDAV at"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:453
+msgid "Channel Settings"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:460
+msgid "Basic Settings"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:461
+#: ../../include/channel.php:1172
+msgid "Full Name:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:463
+msgid "Your Timezone:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:464
+msgid "Default Post Location:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:464
+msgid "Geographical location to display on your posts"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:465
+msgid "Use Browser Location:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:467
+msgid "Adult Content"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:467
+msgid ""
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:469
+msgid "Security and Privacy Settings"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:472
+msgid "Your permissions are already configured. Click to view/adjust"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:474
+msgid "Hide my online presence"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:474
+msgid "Prevents displaying in your profile that you are online"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:476
+msgid "Simple Privacy Settings:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:477
+msgid ""
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:478
+msgid ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:479
+msgid "Private - <em>default private, never open or public</em>"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:480
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:482
+msgid "Allow others to tag your posts"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:482
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:484
+msgid "Channel Permission Limits"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:486
+msgid "Expire other channel content after this many days"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:486
+msgid "0 or blank to use the website limit."
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Channel.php:486
#, php-format
-msgid "%1$.2f MB photo storage used."
+msgid "This website expires after %d days."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:647
-msgid "Upload Photos"
+#: ../../Zotlabs/Module/Settings/Channel.php:486
+msgid "This website does not expire imported content."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:651
-msgid "Enter an album name"
+#: ../../Zotlabs/Module/Settings/Channel.php:486
+msgid "The website limit takes precedence if lower than your limit."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:652
-msgid "or select an existing album (doubleclick)"
+#: ../../Zotlabs/Module/Settings/Channel.php:487
+msgid "Maximum Friend Requests/Day:"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:653
-msgid "Create a status post for this upload"
+#: ../../Zotlabs/Module/Settings/Channel.php:487
+msgid "May reduce spam activity"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:654
-msgid "Caption (optional):"
+#: ../../Zotlabs/Module/Settings/Channel.php:488
+msgid "Default Access Control List (ACL)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:655
-msgid "Description (optional):"
+#: ../../Zotlabs/Module/Settings/Channel.php:490
+msgid "Use my default audience setting for the type of object published"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:686
-msgid "Album name could not be decoded"
+#: ../../Zotlabs/Module/Settings/Channel.php:497
+msgid "Channel permissions category:"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:734
-msgid "Contact Photos"
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid "Maximum private messages per day from unknown people:"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:757
-msgid "Show Newest First"
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid "Useful to reduce spamming"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:759
-msgid "Show Oldest First"
+#: ../../Zotlabs/Module/Settings/Channel.php:506
+msgid "Notification Settings"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:783 ../../Zotlabs/Module/Photos.php:1337
-#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1676
-msgid "View Photo"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "By default post a status message when:"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:814
-#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1693
-msgid "Edit Album"
+#: ../../Zotlabs/Module/Settings/Channel.php:508
+msgid "accepting a friend request"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:861
-msgid "Permission denied. Access to this item may be restricted."
+#: ../../Zotlabs/Module/Settings/Channel.php:509
+msgid "joining a forum/community"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:863
-msgid "Photo not available"
+#: ../../Zotlabs/Module/Settings/Channel.php:510
+msgid "making an <em>interesting</em> profile change"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:921
-msgid "Use as profile photo"
+#: ../../Zotlabs/Module/Settings/Channel.php:511
+msgid "Send a notification email when:"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:922
-msgid "Use as cover photo"
+#: ../../Zotlabs/Module/Settings/Channel.php:512
+msgid "You receive a connection request"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:929
-msgid "Private Photo"
+#: ../../Zotlabs/Module/Settings/Channel.php:513
+msgid "Your connections are confirmed"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:944
-msgid "View Full Size"
+#: ../../Zotlabs/Module/Settings/Channel.php:514
+msgid "Someone writes on your profile wall"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1033
-msgid "Edit photo"
+#: ../../Zotlabs/Module/Settings/Channel.php:515
+msgid "Someone writes a followup comment"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1035
-msgid "Rotate CW (right)"
+#: ../../Zotlabs/Module/Settings/Channel.php:516
+msgid "You receive a private message"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1036
-msgid "Rotate CCW (left)"
+#: ../../Zotlabs/Module/Settings/Channel.php:517
+msgid "You receive a friend suggestion"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1039
-msgid "Move photo to album"
+#: ../../Zotlabs/Module/Settings/Channel.php:518
+msgid "You are tagged in a post"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1040
-msgid "Enter a new album name"
+#: ../../Zotlabs/Module/Settings/Channel.php:519
+msgid "You are poked/prodded/etc. in a post"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1041
-msgid "or select an existing one (doubleclick)"
+#: ../../Zotlabs/Module/Settings/Channel.php:522
+msgid "Show visual notifications including:"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1044
-msgid "Caption"
+#: ../../Zotlabs/Module/Settings/Channel.php:524
+msgid "Unseen grid activity"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1046
-msgid "Add a Tag"
+#: ../../Zotlabs/Module/Settings/Channel.php:525
+msgid "Unseen channel activity"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1054
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
+#: ../../Zotlabs/Module/Settings/Channel.php:526
+msgid "Unseen private messages"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1057
-msgid "Flag as adult in album view"
+#: ../../Zotlabs/Module/Settings/Channel.php:526
+#: ../../Zotlabs/Module/Settings/Channel.php:531
+#: ../../Zotlabs/Module/Settings/Channel.php:532
+#: ../../Zotlabs/Module/Settings/Channel.php:533
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+msgid "Recommended"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1076 ../../Zotlabs/Lib/ThreadItem.php:268
-msgid "I like this (toggle)"
+#: ../../Zotlabs/Module/Settings/Channel.php:527
+msgid "Upcoming events"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1077 ../../Zotlabs/Lib/ThreadItem.php:269
-msgid "I don't like this (toggle)"
+#: ../../Zotlabs/Module/Settings/Channel.php:528
+msgid "Events today"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1079 ../../Zotlabs/Lib/ThreadItem.php:405
-#: ../../include/conversation.php:741
-msgid "Please wait"
+#: ../../Zotlabs/Module/Settings/Channel.php:529
+msgid "Upcoming birthdays"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1095 ../../Zotlabs/Module/Photos.php:1213
-#: ../../Zotlabs/Lib/ThreadItem.php:722
-msgid "This is you"
+#: ../../Zotlabs/Module/Settings/Channel.php:529
+msgid "Not available in all themes"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1097 ../../Zotlabs/Module/Photos.php:1215
-#: ../../Zotlabs/Lib/ThreadItem.php:724 ../../include/js_strings.php:6
-msgid "Comment"
+#: ../../Zotlabs/Module/Settings/Channel.php:530
+msgid "System (personal) notifications"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Likes"
+#: ../../Zotlabs/Module/Settings/Channel.php:531
+msgid "System info messages"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Dislikes"
+#: ../../Zotlabs/Module/Settings/Channel.php:532
+msgid "System critical alerts"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Agree"
+#: ../../Zotlabs/Module/Settings/Channel.php:533
+msgid "New connections"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Disagree"
+#: ../../Zotlabs/Module/Settings/Channel.php:534
+msgid "System Registrations"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Abstain"
+#: ../../Zotlabs/Module/Settings/Channel.php:535
+msgid ""
+"Also show new wall posts, private messages and connections under Notices"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Attending"
+#: ../../Zotlabs/Module/Settings/Channel.php:537
+msgid "Notify me of events this many days in advance"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Not attending"
+#: ../../Zotlabs/Module/Settings/Channel.php:537
+msgid "Must be greater than 0"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Might attend"
+#: ../../Zotlabs/Module/Settings/Channel.php:539
+msgid "Advanced Account/Page Type Settings"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1132 ../../Zotlabs/Module/Photos.php:1144
-#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
-#: ../../include/conversation.php:1763
-msgid "View all"
+#: ../../Zotlabs/Module/Settings/Channel.php:540
+msgid "Change the behaviour of this account for special situations"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:190
-#: ../../include/conversation.php:1787 ../../include/taxonomy.php:403
-#: ../../include/channel.php:1190
-msgctxt "noun"
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../Zotlabs/Module/Settings/Channel.php:542
+msgid "Miscellaneous Settings"
+msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1141 ../../Zotlabs/Lib/ThreadItem.php:195
-#: ../../include/conversation.php:1790
-msgctxt "noun"
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../Zotlabs/Module/Settings/Channel.php:543
+msgid "Default photo upload folder"
+msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1241
-msgid "Photo Tools"
+#: ../../Zotlabs/Module/Settings/Channel.php:543
+#: ../../Zotlabs/Module/Settings/Channel.php:544
+msgid "%Y - current year, %m - current month"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1250
-msgid "In This Photo:"
+#: ../../Zotlabs/Module/Settings/Channel.php:544
+msgid "Default file upload folder"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1255
-msgid "Map"
+#: ../../Zotlabs/Module/Settings/Channel.php:546
+msgid "Personal menu to display in your channel pages"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1263 ../../Zotlabs/Lib/ThreadItem.php:394
-msgctxt "noun"
-msgid "Likes"
+#: ../../Zotlabs/Module/Settings/Channel.php:548
+msgid "Remove this channel."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:395
-msgctxt "noun"
-msgid "Dislikes"
+#: ../../Zotlabs/Module/Settings/Channel.php:549
+msgid "Firefox Share $Projectname provider"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1269 ../../Zotlabs/Lib/ThreadItem.php:400
-#: ../../include/acl_selectors.php:184
-msgid "Close"
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+msgid "Start calendar week on monday"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1343
-msgid "View Album"
+#: ../../Zotlabs/Module/Settings/Display.php:137
+msgid "No special theme for mobile devices"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1354 ../../Zotlabs/Module/Photos.php:1367
-#: ../../Zotlabs/Module/Photos.php:1368
-msgid "Recent Photos"
+#: ../../Zotlabs/Module/Settings/Display.php:140
+#, php-format
+msgid "%s - (Experimental)"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
-msgid "Invalid profile identifier."
+#: ../../Zotlabs/Module/Settings/Display.php:191
+msgid "Display Settings"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:115
-msgid "Profile Visibility Editor"
+#: ../../Zotlabs/Module/Settings/Display.php:192
+msgid "Theme Settings"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1282
-msgid "Profile"
+#: ../../Zotlabs/Module/Settings/Display.php:193
+msgid "Custom Theme Settings"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:119
-msgid "Click on a contact to add or remove."
+#: ../../Zotlabs/Module/Settings/Display.php:194
+msgid "Content Settings"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:128
-msgid "Visible To"
+#: ../../Zotlabs/Module/Settings/Display.php:200
+msgid "Display Theme:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:201
+msgid "Select scheme"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:203
+msgid "Mobile Theme:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:204
+msgid "Preload images before rendering the page"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:204
+msgid ""
+"The subjective page load time will be longer but the page will be ready when "
+"displayed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:205
+msgid "Enable user zoom on mobile devices"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:206
+msgid "Update browser every xx seconds"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:206
+msgid "Minimum of 10 seconds, no maximum"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:207
+msgid "Maximum number of conversations to load at any time:"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:207
+msgid "Maximum of 100 items"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:208
+msgid "Show emoticons (smilies) as images"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:209
+msgid "Manual conversation updates"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:209
+msgid "Default is automatic, which may increase screen jumping"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:210
+msgid "Link post titles to source"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:211
+msgid "System Page Layout Editor - (advanced)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:214
+msgid "Use blog/list mode on channel page"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:214
+#: ../../Zotlabs/Module/Settings/Display.php:215
+msgid "(comments displayed separately)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:215
+msgid "Use blog/list mode on grid page"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Channel page max height of content (in pixels)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:216
+#: ../../Zotlabs/Module/Settings/Display.php:217
+msgid "click to expand content exceeding this height"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Display.php:217
+msgid "Grid page max height of content (in pixels)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Featured.php:24
+msgid "No feature settings configured"
+msgstr ""
+
+#: ../../Zotlabs/Module/Settings/Featured.php:31
+msgid "Feature/Addon Settings"
+msgstr ""
+
+#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
+msgid "Tag removed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Tagrm.php:123
+msgid "Remove Item Tag"
+msgstr ""
+
+#: ../../Zotlabs/Module/Tagrm.php:125
+msgid "Select a tag to remove: "
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:114
+msgid "Thing updated"
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:166
+msgid "Object store: failed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:170
+msgid "Thing added"
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:196
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:259
+msgid "Show Thing"
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:266
+msgid "item not found."
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:299
+msgid "Edit Thing"
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
+msgid "Select a profile"
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Post an activity"
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Only sends to viewers of the applicable profile"
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
+msgid "Name of thing e.g. something"
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
+msgid "URL of thing (optional)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
+msgid "URL for photo of thing (optional)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Thing.php:353
+msgid "Add Thing to your Profile"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:33
+#, php-format
+msgid "Your service plan only allows %d channels."
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:157 ../../include/import.php:100
+msgid "Cloned channel not found. Import failed."
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:167
+msgid "No channel. Import failed."
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:503
+#: ../../include/Import/import_diaspora.php:142
+msgid "Import completed."
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:525
+msgid "You must be logged in to use this feature."
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:530
+msgid "Import Channel"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:531
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You "
+"may retrieve the channel identity from the old server/hub via the network or "
+"provide an export file."
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:533
+msgid "Or provide the old server/hub details"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:534
+msgid "Your old identity address (xyz@example.com)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:535
+msgid "Your old login email address"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:536
+msgid "Your old login password"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:537
+msgid ""
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be "
+"able to post from either location, but only one can be marked as the primary "
+"location for files, photos, and media."
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:538
+msgid "Make this hub my primary location"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:539
+msgid ""
+"Import existing posts if possible (experimental - limited by available memory"
+msgstr ""
+
+#: ../../Zotlabs/Module/Import.php:540
+msgid ""
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
msgstr ""
#: ../../Zotlabs/Module/Viewconnections.php:65
@@ -6615,12 +6793,132 @@ msgstr ""
msgid "Lookup xchan beginning with (or webbie): "
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:69
-msgid "Permissions denied."
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:337 ../../include/text.php:2335
-msgid "Import"
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:106
+msgid "Event can not end before it has started."
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:108 ../../Zotlabs/Module/Events.php:117
+#: ../../Zotlabs/Module/Events.php:139
+msgid "Unable to generate preview."
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:115
+msgid "Event title and start time are required."
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:137 ../../Zotlabs/Module/Events.php:261
+msgid "Event not found."
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:453
+msgid "Edit event title"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:453
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835
+msgid "Event title"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:455
+msgid "Categories (comma-separated list)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:456
+msgid "Edit Category"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:456
+msgid "Category"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:459
+msgid "Edit start date and time"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:459
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
+msgid "Start date and time"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:463
+msgid "Finish date and time are not known or not relevant"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Edit finish date and time"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Finish date and time"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:464 ../../Zotlabs/Module/Events.php:465
+msgid "Adjust for viewer timezone"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:464
+msgid ""
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:466
+msgid "Edit Description"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:468
+msgid "Edit Location"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:472 ../../include/conversation.php:1280
+msgid "Permission settings"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:485
+msgid "Advanced Options"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:624
+msgid "Edit event"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:626
+msgid "Delete event"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:660
+msgid "calendar"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:686
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849
+msgid "Month"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:687
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850
+msgid "Week"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:688
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851
+msgid "Day"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:722
+msgid "Event removed"
+msgstr ""
+
+#: ../../Zotlabs/Module/Events.php:725
+msgid "Failed to remove event"
msgstr ""
#: ../../Zotlabs/Lib/Chatroom.php:27
@@ -6648,7 +6946,8 @@ msgid "Site Admin"
msgstr ""
#: ../../Zotlabs/Lib/Apps.php:206
-msgid "Bug Report"
+#: ../../extend/addon/addon/buglink/buglink.php:16
+msgid "Report Bug"
msgstr ""
#: ../../Zotlabs/Lib/Apps.php:207
@@ -6672,28 +6971,33 @@ msgid "Suggest Channels"
msgstr ""
#: ../../Zotlabs/Lib/Apps.php:213 ../../include/nav.php:115
-#: ../../boot.php:1739
+#: ../../boot.php:1719
msgid "Login"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:215 ../../include/nav.php:184
+#: ../../Zotlabs/Lib/Apps.php:215 ../../include/nav.php:182
msgid "Grid"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:187
+#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:99
+#: ../../include/conversation.php:1758
+msgid "Wiki"
+msgstr ""
+
+#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:185
msgid "Channel Home"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:223 ../../include/nav.php:206
-#: ../../include/conversation.php:1689 ../../include/conversation.php:1692
+#: ../../Zotlabs/Lib/Apps.php:223 ../../include/nav.php:204
+#: ../../include/conversation.php:1709 ../../include/conversation.php:1712
msgid "Events"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:224 ../../include/nav.php:172
+#: ../../Zotlabs/Lib/Apps.php:224 ../../include/nav.php:170
msgid "Directory"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/nav.php:198
+#: ../../Zotlabs/Lib/Apps.php:226 ../../include/nav.php:196
msgid "Mail"
msgstr ""
@@ -6717,11 +7021,12 @@ msgstr ""
msgid "Invite"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:235 ../../include/widgets.php:1563
+#: ../../Zotlabs/Lib/Apps.php:235 ../../include/widgets.php:1635
msgid "Features"
msgstr ""
#: ../../Zotlabs/Lib/Apps.php:236
+#: ../../extend/addon/addon/openid/MysqlProvider.php:69
msgid "Language"
msgstr ""
@@ -6730,6 +7035,9 @@ msgid "Post"
msgstr ""
#: ../../Zotlabs/Lib/Apps.php:238
+#: ../../extend/addon/addon/openid/MysqlProvider.php:58
+#: ../../extend/addon/addon/openid/MysqlProvider.php:59
+#: ../../extend/addon/addon/openid/MysqlProvider.php:60
msgid "Profile Photo"
msgstr ""
@@ -6737,11 +7045,74 @@ msgstr ""
msgid "Purchase"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:667
+#: ../../Zotlabs/Lib/PermissionDescription.php:34
+#: ../../include/acl_selectors.php:128
+msgid "Visible to your default audience"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:107
+#: ../../include/acl_selectors.php:191
+msgid "Only me"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:108
+msgid "Public"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:109
+msgid "Anybody in the $Projectname network"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:110
+#, php-format
+msgid "Any account on %s"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:111
+msgid "Any of my connections"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:112
+msgid "Only connections I specifically allow"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:113
+msgid "Anybody authenticated (could include visitors from other networks)"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:114
+msgid "Any connections including those who haven't yet been approved"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:150
+msgid ""
+"This is your default setting for the audience of your normal stream, and "
+"posts."
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:151
+msgid ""
+"This is your default setting for who can view your default channel profile"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:152
+msgid "This is your default setting for who can view your connections"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:153
+msgid ""
+"This is your default setting for who can view your file storage and photos"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:154
+msgid "This is your default setting for the audience of your webpages"
+msgstr ""
+
+#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:683
msgid "Private Message"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:659
+#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:675
msgid "Select"
msgstr ""
@@ -6789,11 +7160,11 @@ msgstr ""
msgid "starred"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:674
+#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:690
msgid "Message signature validated"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:675
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:691
msgid "Message signature incorrect"
msgstr ""
@@ -6849,2102 +7220,3334 @@ msgstr ""
msgid "via Wall-To-Wall:"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:720
+#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:736
#, php-format
msgid "from %s"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:723
+#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:739
#, php-format
msgid "last edited: %s"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:724
+#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:740
#, php-format
msgid "Expires: %s"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:377
+#: ../../Zotlabs/Lib/ThreadItem.php:358
+msgid "Attend"
+msgstr ""
+
+#: ../../Zotlabs/Lib/ThreadItem.php:359
+msgid "Attendance Options"
+msgstr ""
+
+#: ../../Zotlabs/Lib/ThreadItem.php:360
+msgid "Vote"
+msgstr ""
+
+#: ../../Zotlabs/Lib/ThreadItem.php:361
+msgid "Voting Options"
+msgstr ""
+
+#: ../../Zotlabs/Lib/ThreadItem.php:381
+#: ../../extend/addon/addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:378
+#: ../../Zotlabs/Lib/ThreadItem.php:382
msgid "Add to Calendar"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:387
+#: ../../Zotlabs/Lib/ThreadItem.php:391
msgid "Mark all seen"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:436 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:440 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:726 ../../include/conversation.php:1239
+#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/conversation.php:1255
msgid "Bold"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:727 ../../include/conversation.php:1240
+#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/conversation.php:1256
msgid "Italic"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:728 ../../include/conversation.php:1241
+#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1257
msgid "Underline"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:729 ../../include/conversation.php:1242
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1258
msgid "Quote"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/conversation.php:1243
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1259
msgid "Code"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:731
+#: ../../Zotlabs/Lib/ThreadItem.php:735
msgid "Image"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:732
+#: ../../Zotlabs/Lib/ThreadItem.php:736
msgid "Insert Link"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:733
+#: ../../Zotlabs/Lib/ThreadItem.php:737
msgid "Video"
msgstr ""
-#: ../../Zotlabs/Lib/PermissionDescription.php:31
-#: ../../include/acl_selectors.php:128
-msgid "Visible to your default audience"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:106
-#: ../../include/acl_selectors.php:168
-msgid "Only me"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:107
-msgid "Public"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:108
-msgid "Anybody in the $Projectname network"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:109
-#, php-format
-msgid "Any account on %s"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:110
-msgid "Any of my connections"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:111
-msgid "Only connections I specifically allow"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:112
-msgid "Anybody authenticated (could include visitors from other networks)"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:113
-msgid "Any connections including those who haven't yet been approved"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:152
-msgid ""
-"This is your default setting for the audience of your normal stream, and "
-"posts."
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:153
-msgid ""
-"This is your default setting for who can view your default channel profile"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:154
-msgid "This is your default setting for who can view your connections"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:155
-msgid ""
-"This is your default setting for who can view your file storage and photos"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:156
-msgid "This is your default setting for the audience of your webpages"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1889
+#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1914
msgid "$Projectname Notification"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../include/network.php:1890
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../extend/addon/addon/diaspora/p.php:46
+#: ../../extend/addon/addon/diaspora/util.php:218
+#: ../../extend/addon/addon/diaspora/util.php:231
+#: ../../include/network.php:1915
msgid "$projectname"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1892
+#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1917
msgid "Thank You,"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1894
+#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1919
#, php-format
msgid "%s Administrator"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:115
+#: ../../Zotlabs/Lib/Enotify.php:116
#, php-format
msgid "%s <!item_type!>"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:119
+#: ../../Zotlabs/Lib/Enotify.php:120
#, php-format
msgid "[$Projectname:Notify] New mail received at %s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:121
+#: ../../Zotlabs/Lib/Enotify.php:122
#, php-format
msgid "%1$s, %2$s sent you a new private message at %3$s."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:122
+#: ../../Zotlabs/Lib/Enotify.php:123
#, php-format
msgid "%1$s sent you %2$s."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:122
+#: ../../Zotlabs/Lib/Enotify.php:123
msgid "a private message"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:123
+#: ../../Zotlabs/Lib/Enotify.php:124
#, php-format
msgid "Please visit %s to view and/or reply to your private messages."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:182
+#: ../../Zotlabs/Lib/Enotify.php:183
#, php-format
msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:190
+#: ../../Zotlabs/Lib/Enotify.php:191
#, php-format
msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:199
+#: ../../Zotlabs/Lib/Enotify.php:200
#, php-format
msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:210
+#: ../../Zotlabs/Lib/Enotify.php:211
#, php-format
msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:211
+#: ../../Zotlabs/Lib/Enotify.php:212
#, php-format
msgid "%1$s, %2$s commented on an item/conversation you have been following."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:214 ../../Zotlabs/Lib/Enotify.php:229
-#: ../../Zotlabs/Lib/Enotify.php:255 ../../Zotlabs/Lib/Enotify.php:273
-#: ../../Zotlabs/Lib/Enotify.php:287
+#: ../../Zotlabs/Lib/Enotify.php:215 ../../Zotlabs/Lib/Enotify.php:230
+#: ../../Zotlabs/Lib/Enotify.php:256 ../../Zotlabs/Lib/Enotify.php:274
+#: ../../Zotlabs/Lib/Enotify.php:288
#, php-format
msgid "Please visit %s to view and/or reply to the conversation."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:220
+#: ../../Zotlabs/Lib/Enotify.php:221
#, php-format
msgid "[$Projectname:Notify] %s posted to your profile wall"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:222
+#: ../../Zotlabs/Lib/Enotify.php:223
#, php-format
msgid "%1$s, %2$s posted to your profile wall at %3$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:224
+#: ../../Zotlabs/Lib/Enotify.php:225
#, php-format
msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:248
+#: ../../Zotlabs/Lib/Enotify.php:249
#, php-format
msgid "[$Projectname:Notify] %s tagged you"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:249
+#: ../../Zotlabs/Lib/Enotify.php:250
#, php-format
msgid "%1$s, %2$s tagged you at %3$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:250
+#: ../../Zotlabs/Lib/Enotify.php:251
#, php-format
msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:262
+#: ../../Zotlabs/Lib/Enotify.php:263
#, php-format
msgid "[$Projectname:Notify] %1$s poked you"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:263
+#: ../../Zotlabs/Lib/Enotify.php:264
#, php-format
msgid "%1$s, %2$s poked you at %3$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:264
+#: ../../Zotlabs/Lib/Enotify.php:265
#, php-format
msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:280
+#: ../../Zotlabs/Lib/Enotify.php:281
#, php-format
msgid "[$Projectname:Notify] %s tagged your post"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:281
+#: ../../Zotlabs/Lib/Enotify.php:282
#, php-format
msgid "%1$s, %2$s tagged your post at %3$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:282
+#: ../../Zotlabs/Lib/Enotify.php:283
#, php-format
msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:294
+#: ../../Zotlabs/Lib/Enotify.php:295
msgid "[$Projectname:Notify] Introduction received"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:295
+#: ../../Zotlabs/Lib/Enotify.php:296
#, php-format
msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:296
+#: ../../Zotlabs/Lib/Enotify.php:297
#, php-format
msgid ""
"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:300 ../../Zotlabs/Lib/Enotify.php:319
+#: ../../Zotlabs/Lib/Enotify.php:301 ../../Zotlabs/Lib/Enotify.php:320
#, php-format
msgid "You may visit their profile at %s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:302
+#: ../../Zotlabs/Lib/Enotify.php:303
#, php-format
msgid "Please visit %s to approve or reject the connection request."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:309
+#: ../../Zotlabs/Lib/Enotify.php:310
msgid "[$Projectname:Notify] Friend suggestion received"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:310
+#: ../../Zotlabs/Lib/Enotify.php:311
#, php-format
msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:311
+#: ../../Zotlabs/Lib/Enotify.php:312
#, php-format
msgid ""
"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from %4$s."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:317
+#: ../../Zotlabs/Lib/Enotify.php:318
msgid "Name:"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:318
+#: ../../Zotlabs/Lib/Enotify.php:319
msgid "Photo:"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:321
+#: ../../Zotlabs/Lib/Enotify.php:322
#, php-format
msgid "Please visit %s to approve or reject the suggestion."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:539
+#: ../../Zotlabs/Lib/Enotify.php:540
msgid "[$Projectname:Notify]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:699
+#: ../../Zotlabs/Lib/Enotify.php:700
msgid "created a new post"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:700
+#: ../../Zotlabs/Lib/Enotify.php:701
#, php-format
msgid "commented on %s's post"
msgstr ""
-#: ../../include/Import/import_diaspora.php:16
-msgid "No username found in import file."
+#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:24
+msgid "Flag Adult Photos"
msgstr ""
-#: ../../include/Import/import_diaspora.php:41 ../../include/import.php:51
-msgid "Unable to create a unique channel address. Import failed."
+#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:25
+msgid ""
+"Provide photo edit option to hide inappropriate photos from default album "
+"view"
msgstr ""
-#: ../../include/dba/dba_driver.php:180
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:44
+msgid ""
+"This is a fairly comprehensive and complete guitar chord dictionary which "
+"will list most of the available ways to play a certain chord, starting from "
+"the base of the fingerboard up to a few frets beyond the twelfth fret "
+"(beyond which everything repeats). A couple of non-standard tunings are "
+"provided for the benefit of slide players, etc."
msgstr ""
-#: ../../include/nav.php:85 ../../include/nav.php:118 ../../boot.php:1738
-msgid "Logout"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:46
+msgid ""
+"Chord names start with a root note (A-G) and may include sharps (#) and "
+"flats (b). This software will parse most of the standard naming conventions "
+"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
msgstr ""
-#: ../../include/nav.php:85 ../../include/nav.php:118
-msgid "End this session"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:48
+msgid ""
+"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
+"E7b13b11 ..."
msgstr ""
-#: ../../include/nav.php:88 ../../include/nav.php:149
-msgid "Home"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:51
+msgid "Guitar Chords"
msgstr ""
-#: ../../include/nav.php:88
-msgid "Your posts and conversations"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:52
+msgid "The complete online chord dictionary"
msgstr ""
-#: ../../include/nav.php:89
-msgid "Your profile page"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:57
+msgid "Tuning"
msgstr ""
-#: ../../include/nav.php:91
-msgid "Manage/Edit profiles"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:58
+msgid "Chord name: example: Em7"
msgstr ""
-#: ../../include/nav.php:93 ../../include/channel.php:965
-msgid "Edit Profile"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:59
+msgid "Show for left handed stringing"
msgstr ""
-#: ../../include/nav.php:93
-msgid "Edit your profile"
+#: ../../extend/addon/addon/chords/chords.php:33
+msgid "Quick Reference"
msgstr ""
-#: ../../include/nav.php:95
-msgid "Your photos"
+#: ../../extend/addon/addon/diaspora/diaspora.php:671
+msgid "Diaspora Protocol Settings updated."
msgstr ""
-#: ../../include/nav.php:96
-msgid "Your files"
+#: ../../extend/addon/addon/diaspora/diaspora.php:692
+msgid "Enable the Diaspora protocol for this channel"
msgstr ""
-#: ../../include/nav.php:99
-msgid "Your chatrooms"
+#: ../../extend/addon/addon/diaspora/diaspora.php:696
+msgid "Allow any Diaspora member to comment on your public posts"
msgstr ""
-#: ../../include/nav.php:105 ../../include/conversation.php:1715
-msgid "Bookmarks"
+#: ../../extend/addon/addon/diaspora/diaspora.php:700
+msgid "Prevent your hashtags from being redirected to other sites"
msgstr ""
-#: ../../include/nav.php:105
-msgid "Your bookmarks"
+#: ../../extend/addon/addon/diaspora/diaspora.php:705
+msgid "Followed hashtags (comma separated, do not include the #)"
msgstr ""
-#: ../../include/nav.php:109
-msgid "Your webpages"
+#: ../../extend/addon/addon/diaspora/diaspora.php:710
+msgid "Diaspora Protocol Settings"
msgstr ""
-#: ../../include/nav.php:111
-msgid "Your wiki"
+#: ../../extend/addon/addon/dirstats/dirstats.php:94
+msgid "Hubzilla Directory Stats"
msgstr ""
-#: ../../include/nav.php:115
-msgid "Sign in"
+#: ../../extend/addon/addon/dirstats/dirstats.php:95
+msgid "Total Hubs"
msgstr ""
-#: ../../include/nav.php:132
-#, php-format
-msgid "%s - click to logout"
+#: ../../extend/addon/addon/dirstats/dirstats.php:97
+msgid "Hubzilla Hubs"
msgstr ""
-#: ../../include/nav.php:135
-msgid "Remote authentication"
+#: ../../extend/addon/addon/dirstats/dirstats.php:99
+msgid "Friendica Hubs"
msgstr ""
-#: ../../include/nav.php:135
-msgid "Click to authenticate to your home hub"
+#: ../../extend/addon/addon/dirstats/dirstats.php:101
+msgid "Diaspora Pods"
msgstr ""
-#: ../../include/nav.php:149
-msgid "Home Page"
+#: ../../extend/addon/addon/dirstats/dirstats.php:103
+msgid "Hubzilla Channels"
msgstr ""
-#: ../../include/nav.php:152
-msgid "Create an account"
+#: ../../extend/addon/addon/dirstats/dirstats.php:105
+msgid "Friendica Channels"
msgstr ""
-#: ../../include/nav.php:164
-msgid "Help and documentation"
+#: ../../extend/addon/addon/dirstats/dirstats.php:107
+msgid "Diaspora Channels"
msgstr ""
-#: ../../include/nav.php:168
-msgid "Applications, utilities, links, games"
+#: ../../extend/addon/addon/dirstats/dirstats.php:109
+msgid "Aged 35 and above"
msgstr ""
-#: ../../include/nav.php:170
-msgid "Search site @name, #tag, ?docs, content"
+#: ../../extend/addon/addon/dirstats/dirstats.php:111
+msgid "Aged 34 and under"
msgstr ""
-#: ../../include/nav.php:172
-msgid "Channel Directory"
+#: ../../extend/addon/addon/dirstats/dirstats.php:113
+msgid "Average Age"
msgstr ""
-#: ../../include/nav.php:184
-msgid "Your grid"
+#: ../../extend/addon/addon/dirstats/dirstats.php:115
+msgid "Known Chatrooms"
msgstr ""
-#: ../../include/nav.php:185
-msgid "Mark all grid notifications seen"
+#: ../../extend/addon/addon/dirstats/dirstats.php:117
+msgid "Known Tags"
msgstr ""
-#: ../../include/nav.php:187
-msgid "Channel home"
+#: ../../extend/addon/addon/dirstats/dirstats.php:119
+msgid ""
+"Please note Diaspora and Friendica statistics are merely those **this "
+"directory** is aware of, and not all those known in the network. This also "
+"applies to chatrooms,"
msgstr ""
-#: ../../include/nav.php:188
-msgid "Mark all channel notifications seen"
+#: ../../extend/addon/addon/donate/donate.php:21
+msgid "Project Servers and Resources"
msgstr ""
-#: ../../include/nav.php:194
-msgid "Notices"
+#: ../../extend/addon/addon/donate/donate.php:22
+msgid "Project Creator and Tech Lead"
msgstr ""
-#: ../../include/nav.php:194
-msgid "Notifications"
+#: ../../extend/addon/addon/donate/donate.php:23
+msgid "Admin, developer, directorymin, support bloke"
msgstr ""
-#: ../../include/nav.php:195
-msgid "See all notifications"
+#: ../../extend/addon/addon/donate/donate.php:50
+msgid ""
+"And the hundreds of other people and organisations who helped make the "
+"Hubzilla possible."
msgstr ""
-#: ../../include/nav.php:198
-msgid "Private mail"
+#: ../../extend/addon/addon/donate/donate.php:53
+msgid ""
+"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
+"their time and expertise - and often paying out of pocket for services they "
+"share with others."
msgstr ""
-#: ../../include/nav.php:199
-msgid "See all private messages"
+#: ../../extend/addon/addon/donate/donate.php:54
+msgid ""
+"There is no corporate funding and no ads, and we do not collect and sell "
+"your personal information. (We don't control your personal information - "
+"<strong>you do</strong>.)"
msgstr ""
-#: ../../include/nav.php:200
-msgid "Mark all private messages seen"
+#: ../../extend/addon/addon/donate/donate.php:55
+msgid ""
+"Help support our ground-breaking work in decentralisation, web identity, and "
+"privacy."
msgstr ""
-#: ../../include/nav.php:201 ../../include/widgets.php:700
-msgid "Inbox"
+#: ../../extend/addon/addon/donate/donate.php:57
+msgid ""
+"Your donations keep servers and services running and also helps us to "
+"provide innovative new features and continued development."
msgstr ""
-#: ../../include/nav.php:202 ../../include/widgets.php:705
-msgid "Outbox"
+#: ../../extend/addon/addon/donate/donate.php:60
+msgid "Donate"
msgstr ""
-#: ../../include/nav.php:203 ../../include/widgets.php:710
-msgid "New Message"
+#: ../../extend/addon/addon/donate/donate.php:62
+msgid ""
+"Choose a project, developer, or public hub to support with a one-time "
+"donation"
msgstr ""
-#: ../../include/nav.php:206
-msgid "Event Calendar"
+#: ../../extend/addon/addon/donate/donate.php:63
+msgid "Donate Now"
msgstr ""
-#: ../../include/nav.php:207
-msgid "See all events"
+#: ../../extend/addon/addon/donate/donate.php:64
+msgid ""
+"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"
msgstr ""
-#: ../../include/nav.php:208
-msgid "Mark all events seen"
+#: ../../extend/addon/addon/donate/donate.php:65
+msgid ""
+"Please indicate if you would like your first name or full name (or nothing) "
+"to appear in our sponsor listing"
msgstr ""
-#: ../../include/nav.php:211
-msgid "Manage Your Channels"
+#: ../../extend/addon/addon/donate/donate.php:66
+msgid "Sponsor"
msgstr ""
-#: ../../include/nav.php:213
-msgid "Account/Channel Settings"
+#: ../../extend/addon/addon/donate/donate.php:69
+msgid "Special thanks to: "
msgstr ""
-#: ../../include/nav.php:221 ../../include/widgets.php:1593
-msgid "Admin"
+#: ../../extend/addon/addon/dwpost/dwpost.php:42
+msgid "Post to Dreamwidth"
msgstr ""
-#: ../../include/nav.php:221
-msgid "Site Setup and Configuration"
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+msgid "Enable Dreamwidth Post Plugin"
msgstr ""
-#: ../../include/nav.php:252 ../../include/conversation.php:853
-msgid "Loading..."
+#: ../../extend/addon/addon/dwpost/dwpost.php:77
+msgid "Dreamwidth username"
msgstr ""
-#: ../../include/nav.php:257
-msgid "@name, #tag, ?doc, content"
+#: ../../extend/addon/addon/dwpost/dwpost.php:81
+msgid "Dreamwidth password"
msgstr ""
-#: ../../include/nav.php:258
-msgid "Please wait..."
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+msgid "Post to Dreamwidth by default"
msgstr ""
-#: ../../include/datetime.php:147
-msgid "Birthday"
+#: ../../extend/addon/addon/dwpost/dwpost.php:89
+msgid "Dreamwidth Post Settings"
msgstr ""
-#: ../../include/datetime.php:149
-msgid "Age: "
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:45
+msgid "Flattr this!"
msgstr ""
-#: ../../include/datetime.php:151
-msgid "YYYY-MM-DD or MM-DD"
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:83
+msgid "Flattr widget settings updated."
msgstr ""
-#: ../../include/datetime.php:286 ../../boot.php:2578
-msgid "never"
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:100
+msgid "Flattr user"
msgstr ""
-#: ../../include/datetime.php:292
-msgid "less than a second ago"
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
+msgid "URL of the Thing to flattr"
msgstr ""
-#: ../../include/datetime.php:310
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
+msgid "If empty channel URL is used"
+msgstr ""
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
+msgid "Title of the Thing to flattr"
+msgstr ""
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
+msgid "If empty \"channel name on The Hubzilla\" will be used"
+msgstr ""
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
+msgid "Static or dynamic flattr button"
+msgstr ""
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
+msgid "static"
+msgstr ""
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
+msgid "dynamic"
+msgstr ""
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
+msgid "Alignment of the widget"
+msgstr ""
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
+msgid "left"
+msgstr ""
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
+msgid "right"
+msgstr ""
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+msgid "Enable Flattr widget"
+msgstr ""
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
+msgid "Flattr Widget Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:118
+msgid "Contact not found."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:119
+msgid ""
+"This may occasionally happen if contact was requested by both persons and it "
+"has already been approved."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:238
+msgid "Response from remote site was not understood."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:247
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:252
+msgid "Unexpected response from remote site: "
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:261
+msgid "Confirmation completed successfully."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:263
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:277
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:284
+msgid "Remote site reported: "
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:275
+msgid "Temporary failure. Please wait and try again."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:282
+msgid "Introduction failed or was revoked."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:428
+msgid "Unable to set contact photo."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:485
#, php-format
-msgctxt "e.g. 22 hours ago, 1 minute ago"
-msgid "%1$d %2$s ago"
+msgid "%1$s is now friends with %2$s"
msgstr ""
-#: ../../include/datetime.php:321
-msgctxt "relative_date"
-msgid "year"
-msgid_plural "years"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:570
+#, php-format
+msgid "No user record found for '%s' "
+msgstr ""
-#: ../../include/datetime.php:324
-msgctxt "relative_date"
-msgid "month"
-msgid_plural "months"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:580
+msgid "Our site encryption key is apparently messed up."
+msgstr ""
-#: ../../include/datetime.php:327
-msgctxt "relative_date"
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:591
+msgid "Empty site URL was provided or URL could not be decrypted by us."
+msgstr ""
-#: ../../include/datetime.php:330
-msgctxt "relative_date"
-msgid "day"
-msgid_plural "days"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:612
+msgid "Contact record was not found for you on our site."
+msgstr ""
-#: ../../include/datetime.php:333
-msgctxt "relative_date"
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:626
+#, php-format
+msgid "Site public key not available in contact record for URL %s."
+msgstr ""
-#: ../../include/datetime.php:336
-msgctxt "relative_date"
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:646
+msgid ""
+"The ID provided by your system is a duplicate on our system. It should work "
+"if you try again."
+msgstr ""
-#: ../../include/datetime.php:339
-msgctxt "relative_date"
-msgid "second"
-msgid_plural "seconds"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:657
+msgid "Unable to set your contact credentials on our system."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:724
+msgid "Unable to update your contact profile details on our system"
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:751
+#: ../../extend/addon/addon/friendica/dfrn_request.php:749
+msgid "[Name Withheld]"
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:796
+#, php-format
+msgid "%1$s has joined %2$s"
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_poll.php:103
+#: ../../extend/addon/addon/friendica/dfrn_poll.php:536
+#, php-format
+msgid "%1$s welcomes %2$s"
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:102
+msgid "This introduction has already been accepted."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:123
+#: ../../extend/addon/addon/friendica/dfrn_request.php:528
+msgid "Profile location is not valid or does not contain profile information."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:128
+#: ../../extend/addon/addon/friendica/dfrn_request.php:533
+msgid "Warning: profile location has no identifiable owner name."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:130
+#: ../../extend/addon/addon/friendica/dfrn_request.php:535
+msgid "Warning: profile location has no profile photo."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:133
+#: ../../extend/addon/addon/friendica/dfrn_request.php:538
+#, 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] ""
-#: ../../include/datetime.php:576
+#: ../../extend/addon/addon/friendica/dfrn_request.php:180
+msgid "Introduction complete."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:224
+msgid "Unrecoverable protocol error."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:252
+msgid "Profile unavailable."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:277
#, php-format
-msgid "%1$s's birthday"
+msgid "%s has received too many connection requests today."
msgstr ""
-#: ../../include/datetime.php:577
+#: ../../extend/addon/addon/friendica/dfrn_request.php:278
+msgid "Spam protection measures have been invoked."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:279
+msgid "Friends are advised to please try again in 24 hours."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:341
+msgid "Invalid locator"
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:350
+msgid "Invalid email address."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:377
+msgid "This account has not been configured for email. Request failed."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:473
+msgid "Unable to resolve your name at the provided location."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:486
+msgid "You have already introduced yourself here."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:490
#, php-format
-msgid "Happy Birthday %1$s"
+msgid "Apparently you are already friends with %s."
msgstr ""
-#: ../../include/text.php:459
-msgid "prev"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:511
+msgid "Invalid profile URL."
msgstr ""
-#: ../../include/text.php:461
-msgid "first"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:517
+msgid "Disallowed profile URL."
msgstr ""
-#: ../../include/text.php:490
-msgid "last"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:587
+msgid "Failed to update contact record."
msgstr ""
-#: ../../include/text.php:493
-msgid "next"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:608
+msgid "Your introduction has been sent."
msgstr ""
-#: ../../include/text.php:504
-msgid "older"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:662
+msgid "Please login to confirm introduction."
msgstr ""
-#: ../../include/text.php:506
-msgid "newer"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:676
+msgid ""
+"Incorrect identity currently logged in. Please login to <strong>this</"
+"strong> profile."
msgstr ""
-#: ../../include/text.php:911
-msgid "No connections"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:690
+#: ../../extend/addon/addon/friendica/dfrn_request.php:707
+msgid "Confirm"
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:702
+msgid "Hide this contact"
msgstr ""
-#: ../../include/text.php:936
+#: ../../extend/addon/addon/friendica/dfrn_request.php:705
#, php-format
-msgid "View all %s connections"
+msgid "Welcome home %s."
msgstr ""
-#: ../../include/text.php:1081 ../../include/text.php:1086
-msgid "poke"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:706
+#, php-format
+msgid "Please confirm your introduction/connection request to %s."
msgstr ""
-#: ../../include/text.php:1081 ../../include/text.php:1086
-#: ../../include/conversation.php:243
-msgid "poked"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:836
+msgid ""
+"Please enter your 'Identity Address' from one of the following supported "
+"communications networks:"
msgstr ""
-#: ../../include/text.php:1087
-msgid "ping"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:857
+#, php-format
+msgid ""
+"If you are not yet a member of the free social web, <a href=\"%s/siteinfo"
+"\">follow this link to find a public Friendica site and join us today</a>."
msgstr ""
-#: ../../include/text.php:1087
-msgid "pinged"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:862
+msgid "Friend/Connection Request"
msgstr ""
-#: ../../include/text.php:1088
-msgid "prod"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:863
+msgid ""
+"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
+"testuser@identi.ca"
msgstr ""
-#: ../../include/text.php:1088
-msgid "prodded"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:864
+msgid "Please answer the following:"
msgstr ""
-#: ../../include/text.php:1089
-msgid "slap"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#, php-format
+msgid "Does %s know you?"
msgstr ""
-#: ../../include/text.php:1089
-msgid "slapped"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:869
+msgid "Add a personal note:"
msgstr ""
-#: ../../include/text.php:1090
-msgid "finger"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:871
+#: ../../include/network.php:2232 ../../include/network.php:2233
+msgid "Friendica"
msgstr ""
-#: ../../include/text.php:1090
-msgid "fingered"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:872
+msgid "StatusNet/Federated Social Web"
msgstr ""
-#: ../../include/text.php:1091
-msgid "rebuff"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:873
+#: ../../include/network.php:2238
+msgid "Diaspora"
msgstr ""
-#: ../../include/text.php:1091
-msgid "rebuffed"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:874
+#, php-format
+msgid ""
+" - please do not use this form. Instead, enter %s into your Diaspora search "
+"bar."
msgstr ""
-#: ../../include/text.php:1103
-msgid "happy"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:875
+msgid "Your Identity Address:"
msgstr ""
-#: ../../include/text.php:1104
-msgid "sad"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:878
+msgid "Submit Request"
msgstr ""
-#: ../../include/text.php:1105
-msgid "mellow"
+#: ../../extend/addon/addon/friendica/friendica.php:113
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:114
+msgid "GNU-Social Protocol Settings updated."
msgstr ""
-#: ../../include/text.php:1106
-msgid "tired"
+#: ../../extend/addon/addon/friendica/friendica.php:124
+msgid "Enable the (experimental) GNU-Social protocol for this channel"
msgstr ""
-#: ../../include/text.php:1107
-msgid "perky"
+#: ../../extend/addon/addon/friendica/friendica.php:128
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
+msgid "GNU-Social Protocol Settings"
msgstr ""
-#: ../../include/text.php:1108
-msgid "angry"
+#: ../../extend/addon/addon/friendica/friendica.php:185
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:319
+msgid "Follow"
msgstr ""
-#: ../../include/text.php:1109
-msgid "stupefied"
+#: ../../extend/addon/addon/friendica/friendica.php:188
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:322
+#, php-format
+msgid "%1$s is now following %2$s"
msgstr ""
-#: ../../include/text.php:1110
-msgid "puzzled"
+#: ../../extend/addon/addon/frphotos/frphotos.php:91
+msgid "Friendica Photo Album Import"
msgstr ""
-#: ../../include/text.php:1111
-msgid "interested"
+#: ../../extend/addon/addon/frphotos/frphotos.php:92
+msgid "This will import all your Friendica photo albums to this Red channel."
msgstr ""
-#: ../../include/text.php:1112
-msgid "bitter"
+#: ../../extend/addon/addon/frphotos/frphotos.php:93
+msgid "Friendica Server base URL"
msgstr ""
-#: ../../include/text.php:1113
-msgid "cheerful"
+#: ../../extend/addon/addon/frphotos/frphotos.php:94
+msgid "Friendica Login Username"
msgstr ""
-#: ../../include/text.php:1114
-msgid "alive"
+#: ../../extend/addon/addon/frphotos/frphotos.php:95
+msgid "Friendica Login Password"
msgstr ""
-#: ../../include/text.php:1115
-msgid "annoyed"
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:125
+msgid "Enable the GNU-Social protocol for this channel"
msgstr ""
-#: ../../include/text.php:1116
-msgid "anxious"
+#: ../../extend/addon/addon/hubwall/hubwall.php:19
+msgid "Send email to all members"
msgstr ""
-#: ../../include/text.php:1117
-msgid "cranky"
+#: ../../extend/addon/addon/hubwall/hubwall.php:33
+#, php-format
+msgid "$1%s Administrator"
msgstr ""
-#: ../../include/text.php:1118
-msgid "disturbed"
+#: ../../extend/addon/addon/hubwall/hubwall.php:50
+#: ../../extend/addon/addon/mailtest/mailtest.php:50
+msgid "No recipients found."
msgstr ""
-#: ../../include/text.php:1119
-msgid "frustrated"
+#: ../../extend/addon/addon/hubwall/hubwall.php:73
+#, php-format
+msgid "%1$d of %2$d messages sent."
msgstr ""
-#: ../../include/text.php:1120
-msgid "depressed"
+#: ../../extend/addon/addon/hubwall/hubwall.php:81
+msgid "Send email to all hub members."
msgstr ""
-#: ../../include/text.php:1121
-msgid "motivated"
+#: ../../extend/addon/addon/hubwall/hubwall.php:92
+#: ../../extend/addon/addon/mailtest/mailtest.php:96
+msgid "Message subject"
msgstr ""
-#: ../../include/text.php:1122
-msgid "relaxed"
+#: ../../extend/addon/addon/hubwall/hubwall.php:93
+msgid "Sender Email address"
msgstr ""
-#: ../../include/text.php:1123
-msgid "surprised"
+#: ../../extend/addon/addon/hubwall/hubwall.php:94
+msgid "Test mode (only send to hub administrator)"
msgstr ""
-#: ../../include/text.php:1310 ../../include/js_strings.php:70
-msgid "Monday"
+#: ../../extend/addon/addon/ijpost/ijpost.php:42
+msgid "Post to Insanejournal"
msgstr ""
-#: ../../include/text.php:1310 ../../include/js_strings.php:71
-msgid "Tuesday"
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+msgid "Enable InsaneJournal Post Plugin"
msgstr ""
-#: ../../include/text.php:1310 ../../include/js_strings.php:72
-msgid "Wednesday"
+#: ../../extend/addon/addon/ijpost/ijpost.php:77
+msgid "InsaneJournal username"
msgstr ""
-#: ../../include/text.php:1310 ../../include/js_strings.php:73
-msgid "Thursday"
+#: ../../extend/addon/addon/ijpost/ijpost.php:81
+msgid "InsaneJournal password"
msgstr ""
-#: ../../include/text.php:1310 ../../include/js_strings.php:74
-msgid "Friday"
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+msgid "Post to InsaneJournal by default"
msgstr ""
-#: ../../include/text.php:1310 ../../include/js_strings.php:75
-msgid "Saturday"
+#: ../../extend/addon/addon/ijpost/ijpost.php:89
+msgid "InsaneJournal Post Settings"
msgstr ""
-#: ../../include/text.php:1310 ../../include/js_strings.php:69
-msgid "Sunday"
+#: ../../extend/addon/addon/ijpost/ijpost.php:104
+msgid "Insane Journal Settings saved."
msgstr ""
-#: ../../include/text.php:1314 ../../include/js_strings.php:45
-msgid "January"
+#: ../../extend/addon/addon/irc/irc.php:45
+msgid "Channels to auto connect"
msgstr ""
-#: ../../include/text.php:1314 ../../include/js_strings.php:46
-msgid "February"
+#: ../../extend/addon/addon/irc/irc.php:45
+#: ../../extend/addon/addon/irc/irc.php:49
+msgid "Comma separated list"
msgstr ""
-#: ../../include/text.php:1314 ../../include/js_strings.php:47
-msgid "March"
+#: ../../extend/addon/addon/irc/irc.php:49
+#: ../../extend/addon/addon/irc/irc.php:96
+msgid "Popular Channels"
msgstr ""
-#: ../../include/text.php:1314 ../../include/js_strings.php:48
-msgid "April"
+#: ../../extend/addon/addon/irc/irc.php:53
+msgid "IRC Settings"
msgstr ""
-#: ../../include/text.php:1314
-msgid "May"
+#: ../../extend/addon/addon/irc/irc.php:69
+msgid "IRC settings saved."
msgstr ""
-#: ../../include/text.php:1314 ../../include/js_strings.php:50
-msgid "June"
+#: ../../extend/addon/addon/irc/irc.php:74
+msgid "IRC Chatroom"
msgstr ""
-#: ../../include/text.php:1314 ../../include/js_strings.php:51
-msgid "July"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:305
+#: ../../include/channel.php:1056 ../../include/channel.php:1218
+msgid "Status:"
msgstr ""
-#: ../../include/text.php:1314 ../../include/js_strings.php:52
-msgid "August"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+msgid "Activate addon"
msgstr ""
-#: ../../include/text.php:1314 ../../include/js_strings.php:53
-msgid "September"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+msgid "Hide Jappixmini Chat-Widget from the webinterface"
msgstr ""
-#: ../../include/text.php:1314 ../../include/js_strings.php:54
-msgid "October"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:318
+msgid "Jabber username"
msgstr ""
-#: ../../include/text.php:1314 ../../include/js_strings.php:55
-msgid "November"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:324
+msgid "Jabber server"
msgstr ""
-#: ../../include/text.php:1314 ../../include/js_strings.php:56
-msgid "December"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:330
+msgid "Jabber BOSH host URL"
msgstr ""
-#: ../../include/text.php:1391 ../../include/text.php:1395
-msgid "Unknown Attachment"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:337
+msgid "Jabber password"
msgstr ""
-#: ../../include/text.php:1397
-msgid "unknown"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+msgid "Encrypt Jabber password with Hubzilla password"
msgstr ""
-#: ../../include/text.php:1433
-msgid "remove category"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:347
+#: ../../extend/addon/addon/redred/redred.php:115
+msgid "Hubzilla password"
msgstr ""
-#: ../../include/text.php:1510
-msgid "remove from file"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+msgid "Approve subscription requests from Hubzilla contacts automatically"
msgstr ""
-#: ../../include/text.php:1814 ../../include/language.php:367
-msgid "default"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+msgid "Purge internal list of jabber addresses of contacts"
msgstr ""
-#: ../../include/text.php:1822
-msgid "Page layout"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:364
+msgid "Configuration Help"
msgstr ""
-#: ../../include/text.php:1822
-msgid "You can create your own with the layouts tool"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:368
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149
+msgid "Add Contact"
msgstr ""
-#: ../../include/text.php:1864
-msgid "Page content type"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
+msgid "Jappix Mini Settings"
msgstr ""
-#: ../../include/text.php:1997
-msgid "activity"
+#: ../../extend/addon/addon/js_upload/js_upload.php:44
+msgid "Upload a file"
msgstr ""
-#: ../../include/text.php:2308
-msgid "Design Tools"
+#: ../../extend/addon/addon/js_upload/js_upload.php:45
+msgid "Drop files here to upload"
msgstr ""
-#: ../../include/text.php:2314
-msgid "Pages"
+#: ../../extend/addon/addon/js_upload/js_upload.php:47
+msgid "Failed"
msgstr ""
-#: ../../include/text.php:2336
-msgid "Import website..."
+#: ../../extend/addon/addon/js_upload/js_upload.php:315
+msgid "No files were uploaded."
msgstr ""
-#: ../../include/text.php:2337
-msgid "Select folder to import"
+#: ../../extend/addon/addon/js_upload/js_upload.php:322
+msgid "Uploaded file is empty"
msgstr ""
-#: ../../include/text.php:2338
-msgid "Import from a zipped folder:"
+#: ../../extend/addon/addon/js_upload/js_upload.php:335
+msgid "Image exceeds size limit of "
msgstr ""
-#: ../../include/text.php:2339
-msgid "Import from cloud files:"
+#: ../../extend/addon/addon/js_upload/js_upload.php:347
+msgid "File has an invalid extension, it should be one of "
msgstr ""
-#: ../../include/text.php:2340
-msgid "/cloud/channel/path/to/folder"
+#: ../../extend/addon/addon/js_upload/js_upload.php:359
+msgid "Upload was cancelled, or server error encountered"
msgstr ""
-#: ../../include/text.php:2341
-msgid "Enter path to website files"
+#: ../../extend/addon/addon/ldapauth/ldapauth.php:61
+msgid "An account has been created for you."
msgstr ""
-#: ../../include/text.php:2342
-msgid "Select folder"
+#: ../../extend/addon/addon/ldapauth/ldapauth.php:68
+msgid "Authentication successful but rejected: account creation is disabled."
msgstr ""
-#: ../../include/text.php:2343
-msgid "Export website..."
+#: ../../extend/addon/addon/libertree/libertree.php:38
+msgid "Post to Libertree"
msgstr ""
-#: ../../include/text.php:2344
-msgid "Export to a zip file"
+#: ../../extend/addon/addon/libertree/libertree.php:69
+msgid "Enable Libertree Post Plugin"
msgstr ""
-#: ../../include/text.php:2345
-msgid "website.zip"
+#: ../../extend/addon/addon/libertree/libertree.php:73
+msgid "Libertree API token"
msgstr ""
-#: ../../include/text.php:2346
-msgid "Enter a name for the zip file."
+#: ../../extend/addon/addon/libertree/libertree.php:77
+msgid "Libertree site URL"
msgstr ""
-#: ../../include/text.php:2347
-msgid "Export to cloud files"
+#: ../../extend/addon/addon/libertree/libertree.php:81
+msgid "Post to Libertree by default"
msgstr ""
-#: ../../include/text.php:2348
-msgid "/path/to/export/folder"
+#: ../../extend/addon/addon/libertree/libertree.php:85
+msgid "Libertree Post Settings"
msgstr ""
-#: ../../include/text.php:2349
-msgid "Enter a path to a cloud files destination."
+#: ../../extend/addon/addon/libertree/libertree.php:99
+msgid "Libertree Settings saved."
msgstr ""
-#: ../../include/text.php:2350
-msgid "Specify folder"
+#: ../../extend/addon/addon/ljpost/ljpost.php:42
+msgid "Post to LiveJournal"
msgstr ""
-#: ../../include/bbcode.php:134 ../../include/bbcode.php:902
-#: ../../include/bbcode.php:905 ../../include/bbcode.php:910
-#: ../../include/bbcode.php:913 ../../include/bbcode.php:916
-#: ../../include/bbcode.php:919 ../../include/bbcode.php:924
-#: ../../include/bbcode.php:927 ../../include/bbcode.php:932
-#: ../../include/bbcode.php:935 ../../include/bbcode.php:938
-#: ../../include/bbcode.php:941
-msgid "Image/photo"
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+msgid "Enable LiveJournal Post Plugin"
msgstr ""
-#: ../../include/bbcode.php:173 ../../include/bbcode.php:952
-msgid "Encrypted content"
+#: ../../extend/addon/addon/ljpost/ljpost.php:74
+msgid "LiveJournal username"
msgstr ""
-#: ../../include/bbcode.php:189
-#, php-format
-msgid "Install %s element: "
+#: ../../extend/addon/addon/ljpost/ljpost.php:78
+msgid "LiveJournal password"
msgstr ""
-#: ../../include/bbcode.php:193
-#, php-format
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+msgid "Post to LiveJournal by default"
+msgstr ""
+
+#: ../../extend/addon/addon/ljpost/ljpost.php:86
+msgid "LiveJournal Post Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/ljpost/ljpost.php:101
+msgid "LiveJournal Settings saved."
+msgstr ""
+
+#: ../../extend/addon/addon/logrot/logrot.php:36
+msgid "Logfile archive directory"
+msgstr ""
+
+#: ../../extend/addon/addon/logrot/logrot.php:36
+msgid "Directory to store rotated logs"
+msgstr ""
+
+#: ../../extend/addon/addon/logrot/logrot.php:37
+msgid "Logfile size in bytes before rotating"
+msgstr ""
+
+#: ../../extend/addon/addon/logrot/logrot.php:38
+msgid "Number of logfiles to retain"
+msgstr ""
+
+#: ../../extend/addon/addon/mailhost/mailhost.php:36
+msgid "Email notification hub"
+msgstr ""
+
+#: ../../extend/addon/addon/mailhost/mailhost.php:36
+msgid "Hostname"
+msgstr ""
+
+#: ../../extend/addon/addon/mailhost/mailhost.php:40
+msgid "Mailhost Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/mailhost/mailhost.php:54
+msgid "MAILHOST Settings saved."
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:19
+msgid "lonely"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:20
+msgid "drunk"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:21
+msgid "horny"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:22
+msgid "stoned"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:23
+msgid "fucked up"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:24
+msgid "clusterfucked"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:25
+msgid "crazy"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:26
+msgid "hurt"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:27
+msgid "sleepy"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:28
+msgid "grumpy"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:29
+msgid "high"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:30
+msgid "semi-conscious"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:31
+msgid "in love"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:32
+msgid "in lust"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:33
+msgid "naked"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:34
+msgid "stinky"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:35
+msgid "sweaty"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:36
+msgid "bleeding out"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:37
+msgid "victorious"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:38
+msgid "defeated"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:39
+msgid "envious"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:40
+msgid "jealous"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:19
+msgid "bitchslap"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:19
+msgid "bitchslapped"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:20
+msgid "shag"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:20
+msgid "shagged"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:21
+msgid "patent"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:21
+msgid "patented"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:22
+msgid "hug"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:22
+msgid "hugged"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:23
+msgid "murder"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:23
+msgid "murdered"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:24
+msgid "worship"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:24
+msgid "worshipped"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:25
+msgid "kiss"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:25
+msgid "kissed"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:26
+msgid "tempt"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:26
+msgid "tempted"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:27
+msgid "raise eyebrows at"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:27
+msgid "raised their eyebrows at"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:28
+msgid "insult"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:28
+msgid "insulted"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:29
+msgid "praise"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:29
+msgid "praised"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:30
+msgid "be dubious of"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:30
+msgid "was dubious of"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:31
+msgid "eat"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:31
+msgid "ate"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:32
+msgid "giggle and fawn at"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:32
+msgid "giggled and fawned at"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:33
+msgid "doubt"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:33
+msgid "doubted"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:34
+msgid "glare"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:34
+msgid "glared at"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:35
+msgid "fuck"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:35
+msgid "fucked"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:36
+msgid "bonk"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:36
+msgid "bonked"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:37
+msgid "declare undying love for"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:37
+msgid "declared undying love for"
+msgstr ""
+
+#: ../../extend/addon/addon/msgfooter/msgfooter.php:46
+#: ../../extend/addon/addon/xmpp/xmpp.php:91
+msgid "Save Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/msgfooter/msgfooter.php:47
+msgid "text to include in all outgoing posts from this site"
+msgstr ""
+
+#: ../../extend/addon/addon/nofed/nofed.php:42
+msgid "Federate"
+msgstr ""
+
+#: ../../extend/addon/addon/nofed/nofed.php:56
+msgid "nofed Settings saved."
+msgstr ""
+
+#: ../../extend/addon/addon/nofed/nofed.php:72
+msgid "Allow Federation Toggle"
+msgstr ""
+
+#: ../../extend/addon/addon/nofed/nofed.php:76
+msgid "Federate posts by default"
+msgstr ""
+
+#: ../../extend/addon/addon/nofed/nofed.php:80
+msgid "NoFed Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/nsabait/nsabait.php:125
+msgid "Nsabait Settings updated."
+msgstr ""
+
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+msgid "Enable NSAbait Plugin"
+msgstr ""
+
+#: ../../extend/addon/addon/nsabait/nsabait.php:161
+msgid "NSAbait Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:80
msgid ""
-"This post contains an installable %s element, however you lack permissions "
-"to install it on this site."
+"This plugin looks in posts for the words/text you specify below, and "
+"collapses any content containing those keywords so it is not displayed at "
+"inappropriate times, such as sexual innuendo that may be improper in a work "
+"setting. It is polite and recommended to tag any content containing nudity "
+"with #NSFW. This filter can also match any other word/text you specify, and "
+"can thereby be used as a general purpose content filter."
msgstr ""
-#: ../../include/bbcode.php:272
-#, php-format
-msgid "%1$s wrote the following %2$s %3$s"
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+msgid "Enable Content filter"
msgstr ""
-#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
-msgid "Click to open/close"
+#: ../../extend/addon/addon/nsfw/nsfw.php:88
+msgid "Comma separated list of keywords to hide"
msgstr ""
-#: ../../include/bbcode.php:357
-msgid "spoiler"
+#: ../../extend/addon/addon/nsfw/nsfw.php:88
+msgid "Use /expression/ to provide regular expressions"
msgstr ""
-#: ../../include/bbcode.php:633 ../../include/wiki.php:525
-msgid "Different viewers will see this text differently"
+#: ../../extend/addon/addon/nsfw/nsfw.php:92
+msgid "Not Safe For Work Settings"
msgstr ""
-#: ../../include/bbcode.php:890
-msgid "$1 wrote:"
+#: ../../extend/addon/addon/nsfw/nsfw.php:92
+msgid "General Purpose Content Filter"
+msgstr ""
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:110
+msgid "NSFW Settings saved."
msgstr ""
-#: ../../include/photos.php:114
+#: ../../extend/addon/addon/nsfw/nsfw.php:207
+msgid "Possible adult content"
+msgstr ""
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:211
#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
+msgid "%s - click to open/close"
msgstr ""
-#: ../../include/photos.php:121
-msgid "Image file is empty."
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:49
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:127
+msgid "System defaults:"
msgstr ""
-#: ../../include/photos.php:259
-msgid "Photo storage failed."
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
+msgid "Preferred Clipart IDs"
msgstr ""
-#: ../../include/photos.php:299
-msgid "a new photo"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
+msgid "List of preferred clipart ids. These will be shown first."
msgstr ""
-#: ../../include/photos.php:303
-#, php-format
-msgctxt "photo_upload"
-msgid "%1$s posted %2$s to %3$s"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
+msgid "Default Search Term"
msgstr ""
-#: ../../include/photos.php:506 ../../include/conversation.php:1675
-msgid "Photo Albums"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
+msgid "The default search term. These will be shown second."
msgstr ""
-#: ../../include/photos.php:510
-msgid "Upload New Photos"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
+msgid "Return After"
msgstr ""
-#: ../../include/dir_fns.php:141
-msgid "Directory Options"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
+msgid "Page to load after image selection."
msgstr ""
-#: ../../include/dir_fns.php:143
-msgid "Safe Mode"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:57
+#: ../../include/channel.php:965 ../../include/nav.php:93
+msgid "Edit Profile"
msgstr ""
-#: ../../include/dir_fns.php:144
-msgid "Public Forums Only"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:58
+msgid "Profile List"
msgstr ""
-#: ../../include/dir_fns.php:145
-msgid "This Website Only"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:60
+msgid "Order of Preferred"
msgstr ""
-#: ../../include/features.php:58
-msgid "General Features"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:60
+msgid "Sort order of preferred clipart ids."
msgstr ""
-#: ../../include/features.php:63
-msgid "Multiple Profiles"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
+msgid "Newest first"
msgstr ""
-#: ../../include/features.php:64
-msgid "Ability to create multiple profiles"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:64
+msgid "As entered"
msgstr ""
-#: ../../include/features.php:72
-msgid "Advanced Profiles"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:66
+msgid "Order of other"
msgstr ""
-#: ../../include/features.php:73
-msgid "Additional profile sections and selections"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:66
+msgid "Sort order of other clipart ids."
msgstr ""
-#: ../../include/features.php:81
-msgid "Profile Import/Export"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:68
+msgid "Most downloaded first"
msgstr ""
-#: ../../include/features.php:82
-msgid "Save and load profile details across sites/channels"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:69
+msgid "Most liked first"
msgstr ""
-#: ../../include/features.php:90
-msgid "Web Pages"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:71
+msgid "Preferred IDs Message"
msgstr ""
-#: ../../include/features.php:91
-msgid "Provide managed web pages on your channel"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:71
+msgid "Message to display above preferred results."
msgstr ""
-#: ../../include/features.php:100
-msgid "Provide a wiki for your channel"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:77
+msgid "Uploaded by: "
msgstr ""
-#: ../../include/features.php:117
-msgid "Private Notes"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:77
+msgid "Drawn by: "
msgstr ""
-#: ../../include/features.php:118
-msgid "Enables a tool to store notes and reminders (note: not encrypted)"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:191
+msgid "Or select from a free OpenClipart.org image:"
msgstr ""
-#: ../../include/features.php:126
-msgid "Navigation Channel Select"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:194
+msgid "Search Term"
msgstr ""
-#: ../../include/features.php:127
-msgid "Change channels directly from within the navigation dropdown menu"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:216
+msgid "Unknown error. Please try again later."
msgstr ""
-#: ../../include/features.php:135
-msgid "Photo Location"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:303
+msgid "Profile photo updated successfully."
msgstr ""
-#: ../../include/features.php:136
-msgid "If location data is available on uploaded photos, link this to a map."
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:146
+msgid "View Larger"
msgstr ""
-#: ../../include/features.php:144
-msgid "Access Controlled Chatrooms"
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+msgid "Tile Server URL"
msgstr ""
-#: ../../include/features.php:145
-msgid "Provide chatrooms and chat services with access control."
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+msgid ""
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank"
+"\">public tile servers</a>"
msgstr ""
-#: ../../include/features.php:153
-msgid "Smart Birthdays"
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+msgid "Nominatim (reverse geocoding) Server URL"
msgstr ""
-#: ../../include/features.php:154
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
msgid ""
-"Make birthday events timezone aware in case your friends are scattered "
-"across the planet."
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target="
+"\"_blank\">Nominatim servers</a>"
msgstr ""
-#: ../../include/features.php:162
-msgid "Advanced Directory Search"
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+msgid "Default zoom"
msgstr ""
-#: ../../include/features.php:163
-msgid "Allows creation of complex directory search queries"
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+msgid ""
+"The default zoom level. (1:world, 18:highest, also depends on tile server)"
msgstr ""
-#: ../../include/features.php:171
-msgid "Advanced Theme and Layout Settings"
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+msgid "Include marker on map"
msgstr ""
-#: ../../include/features.php:172
-msgid "Allows fine tuning of themes and page layouts"
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+msgid "Include a marker on the map."
msgstr ""
-#: ../../include/features.php:182
-msgid "Post Composition Features"
+#: ../../extend/addon/addon/pageheader/pageheader.php:43
+msgid "Message to display on every page on this server"
msgstr ""
-#: ../../include/features.php:186
-msgid "Large Photos"
+#: ../../extend/addon/addon/pageheader/pageheader.php:48
+msgid "Pageheader Settings"
msgstr ""
-#: ../../include/features.php:187
+#: ../../extend/addon/addon/pageheader/pageheader.php:64
+msgid "pageheader Settings saved."
+msgstr ""
+
+#: ../../extend/addon/addon/piwik/piwik.php:85
msgid ""
-"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
-"(640px) photo thumbnails"
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
msgstr ""
-#: ../../include/features.php:196
-msgid "Automatically import channel content from other channels or feeds"
+#: ../../extend/addon/addon/piwik/piwik.php:88
+#, php-format
+msgid ""
+"If you do not want that your visits are logged this way you <a href='%s'>can "
+"set a cookie to prevent Piwik from tracking further visits of the site</a> "
+"(opt-out)."
msgstr ""
-#: ../../include/features.php:204
-msgid "Even More Encryption"
+#: ../../extend/addon/addon/piwik/piwik.php:96
+msgid "Piwik Base URL"
msgstr ""
-#: ../../include/features.php:205
+#: ../../extend/addon/addon/piwik/piwik.php:96
msgid ""
-"Allow optional encryption of content end-to-end with a shared secret key"
+"Absolute path to your Piwik installation. (without protocol (http/s), with "
+"trailing slash)"
msgstr ""
-#: ../../include/features.php:213
-msgid "Enable Voting Tools"
+#: ../../extend/addon/addon/piwik/piwik.php:97
+msgid "Site ID"
msgstr ""
-#: ../../include/features.php:214
-msgid "Provide a class of post which others can vote on"
+#: ../../extend/addon/addon/piwik/piwik.php:98
+msgid "Show opt-out cookie link?"
msgstr ""
-#: ../../include/features.php:222
-msgid "Disable Comments"
+#: ../../extend/addon/addon/piwik/piwik.php:99
+msgid "Asynchronous tracking"
msgstr ""
-#: ../../include/features.php:223
-msgid "Provide the option to disable comments for a post"
+#: ../../extend/addon/addon/piwik/piwik.php:100
+msgid "Enable frontend JavaScript error tracking"
msgstr ""
-#: ../../include/features.php:231
-msgid "Delayed Posting"
+#: ../../extend/addon/addon/piwik/piwik.php:100
+msgid "This feature requires Piwik >= 2.2.0"
msgstr ""
-#: ../../include/features.php:232
-msgid "Allow posts to be published at a later date"
+#: ../../extend/addon/addon/planets/planets.php:121
+msgid "Planets Settings updated."
msgstr ""
-#: ../../include/features.php:240
-msgid "Content Expiration"
+#: ../../extend/addon/addon/planets/planets.php:153
+msgid "Enable Planets Plugin"
msgstr ""
-#: ../../include/features.php:241
-msgid "Remove posts/comments and/or private messages at a future time"
+#: ../../extend/addon/addon/planets/planets.php:157
+msgid "Planets Settings"
msgstr ""
-#: ../../include/features.php:249
-msgid "Suppress Duplicate Posts/Comments"
+#: ../../extend/addon/addon/pumpio/pumpio.php:148
+msgid "You are now authenticated to pumpio."
msgstr ""
-#: ../../include/features.php:250
-msgid ""
-"Prevent posts with identical content to be published with less than two "
-"minutes in between submissions."
+#: ../../extend/addon/addon/pumpio/pumpio.php:149
+msgid "return to the featured settings page"
msgstr ""
-#: ../../include/features.php:261
-msgid "Network and Stream Filtering"
+#: ../../extend/addon/addon/pumpio/pumpio.php:163
+msgid "Post to Pump.io"
msgstr ""
-#: ../../include/features.php:265
-msgid "Search by Date"
+#: ../../extend/addon/addon/pumpio/pumpio.php:198
+msgid "Pump.io servername"
msgstr ""
-#: ../../include/features.php:266
-msgid "Ability to select posts by date ranges"
+#: ../../extend/addon/addon/pumpio/pumpio.php:198
+msgid "Without \"http://\" or \"https://\""
msgstr ""
-#: ../../include/features.php:274 ../../include/group.php:311
-msgid "Privacy Groups"
+#: ../../extend/addon/addon/pumpio/pumpio.php:202
+msgid "Pump.io username"
msgstr ""
-#: ../../include/features.php:275
-msgid "Enable management and selection of privacy groups"
+#: ../../extend/addon/addon/pumpio/pumpio.php:202
+msgid "Without the servername"
msgstr ""
-#: ../../include/features.php:283 ../../include/widgets.php:283
-msgid "Saved Searches"
+#: ../../extend/addon/addon/pumpio/pumpio.php:213
+msgid "You are not authenticated to pumpio"
msgstr ""
-#: ../../include/features.php:284
-msgid "Save search terms for re-use"
+#: ../../extend/addon/addon/pumpio/pumpio.php:215
+msgid "(Re-)Authenticate your pump.io connection"
msgstr ""
-#: ../../include/features.php:292
-msgid "Network Personal Tab"
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+msgid "Enable pump.io Post Plugin"
msgstr ""
-#: ../../include/features.php:293
-msgid "Enable tab to display only Network posts that you've interacted on"
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+msgid "Post to pump.io by default"
msgstr ""
-#: ../../include/features.php:301
-msgid "Network New Tab"
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+msgid "Should posts be public"
msgstr ""
-#: ../../include/features.php:302
-msgid "Enable tab to display all new Network activity"
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+msgid "Mirror all public posts"
msgstr ""
-#: ../../include/features.php:310
-msgid "Affinity Tool"
+#: ../../extend/addon/addon/pumpio/pumpio.php:237
+msgid "Pump.io Post Settings"
msgstr ""
-#: ../../include/features.php:311
-msgid "Filter stream activity by depth of relationships"
+#: ../../extend/addon/addon/pumpio/pumpio.php:266
+msgid "PumpIO Settings saved."
msgstr ""
-#: ../../include/features.php:320
-msgid "Show friend and connection suggestions"
+#: ../../extend/addon/addon/qrator/qrator.php:48
+msgid "QR code"
msgstr ""
-#: ../../include/features.php:328
-msgid "Connection Filtering"
+#: ../../extend/addon/addon/qrator/qrator.php:63
+msgid "QR Generator"
msgstr ""
-#: ../../include/features.php:329
-msgid "Filter incoming posts from connections based on keywords/content"
+#: ../../extend/addon/addon/qrator/qrator.php:64
+msgid "Enter some text"
msgstr ""
-#: ../../include/features.php:341
-msgid "Post/Comment Tools"
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+msgid "Enable Rainbowtag"
msgstr ""
-#: ../../include/features.php:345
-msgid "Community Tagging"
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
+msgid "Rainbowtag Settings"
msgstr ""
-#: ../../include/features.php:346
-msgid "Ability to tag existing posts"
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:101
+msgid "Rainbowtag Settings saved."
msgstr ""
-#: ../../include/features.php:354
-msgid "Post Categories"
+#: ../../extend/addon/addon/randpost/randpost.php:97
+msgid "You're welcome."
msgstr ""
-#: ../../include/features.php:355
-msgid "Add categories to your posts"
+#: ../../extend/addon/addon/randpost/randpost.php:98
+msgid "Ah shucks..."
msgstr ""
-#: ../../include/features.php:363
-msgid "Emoji Reactions"
+#: ../../extend/addon/addon/randpost/randpost.php:99
+msgid "Don't mention it."
msgstr ""
-#: ../../include/features.php:364
-msgid "Add emoji reaction ability to posts"
+#: ../../extend/addon/addon/randpost/randpost.php:100
+msgid "&lt;blush&gt;"
msgstr ""
-#: ../../include/features.php:372 ../../include/widgets.php:346
-#: ../../include/contact_widgets.php:53
-msgid "Saved Folders"
+#: ../../extend/addon/addon/redfiles/redfiles.php:119
+msgid "Redmatrix File Storage Import"
msgstr ""
-#: ../../include/features.php:373
-msgid "Ability to file posts under folders"
+#: ../../extend/addon/addon/redfiles/redfiles.php:120
+msgid "This will import all your Redmatrix cloud files to this channel."
msgstr ""
-#: ../../include/features.php:381
-msgid "Dislike Posts"
+#: ../../extend/addon/addon/redfiles/redfiles.php:121
+#: ../../extend/addon/addon/redphotos/redphotos.php:131
+msgid "Redmatrix Server base URL"
msgstr ""
-#: ../../include/features.php:382
-msgid "Ability to dislike posts/comments"
+#: ../../extend/addon/addon/redfiles/redfiles.php:122
+#: ../../extend/addon/addon/redphotos/redphotos.php:132
+msgid "Redmatrix Login Username"
msgstr ""
-#: ../../include/features.php:390
-msgid "Star Posts"
+#: ../../extend/addon/addon/redfiles/redfiles.php:123
+#: ../../extend/addon/addon/redphotos/redphotos.php:133
+msgid "Redmatrix Login Password"
msgstr ""
-#: ../../include/features.php:391
-msgid "Ability to mark special posts with a star indicator"
+#: ../../extend/addon/addon/redfiles/redfilehelper.php:67
+msgid "file"
msgstr ""
-#: ../../include/features.php:399
-msgid "Tag Cloud"
+#: ../../extend/addon/addon/redphotos/redphotos.php:106
+msgid "Photos imported"
msgstr ""
-#: ../../include/features.php:400
-msgid "Provide a personal tag cloud on your channel page"
+#: ../../extend/addon/addon/redphotos/redphotos.php:129
+msgid "Redmatrix Photo Album Import"
msgstr ""
-#: ../../include/features.php:412
-msgid "Premium Channel"
+#: ../../extend/addon/addon/redphotos/redphotos.php:130
+msgid "This will import all your Redmatrix photo albums to this channel."
msgstr ""
-#: ../../include/features.php:413
+#: ../../extend/addon/addon/redphotos/redphotos.php:134
+msgid "Import just this album"
+msgstr ""
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:134
+msgid "Leave blank to import all albums"
+msgstr ""
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:135
+msgid "Maximum count to import"
+msgstr ""
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:135
+msgid "0 or blank to import all available"
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:45
+msgid "Post to Red"
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:60
+msgid "Channel is required."
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:65
+msgid "Invalid channel."
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:76
+msgid "redred Settings saved."
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:95
+msgid "Allow posting to another Hubzilla Channel"
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:99
+msgid "Send public postings to Hubzilla channel by default"
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:103
+msgid "Hubzilla API Path"
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:103
+#: ../../extend/addon/addon/rtof/rtof.php:89
+msgid "https://{sitename}/api"
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:107
+msgid "Hubzilla login name"
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:111
+msgid "Hubzilla channel name"
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:111
+#: ../../extend/addon/addon/openid/MysqlProvider.php:54
+msgid "Nickname"
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:119
+msgid "Hubzilla Crosspost Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/rtof/rtof.php:45
+msgid "Post to Friendica"
+msgstr ""
+
+#: ../../extend/addon/addon/rtof/rtof.php:62
+msgid "rtof Settings saved."
+msgstr ""
+
+#: ../../extend/addon/addon/rtof/rtof.php:81
+msgid "Allow posting to Friendica"
+msgstr ""
+
+#: ../../extend/addon/addon/rtof/rtof.php:85
+msgid "Send public postings to Friendica by default"
+msgstr ""
+
+#: ../../extend/addon/addon/rtof/rtof.php:89
+msgid "Friendica API Path"
+msgstr ""
+
+#: ../../extend/addon/addon/rtof/rtof.php:93
+msgid "Friendica login name"
+msgstr ""
+
+#: ../../extend/addon/addon/rtof/rtof.php:97
+msgid "Friendica password"
+msgstr ""
+
+#: ../../extend/addon/addon/rtof/rtof.php:101
+msgid "Hubzilla to Friendica Post Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/sendzid/sendzid.php:25
+msgid "Extended Identity Sharing"
+msgstr ""
+
+#: ../../extend/addon/addon/sendzid/sendzid.php:26
msgid ""
-"Allows you to set restrictions and terms on those that connect with your "
-"channel"
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
msgstr ""
-#: ../../include/network.php:704
-msgid "view full size"
+#: ../../extend/addon/addon/skeleton/skeleton.php:59
+msgid "Some setting"
msgstr ""
-#: ../../include/network.php:1937
-msgid "Administrator"
+#: ../../extend/addon/addon/skeleton/skeleton.php:61
+msgid "A setting"
msgstr ""
-#: ../../include/network.php:1953
-msgid "No Subject"
+#: ../../extend/addon/addon/skeleton/skeleton.php:64
+msgid "Skeleton Settings"
msgstr ""
-#: ../../include/network.php:2207 ../../include/network.php:2208
-msgid "Friendica"
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+msgid "Deactivate the feature"
msgstr ""
-#: ../../include/network.php:2209
-msgid "OStatus"
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+msgid "Hide the button and show the smilies directly."
msgstr ""
-#: ../../include/network.php:2210
-msgid "GNU-Social"
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
+msgid "Smileybutton Settings"
msgstr ""
-#: ../../include/network.php:2211
-msgid "RSS/Atom"
+#: ../../extend/addon/addon/startpage/startpage.php:109
+msgid "Page to load after login"
msgstr ""
-#: ../../include/network.php:2213
-msgid "Diaspora"
+#: ../../extend/addon/addon/startpage/startpage.php:109
+msgid ""
+"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
+"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
+"blank for default network page (grid)."
msgstr ""
-#: ../../include/network.php:2214
-msgid "Facebook"
+#: ../../extend/addon/addon/startpage/startpage.php:113
+msgid "Startpage Settings"
msgstr ""
-#: ../../include/network.php:2215
-msgid "Zot"
+#: ../../extend/addon/addon/statusnet/statusnet.php:143
+msgid "Post to GNU social"
msgstr ""
-#: ../../include/network.php:2216
-msgid "LinkedIn"
+#: ../../extend/addon/addon/statusnet/statusnet.php:195
+msgid ""
+"Please contact your site administrator.<br />The provided API URL is not "
+"valid."
msgstr ""
-#: ../../include/network.php:2217
-msgid "XMPP/IM"
+#: ../../extend/addon/addon/statusnet/statusnet.php:232
+msgid "We could not contact the GNU social API with the Path you entered."
msgstr ""
-#: ../../include/network.php:2218
-msgid "MySpace"
+#: ../../extend/addon/addon/statusnet/statusnet.php:266
+msgid "GNU social settings updated."
msgstr ""
-#: ../../include/widgets.php:46 ../../include/widgets.php:465
-#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
-#: ../../include/contact_widgets.php:91
-msgid "Categories"
+#: ../../extend/addon/addon/statusnet/statusnet.php:310
+msgid "Globally Available GNU social OAuthKeys"
msgstr ""
-#: ../../include/widgets.php:103
-msgid "System"
+#: ../../extend/addon/addon/statusnet/statusnet.php:312
+msgid ""
+"There are preconfigured OAuth key pairs for some GNU social servers "
+"available. If you are using one of them, please use these credentials.<br /"
+">If not feel free to connect to any other GNU social instance (see below)."
msgstr ""
-#: ../../include/widgets.php:106
-msgid "New App"
+#: ../../extend/addon/addon/statusnet/statusnet.php:327
+msgid "Provide your own OAuth Credentials"
msgstr ""
-#: ../../include/widgets.php:154
-msgid "Suggestions"
+#: ../../extend/addon/addon/statusnet/statusnet.php:329
+msgid ""
+"No consumer key pair for GNU social found. Register your Hubzilla Account as "
+"an desktop client on your GNU social 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 "
+"Hubzilla installation at your favourite GNU social installation."
msgstr ""
-#: ../../include/widgets.php:155
-msgid "See more..."
+#: ../../extend/addon/addon/statusnet/statusnet.php:333
+msgid "OAuth Consumer Key"
msgstr ""
-#: ../../include/widgets.php:175
+#: ../../extend/addon/addon/statusnet/statusnet.php:337
+msgid "OAuth Consumer Secret"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:341
+msgid "Base API Path"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:341
+msgid "Remember the trailing /"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:345
+msgid "GNU social application name"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:368
+msgid ""
+"To connect to your GNU social account click the button below to get a "
+"security code from GNU social which you have to copy into the input box "
+"below and submit the form. Only your <strong>public</strong> posts will be "
+"posted to GNU social."
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:370
+msgid "Log in with GNU social"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:373
+msgid "Copy the security code from GNU social here"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:383
+msgid "Cancel Connection Process"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:385
+msgid "Current GNU social API is"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+msgid "Cancel GNU social Connection"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:401
+#: ../../extend/addon/addon/twitter/twitter.php:232
+msgid "Currently connected to: "
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:406
+msgid ""
+"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to GNU social will lead the visitor to a blank page "
+"informing the visitor that the access to your profile has been restricted."
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+msgid "Allow posting to GNU social"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+msgid ""
+"If enabled your public postings can be posted to the associated GNU-social "
+"account"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+msgid "Post to GNU social by default"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+msgid ""
+"If enabled your public postings will be posted to the associated GNU-social "
+"account by default"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:255
+msgid "Clear OAuth configuration"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:432
+msgid "GNU social Post Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:891
+msgid "API URL"
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:894
+msgid "Application name"
+msgstr ""
+
+#: ../../extend/addon/addon/superblock/superblock.php:106
+msgid "Currently blocked"
+msgstr ""
+
+#: ../../extend/addon/addon/superblock/superblock.php:108
+msgid "No channels currently blocked"
+msgstr ""
+
+#: ../../extend/addon/addon/superblock/superblock.php:114
+msgid "\"Superblock\" Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/superblock/superblock.php:279
+msgid "Block Completely"
+msgstr ""
+
+#: ../../extend/addon/addon/superblock/superblock.php:326
+msgid "superblock settings updated"
+msgstr ""
+
+#: ../../extend/addon/addon/testdrive/testdrive.php:104
#, php-format
-msgid "You have %1$.0f of %2$.0f allowed connections."
+msgid "Your account on %s will expire in a few days."
msgstr ""
-#: ../../include/widgets.php:181
-msgid "Add New Connection"
+#: ../../extend/addon/addon/testdrive/testdrive.php:105
+msgid "Your $Productname test account is about to expire."
msgstr ""
-#: ../../include/widgets.php:182
-msgid "Enter channel address"
+#: ../../extend/addon/addon/tictac/tictac.php:21
+msgid "Three Dimensional Tic-Tac-Toe"
msgstr ""
-#: ../../include/widgets.php:183
-msgid "Examples: bob@example.com, https://example.com/barbara"
+#: ../../extend/addon/addon/tictac/tictac.php:54
+msgid "3D Tic-Tac-Toe"
msgstr ""
-#: ../../include/widgets.php:199
-msgid "Notes"
+#: ../../extend/addon/addon/tictac/tictac.php:59
+msgid "New game"
msgstr ""
-#: ../../include/widgets.php:275
-msgid "Remove term"
+#: ../../extend/addon/addon/tictac/tictac.php:60
+msgid "New game with handicap"
msgstr ""
-#: ../../include/widgets.php:284 ../../include/group.php:316
-msgid "add"
+#: ../../extend/addon/addon/tictac/tictac.php:61
+msgid ""
+"Three dimensional tic-tac-toe is just like the traditional game except that "
+"it is played on multiple levels simultaneously. "
msgstr ""
-#: ../../include/widgets.php:349 ../../include/widgets.php:468
-#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
-msgid "Everything"
+#: ../../extend/addon/addon/tictac/tictac.php:62
+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/widgets.php:390
-msgid "Archives"
+#: ../../extend/addon/addon/tictac/tictac.php:64
+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/widgets.php:552
-msgid "Refresh"
+#: ../../extend/addon/addon/tictac/tictac.php:183
+msgid "You go first..."
msgstr ""
-#: ../../include/widgets.php:592
-msgid "Account settings"
+#: ../../extend/addon/addon/tictac/tictac.php:188
+msgid "I'm going first this time..."
msgstr ""
-#: ../../include/widgets.php:598
-msgid "Channel settings"
+#: ../../extend/addon/addon/tictac/tictac.php:194
+msgid "You won!"
msgstr ""
-#: ../../include/widgets.php:607
-msgid "Additional features"
+#: ../../extend/addon/addon/tictac/tictac.php:200
+#: ../../extend/addon/addon/tictac/tictac.php:225
+msgid "\"Cat\" game!"
msgstr ""
-#: ../../include/widgets.php:614
-msgid "Feature/Addon settings"
+#: ../../extend/addon/addon/tictac/tictac.php:223
+msgid "I won!"
msgstr ""
-#: ../../include/widgets.php:620
-msgid "Display settings"
+#: ../../extend/addon/addon/tour/tour.php:75
+msgid "Edit your profile and change settings."
msgstr ""
-#: ../../include/widgets.php:627
-msgid "Manage locations"
+#: ../../extend/addon/addon/tour/tour.php:76
+msgid "Click here to see activity from your connections."
msgstr ""
-#: ../../include/widgets.php:634
-msgid "Export channel"
+#: ../../extend/addon/addon/tour/tour.php:77
+msgid "Click here to see your channel home."
msgstr ""
-#: ../../include/widgets.php:640
-msgid "Connected apps"
+#: ../../extend/addon/addon/tour/tour.php:78
+msgid "You can access your private messages from here."
msgstr ""
-#: ../../include/widgets.php:664
-msgid "Premium Channel Settings"
+#: ../../extend/addon/addon/tour/tour.php:79
+msgid "Create new events here."
msgstr ""
-#: ../../include/widgets.php:693
-msgid "Private Mail Menu"
+#: ../../extend/addon/addon/tour/tour.php:80
+msgid ""
+"You can accept new connections and change permissions for existing ones "
+"here. You can also e.g. create groups of contacts."
msgstr ""
-#: ../../include/widgets.php:695
-msgid "Combined View"
+#: ../../extend/addon/addon/tour/tour.php:81
+msgid "System notifications will arrive here"
msgstr ""
-#: ../../include/widgets.php:727 ../../include/widgets.php:739
-msgid "Conversations"
+#: ../../extend/addon/addon/tour/tour.php:82
+msgid "Search for content and users"
msgstr ""
-#: ../../include/widgets.php:731
-msgid "Received Messages"
+#: ../../extend/addon/addon/tour/tour.php:83
+msgid "Browse for new contacts"
msgstr ""
-#: ../../include/widgets.php:735
-msgid "Sent Messages"
+#: ../../extend/addon/addon/tour/tour.php:84
+msgid "Launch installed apps"
msgstr ""
-#: ../../include/widgets.php:749
-msgid "No messages."
+#: ../../extend/addon/addon/tour/tour.php:85
+msgid "Looking for help? Click here."
msgstr ""
-#: ../../include/widgets.php:767
-msgid "Delete conversation"
+#: ../../extend/addon/addon/tour/tour.php:86
+msgid ""
+"New events have occurred in your network. Click here to see what has "
+"happened!"
msgstr ""
-#: ../../include/widgets.php:793
-msgid "Events Tools"
+#: ../../extend/addon/addon/tour/tour.php:87
+msgid "You have received a new private message. Click here to see from who!"
msgstr ""
-#: ../../include/widgets.php:794
-msgid "Export Calendar"
+#: ../../extend/addon/addon/tour/tour.php:88
+msgid "There are events this week. Click here too see which!"
msgstr ""
-#: ../../include/widgets.php:795
-msgid "Import Calendar"
+#: ../../extend/addon/addon/tour/tour.php:89
+msgid "You have received a new introduction. Click here to see who!"
msgstr ""
-#: ../../include/widgets.php:883 ../../include/conversation.php:1702
-#: ../../include/conversation.php:1705
-msgid "Chatrooms"
+#: ../../extend/addon/addon/tour/tour.php:90
+msgid ""
+"There is a new system notification. Click here to see what has happened!"
msgstr ""
-#: ../../include/widgets.php:887
-msgid "Overview"
+#: ../../extend/addon/addon/tour/tour.php:93
+msgid "Click here to share text, images, videos and sound."
msgstr ""
-#: ../../include/widgets.php:894
-msgid "Chat Members"
+#: ../../extend/addon/addon/tour/tour.php:94
+msgid "You can write an optional title for your update (good for long posts)."
msgstr ""
-#: ../../include/widgets.php:916
-msgid "Wiki List"
+#: ../../extend/addon/addon/tour/tour.php:95
+msgid "Entering some categories here makes it easier to find your post later."
msgstr ""
-#: ../../include/widgets.php:954
-msgid "Wiki Pages"
+#: ../../extend/addon/addon/tour/tour.php:96
+msgid "Share photos, links, location, etc."
msgstr ""
-#: ../../include/widgets.php:989
-msgid "Bookmarked Chatrooms"
+#: ../../extend/addon/addon/tour/tour.php:97
+msgid ""
+"Only want to share content for a while? Make it expire at a certain date."
msgstr ""
-#: ../../include/widgets.php:1020
-msgid "Suggested Chatrooms"
+#: ../../extend/addon/addon/tour/tour.php:98
+msgid "You can password protect content."
msgstr ""
-#: ../../include/widgets.php:1165 ../../include/widgets.php:1277
-msgid "photo/image"
+#: ../../extend/addon/addon/tour/tour.php:99
+msgid "Choose who you share with."
msgstr ""
-#: ../../include/widgets.php:1220
-msgid "Click to show more"
+#: ../../extend/addon/addon/tour/tour.php:101
+msgid "Click here when you are done."
msgstr ""
-#: ../../include/widgets.php:1371
-msgid "Rating Tools"
+#: ../../extend/addon/addon/tour/tour.php:104
+msgid "Adjust from which channels posts should be displayed."
msgstr ""
-#: ../../include/widgets.php:1375 ../../include/widgets.php:1377
-msgid "Rate Me"
+#: ../../extend/addon/addon/tour/tour.php:105
+msgid "Only show posts from channels in the specified privacy group."
msgstr ""
-#: ../../include/widgets.php:1380
-msgid "View Ratings"
+#: ../../extend/addon/addon/tour/tour.php:109
+msgid ""
+"Easily find posts containing tags (keywords preceded by the \"#\" symbol)."
msgstr ""
-#: ../../include/widgets.php:1464
-msgid "Forums"
+#: ../../extend/addon/addon/tour/tour.php:110
+msgid "Easily find posts in given category."
msgstr ""
-#: ../../include/widgets.php:1493
-msgid "Tasks"
+#: ../../extend/addon/addon/tour/tour.php:111
+msgid "Easily find posts by date."
msgstr ""
-#: ../../include/widgets.php:1504
-msgid "Documentation"
+#: ../../extend/addon/addon/tour/tour.php:112
+msgid ""
+"Suggested users who have volounteered to be shown as suggestions, and who we "
+"think you might find interesting."
msgstr ""
-#: ../../include/widgets.php:1560 ../../include/widgets.php:1598
-msgid "Member registrations waiting for confirmation"
+#: ../../extend/addon/addon/tour/tour.php:113
+msgid "Here you see channels you have connected to."
msgstr ""
-#: ../../include/widgets.php:1566
-msgid "Inspect queue"
+#: ../../extend/addon/addon/tour/tour.php:114
+msgid "Save your search so you can repeat it at a later date."
msgstr ""
-#: ../../include/widgets.php:1568
-msgid "DB updates"
+#: ../../extend/addon/addon/tour/tour.php:117
+msgid ""
+"If you see this icon you can be sure that the sender is who it say it is. It "
+"is normal that it is not always possible to verify the sender, so the icon "
+"will be missing sometimes. There is usually no need to worry about that."
msgstr ""
-#: ../../include/widgets.php:1594
-msgid "Plugin Features"
+#: ../../extend/addon/addon/tour/tour.php:118
+msgid ""
+"Danger! It seems someone tried to forge a message! This message is not "
+"necessarily from who it says it is from!"
msgstr ""
-#: ../../include/bb2diaspora.php:404
-msgid "Attachments:"
+#: ../../extend/addon/addon/tour/tour.php:125
+msgid ""
+"Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can "
+"pause it at any time and continue where you left off by reloading the page, "
+"or navigting to another page.</p><p>You can also advance by pressing the "
+"return key"
msgstr ""
-#: ../../include/bb2diaspora.php:491 ../../include/event.php:22
-#: ../../include/event.php:69
-msgid "l F d, Y \\@ g:i A"
+#: ../../extend/addon/addon/twitter/twitter.php:99
+msgid "Post to Twitter"
msgstr ""
-#: ../../include/bb2diaspora.php:493
-msgid "$Projectname event notification:"
+#: ../../extend/addon/addon/twitter/twitter.php:154
+msgid "Twitter settings updated."
msgstr ""
-#: ../../include/bb2diaspora.php:497 ../../include/event.php:30
-#: ../../include/event.php:73
-msgid "Starts:"
+#: ../../extend/addon/addon/twitter/twitter.php:183
+msgid ""
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
msgstr ""
-#: ../../include/bb2diaspora.php:505 ../../include/event.php:40
-#: ../../include/event.php:77
-msgid "Finishes:"
+#: ../../extend/addon/addon/twitter/twitter.php:205
+msgid ""
+"At this Hubzilla 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 ""
-#: ../../include/security.php:117
-msgid "guest:"
+#: ../../extend/addon/addon/twitter/twitter.php:207
+msgid "Log in with Twitter"
msgstr ""
-#: ../../include/security.php:535
+#: ../../extend/addon/addon/twitter/twitter.php:210
+msgid "Copy the PIN from Twitter here"
+msgstr ""
+
+#: ../../extend/addon/addon/twitter/twitter.php:237
msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
+"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to Twitter will lead the visitor to a blank page informing "
+"the visitor that the access to your profile has been restricted."
msgstr ""
-#: ../../include/bookmarks.php:35
+#: ../../extend/addon/addon/twitter/twitter.php:242
+msgid "Allow posting to Twitter"
+msgstr ""
+
+#: ../../extend/addon/addon/twitter/twitter.php:242
+msgid ""
+"If enabled your public postings can be posted to the associated Twitter "
+"account"
+msgstr ""
+
+#: ../../extend/addon/addon/twitter/twitter.php:246
+msgid "Send public postings to Twitter by default"
+msgstr ""
+
+#: ../../extend/addon/addon/twitter/twitter.php:246
+msgid ""
+"If enabled your public postings will be posted to the associated Twitter "
+"account by default"
+msgstr ""
+
+#: ../../extend/addon/addon/twitter/twitter.php:264
+msgid "Twitter Post Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/twitter/twitter.php:773
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:95
+msgid "Submit Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:25
+msgid "Show Upload Limits"
+msgstr ""
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:27
+msgid "Hubzilla configured maximum size: "
+msgstr ""
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:28
+msgid "PHP upload_max_filesize: "
+msgstr ""
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:29
+msgid "PHP post_max_size (must be larger than upload_max_filesize): "
+msgstr ""
+
+#: ../../extend/addon/addon/visage/visage.php:93
+msgid "Recent Channel/Profile Viewers"
+msgstr ""
+
+#: ../../extend/addon/addon/visage/visage.php:98
+msgid "This plugin/addon has not been configured."
+msgstr ""
+
+#: ../../extend/addon/addon/visage/visage.php:99
#, php-format
-msgid "%1$s's bookmarks"
+msgid "Please visit the Visage settings on %s"
msgstr ""
-#: ../../include/group.php:26
+#: ../../extend/addon/addon/visage/visage.php:99
+msgid "your feature settings page"
+msgstr ""
+
+#: ../../extend/addon/addon/visage/visage.php:112
+msgid "No entries."
+msgstr ""
+
+#: ../../extend/addon/addon/visage/visage.php:166
+msgid "Enable Visage Visitor Logging"
+msgstr ""
+
+#: ../../extend/addon/addon/visage/visage.php:170
+msgid "Visage Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/wholikesme/wholikesme.php:29
+msgid "Who likes me?"
+msgstr ""
+
+#: ../../extend/addon/addon/wppost/wppost.php:45
+msgid "Post to WordPress"
+msgstr ""
+
+#: ../../extend/addon/addon/wppost/wppost.php:82
+msgid "Enable WordPress Post Plugin"
+msgstr ""
+
+#: ../../extend/addon/addon/wppost/wppost.php:86
+msgid "WordPress username"
+msgstr ""
+
+#: ../../extend/addon/addon/wppost/wppost.php:90
+msgid "WordPress password"
+msgstr ""
+
+#: ../../extend/addon/addon/wppost/wppost.php:94
+msgid "WordPress API URL"
+msgstr ""
+
+#: ../../extend/addon/addon/wppost/wppost.php:95
+msgid "Typically https://your-blog.tld/xmlrpc.php"
+msgstr ""
+
+#: ../../extend/addon/addon/wppost/wppost.php:98
+msgid "WordPress blogid"
+msgstr ""
+
+#: ../../extend/addon/addon/wppost/wppost.php:99
+msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
+msgstr ""
+
+#: ../../extend/addon/addon/wppost/wppost.php:105
+msgid "Post to WordPress by default"
+msgstr ""
+
+#: ../../extend/addon/addon/wppost/wppost.php:109
+msgid "Forward comments (requires hubzilla_wp plugin)"
+msgstr ""
+
+#: ../../extend/addon/addon/wppost/wppost.php:113
+msgid "WordPress Post Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/wppost/wppost.php:129
+msgid "Wordpress Settings saved."
+msgstr ""
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:31
+msgid "XMPP settings updated."
+msgstr ""
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+msgid "Enable Chat"
+msgstr ""
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:58
+msgid "Individual credentials"
+msgstr ""
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:64
+msgid "Jabber BOSH server"
+msgstr ""
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:69
+msgid "XMPP Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:92
+msgid "Jabber BOSH host"
+msgstr ""
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:93
+msgid "Use central userbase"
+msgstr ""
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:93
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."
+"If enabled, members will automatically login to an ejabberd server that has "
+"to be installed on this machine with synchronized credentials via the "
+"\"auth_ejabberd.php\" script."
msgstr ""
-#: ../../include/group.php:248
-msgid "Add new connections to this privacy group"
+#: ../../extend/addon/addon/cdav/include/widgets.php:37
+msgid "Select Channel"
msgstr ""
-#: ../../include/group.php:289
-msgid "edit"
+#: ../../extend/addon/addon/cdav/include/widgets.php:42
+msgid "Read-write"
msgstr ""
-#: ../../include/group.php:312
-msgid "Edit group"
+#: ../../extend/addon/addon/cdav/include/widgets.php:43
+msgid "Read-only"
msgstr ""
-#: ../../include/group.php:313
-msgid "Add privacy group"
+#: ../../extend/addon/addon/cdav/include/widgets.php:116
+msgid "My Calendars"
msgstr ""
-#: ../../include/group.php:314
-msgid "Channels not in any privacy group"
+#: ../../extend/addon/addon/cdav/include/widgets.php:118
+msgid "Shared Calendars"
msgstr ""
-#: ../../include/import.php:30
+#: ../../extend/addon/addon/cdav/include/widgets.php:122
+msgid "Share this calendar"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:124
+msgid "Calendar name and color"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:126
+msgid "Create new calendar"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:128
+msgid "Calendar Name"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:129
+msgid "Calendar Tools"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:130
+msgid "Import calendar"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:131
+msgid "Select a calendar to import to"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:158
+msgid "Addressbooks"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:160
+msgid "Addressbook name"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:162
+msgid "Create new addressbook"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:163
+msgid "Addressbook Name"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:165
+msgid "Addressbook Tools"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:166
+msgid "Import addressbook"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:167
+msgid "Select an addressbook to import to"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:36
+msgid "Errors encountered creating database table: "
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:197
+msgid "Default Calendar"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:206
+msgid "Default Addressbook"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:215
+msgid "CalDAV/CardDAV Settings saved."
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:234
+msgid "Enable CalDAV/CardDAV Server for this channel"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:237
+#, php-format
+msgid "Your CalDAV resources are located at %s "
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:240
+#, php-format
+msgid "Your CardDAV resources are located at %s "
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:246
+msgid "CalDAV/CardDAV Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:270
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145
+msgid "Mobile"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:271
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146 ../../include/nav.php:88
+msgid "Home"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:272
+msgid "Home, Voice"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:273
+msgid "Home, Fax"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:274
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147
+msgid "Work"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:275
+msgid "Work, Voice"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:276
+msgid "Work, Fax"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:744
+msgid "INVALID EVENT DISMISSED!"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
+msgid "Summary: "
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
+msgid "Date: "
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:747
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:754
+msgid "Reason: "
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:752
+msgid "INVALID CARD DISMISSED!"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
+msgid "Name: "
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:770
msgid ""
-"Cannot create a duplicate channel identifier on this system. Import failed."
+"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
+"Settings before you can use it."
msgstr ""
-#: ../../include/import.php:90
-msgid "Channel clone failed. Import failed."
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
+msgid "Example: YYYY-MM-DD HH:mm"
msgstr ""
-#: ../../include/import.php:1354
-msgid "Unable to import element \""
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
+msgid "End date and time"
msgstr ""
-#: ../../include/language.php:380
-msgid "Select an alternate language"
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:852
+msgid "List month"
msgstr ""
-#: ../../include/message.php:20
-msgid "No recipient provided."
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:853
+msgid "List week"
msgstr ""
-#: ../../include/message.php:25
-msgid "[no subject]"
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:854
+msgid "List day"
msgstr ""
-#: ../../include/message.php:45
-msgid "Unable to determine sender."
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:861
+msgid "More"
msgstr ""
-#: ../../include/message.php:222
-msgid "Stored post could not be verified."
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:862
+msgid "Less"
msgstr ""
-#: ../../include/page_widgets.php:7
-msgid "New Page"
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:863
+msgid "Select calendar"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:865
+msgid "Delete all"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:867
+msgid "Sorry! Editing of recurrent events is not yet implemented."
msgstr ""
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137
+msgid "Organisation"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138
#: ../../include/page_widgets.php:46
msgid "Title"
msgstr ""
-#: ../../include/oembed.php:322
-msgid " by "
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139
+msgid "Phone"
msgstr ""
-#: ../../include/oembed.php:323
-msgid " on "
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141
+msgid "Instant messenger"
msgstr ""
-#: ../../include/oembed.php:352
-msgid "Embedded content"
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142
+msgid "Website"
msgstr ""
-#: ../../include/oembed.php:361
-msgid "Embedding disabled"
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144
+msgid "Note"
msgstr ""
-#: ../../include/account.php:35
-msgid "Not a valid email address"
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150
+msgid "Add Field"
msgstr ""
-#: ../../include/account.php:37
-msgid "Your email domain is not among those allowed on this site"
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155
+msgid "P.O. Box"
msgstr ""
-#: ../../include/account.php:43
-msgid "Your email address is already registered at this site."
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156
+msgid "Additional"
msgstr ""
-#: ../../include/account.php:75
-msgid "An invitation is required."
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157
+msgid "Street"
msgstr ""
-#: ../../include/account.php:79
-msgid "Invitation could not be verified."
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158
+msgid "Locality"
msgstr ""
-#: ../../include/account.php:130
-msgid "Please enter the required information."
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159
+msgid "Region"
msgstr ""
-#: ../../include/account.php:198
-msgid "Failed to store account information."
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160
+msgid "ZIP Code"
msgstr ""
-#: ../../include/account.php:263
-#, php-format
-msgid "Registration confirmation for %s"
+#: ../../extend/addon/addon/chess/chess.php:276
+#: ../../extend/addon/addon/chess/chess.php:430
+msgid "Invalid game."
msgstr ""
-#: ../../include/account.php:330
-#, php-format
-msgid "Registration request at %s"
+#: ../../extend/addon/addon/chess/chess.php:282
+#: ../../extend/addon/addon/chess/chess.php:436
+msgid "You are not a player in this game."
msgstr ""
-#: ../../include/account.php:352
-msgid "your registration password"
+#: ../../extend/addon/addon/chess/chess.php:315
+msgid "You must be a local channel to create a game."
msgstr ""
-#: ../../include/account.php:358 ../../include/account.php:420
-#, php-format
-msgid "Registration details for %s"
+#: ../../extend/addon/addon/chess/chess.php:333
+msgid "You must select one opponent that is not yourself."
msgstr ""
-#: ../../include/account.php:431
-msgid "Account approved."
+#: ../../extend/addon/addon/chess/chess.php:336
+msgid "Creating new game..."
msgstr ""
-#: ../../include/account.php:471
-#, php-format
-msgid "Registration revoked for %s"
+#: ../../extend/addon/addon/chess/chess.php:342
+msgid "You must select white or black."
msgstr ""
-#: ../../include/account.php:756 ../../include/account.php:758
-msgid "Click here to upgrade."
+#: ../../extend/addon/addon/chess/chess.php:349
+msgid "Error creating new game."
msgstr ""
-#: ../../include/account.php:764
-msgid "This action exceeds the limits set by your subscription plan."
+#: ../../extend/addon/addon/chess/chess.php:379 ../../include/channel.php:816
+msgid "Requested channel is not available."
msgstr ""
-#: ../../include/account.php:769
-msgid "This action is not available under your subscription plan."
+#: ../../extend/addon/addon/chess/chess.php:392
+msgid "You must select a local channel /chess/channelname"
msgstr ""
-#: ../../include/js_strings.php:5
-msgid "Delete this item?"
+#: ../../extend/addon/addon/chess/chess.php:920
+msgid "Enable notifications"
msgstr ""
-#: ../../include/js_strings.php:8
-#, php-format
-msgid "%s show less"
+#: ../../extend/addon/addon/likebanner/likebanner.php:51
+msgid "Your Webbie:"
msgstr ""
-#: ../../include/js_strings.php:9
-#, php-format
-msgid "%s expand"
+#: ../../extend/addon/addon/likebanner/likebanner.php:54
+msgid "Fontsize (px):"
msgstr ""
-#: ../../include/js_strings.php:10
-#, php-format
-msgid "%s collapse"
+#: ../../extend/addon/addon/likebanner/likebanner.php:68
+msgid "Link:"
msgstr ""
-#: ../../include/js_strings.php:11
-msgid "Password too short"
+#: ../../extend/addon/addon/likebanner/likebanner.php:70
+msgid "Like us on Hubzilla"
msgstr ""
-#: ../../include/js_strings.php:12
-msgid "Passwords do not match"
+#: ../../extend/addon/addon/likebanner/likebanner.php:72
+msgid "Embed:"
msgstr ""
-#: ../../include/js_strings.php:13
-msgid "everybody"
+#: ../../extend/addon/addon/openid/Mod_Id.php:85
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+msgid "Male"
msgstr ""
-#: ../../include/js_strings.php:14
-msgid "Secret Passphrase"
+#: ../../extend/addon/addon/openid/Mod_Id.php:87
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+msgid "Female"
msgstr ""
-#: ../../include/js_strings.php:15
-msgid "Passphrase hint"
+#: ../../extend/addon/addon/openid/Mod_Openid.php:30
+msgid "OpenID protocol error. No ID returned."
msgstr ""
-#: ../../include/js_strings.php:16
-msgid "Notice: Permissions have changed but have not yet been submitted."
+#: ../../extend/addon/addon/openid/Mod_Openid.php:193
+#: ../../include/auth.php:286
+msgid "Login failed."
msgstr ""
-#: ../../include/js_strings.php:17
-msgid "close all"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:52
+msgid "First Name"
msgstr ""
-#: ../../include/js_strings.php:18
-msgid "Nothing new here"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:53
+msgid "Last Name"
msgstr ""
-#: ../../include/js_strings.php:19
-msgid "Rate This Channel (this is public)"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:55
+msgid "Full Name"
msgstr ""
-#: ../../include/js_strings.php:21
-msgid "Describe (optional)"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:61
+msgid "Profile Photo 16px"
msgstr ""
-#: ../../include/js_strings.php:23
-msgid "Please enter a link URL"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:62
+msgid "Profile Photo 32px"
msgstr ""
-#: ../../include/js_strings.php:24
-msgid "Unsaved changes. Are you sure you wish to leave this page?"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:63
+msgid "Profile Photo 48px"
msgstr ""
-#: ../../include/js_strings.php:27
-msgid "timeago.prefixAgo"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:64
+msgid "Profile Photo 64px"
msgstr ""
-#: ../../include/js_strings.php:28
-msgid "timeago.prefixFromNow"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:65
+msgid "Profile Photo 80px"
msgstr ""
-#: ../../include/js_strings.php:29
-msgid "ago"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:66
+msgid "Profile Photo 128px"
msgstr ""
-#: ../../include/js_strings.php:30
-msgid "from now"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:67
+msgid "Timezone"
msgstr ""
-#: ../../include/js_strings.php:31
-msgid "less than a minute"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:70
+msgid "Birth Year"
msgstr ""
-#: ../../include/js_strings.php:32
-msgid "about a minute"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:71
+msgid "Birth Month"
msgstr ""
-#: ../../include/js_strings.php:33
-#, php-format
-msgid "%d minutes"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:72
+msgid "Birth Day"
msgstr ""
-#: ../../include/js_strings.php:34
-msgid "about an hour"
+#: ../../extend/addon/addon/openid/MysqlProvider.php:73
+msgid "Birthdate"
msgstr ""
-#: ../../include/js_strings.php:35
-#, php-format
-msgid "about %d hours"
+#: ../../extend/addon/addon/openid/openid.php:49
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
msgstr ""
-#: ../../include/js_strings.php:36
-msgid "a day"
+#: ../../extend/addon/addon/openid/openid.php:49
+msgid "The error message was:"
msgstr ""
-#: ../../include/js_strings.php:37
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:44
#, php-format
-msgid "%d days"
+msgid "Reconnecting %d connections"
msgstr ""
-#: ../../include/js_strings.php:38
-msgid "about a month"
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:63
+msgid "Diaspora Reconnect"
msgstr ""
-#: ../../include/js_strings.php:39
-#, php-format
-msgid "%d months"
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:65
+msgid ""
+"Use this form to re-establish Diaspora connections which were initially made "
+"from a different hub."
msgstr ""
-#: ../../include/js_strings.php:40
-msgid "about a year"
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:70
+msgid "Reconnect"
msgstr ""
-#: ../../include/js_strings.php:41
-#, php-format
-msgid "%d years"
+#: ../../extend/addon/addon/mailtest/mailtest.php:19
+msgid "Send test email"
msgstr ""
-#: ../../include/js_strings.php:42
-msgid " "
+#: ../../extend/addon/addon/mailtest/mailtest.php:66
+msgid "Mail sent."
msgstr ""
-#: ../../include/js_strings.php:43
-msgid "timeago.numbers"
+#: ../../extend/addon/addon/mailtest/mailtest.php:68
+msgid "Sending of mail failed."
msgstr ""
-#: ../../include/js_strings.php:49
-msgctxt "long"
-msgid "May"
+#: ../../extend/addon/addon/mailtest/mailtest.php:77
+msgid "Mail Test"
msgstr ""
-#: ../../include/js_strings.php:57
-msgid "Jan"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:57
+msgid "Errors encountered deleting database table "
msgstr ""
-#: ../../include/js_strings.php:58
-msgid "Feb"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
+msgid "Drop tables when uninstalling?"
msgstr ""
-#: ../../include/js_strings.php:59
-msgid "Mar"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
+msgid ""
+"If checked, the Rendezvous database tables will be deleted when the plugin "
+"is uninstalled."
msgstr ""
-#: ../../include/js_strings.php:60
-msgid "Apr"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
+msgid "Mapbox Access Token"
msgstr ""
-#: ../../include/js_strings.php:61
-msgctxt "short"
-msgid "May"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
+msgid ""
+"If you enter a Mapbox access token, it will be used to retrieve map tiles "
+"from Mapbox instead of the default OpenStreetMap tile server."
msgstr ""
-#: ../../include/js_strings.php:62
-msgid "Jun"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:122
+msgid "Rendezvous"
msgstr ""
-#: ../../include/js_strings.php:63
-msgid "Jul"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:127
+msgid ""
+"This identity has been deleted by another member due to inactivity. Please "
+"press the \"New identity\" button or refresh the page to register a new "
+"identity. You may use the same name."
msgstr ""
-#: ../../include/js_strings.php:64
-msgid "Aug"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:128
+msgid "Welcome to Rendezvous!"
msgstr ""
-#: ../../include/js_strings.php:65
-msgid "Sep"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:129
+msgid ""
+"Enter your name to join this rendezvous. To begin sharing your location with "
+"the other members, tap the GPS control. When your location is discovered, a "
+"red dot will appear and others will be able to see you on the map."
msgstr ""
-#: ../../include/js_strings.php:66
-msgid "Oct"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:131
+msgid "Let's meet here"
msgstr ""
-#: ../../include/js_strings.php:67
-msgid "Nov"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:134
+msgid "New marker"
msgstr ""
-#: ../../include/js_strings.php:68
-msgid "Dec"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:135
+msgid "Edit marker"
msgstr ""
-#: ../../include/js_strings.php:76
-msgid "Sun"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:136
+msgid "New identity"
msgstr ""
-#: ../../include/js_strings.php:77
-msgid "Mon"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:137
+msgid "Delete marker"
msgstr ""
-#: ../../include/js_strings.php:78
-msgid "Tue"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:138
+msgid "Delete member"
msgstr ""
-#: ../../include/js_strings.php:79
-msgid "Wed"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:139
+msgid "Edit proximity alert"
msgstr ""
-#: ../../include/js_strings.php:80
-msgid "Thu"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:140
+msgid ""
+"A proximity alert will be issued when this member is within a certain radius "
+"of you.<br><br>Enter a radius in meters (0 to disable):"
msgstr ""
-#: ../../include/js_strings.php:81
-msgid "Fri"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:140
+msgid "distance"
msgstr ""
-#: ../../include/js_strings.php:82
-msgid "Sat"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:150
+msgid "Add new rendezvous"
msgstr ""
-#: ../../include/js_strings.php:83
-msgctxt "calendar"
-msgid "today"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:151
+msgid ""
+"Create a new rendezvous and share the access link with those you wish to "
+"invite to the group. Those who open the link become members of the "
+"rendezvous. They can view other member locations, add markers to the map, or "
+"share their own locations with the group."
msgstr ""
-#: ../../include/js_strings.php:84
-msgctxt "calendar"
-msgid "month"
+#: ../../include/Import/import_diaspora.php:16
+msgid "No username found in import file."
msgstr ""
-#: ../../include/js_strings.php:85
-msgctxt "calendar"
-msgid "week"
+#: ../../include/Import/import_diaspora.php:41 ../../include/import.php:51
+msgid "Unable to create a unique channel address. Import failed."
+msgstr ""
+
+#: ../../include/dba/dba_driver.php:187
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
-#: ../../include/js_strings.php:86
-msgctxt "calendar"
+#: ../../include/datetime.php:147
+msgid "Birthday"
+msgstr ""
+
+#: ../../include/datetime.php:149
+msgid "Age: "
+msgstr ""
+
+#: ../../include/datetime.php:151
+msgid "YYYY-MM-DD or MM-DD"
+msgstr ""
+
+#: ../../include/datetime.php:286 ../../boot.php:2563
+msgid "never"
+msgstr ""
+
+#: ../../include/datetime.php:292
+msgid "less than a second ago"
+msgstr ""
+
+#: ../../include/datetime.php:310
+#, php-format
+msgctxt "e.g. 22 hours ago, 1 minute ago"
+msgid "%1$d %2$s ago"
+msgstr ""
+
+#: ../../include/datetime.php:321
+msgctxt "relative_date"
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:324
+msgctxt "relative_date"
+msgid "month"
+msgid_plural "months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:327
+msgctxt "relative_date"
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:330
+msgctxt "relative_date"
msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:333
+msgctxt "relative_date"
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:336
+msgctxt "relative_date"
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:339
+msgctxt "relative_date"
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:576
+#, php-format
+msgid "%1$s's birthday"
msgstr ""
-#: ../../include/js_strings.php:87
-msgctxt "calendar"
-msgid "All day"
+#: ../../include/datetime.php:577
+#, php-format
+msgid "Happy Birthday %1$s"
msgstr ""
-#: ../../include/follow.php:27
-msgid "Channel is blocked on this site."
+#: ../../include/account.php:35
+msgid "Not a valid email address"
msgstr ""
-#: ../../include/follow.php:32
-msgid "Channel location missing."
+#: ../../include/account.php:37
+msgid "Your email domain is not among those allowed on this site"
msgstr ""
-#: ../../include/follow.php:80
-msgid "Response from remote channel was incomplete."
+#: ../../include/account.php:43
+msgid "Your email address is already registered at this site."
msgstr ""
-#: ../../include/follow.php:97
-msgid "Channel was deleted and no longer exists."
+#: ../../include/account.php:75
+msgid "An invitation is required."
msgstr ""
-#: ../../include/follow.php:147 ../../include/follow.php:183
-msgid "Protocol disabled."
+#: ../../include/account.php:79
+msgid "Invitation could not be verified."
msgstr ""
-#: ../../include/follow.php:171
-msgid "Channel discovery failed."
+#: ../../include/account.php:130
+msgid "Please enter the required information."
msgstr ""
-#: ../../include/follow.php:210
-msgid "Cannot connect to yourself."
+#: ../../include/account.php:198
+msgid "Failed to store account information."
+msgstr ""
+
+#: ../../include/account.php:263
+#, php-format
+msgid "Registration confirmation for %s"
+msgstr ""
+
+#: ../../include/account.php:330
+#, php-format
+msgid "Registration request at %s"
+msgstr ""
+
+#: ../../include/account.php:352
+msgid "your registration password"
+msgstr ""
+
+#: ../../include/account.php:358 ../../include/account.php:420
+#, php-format
+msgid "Registration details for %s"
+msgstr ""
+
+#: ../../include/account.php:431
+msgid "Account approved."
+msgstr ""
+
+#: ../../include/account.php:471
+#, php-format
+msgid "Registration revoked for %s"
+msgstr ""
+
+#: ../../include/account.php:756 ../../include/account.php:758
+msgid "Click here to upgrade."
+msgstr ""
+
+#: ../../include/account.php:764
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr ""
+
+#: ../../include/account.php:769
+msgid "This action is not available under your subscription plan."
+msgstr ""
+
+#: ../../include/message.php:20
+msgid "No recipient provided."
+msgstr ""
+
+#: ../../include/message.php:25
+msgid "[no subject]"
+msgstr ""
+
+#: ../../include/message.php:45
+msgid "Unable to determine sender."
+msgstr ""
+
+#: ../../include/message.php:223
+msgid "Stored post could not be verified."
msgstr ""
#: ../../include/selectors.php:30
@@ -8971,14 +10574,6 @@ msgstr ""
msgid "Monthly"
msgstr ""
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Male"
-msgstr ""
-
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Female"
-msgstr ""
-
#: ../../include/selectors.php:49
msgid "Currently Male"
msgstr ""
@@ -9195,56 +10790,150 @@ msgstr ""
msgid "Ask me"
msgstr ""
-#: ../../include/permissions.php:35
-msgid "Can view my normal stream and posts"
+#: ../../include/channel.php:33
+msgid "Unable to obtain identity information from database"
msgstr ""
-#: ../../include/permissions.php:39
-msgid "Can view my webpages"
+#: ../../include/channel.php:67
+msgid "Empty name"
msgstr ""
-#: ../../include/permissions.php:43
-msgid "Can post on my channel page (\"wall\")"
+#: ../../include/channel.php:70
+msgid "Name too long"
msgstr ""
-#: ../../include/permissions.php:46
-msgid "Can like/dislike stuff"
+#: ../../include/channel.php:181
+msgid "No account identifier"
msgstr ""
-#: ../../include/permissions.php:46
-msgid "Profiles and things other than posts/comments"
+#: ../../include/channel.php:193
+msgid "Nickname is required."
msgstr ""
-#: ../../include/permissions.php:48
-msgid "Can forward to all my channel contacts via post @mentions"
+#: ../../include/channel.php:207
+msgid "Reserved nickname. Please choose another."
msgstr ""
-#: ../../include/permissions.php:48
-msgid "Advanced - useful for creating group forum channels"
+#: ../../include/channel.php:212
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
msgstr ""
-#: ../../include/permissions.php:49
-msgid "Can chat with me (when available)"
+#: ../../include/channel.php:272
+msgid "Unable to retrieve created identity"
msgstr ""
-#: ../../include/permissions.php:50
-msgid "Can write to my file storage and photos"
+#: ../../include/channel.php:341
+msgid "Default Profile"
msgstr ""
-#: ../../include/permissions.php:51
-msgid "Can edit my webpages"
+#: ../../include/channel.php:962
+msgid "Create New Profile"
msgstr ""
-#: ../../include/permissions.php:53
-msgid "Somewhat advanced - very useful in open communities"
+#: ../../include/channel.php:982
+msgid "Visible to everybody"
msgstr ""
-#: ../../include/permissions.php:55
-msgid "Can administer my channel resources"
+#: ../../include/channel.php:1055 ../../include/channel.php:1174
+msgid "Gender:"
msgstr ""
-#: ../../include/permissions.php:55
-msgid "Extremely advanced. Leave this alone unless you know what you are doing"
+#: ../../include/channel.php:1057 ../../include/channel.php:1229
+msgid "Homepage:"
+msgstr ""
+
+#: ../../include/channel.php:1058
+msgid "Online Now"
+msgstr ""
+
+#: ../../include/channel.php:1179
+msgid "Like this channel"
+msgstr ""
+
+#: ../../include/channel.php:1203
+msgid "j F, Y"
+msgstr ""
+
+#: ../../include/channel.php:1204
+msgid "j F"
+msgstr ""
+
+#: ../../include/channel.php:1211
+msgid "Birthday:"
+msgstr ""
+
+#: ../../include/channel.php:1224
+#, php-format
+msgid "for %1$d %2$s"
+msgstr ""
+
+#: ../../include/channel.php:1227
+msgid "Sexual Preference:"
+msgstr ""
+
+#: ../../include/channel.php:1233
+msgid "Tags:"
+msgstr ""
+
+#: ../../include/channel.php:1235
+msgid "Political Views:"
+msgstr ""
+
+#: ../../include/channel.php:1237
+msgid "Religion:"
+msgstr ""
+
+#: ../../include/channel.php:1241
+msgid "Hobbies/Interests:"
+msgstr ""
+
+#: ../../include/channel.php:1243
+msgid "Likes:"
+msgstr ""
+
+#: ../../include/channel.php:1245
+msgid "Dislikes:"
+msgstr ""
+
+#: ../../include/channel.php:1247
+msgid "Contact information and Social Networks:"
+msgstr ""
+
+#: ../../include/channel.php:1249
+msgid "My other channels:"
+msgstr ""
+
+#: ../../include/channel.php:1251
+msgid "Musical interests:"
+msgstr ""
+
+#: ../../include/channel.php:1253
+msgid "Books, literature:"
+msgstr ""
+
+#: ../../include/channel.php:1255
+msgid "Television:"
+msgstr ""
+
+#: ../../include/channel.php:1257
+msgid "Film/dance/culture/entertainment:"
+msgstr ""
+
+#: ../../include/channel.php:1259
+msgid "Love/Romance:"
+msgstr ""
+
+#: ../../include/channel.php:1261
+msgid "Work/employment:"
+msgstr ""
+
+#: ../../include/channel.php:1263
+msgid "School/education:"
+msgstr ""
+
+#: ../../include/channel.php:1284
+msgid "Like this thing"
msgstr ""
#: ../../include/connections.php:95
@@ -9260,423 +10949,870 @@ msgstr ""
msgid "User '%s' deleted"
msgstr ""
-#: ../../include/auth.php:148
-msgid "Logged out."
+#: ../../include/dir_fns.php:141
+msgid "Directory Options"
msgstr ""
-#: ../../include/auth.php:275
-msgid "Failed authentication"
+#: ../../include/dir_fns.php:143
+msgid "Safe Mode"
msgstr ""
-#: ../../include/auth.php:286
-msgid "Login failed."
+#: ../../include/dir_fns.php:144
+msgid "Public Forums Only"
msgstr ""
-#: ../../include/activities.php:41
-msgid " and "
+#: ../../include/dir_fns.php:145
+msgid "This Website Only"
msgstr ""
-#: ../../include/activities.php:49
-msgid "public profile"
+#: ../../include/nav.php:85 ../../include/nav.php:118 ../../boot.php:1718
+msgid "Logout"
msgstr ""
-#: ../../include/activities.php:58
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+#: ../../include/nav.php:85 ../../include/nav.php:118
+msgid "End this session"
msgstr ""
-#: ../../include/activities.php:59
-#, php-format
-msgid "Visit %1$s's %2$s"
+#: ../../include/nav.php:88
+msgid "Your posts and conversations"
msgstr ""
-#: ../../include/activities.php:62
-#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
+#: ../../include/nav.php:89
+msgid "Your profile page"
msgstr ""
-#: ../../include/conversation.php:204
-#, php-format
-msgid "%1$s is now connected with %2$s"
+#: ../../include/nav.php:91
+msgid "Manage/Edit profiles"
msgstr ""
-#: ../../include/conversation.php:239
-#, php-format
-msgid "%1$s poked %2$s"
+#: ../../include/nav.php:93
+msgid "Edit your profile"
msgstr ""
-#: ../../include/conversation.php:694
-#, php-format
-msgid "View %s's profile @ %s"
+#: ../../include/nav.php:95
+msgid "Your photos"
msgstr ""
-#: ../../include/conversation.php:713
-msgid "Categories:"
+#: ../../include/nav.php:96
+msgid "Your files"
msgstr ""
-#: ../../include/conversation.php:714
-msgid "Filed under:"
+#: ../../include/nav.php:99
+msgid "Your chatrooms"
msgstr ""
-#: ../../include/conversation.php:739
-msgid "View in context"
+#: ../../include/nav.php:105 ../../include/conversation.php:1735
+msgid "Bookmarks"
msgstr ""
-#: ../../include/conversation.php:849
-msgid "remove"
+#: ../../include/nav.php:105
+msgid "Your bookmarks"
msgstr ""
-#: ../../include/conversation.php:854
-msgid "Delete Selected Items"
+#: ../../include/nav.php:109
+msgid "Your webpages"
msgstr ""
-#: ../../include/conversation.php:947
-msgid "View Source"
+#: ../../include/nav.php:111
+msgid "Your wikis"
msgstr ""
-#: ../../include/conversation.php:948
-msgid "Follow Thread"
+#: ../../include/nav.php:115
+msgid "Sign in"
msgstr ""
-#: ../../include/conversation.php:949
-msgid "Unfollow Thread"
+#: ../../include/nav.php:131
+msgid "Remote authentication"
msgstr ""
-#: ../../include/conversation.php:954
-msgid "Activity/Posts"
+#: ../../include/nav.php:131
+msgid "Click to authenticate to your home hub"
msgstr ""
-#: ../../include/conversation.php:956
-msgid "Edit Connection"
+#: ../../include/nav.php:143
+msgid "Get me home"
msgstr ""
-#: ../../include/conversation.php:957
-msgid "Message"
+#: ../../include/nav.php:145
+msgid "Log me out of this site"
msgstr ""
-#: ../../include/conversation.php:1077
-#, php-format
-msgid "%s likes this."
+#: ../../include/nav.php:150
+msgid "Create an account"
msgstr ""
-#: ../../include/conversation.php:1077
-#, php-format
-msgid "%s doesn't like this."
+#: ../../include/nav.php:162
+msgid "Help and documentation"
msgstr ""
-#: ../../include/conversation.php:1081
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgid_plural "<span %1$s>%2$d people</span> like this."
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/nav.php:166
+msgid "Applications, utilities, links, games"
+msgstr ""
-#: ../../include/conversation.php:1083
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgid_plural "<span %1$s>%2$d people</span> don't like this."
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/nav.php:168
+msgid "Search site @name, #tag, ?docs, content"
+msgstr ""
-#: ../../include/conversation.php:1089
-msgid "and"
+#: ../../include/nav.php:170
+msgid "Channel Directory"
msgstr ""
-#: ../../include/conversation.php:1092
-#, php-format
-msgid ", and %d other people"
-msgid_plural ", and %d other people"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/nav.php:182
+msgid "Your grid"
+msgstr ""
-#: ../../include/conversation.php:1093
-#, php-format
-msgid "%s like this."
+#: ../../include/nav.php:183
+msgid "Mark all grid notifications seen"
msgstr ""
-#: ../../include/conversation.php:1093
-#, php-format
-msgid "%s don't like this."
+#: ../../include/nav.php:185
+msgid "Channel home"
msgstr ""
-#: ../../include/conversation.php:1136
-msgid "Set your location"
+#: ../../include/nav.php:186
+msgid "Mark all channel notifications seen"
msgstr ""
-#: ../../include/conversation.php:1137
-msgid "Clear browser location"
+#: ../../include/nav.php:192
+msgid "Notices"
msgstr ""
-#: ../../include/conversation.php:1185
-msgid "Tag term:"
+#: ../../include/nav.php:192
+msgid "Notifications"
msgstr ""
-#: ../../include/conversation.php:1186
-msgid "Where are you right now?"
+#: ../../include/nav.php:193
+msgid "See all notifications"
msgstr ""
-#: ../../include/conversation.php:1195
-msgid "Comments enabled"
+#: ../../include/nav.php:196
+msgid "Private mail"
msgstr ""
-#: ../../include/conversation.php:1196
-msgid "Comments disabled"
+#: ../../include/nav.php:197
+msgid "See all private messages"
msgstr ""
-#: ../../include/conversation.php:1234
-msgid "Page link name"
+#: ../../include/nav.php:198
+msgid "Mark all private messages seen"
msgstr ""
-#: ../../include/conversation.php:1237
-msgid "Post as"
+#: ../../include/nav.php:199 ../../include/widgets.php:700
+msgid "Inbox"
msgstr ""
-#: ../../include/conversation.php:1251
-msgid "Toggle voting"
+#: ../../include/nav.php:200 ../../include/widgets.php:705
+msgid "Outbox"
msgstr ""
-#: ../../include/conversation.php:1254
-msgid "Disable comments"
+#: ../../include/nav.php:201 ../../include/widgets.php:710
+msgid "New Message"
msgstr ""
-#: ../../include/conversation.php:1255
-msgid "Toggle comments"
+#: ../../include/nav.php:204
+msgid "Event Calendar"
msgstr ""
-#: ../../include/conversation.php:1263
-msgid "Categories (optional, comma-separated list)"
+#: ../../include/nav.php:205
+msgid "See all events"
msgstr ""
-#: ../../include/conversation.php:1286
-msgid "Other networks and post services"
+#: ../../include/nav.php:206
+msgid "Mark all events seen"
msgstr ""
-#: ../../include/conversation.php:1292
-msgid "Set publish date"
+#: ../../include/nav.php:209
+msgid "Manage Your Channels"
msgstr ""
-#: ../../include/conversation.php:1541
-msgid "Discover"
+#: ../../include/nav.php:211
+msgid "Account/Channel Settings"
msgstr ""
-#: ../../include/conversation.php:1544
-msgid "Imported public streams"
+#: ../../include/nav.php:219 ../../include/widgets.php:1665
+msgid "Admin"
msgstr ""
-#: ../../include/conversation.php:1549
-msgid "Commented Order"
+#: ../../include/nav.php:219
+msgid "Site Setup and Configuration"
msgstr ""
-#: ../../include/conversation.php:1552
-msgid "Sort by Comment Date"
+#: ../../include/nav.php:250 ../../include/conversation.php:869
+msgid "Loading..."
msgstr ""
-#: ../../include/conversation.php:1556
-msgid "Posted Order"
+#: ../../include/nav.php:255
+msgid "@name, #tag, ?doc, content"
msgstr ""
-#: ../../include/conversation.php:1559
-msgid "Sort by Post Date"
+#: ../../include/nav.php:256
+msgid "Please wait..."
msgstr ""
-#: ../../include/conversation.php:1567
-msgid "Posts that mention or involve you"
+#: ../../include/features.php:58
+msgid "General Features"
msgstr ""
-#: ../../include/conversation.php:1576
-msgid "Activity Stream - by date"
+#: ../../include/features.php:63
+msgid "Multiple Profiles"
msgstr ""
-#: ../../include/conversation.php:1582
-msgid "Starred"
+#: ../../include/features.php:64
+msgid "Ability to create multiple profiles"
msgstr ""
-#: ../../include/conversation.php:1585
-msgid "Favourite Posts"
+#: ../../include/features.php:72
+msgid "Advanced Profiles"
msgstr ""
-#: ../../include/conversation.php:1592
-msgid "Spam"
+#: ../../include/features.php:73
+msgid "Additional profile sections and selections"
msgstr ""
-#: ../../include/conversation.php:1595
-msgid "Posts flagged as SPAM"
+#: ../../include/features.php:81
+msgid "Profile Import/Export"
msgstr ""
-#: ../../include/conversation.php:1654
-msgid "Status Messages and Posts"
+#: ../../include/features.php:82
+msgid "Save and load profile details across sites/channels"
msgstr ""
-#: ../../include/conversation.php:1663
-msgid "About"
+#: ../../include/features.php:90
+msgid "Web Pages"
msgstr ""
-#: ../../include/conversation.php:1666
-msgid "Profile Details"
+#: ../../include/features.php:91
+msgid "Provide managed web pages on your channel"
msgstr ""
-#: ../../include/conversation.php:1682
-msgid "Files and Storage"
+#: ../../include/features.php:100
+msgid "Provide a wiki for your channel"
msgstr ""
-#: ../../include/conversation.php:1718
-msgid "Saved Bookmarks"
+#: ../../include/features.php:117
+msgid "Private Notes"
msgstr ""
-#: ../../include/conversation.php:1728
-msgid "Manage Webpages"
+#: ../../include/features.php:118
+msgid "Enables a tool to store notes and reminders (note: not encrypted)"
msgstr ""
-#: ../../include/conversation.php:1793
-msgctxt "noun"
-msgid "Attending"
-msgid_plural "Attending"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/features.php:126
+msgid "Navigation Channel Select"
+msgstr ""
-#: ../../include/conversation.php:1796
-msgctxt "noun"
-msgid "Not Attending"
-msgid_plural "Not Attending"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/features.php:127
+msgid "Change channels directly from within the navigation dropdown menu"
+msgstr ""
-#: ../../include/conversation.php:1799
-msgctxt "noun"
-msgid "Undecided"
-msgid_plural "Undecided"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/features.php:135
+msgid "Photo Location"
+msgstr ""
-#: ../../include/conversation.php:1802
-msgctxt "noun"
-msgid "Agree"
-msgid_plural "Agrees"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/features.php:136
+msgid "If location data is available on uploaded photos, link this to a map."
+msgstr ""
-#: ../../include/conversation.php:1805
-msgctxt "noun"
-msgid "Disagree"
-msgid_plural "Disagrees"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/features.php:144
+msgid "Access Controlled Chatrooms"
+msgstr ""
-#: ../../include/conversation.php:1808
-msgctxt "noun"
-msgid "Abstain"
-msgid_plural "Abstains"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/features.php:145
+msgid "Provide chatrooms and chat services with access control."
+msgstr ""
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
-msgid "Tags"
+#: ../../include/features.php:153
+msgid "Smart Birthdays"
msgstr ""
-#: ../../include/taxonomy.php:293
-msgid "Keywords"
+#: ../../include/features.php:154
+msgid ""
+"Make birthday events timezone aware in case your friends are scattered "
+"across the planet."
msgstr ""
-#: ../../include/taxonomy.php:314
-msgid "have"
+#: ../../include/features.php:162
+msgid "Advanced Directory Search"
msgstr ""
-#: ../../include/taxonomy.php:314
-msgid "has"
+#: ../../include/features.php:163
+msgid "Allows creation of complex directory search queries"
msgstr ""
-#: ../../include/taxonomy.php:315
-msgid "want"
+#: ../../include/features.php:171
+msgid "Advanced Theme and Layout Settings"
msgstr ""
-#: ../../include/taxonomy.php:315
-msgid "wants"
+#: ../../include/features.php:172
+msgid "Allows fine tuning of themes and page layouts"
msgstr ""
-#: ../../include/taxonomy.php:316
-msgid "likes"
+#: ../../include/features.php:182
+msgid "Post Composition Features"
msgstr ""
-#: ../../include/taxonomy.php:317
-msgid "dislikes"
+#: ../../include/features.php:186
+msgid "Large Photos"
msgstr ""
-#: ../../include/event.php:824
-msgid "This event has been added to your calendar."
+#: ../../include/features.php:187
+msgid ""
+"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
+"(640px) photo thumbnails"
msgstr ""
-#: ../../include/event.php:1024
-msgid "Not specified"
+#: ../../include/features.php:196
+msgid "Automatically import channel content from other channels or feeds"
msgstr ""
-#: ../../include/event.php:1025
-msgid "Needs Action"
+#: ../../include/features.php:204
+msgid "Even More Encryption"
msgstr ""
-#: ../../include/event.php:1026
-msgid "Completed"
+#: ../../include/features.php:205
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
msgstr ""
-#: ../../include/event.php:1027
-msgid "In Process"
+#: ../../include/features.php:213
+msgid "Enable Voting Tools"
msgstr ""
-#: ../../include/event.php:1028
-msgid "Cancelled"
+#: ../../include/features.php:214
+msgid "Provide a class of post which others can vote on"
msgstr ""
-#: ../../include/items.php:909 ../../include/items.php:954
-msgid "(Unknown)"
+#: ../../include/features.php:222
+msgid "Disable Comments"
msgstr ""
-#: ../../include/items.php:1152
-msgid "Visible to anybody on the internet."
+#: ../../include/features.php:223
+msgid "Provide the option to disable comments for a post"
msgstr ""
-#: ../../include/items.php:1154
-msgid "Visible to you only."
+#: ../../include/features.php:231
+msgid "Delayed Posting"
msgstr ""
-#: ../../include/items.php:1156
-msgid "Visible to anybody in this network."
+#: ../../include/features.php:232
+msgid "Allow posts to be published at a later date"
msgstr ""
-#: ../../include/items.php:1158
-msgid "Visible to anybody authenticated."
+#: ../../include/features.php:240
+msgid "Content Expiration"
+msgstr ""
+
+#: ../../include/features.php:241
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr ""
+
+#: ../../include/features.php:249
+msgid "Suppress Duplicate Posts/Comments"
+msgstr ""
+
+#: ../../include/features.php:250
+msgid ""
+"Prevent posts with identical content to be published with less than two "
+"minutes in between submissions."
+msgstr ""
+
+#: ../../include/features.php:261
+msgid "Network and Stream Filtering"
+msgstr ""
+
+#: ../../include/features.php:265
+msgid "Search by Date"
+msgstr ""
+
+#: ../../include/features.php:266
+msgid "Ability to select posts by date ranges"
+msgstr ""
+
+#: ../../include/features.php:274 ../../include/group.php:311
+msgid "Privacy Groups"
+msgstr ""
+
+#: ../../include/features.php:275
+msgid "Enable management and selection of privacy groups"
+msgstr ""
+
+#: ../../include/features.php:283 ../../include/widgets.php:283
+msgid "Saved Searches"
+msgstr ""
+
+#: ../../include/features.php:284
+msgid "Save search terms for re-use"
+msgstr ""
+
+#: ../../include/features.php:292
+msgid "Network Personal Tab"
+msgstr ""
+
+#: ../../include/features.php:293
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr ""
+
+#: ../../include/features.php:301
+msgid "Network New Tab"
+msgstr ""
+
+#: ../../include/features.php:302
+msgid "Enable tab to display all new Network activity"
+msgstr ""
+
+#: ../../include/features.php:310
+msgid "Affinity Tool"
+msgstr ""
+
+#: ../../include/features.php:311
+msgid "Filter stream activity by depth of relationships"
+msgstr ""
+
+#: ../../include/features.php:320
+msgid "Show friend and connection suggestions"
+msgstr ""
+
+#: ../../include/features.php:328
+msgid "Connection Filtering"
+msgstr ""
+
+#: ../../include/features.php:329
+msgid "Filter incoming posts from connections based on keywords/content"
+msgstr ""
+
+#: ../../include/features.php:341
+msgid "Post/Comment Tools"
+msgstr ""
+
+#: ../../include/features.php:345
+msgid "Community Tagging"
+msgstr ""
+
+#: ../../include/features.php:346
+msgid "Ability to tag existing posts"
+msgstr ""
+
+#: ../../include/features.php:354
+msgid "Post Categories"
+msgstr ""
+
+#: ../../include/features.php:355
+msgid "Add categories to your posts"
+msgstr ""
+
+#: ../../include/features.php:363
+msgid "Emoji Reactions"
+msgstr ""
+
+#: ../../include/features.php:364
+msgid "Add emoji reaction ability to posts"
+msgstr ""
+
+#: ../../include/features.php:372 ../../include/contact_widgets.php:53
+#: ../../include/widgets.php:346
+msgid "Saved Folders"
+msgstr ""
+
+#: ../../include/features.php:373
+msgid "Ability to file posts under folders"
+msgstr ""
+
+#: ../../include/features.php:381
+msgid "Dislike Posts"
+msgstr ""
+
+#: ../../include/features.php:382
+msgid "Ability to dislike posts/comments"
+msgstr ""
+
+#: ../../include/features.php:390
+msgid "Star Posts"
+msgstr ""
+
+#: ../../include/features.php:391
+msgid "Ability to mark special posts with a star indicator"
+msgstr ""
+
+#: ../../include/features.php:399
+msgid "Tag Cloud"
+msgstr ""
+
+#: ../../include/features.php:400
+msgid "Provide a personal tag cloud on your channel page"
+msgstr ""
+
+#: ../../include/features.php:412
+msgid "Premium Channel"
+msgstr ""
+
+#: ../../include/features.php:413
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr ""
+
+#: ../../include/text.php:460
+msgid "prev"
+msgstr ""
+
+#: ../../include/text.php:462
+msgid "first"
+msgstr ""
+
+#: ../../include/text.php:491
+msgid "last"
+msgstr ""
+
+#: ../../include/text.php:494
+msgid "next"
+msgstr ""
+
+#: ../../include/text.php:505
+msgid "older"
+msgstr ""
+
+#: ../../include/text.php:507
+msgid "newer"
+msgstr ""
+
+#: ../../include/text.php:904
+msgid "No connections"
msgstr ""
-#: ../../include/items.php:1160
+#: ../../include/text.php:929
#, php-format
-msgid "Visible to anybody on %s."
+msgid "View all %s connections"
msgstr ""
-#: ../../include/items.php:1162
-msgid "Visible to all connections."
+#: ../../include/text.php:1074 ../../include/text.php:1079
+msgid "poke"
msgstr ""
-#: ../../include/items.php:1164
-msgid "Visible to approved connections."
+#: ../../include/text.php:1074 ../../include/text.php:1079
+#: ../../include/conversation.php:243
+msgid "poked"
msgstr ""
-#: ../../include/items.php:1166
-msgid "Visible to specific connections."
+#: ../../include/text.php:1080
+msgid "ping"
msgstr ""
-#: ../../include/items.php:3960
-msgid "Privacy group is empty."
+#: ../../include/text.php:1080
+msgid "pinged"
+msgstr ""
+
+#: ../../include/text.php:1081
+msgid "prod"
+msgstr ""
+
+#: ../../include/text.php:1081
+msgid "prodded"
+msgstr ""
+
+#: ../../include/text.php:1082
+msgid "slap"
+msgstr ""
+
+#: ../../include/text.php:1082
+msgid "slapped"
+msgstr ""
+
+#: ../../include/text.php:1083
+msgid "finger"
+msgstr ""
+
+#: ../../include/text.php:1083
+msgid "fingered"
+msgstr ""
+
+#: ../../include/text.php:1084
+msgid "rebuff"
+msgstr ""
+
+#: ../../include/text.php:1084
+msgid "rebuffed"
+msgstr ""
+
+#: ../../include/text.php:1096
+msgid "happy"
+msgstr ""
+
+#: ../../include/text.php:1097
+msgid "sad"
+msgstr ""
+
+#: ../../include/text.php:1098
+msgid "mellow"
+msgstr ""
+
+#: ../../include/text.php:1099
+msgid "tired"
+msgstr ""
+
+#: ../../include/text.php:1100
+msgid "perky"
+msgstr ""
+
+#: ../../include/text.php:1101
+msgid "angry"
+msgstr ""
+
+#: ../../include/text.php:1102
+msgid "stupefied"
+msgstr ""
+
+#: ../../include/text.php:1103
+msgid "puzzled"
+msgstr ""
+
+#: ../../include/text.php:1104
+msgid "interested"
+msgstr ""
+
+#: ../../include/text.php:1105
+msgid "bitter"
+msgstr ""
+
+#: ../../include/text.php:1106
+msgid "cheerful"
+msgstr ""
+
+#: ../../include/text.php:1107
+msgid "alive"
+msgstr ""
+
+#: ../../include/text.php:1108
+msgid "annoyed"
+msgstr ""
+
+#: ../../include/text.php:1109
+msgid "anxious"
+msgstr ""
+
+#: ../../include/text.php:1110
+msgid "cranky"
+msgstr ""
+
+#: ../../include/text.php:1111
+msgid "disturbed"
+msgstr ""
+
+#: ../../include/text.php:1112
+msgid "frustrated"
+msgstr ""
+
+#: ../../include/text.php:1113
+msgid "depressed"
+msgstr ""
+
+#: ../../include/text.php:1114
+msgid "motivated"
+msgstr ""
+
+#: ../../include/text.php:1115
+msgid "relaxed"
+msgstr ""
+
+#: ../../include/text.php:1116
+msgid "surprised"
+msgstr ""
+
+#: ../../include/text.php:1303 ../../include/js_strings.php:70
+msgid "Monday"
+msgstr ""
+
+#: ../../include/text.php:1303 ../../include/js_strings.php:71
+msgid "Tuesday"
+msgstr ""
+
+#: ../../include/text.php:1303 ../../include/js_strings.php:72
+msgid "Wednesday"
+msgstr ""
+
+#: ../../include/text.php:1303 ../../include/js_strings.php:73
+msgid "Thursday"
+msgstr ""
+
+#: ../../include/text.php:1303 ../../include/js_strings.php:74
+msgid "Friday"
+msgstr ""
+
+#: ../../include/text.php:1303 ../../include/js_strings.php:75
+msgid "Saturday"
+msgstr ""
+
+#: ../../include/text.php:1303 ../../include/js_strings.php:69
+msgid "Sunday"
+msgstr ""
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:45
+msgid "January"
+msgstr ""
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:46
+msgid "February"
+msgstr ""
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:47
+msgid "March"
+msgstr ""
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:48
+msgid "April"
+msgstr ""
+
+#: ../../include/text.php:1307
+msgid "May"
+msgstr ""
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:50
+msgid "June"
+msgstr ""
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:51
+msgid "July"
+msgstr ""
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:52
+msgid "August"
+msgstr ""
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:53
+msgid "September"
+msgstr ""
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:54
+msgid "October"
+msgstr ""
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:55
+msgid "November"
+msgstr ""
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:56
+msgid "December"
+msgstr ""
+
+#: ../../include/text.php:1384 ../../include/text.php:1388
+msgid "Unknown Attachment"
+msgstr ""
+
+#: ../../include/text.php:1390
+msgid "unknown"
+msgstr ""
+
+#: ../../include/text.php:1426
+msgid "remove category"
+msgstr ""
+
+#: ../../include/text.php:1503
+msgid "remove from file"
+msgstr ""
+
+#: ../../include/text.php:1770 ../../include/language.php:367
+msgid "default"
+msgstr ""
+
+#: ../../include/text.php:1778
+msgid "Page layout"
+msgstr ""
+
+#: ../../include/text.php:1778
+msgid "You can create your own with the layouts tool"
+msgstr ""
+
+#: ../../include/text.php:1820
+msgid "Page content type"
+msgstr ""
+
+#: ../../include/text.php:1953
+msgid "activity"
+msgstr ""
+
+#: ../../include/text.php:2267
+msgid "Design Tools"
+msgstr ""
+
+#: ../../include/text.php:2273
+msgid "Pages"
+msgstr ""
+
+#: ../../include/text.php:2295
+msgid "Import website..."
+msgstr ""
+
+#: ../../include/text.php:2296
+msgid "Select folder to import"
+msgstr ""
+
+#: ../../include/text.php:2297
+msgid "Import from a zipped folder:"
+msgstr ""
+
+#: ../../include/text.php:2298
+msgid "Import from cloud files:"
+msgstr ""
+
+#: ../../include/text.php:2299
+msgid "/cloud/channel/path/to/folder"
+msgstr ""
+
+#: ../../include/text.php:2300
+msgid "Enter path to website files"
+msgstr ""
+
+#: ../../include/text.php:2301
+msgid "Select folder"
+msgstr ""
+
+#: ../../include/text.php:2302
+msgid "Export website..."
+msgstr ""
+
+#: ../../include/text.php:2303
+msgid "Export to a zip file"
+msgstr ""
+
+#: ../../include/text.php:2304
+msgid "website.zip"
+msgstr ""
+
+#: ../../include/text.php:2305
+msgid "Enter a name for the zip file."
+msgstr ""
+
+#: ../../include/text.php:2306
+msgid "Export to cloud files"
+msgstr ""
+
+#: ../../include/text.php:2307
+msgid "/path/to/export/folder"
+msgstr ""
+
+#: ../../include/text.php:2308
+msgid "Enter a path to a cloud files destination."
msgstr ""
-#: ../../include/items.php:3967
+#: ../../include/text.php:2309
+msgid "Specify folder"
+msgstr ""
+
+#: ../../include/bookmarks.php:35
#, php-format
-msgid "Privacy group: %s"
+msgid "%1$s's bookmarks"
msgstr ""
-#: ../../include/items.php:3979
-msgid "Connection not found."
+#: ../../include/wiki.php:545 ../../include/bbcode.php:552
+#: ../../include/bbcode.php:683
+msgid "Different viewers will see this text differently"
msgstr ""
-#: ../../include/items.php:4332
-msgid "profile photo"
+#: ../../include/help.php:31
+msgid "Help:"
+msgstr ""
+
+#: ../../include/page_widgets.php:7
+msgid "New Page"
msgstr ""
#: ../../include/contact_widgets.php:11
@@ -9714,6 +11850,17 @@ msgstr ""
msgid "Advanced example: name=fred and country=iceland"
msgstr ""
+#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
+#: ../../include/widgets.php:349 ../../include/widgets.php:468
+msgid "Everything"
+msgstr ""
+
+#: ../../include/contact_widgets.php:91 ../../include/taxonomy.php:188
+#: ../../include/taxonomy.php:270 ../../include/widgets.php:46
+#: ../../include/widgets.php:465
+msgid "Categories"
+msgstr ""
+
#: ../../include/contact_widgets.php:122
#, php-format
msgid "%d connection in common"
@@ -9725,33 +11872,328 @@ msgstr[1] ""
msgid "show more"
msgstr ""
-#: ../../include/acl_selectors.php:172
-msgid "Who can see this?"
+#: ../../include/selectors.php:123
+msgid "Partners"
msgstr ""
-#: ../../include/acl_selectors.php:173
-msgid "Custom selection"
+#: ../../include/selectors.php:123 ../../include/selectors.php:140
+msgid "Cohabiting"
+msgstr ""
+
+#: ../../include/selectors.php:123
+msgid "Common law"
+msgstr ""
+
+#: ../../include/selectors.php:123
+msgid "Happy"
+msgstr ""
+
+#: ../../include/selectors.php:123
+msgid "Not looking"
+msgstr ""
+
+#: ../../include/selectors.php:123
+msgid "Swinger"
+msgstr ""
+
+#: ../../include/selectors.php:123
+msgid "Betrayed"
+msgstr ""
+
+#: ../../include/selectors.php:123 ../../include/selectors.php:140
+msgid "Separated"
+msgstr ""
+
+#: ../../include/selectors.php:123
+msgid "Unstable"
+msgstr ""
+
+#: ../../include/selectors.php:123 ../../include/selectors.php:140
+msgid "Divorced"
+msgstr ""
+
+#: ../../include/selectors.php:123
+msgid "Imaginarily divorced"
+msgstr ""
+
+#: ../../include/selectors.php:123 ../../include/selectors.php:140
+msgid "Widowed"
+msgstr ""
+
+#: ../../include/selectors.php:123
+msgid "Uncertain"
+msgstr ""
+
+#: ../../include/selectors.php:123 ../../include/selectors.php:140
+msgid "It's complicated"
+msgstr ""
+
+#: ../../include/selectors.php:123
+msgid "Don't care"
+msgstr ""
+
+#: ../../include/selectors.php:123
+msgid "Ask me"
+msgstr ""
+
+#: ../../include/permissions.php:35
+msgid "Can view my normal stream and posts"
+msgstr ""
+
+#: ../../include/permissions.php:39
+msgid "Can view my webpages"
+msgstr ""
+
+#: ../../include/permissions.php:43
+msgid "Can post on my channel page (\"wall\")"
+msgstr ""
+
+#: ../../include/permissions.php:46
+msgid "Can like/dislike stuff"
+msgstr ""
+
+#: ../../include/permissions.php:46
+msgid "Profiles and things other than posts/comments"
+msgstr ""
+
+#: ../../include/permissions.php:48
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr ""
+
+#: ../../include/permissions.php:48
+msgid "Advanced - useful for creating group forum channels"
+msgstr ""
+
+#: ../../include/permissions.php:49
+msgid "Can chat with me (when available)"
+msgstr ""
+
+#: ../../include/permissions.php:50
+msgid "Can write to my file storage and photos"
+msgstr ""
+
+#: ../../include/permissions.php:51
+msgid "Can edit my webpages"
+msgstr ""
+
+#: ../../include/permissions.php:53
+msgid "Somewhat advanced - very useful in open communities"
+msgstr ""
+
+#: ../../include/permissions.php:55
+msgid "Can administer my channel resources"
+msgstr ""
+
+#: ../../include/network.php:729
+msgid "view full size"
+msgstr ""
+
+#: ../../include/network.php:1978
+msgid "No Subject"
+msgstr ""
+
+#: ../../include/network.php:2234
+msgid "OStatus"
+msgstr ""
+
+#: ../../include/network.php:2235
+msgid "GNU-Social"
+msgstr ""
+
+#: ../../include/network.php:2236
+msgid "RSS/Atom"
+msgstr ""
+
+#: ../../include/network.php:2239
+msgid "Facebook"
+msgstr ""
+
+#: ../../include/network.php:2240
+msgid "Zot"
+msgstr ""
+
+#: ../../include/network.php:2241
+msgid "LinkedIn"
+msgstr ""
+
+#: ../../include/network.php:2242
+msgid "XMPP/IM"
+msgstr ""
+
+#: ../../include/network.php:2243
+msgid "MySpace"
+msgstr ""
+
+#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+msgid "Tags"
+msgstr ""
+
+#: ../../include/taxonomy.php:293
+msgid "Keywords"
+msgstr ""
+
+#: ../../include/taxonomy.php:314
+msgid "have"
+msgstr ""
+
+#: ../../include/taxonomy.php:314
+msgid "has"
+msgstr ""
+
+#: ../../include/taxonomy.php:315
+msgid "want"
+msgstr ""
+
+#: ../../include/taxonomy.php:315
+msgid "wants"
+msgstr ""
+
+#: ../../include/taxonomy.php:316
+msgid "likes"
+msgstr ""
+
+#: ../../include/taxonomy.php:317
+msgid "dislikes"
msgstr ""
-#: ../../include/acl_selectors.php:174
+#: ../../include/import.php:30
msgid ""
-"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit "
-"the scope of \"Show\"."
+"Cannot create a duplicate channel identifier on this system. Import failed."
msgstr ""
-#: ../../include/acl_selectors.php:175
-msgid "Show"
+#: ../../include/import.php:90
+msgid "Channel clone failed. Import failed."
msgstr ""
-#: ../../include/acl_selectors.php:176
-msgid "Don't show"
+#: ../../include/import.php:1354
+msgid "Unable to import element \""
msgstr ""
-#: ../../include/acl_selectors.php:209
-#, php-format
+#: ../../include/security.php:117
+msgid "guest:"
+msgstr ""
+
+#: ../../include/security.php:535
msgid ""
-"Post permissions %s cannot be changed %s after a post is shared.</br />These "
-"permissions set who is allowed to view the post."
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
+msgstr ""
+
+#: ../../include/zot.php:662
+msgid "Invalid data packet"
+msgstr ""
+
+#: ../../include/zot.php:678
+msgid "Unable to verify channel signature"
+msgstr ""
+
+#: ../../include/zot.php:2320
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr ""
+
+#: ../../include/zot.php:3718
+msgid "invalid target signature"
+msgstr ""
+
+#: ../../include/items.php:837 ../../include/items.php:882
+msgid "(Unknown)"
+msgstr ""
+
+#: ../../include/items.php:1080
+msgid "Visible to anybody on the internet."
+msgstr ""
+
+#: ../../include/items.php:1082
+msgid "Visible to you only."
+msgstr ""
+
+#: ../../include/items.php:1084
+msgid "Visible to anybody in this network."
+msgstr ""
+
+#: ../../include/items.php:1086
+msgid "Visible to anybody authenticated."
+msgstr ""
+
+#: ../../include/items.php:1088
+#, php-format
+msgid "Visible to anybody on %s."
+msgstr ""
+
+#: ../../include/items.php:1090
+msgid "Visible to all connections."
+msgstr ""
+
+#: ../../include/items.php:1092
+msgid "Visible to approved connections."
+msgstr ""
+
+#: ../../include/items.php:1094
+msgid "Visible to specific connections."
+msgstr ""
+
+#: ../../include/items.php:3892
+msgid "Privacy group is empty."
+msgstr ""
+
+#: ../../include/items.php:3899
+#, php-format
+msgid "Privacy group: %s"
+msgstr ""
+
+#: ../../include/items.php:3911
+msgid "Connection not found."
+msgstr ""
+
+#: ../../include/items.php:4260
+msgid "profile photo"
+msgstr ""
+
+#: ../../include/items.php:4456
+#, php-format
+msgid "[Edited %s]"
+msgstr ""
+
+#: ../../include/items.php:4456
+msgctxt "edit_activity"
+msgid "Post"
+msgstr ""
+
+#: ../../include/items.php:4456
+msgctxt "edit_activity"
+msgid "Comment"
+msgstr ""
+
+#: ../../include/auth.php:148
+msgid "Logged out."
+msgstr ""
+
+#: ../../include/auth.php:275
+msgid "Failed authentication"
+msgstr ""
+
+#: ../../include/activities.php:41
+msgid " and "
+msgstr ""
+
+#: ../../include/activities.php:49
+msgid "public profile"
+msgstr ""
+
+#: ../../include/activities.php:58
+#, php-format
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr ""
+
+#: ../../include/activities.php:59
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr ""
+
+#: ../../include/activities.php:62
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
msgstr ""
#: ../../include/attach.php:248 ../../include/attach.php:336
@@ -9780,215 +12222,813 @@ msgstr ""
msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
msgstr ""
-#: ../../include/attach.php:846
+#: ../../include/attach.php:852
msgid "File upload failed. Possible system limit or action terminated."
msgstr ""
-#: ../../include/attach.php:859
+#: ../../include/attach.php:865
msgid "Stored file could not be verified. Upload failed."
msgstr ""
-#: ../../include/attach.php:914 ../../include/attach.php:930
+#: ../../include/attach.php:920 ../../include/attach.php:936
msgid "Path not available."
msgstr ""
-#: ../../include/attach.php:976 ../../include/attach.php:1128
+#: ../../include/attach.php:982 ../../include/attach.php:1140
msgid "Empty pathname"
msgstr ""
-#: ../../include/attach.php:1002
+#: ../../include/attach.php:1008
msgid "duplicate filename or path"
msgstr ""
-#: ../../include/attach.php:1024
+#: ../../include/attach.php:1030
msgid "Path not found."
msgstr ""
-#: ../../include/attach.php:1082
+#: ../../include/attach.php:1094
msgid "mkdir failed."
msgstr ""
-#: ../../include/attach.php:1086
+#: ../../include/attach.php:1098
msgid "database storage failed."
msgstr ""
-#: ../../include/attach.php:1134
+#: ../../include/attach.php:1146
msgid "Empty path"
msgstr ""
-#: ../../include/channel.php:33
-msgid "Unable to obtain identity information from database"
+#: ../../include/event.php:22 ../../include/event.php:69
+#: ../../include/bb2diaspora.php:498
+msgid "l F d, Y \\@ g:i A"
msgstr ""
-#: ../../include/channel.php:67
-msgid "Empty name"
+#: ../../include/event.php:30 ../../include/event.php:73
+#: ../../include/bb2diaspora.php:504
+msgid "Starts:"
msgstr ""
-#: ../../include/channel.php:70
-msgid "Name too long"
+#: ../../include/event.php:40 ../../include/event.php:77
+#: ../../include/bb2diaspora.php:512
+msgid "Finishes:"
msgstr ""
-#: ../../include/channel.php:181
-msgid "No account identifier"
+#: ../../include/event.php:824
+msgid "This event has been added to your calendar."
msgstr ""
-#: ../../include/channel.php:193
-msgid "Nickname is required."
+#: ../../include/event.php:1024
+msgid "Not specified"
msgstr ""
-#: ../../include/channel.php:207
-msgid "Reserved nickname. Please choose another."
+#: ../../include/event.php:1025
+msgid "Needs Action"
msgstr ""
-#: ../../include/channel.php:212
+#: ../../include/event.php:1026
+msgid "Completed"
+msgstr ""
+
+#: ../../include/event.php:1027
+msgid "In Process"
+msgstr ""
+
+#: ../../include/event.php:1028
+msgid "Cancelled"
+msgstr ""
+
+#: ../../include/follow.php:27
+msgid "Channel is blocked on this site."
+msgstr ""
+
+#: ../../include/follow.php:32
+msgid "Channel location missing."
+msgstr ""
+
+#: ../../include/follow.php:80
+msgid "Response from remote channel was incomplete."
+msgstr ""
+
+#: ../../include/follow.php:97
+msgid "Channel was deleted and no longer exists."
+msgstr ""
+
+#: ../../include/follow.php:147 ../../include/follow.php:183
+msgid "Protocol disabled."
+msgstr ""
+
+#: ../../include/follow.php:171
+msgid "Channel discovery failed."
+msgstr ""
+
+#: ../../include/follow.php:210
+msgid "Cannot connect to yourself."
+msgstr ""
+
+#: ../../include/group.php:26
msgid ""
-"Nickname has unsupported characters or is already being used on this site."
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
msgstr ""
-#: ../../include/channel.php:272
-msgid "Unable to retrieve created identity"
+#: ../../include/group.php:248
+msgid "Add new connections to this privacy group"
msgstr ""
-#: ../../include/channel.php:341
-msgid "Default Profile"
+#: ../../include/group.php:289
+msgid "edit"
msgstr ""
-#: ../../include/channel.php:816
-msgid "Requested channel is not available."
+#: ../../include/group.php:312
+msgid "Edit group"
msgstr ""
-#: ../../include/channel.php:962
-msgid "Create New Profile"
+#: ../../include/group.php:313
+msgid "Add privacy group"
msgstr ""
-#: ../../include/channel.php:982
-msgid "Visible to everybody"
+#: ../../include/group.php:314
+msgid "Channels not in any privacy group"
msgstr ""
-#: ../../include/channel.php:1055 ../../include/channel.php:1174
-msgid "Gender:"
+#: ../../include/group.php:316 ../../include/widgets.php:284
+msgid "add"
msgstr ""
-#: ../../include/channel.php:1056 ../../include/channel.php:1218
-msgid "Status:"
+#: ../../include/language.php:380
+msgid "Select an alternate language"
msgstr ""
-#: ../../include/channel.php:1057 ../../include/channel.php:1229
-msgid "Homepage:"
+#: ../../include/photos.php:115
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
msgstr ""
-#: ../../include/channel.php:1058
-msgid "Online Now"
+#: ../../include/photos.php:122
+msgid "Image file is empty."
msgstr ""
-#: ../../include/channel.php:1179
-msgid "Like this channel"
+#: ../../include/photos.php:260
+msgid "Photo storage failed."
msgstr ""
-#: ../../include/channel.php:1203
-msgid "j F, Y"
+#: ../../include/photos.php:300
+msgid "a new photo"
msgstr ""
-#: ../../include/channel.php:1204
-msgid "j F"
+#: ../../include/photos.php:304
+#, php-format
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
msgstr ""
-#: ../../include/channel.php:1211
-msgid "Birthday:"
+#: ../../include/photos.php:507 ../../include/conversation.php:1695
+msgid "Photo Albums"
msgstr ""
-#: ../../include/channel.php:1224
+#: ../../include/photos.php:511
+msgid "Upload New Photos"
+msgstr ""
+
+#: ../../include/widgets.php:103
+msgid "System"
+msgstr ""
+
+#: ../../include/widgets.php:106
+msgid "New App"
+msgstr ""
+
+#: ../../include/widgets.php:154
+msgid "Suggestions"
+msgstr ""
+
+#: ../../include/widgets.php:155
+msgid "See more..."
+msgstr ""
+
+#: ../../include/widgets.php:175
#, php-format
-msgid "for %1$d %2$s"
+msgid "You have %1$.0f of %2$.0f allowed connections."
msgstr ""
-#: ../../include/channel.php:1227
-msgid "Sexual Preference:"
+#: ../../include/widgets.php:181
+msgid "Add New Connection"
msgstr ""
-#: ../../include/channel.php:1233
-msgid "Tags:"
+#: ../../include/widgets.php:182
+msgid "Enter channel address"
msgstr ""
-#: ../../include/channel.php:1235
-msgid "Political Views:"
+#: ../../include/widgets.php:183
+msgid "Examples: bob@example.com, https://example.com/barbara"
msgstr ""
-#: ../../include/channel.php:1237
-msgid "Religion:"
+#: ../../include/widgets.php:199
+msgid "Notes"
msgstr ""
-#: ../../include/channel.php:1241
-msgid "Hobbies/Interests:"
+#: ../../include/widgets.php:275
+msgid "Remove term"
msgstr ""
-#: ../../include/channel.php:1243
-msgid "Likes:"
+#: ../../include/widgets.php:390
+msgid "Archives"
msgstr ""
-#: ../../include/channel.php:1245
-msgid "Dislikes:"
+#: ../../include/widgets.php:552
+msgid "Refresh"
msgstr ""
-#: ../../include/channel.php:1247
-msgid "Contact information and Social Networks:"
+#: ../../include/widgets.php:592
+msgid "Account settings"
msgstr ""
-#: ../../include/channel.php:1249
-msgid "My other channels:"
+#: ../../include/widgets.php:598
+msgid "Channel settings"
msgstr ""
-#: ../../include/channel.php:1251
-msgid "Musical interests:"
+#: ../../include/widgets.php:607
+msgid "Additional features"
msgstr ""
-#: ../../include/channel.php:1253
-msgid "Books, literature:"
+#: ../../include/widgets.php:614
+msgid "Feature/Addon settings"
msgstr ""
-#: ../../include/channel.php:1255
-msgid "Television:"
+#: ../../include/widgets.php:620
+msgid "Display settings"
msgstr ""
-#: ../../include/channel.php:1257
-msgid "Film/dance/culture/entertainment:"
+#: ../../include/widgets.php:627
+msgid "Manage locations"
msgstr ""
-#: ../../include/channel.php:1259
-msgid "Love/Romance:"
+#: ../../include/widgets.php:634
+msgid "Export channel"
msgstr ""
-#: ../../include/channel.php:1261
-msgid "Work/employment:"
+#: ../../include/widgets.php:640
+msgid "Connected apps"
msgstr ""
-#: ../../include/channel.php:1263
-msgid "School/education:"
+#: ../../include/widgets.php:664
+msgid "Premium Channel Settings"
msgstr ""
-#: ../../include/channel.php:1284
-msgid "Like this thing"
+#: ../../include/widgets.php:693
+msgid "Private Mail Menu"
msgstr ""
-#: ../../include/help.php:31
-msgid "Help:"
+#: ../../include/widgets.php:695
+msgid "Combined View"
msgstr ""
-#: ../../include/zot.php:705
-msgid "Invalid data packet"
+#: ../../include/widgets.php:727 ../../include/widgets.php:739
+msgid "Conversations"
msgstr ""
-#: ../../include/zot.php:721
-msgid "Unable to verify channel signature"
+#: ../../include/widgets.php:731
+msgid "Received Messages"
+msgstr ""
+
+#: ../../include/widgets.php:735
+msgid "Sent Messages"
+msgstr ""
+
+#: ../../include/widgets.php:749
+msgid "No messages."
+msgstr ""
+
+#: ../../include/widgets.php:767
+msgid "Delete conversation"
+msgstr ""
+
+#: ../../include/widgets.php:793
+msgid "Events Tools"
+msgstr ""
+
+#: ../../include/widgets.php:794
+msgid "Export Calendar"
+msgstr ""
+
+#: ../../include/widgets.php:795
+msgid "Import Calendar"
+msgstr ""
+
+#: ../../include/widgets.php:883 ../../include/conversation.php:1722
+#: ../../include/conversation.php:1725
+msgid "Chatrooms"
+msgstr ""
+
+#: ../../include/widgets.php:887
+msgid "Overview"
+msgstr ""
+
+#: ../../include/widgets.php:894
+msgid "Chat Members"
+msgstr ""
+
+#: ../../include/widgets.php:960
+msgid "Wiki List"
+msgstr ""
+
+#: ../../include/widgets.php:968
+msgid "Create new wiki"
+msgstr ""
+
+#: ../../include/widgets.php:978
+msgid "Send notification"
+msgstr ""
+
+#: ../../include/widgets.php:1014
+msgid "Wiki Pages"
+msgstr ""
+
+#: ../../include/widgets.php:1019
+msgid "Add new page"
+msgstr ""
+
+#: ../../include/widgets.php:1020
+msgid "Page name"
+msgstr ""
+
+#: ../../include/widgets.php:1052
+msgid "Bookmarked Chatrooms"
+msgstr ""
+
+#: ../../include/widgets.php:1083
+msgid "Suggested Chatrooms"
+msgstr ""
+
+#: ../../include/widgets.php:1228 ../../include/widgets.php:1340
+msgid "photo/image"
+msgstr ""
+
+#: ../../include/widgets.php:1283
+msgid "Click to show more"
+msgstr ""
+
+#: ../../include/widgets.php:1434
+msgid "Rating Tools"
+msgstr ""
+
+#: ../../include/widgets.php:1438 ../../include/widgets.php:1440
+msgid "Rate Me"
+msgstr ""
+
+#: ../../include/widgets.php:1443
+msgid "View Ratings"
+msgstr ""
+
+#: ../../include/widgets.php:1536
+msgid "Forums"
+msgstr ""
+
+#: ../../include/widgets.php:1565
+msgid "Tasks"
+msgstr ""
+
+#: ../../include/widgets.php:1576
+msgid "Documentation"
+msgstr ""
+
+#: ../../include/widgets.php:1632 ../../include/widgets.php:1670
+msgid "Member registrations waiting for confirmation"
+msgstr ""
+
+#: ../../include/widgets.php:1638
+msgid "Inspect queue"
+msgstr ""
+
+#: ../../include/widgets.php:1640
+msgid "DB updates"
+msgstr ""
+
+#: ../../include/widgets.php:1666
+msgid "Plugin Features"
+msgstr ""
+
+#: ../../include/acl_selectors.php:198
+msgid "Who can see this?"
+msgstr ""
+
+#: ../../include/acl_selectors.php:199
+msgid "Custom selection"
msgstr ""
-#: ../../include/zot.php:2336
+#: ../../include/acl_selectors.php:200
+msgid ""
+"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit "
+"the scope of \"Show\"."
+msgstr ""
+
+#: ../../include/acl_selectors.php:201
+msgid "Show"
+msgstr ""
+
+#: ../../include/acl_selectors.php:202
+msgid "Don't show"
+msgstr ""
+
+#: ../../include/acl_selectors.php:235
#, php-format
-msgid "Unable to verify site signature for %s"
+msgid ""
+"Post permissions %s cannot be changed %s after a post is shared.</br />These "
+"permissions set who is allowed to view the post."
msgstr ""
-#: ../../include/zot.php:3721
-msgid "invalid target signature"
+#: ../../include/oembed.php:312
+msgid " by "
+msgstr ""
+
+#: ../../include/oembed.php:313
+msgid " on "
+msgstr ""
+
+#: ../../include/oembed.php:342
+msgid "Embedded content"
+msgstr ""
+
+#: ../../include/oembed.php:351
+msgid "Embedding disabled"
+msgstr ""
+
+#: ../../include/bb2diaspora.php:403
+msgid "Attachments:"
+msgstr ""
+
+#: ../../include/bb2diaspora.php:500
+msgid "$Projectname event notification:"
+msgstr ""
+
+#: ../../include/permissions.php:35
+msgid "Can view my normal stream and posts"
+msgstr ""
+
+#: ../../include/permissions.php:39
+msgid "Can view my webpages"
+msgstr ""
+
+#: ../../include/permissions.php:43
+msgid "Can post on my channel page (\"wall\")"
+msgstr ""
+
+#: ../../include/permissions.php:46
+msgid "Can like/dislike stuff"
+msgstr ""
+
+#: ../../include/permissions.php:46
+msgid "Profiles and things other than posts/comments"
+msgstr ""
+
+#: ../../include/permissions.php:48
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr ""
+
+#: ../../include/permissions.php:48
+msgid "Advanced - useful for creating group forum channels"
+msgstr ""
+
+#: ../../include/permissions.php:49
+msgid "Can chat with me (when available)"
+msgstr ""
+
+#: ../../include/permissions.php:50
+msgid "Can write to my file storage and photos"
+msgstr ""
+
+#: ../../include/permissions.php:51
+msgid "Can edit my webpages"
+msgstr ""
+
+#: ../../include/permissions.php:53
+msgid "Somewhat advanced - very useful in open communities"
+msgstr ""
+
+#: ../../include/permissions.php:55
+msgid "Can administer my channel resources"
+msgstr ""
+
+#: ../../include/permissions.php:55
+msgid "Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr ""
+
+#: ../../include/conversation.php:204
+#, php-format
+msgid "%1$s is now connected with %2$s"
+msgstr ""
+
+#: ../../include/conversation.php:239
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr ""
+
+#: ../../include/conversation.php:710
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr ""
+
+#: ../../include/conversation.php:729
+msgid "Categories:"
+msgstr ""
+
+#: ../../include/conversation.php:730
+msgid "Filed under:"
+msgstr ""
+
+#: ../../include/conversation.php:755
+msgid "View in context"
+msgstr ""
+
+#: ../../include/conversation.php:865
+msgid "remove"
+msgstr ""
+
+#: ../../include/conversation.php:870
+msgid "Delete Selected Items"
+msgstr ""
+
+#: ../../include/conversation.php:963
+msgid "View Source"
+msgstr ""
+
+#: ../../include/conversation.php:964
+msgid "Follow Thread"
+msgstr ""
+
+#: ../../include/conversation.php:965
+msgid "Unfollow Thread"
+msgstr ""
+
+#: ../../include/conversation.php:970
+msgid "Activity/Posts"
+msgstr ""
+
+#: ../../include/conversation.php:972
+msgid "Edit Connection"
+msgstr ""
+
+#: ../../include/conversation.php:973
+msgid "Message"
+msgstr ""
+
+#: ../../include/conversation.php:1093
+#, php-format
+msgid "%s likes this."
+msgstr ""
+
+#: ../../include/conversation.php:1093
+#, php-format
+msgid "%s doesn't like this."
+msgstr ""
+
+#: ../../include/conversation.php:1097
+#, php-format
+msgid "<span %1$s>%2$d people</span> like this."
+msgid_plural "<span %1$s>%2$d people</span> like this."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/conversation.php:1099
+#, php-format
+msgid "<span %1$s>%2$d people</span> don't like this."
+msgid_plural "<span %1$s>%2$d people</span> don't like this."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/conversation.php:1105
+msgid "and"
+msgstr ""
+
+#: ../../include/conversation.php:1108
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/conversation.php:1109
+#, php-format
+msgid "%s like this."
+msgstr ""
+
+#: ../../include/conversation.php:1109
+#, php-format
+msgid "%s don't like this."
+msgstr ""
+
+#: ../../include/conversation.php:1152
+msgid "Set your location"
+msgstr ""
+
+#: ../../include/conversation.php:1153
+msgid "Clear browser location"
+msgstr ""
+
+#: ../../include/conversation.php:1201
+msgid "Tag term:"
+msgstr ""
+
+#: ../../include/conversation.php:1202
+msgid "Where are you right now?"
+msgstr ""
+
+#: ../../include/conversation.php:1211
+msgid "Comments enabled"
+msgstr ""
+
+#: ../../include/conversation.php:1212
+msgid "Comments disabled"
+msgstr ""
+
+#: ../../include/conversation.php:1250
+msgid "Page link name"
+msgstr ""
+
+#: ../../include/conversation.php:1253
+msgid "Post as"
+msgstr ""
+
+#: ../../include/conversation.php:1267
+msgid "Toggle voting"
+msgstr ""
+
+#: ../../include/conversation.php:1270
+msgid "Disable comments"
+msgstr ""
+
+#: ../../include/conversation.php:1271
+msgid "Toggle comments"
+msgstr ""
+
+#: ../../include/conversation.php:1279
+msgid "Categories (optional, comma-separated list)"
+msgstr ""
+
+#: ../../include/conversation.php:1302
+msgid "Other networks and post services"
+msgstr ""
+
+#: ../../include/conversation.php:1308
+msgid "Set publish date"
+msgstr ""
+
+#: ../../include/conversation.php:1562
+msgid "Discover"
+msgstr ""
+
+#: ../../include/conversation.php:1565
+msgid "Imported public streams"
+msgstr ""
+
+#: ../../include/conversation.php:1570
+msgid "Commented Order"
+msgstr ""
+
+#: ../../include/conversation.php:1573
+msgid "Sort by Comment Date"
+msgstr ""
+
+#: ../../include/conversation.php:1577
+msgid "Posted Order"
+msgstr ""
+
+#: ../../include/conversation.php:1580
+msgid "Sort by Post Date"
+msgstr ""
+
+#: ../../include/conversation.php:1588
+msgid "Posts that mention or involve you"
+msgstr ""
+
+#: ../../include/conversation.php:1597
+msgid "Activity Stream - by date"
+msgstr ""
+
+#: ../../include/conversation.php:1603
+msgid "Starred"
+msgstr ""
+
+#: ../../include/conversation.php:1606
+msgid "Favourite Posts"
+msgstr ""
+
+#: ../../include/conversation.php:1613
+msgid "Spam"
+msgstr ""
+
+#: ../../include/conversation.php:1616
+msgid "Posts flagged as SPAM"
+msgstr ""
+
+#: ../../include/conversation.php:1674
+msgid "Status Messages and Posts"
+msgstr ""
+
+#: ../../include/conversation.php:1683
+msgid "About"
+msgstr ""
+
+#: ../../include/conversation.php:1686
+msgid "Profile Details"
+msgstr ""
+
+#: ../../include/conversation.php:1702
+msgid "Files and Storage"
+msgstr ""
+
+#: ../../include/conversation.php:1738
+msgid "Saved Bookmarks"
+msgstr ""
+
+#: ../../include/conversation.php:1748
+msgid "Manage Webpages"
+msgstr ""
+
+#: ../../include/conversation.php:1813
+msgctxt "noun"
+msgid "Attending"
+msgid_plural "Attending"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/conversation.php:1816
+msgctxt "noun"
+msgid "Not Attending"
+msgid_plural "Not Attending"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/conversation.php:1819
+msgctxt "noun"
+msgid "Undecided"
+msgid_plural "Undecided"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/conversation.php:1822
+msgctxt "noun"
+msgid "Agree"
+msgid_plural "Agrees"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/conversation.php:1825
+msgctxt "noun"
+msgid "Disagree"
+msgid_plural "Disagrees"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/conversation.php:1828
+msgctxt "noun"
+msgid "Abstain"
+msgid_plural "Abstains"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/bbcode.php:134 ../../include/bbcode.php:962
+#: ../../include/bbcode.php:965 ../../include/bbcode.php:970
+#: ../../include/bbcode.php:973 ../../include/bbcode.php:976
+#: ../../include/bbcode.php:979 ../../include/bbcode.php:984
+#: ../../include/bbcode.php:987 ../../include/bbcode.php:992
+#: ../../include/bbcode.php:995 ../../include/bbcode.php:998
+#: ../../include/bbcode.php:1001
+msgid "Image/photo"
+msgstr ""
+
+#: ../../include/bbcode.php:173 ../../include/bbcode.php:1012
+msgid "Encrypted content"
+msgstr ""
+
+#: ../../include/bbcode.php:189
+#, php-format
+msgid "Install %s element: "
+msgstr ""
+
+#: ../../include/bbcode.php:193
+#, php-format
+msgid ""
+"This post contains an installable %s element, however you lack permissions "
+"to install it on this site."
+msgstr ""
+
+#: ../../include/bbcode.php:272
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr ""
+
+#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
+msgid "Click to open/close"
+msgstr ""
+
+#: ../../include/bbcode.php:357
+msgid "spoiler"
+msgstr ""
+
+#: ../../include/bbcode.php:950
+msgid "$1 wrote:"
msgstr ""
#: ../../view/theme/redbasic/php/config.php:9
@@ -10123,66 +13163,66 @@ msgstr ""
msgid "Set size of followup author photos"
msgstr ""
-#: ../../boot.php:1195
+#: ../../boot.php:1175
#, php-format
msgctxt "opensearch"
msgid "Search %1$s (%2$s)"
msgstr ""
-#: ../../boot.php:1195
+#: ../../boot.php:1175
msgctxt "opensearch"
msgid "$Projectname"
msgstr ""
-#: ../../boot.php:1513
+#: ../../boot.php:1493
#, php-format
msgid "Update %s failed. See error logs."
msgstr ""
-#: ../../boot.php:1516
+#: ../../boot.php:1496
#, php-format
msgid "Update Error at %s"
msgstr ""
-#: ../../boot.php:1720
+#: ../../boot.php:1700
msgid ""
"Create an account to access services and applications within the Hubzilla"
msgstr ""
-#: ../../boot.php:1741
+#: ../../boot.php:1721
msgid "Login/Email"
msgstr ""
-#: ../../boot.php:1742
+#: ../../boot.php:1722
msgid "Password"
msgstr ""
-#: ../../boot.php:1743
+#: ../../boot.php:1723
msgid "Remember me"
msgstr ""
-#: ../../boot.php:1746
+#: ../../boot.php:1726
msgid "Forgot your password?"
msgstr ""
-#: ../../boot.php:2315
+#: ../../boot.php:2287
msgid "toggle mobile"
msgstr ""
-#: ../../boot.php:2470
+#: ../../boot.php:2442
msgid "Website SSL certificate is not valid. Please correct."
msgstr ""
-#: ../../boot.php:2473
+#: ../../boot.php:2445
#, php-format
msgid "[hubzilla] Website SSL error for %s"
msgstr ""
-#: ../../boot.php:2577
+#: ../../boot.php:2562
msgid "Cron/Scheduled tasks not running."
msgstr ""
-#: ../../boot.php:2581
+#: ../../boot.php:2566
#, php-format
msgid "[hubzilla] Cron tasks not running on %s"
msgstr ""
diff --git a/util/run_xgettext.sh b/util/run_xgettext.sh
index 9402546a8..918597882 100755
--- a/util/run_xgettext.sh
+++ b/util/run_xgettext.sh
@@ -2,6 +2,12 @@
FULLPATH=$(dirname $(readlink -f "$0"))
+VINFO=`echo "<?php include 'boot.php'; echo PLATFORM_NAME . \" \" . STD_VERSION . \"\\n\";" | php`
+
+PROJECTNAME=`echo $VINFO | awk '{print $1;}'`
+F9KVERSION=`echo $VINFO | awk '{print $2;}'`
+
+
ADDONMODE=
ADDONNAME=
if [ "$1" == "--addon" -o "$1" == "-a" ]
@@ -24,13 +30,13 @@ else
OUTFILE="$FULLPATH/hmessages.po"
FINDSTARTDIR="../../"
# skip addon folder
- FINDOPTS="-wholename */addon -prune -o"
+ FINDOPTS=
+ RRIT="-wholename */extend -prune -o"
fi
-F9KVERSION=$(cat ../../version.inc);
-echo "Red version $F9KVERSION"
+echo "$PROJECTNAME version $F9KVERSION"
OPTS=
@@ -65,15 +71,15 @@ then
sed -i "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER//g" "$OUTFILE"
sed -i "s/FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.//g" "$OUTFILE"
sed -i "s/PACKAGE VERSION//g" "$OUTFILE"
- sed -i "s/PACKAGE/Hubzilla $ADDONNAME addon/g" "$OUTFILE"
+ sed -i "s/PACKAGE/$PROJECTNAME $ADDONNAME addon/g" "$OUTFILE"
sed -i "s/CHARSET/UTF-8/g" "$OUTFILE"
sed -i '/^\"Plural-Forms/d' "$OUTFILE"
else
- sed -i "s/SOME DESCRIPTIVE TITLE./Hubzilla Project/g" "$OUTFILE"
- sed -i "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER/2012-2014 the Hubzilla Project/g" "$OUTFILE"
+ sed -i "s/SOME DESCRIPTIVE TITLE./$PROJECTNAME/g" "$OUTFILE"
+ sed -i "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER/2012-2016 $PROJECTNAME/g" "$OUTFILE"
sed -i "s/FIRST AUTHOR <EMAIL@ADDRESS>, YEAR./Mike Macgirvin, 2012/g" "$OUTFILE"
sed -i "s/PACKAGE VERSION/$F9KVERSION/g" "$OUTFILE"
- sed -i "s/PACKAGE/Red/g" "$OUTFILE"
+ sed -i "s/PACKAGE/$PROJECTNAME/g" "$OUTFILE"
sed -i "s/CHARSET/UTF-8/g" "$OUTFILE"
sed -i '/^\"Plural-Forms/d' "$OUTFILE"
fi
diff --git a/util/zotsh/README.txt b/util/zotsh/README.txt
index 3f31bba7f..facddc850 100644
--- a/util/zotsh/README.txt
+++ b/util/zotsh/README.txt
@@ -8,6 +8,8 @@ Install
ZotSH requires 'requests'(1).
Please refer to requests docs on how to install it (2)
+The initially connected server must have the twitter_api plugin installed
+
Extract somewere and launch zotsh.py
@@ -106,4 +108,4 @@ Links
_0 : https://github.com/amnong/easywebdav
_1 : http://docs.python-requests.org/en/latest/
-_2 : http://docs.python-requests.org/en/latest/user/install/ \ No newline at end of file
+_2 : http://docs.python-requests.org/en/latest/user/install/
diff --git a/util/zotsh/easywebdav/__init__.pyc b/util/zotsh/easywebdav/__init__.pyc
index b609b06c1..4f30c1871 100644
--- a/util/zotsh/easywebdav/__init__.pyc
+++ b/util/zotsh/easywebdav/__init__.pyc
Binary files differ
diff --git a/util/zotsh/easywebdav/__version__.pyc b/util/zotsh/easywebdav/__version__.pyc
index 5da5a28ec..b19bf50b0 100644
--- a/util/zotsh/easywebdav/__version__.pyc
+++ b/util/zotsh/easywebdav/__version__.pyc
Binary files differ
diff --git a/util/zotsh/easywebdav/client.pyc b/util/zotsh/easywebdav/client.pyc
index 4c42d2603..cf074d522 100644
--- a/util/zotsh/easywebdav/client.pyc
+++ b/util/zotsh/easywebdav/client.pyc
Binary files differ
diff --git a/vendor/autoload.php b/vendor/autoload.php
index f9e0189d7..063a1b7e1 100644
--- a/vendor/autoload.php
+++ b/vendor/autoload.php
@@ -4,4 +4,4 @@
require_once __DIR__ . '/composer' . '/autoload_real.php';
-return ComposerAutoloaderInit02c7a5bb99a87a4c8dbf069d69b1a15c::getLoader();
+return ComposerAutoloaderInit7b34d7e50a62201ec5d5e526a5b8b35d::getLoader();
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
index ff6ecfb82..ac67d302a 100644
--- a/vendor/composer/ClassLoader.php
+++ b/vendor/composer/ClassLoader.php
@@ -53,8 +53,8 @@ class ClassLoader
private $useIncludePath = false;
private $classMap = array();
-
private $classMapAuthoritative = false;
+ private $missingClasses = array();
public function getPrefixes()
{
@@ -322,20 +322,20 @@ class ClassLoader
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
- if ($this->classMapAuthoritative) {
+ if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
return false;
}
$file = $this->findFileWithExtension($class, '.php');
// Search for Hack files if we are running on HHVM
- if ($file === null && defined('HHVM_VERSION')) {
+ if (false === $file && defined('HHVM_VERSION')) {
$file = $this->findFileWithExtension($class, '.hh');
}
- if ($file === null) {
+ if (false === $file) {
// Remember that this class does not exist.
- return $this->classMap[$class] = false;
+ $this->missingClasses[$class] = true;
}
return $file;
@@ -399,6 +399,8 @@ class ClassLoader
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
return $file;
}
+
+ return false;
}
}
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index 7a91153b0..ad3291349 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -6,4 +6,609 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ 'Hubzilla\\Import\\Import' => $baseDir . '/include/Import/Importer.php',
+ 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php',
+ 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php',
+ 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php',
+ 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareInterface.php',
+ 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerAwareTrait.php',
+ 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php',
+ 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php',
+ 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
+ 'Sabre\\CalDAV\\Backend\\AbstractBackend' => $vendorDir . '/sabre/dav/lib/CalDAV/Backend/AbstractBackend.php',
+ 'Sabre\\CalDAV\\Backend\\BackendInterface' => $vendorDir . '/sabre/dav/lib/CalDAV/Backend/BackendInterface.php',
+ 'Sabre\\CalDAV\\Backend\\NotificationSupport' => $vendorDir . '/sabre/dav/lib/CalDAV/Backend/NotificationSupport.php',
+ 'Sabre\\CalDAV\\Backend\\PDO' => $vendorDir . '/sabre/dav/lib/CalDAV/Backend/PDO.php',
+ 'Sabre\\CalDAV\\Backend\\SchedulingSupport' => $vendorDir . '/sabre/dav/lib/CalDAV/Backend/SchedulingSupport.php',
+ 'Sabre\\CalDAV\\Backend\\SharingSupport' => $vendorDir . '/sabre/dav/lib/CalDAV/Backend/SharingSupport.php',
+ 'Sabre\\CalDAV\\Backend\\SimplePDO' => $vendorDir . '/sabre/dav/lib/CalDAV/Backend/SimplePDO.php',
+ 'Sabre\\CalDAV\\Backend\\SubscriptionSupport' => $vendorDir . '/sabre/dav/lib/CalDAV/Backend/SubscriptionSupport.php',
+ 'Sabre\\CalDAV\\Backend\\SyncSupport' => $vendorDir . '/sabre/dav/lib/CalDAV/Backend/SyncSupport.php',
+ 'Sabre\\CalDAV\\Calendar' => $vendorDir . '/sabre/dav/lib/CalDAV/Calendar.php',
+ 'Sabre\\CalDAV\\CalendarHome' => $vendorDir . '/sabre/dav/lib/CalDAV/CalendarHome.php',
+ 'Sabre\\CalDAV\\CalendarObject' => $vendorDir . '/sabre/dav/lib/CalDAV/CalendarObject.php',
+ 'Sabre\\CalDAV\\CalendarQueryValidator' => $vendorDir . '/sabre/dav/lib/CalDAV/CalendarQueryValidator.php',
+ 'Sabre\\CalDAV\\CalendarRoot' => $vendorDir . '/sabre/dav/lib/CalDAV/CalendarRoot.php',
+ 'Sabre\\CalDAV\\Exception\\InvalidComponentType' => $vendorDir . '/sabre/dav/lib/CalDAV/Exception/InvalidComponentType.php',
+ 'Sabre\\CalDAV\\ICSExportPlugin' => $vendorDir . '/sabre/dav/lib/CalDAV/ICSExportPlugin.php',
+ 'Sabre\\CalDAV\\ICalendar' => $vendorDir . '/sabre/dav/lib/CalDAV/ICalendar.php',
+ 'Sabre\\CalDAV\\ICalendarObject' => $vendorDir . '/sabre/dav/lib/CalDAV/ICalendarObject.php',
+ 'Sabre\\CalDAV\\ICalendarObjectContainer' => $vendorDir . '/sabre/dav/lib/CalDAV/ICalendarObjectContainer.php',
+ 'Sabre\\CalDAV\\ISharedCalendar' => $vendorDir . '/sabre/dav/lib/CalDAV/ISharedCalendar.php',
+ 'Sabre\\CalDAV\\Notifications\\Collection' => $vendorDir . '/sabre/dav/lib/CalDAV/Notifications/Collection.php',
+ 'Sabre\\CalDAV\\Notifications\\ICollection' => $vendorDir . '/sabre/dav/lib/CalDAV/Notifications/ICollection.php',
+ 'Sabre\\CalDAV\\Notifications\\INode' => $vendorDir . '/sabre/dav/lib/CalDAV/Notifications/INode.php',
+ 'Sabre\\CalDAV\\Notifications\\Node' => $vendorDir . '/sabre/dav/lib/CalDAV/Notifications/Node.php',
+ 'Sabre\\CalDAV\\Notifications\\Plugin' => $vendorDir . '/sabre/dav/lib/CalDAV/Notifications/Plugin.php',
+ 'Sabre\\CalDAV\\Plugin' => $vendorDir . '/sabre/dav/lib/CalDAV/Plugin.php',
+ 'Sabre\\CalDAV\\Principal\\Collection' => $vendorDir . '/sabre/dav/lib/CalDAV/Principal/Collection.php',
+ 'Sabre\\CalDAV\\Principal\\IProxyRead' => $vendorDir . '/sabre/dav/lib/CalDAV/Principal/IProxyRead.php',
+ 'Sabre\\CalDAV\\Principal\\IProxyWrite' => $vendorDir . '/sabre/dav/lib/CalDAV/Principal/IProxyWrite.php',
+ 'Sabre\\CalDAV\\Principal\\ProxyRead' => $vendorDir . '/sabre/dav/lib/CalDAV/Principal/ProxyRead.php',
+ 'Sabre\\CalDAV\\Principal\\ProxyWrite' => $vendorDir . '/sabre/dav/lib/CalDAV/Principal/ProxyWrite.php',
+ 'Sabre\\CalDAV\\Principal\\User' => $vendorDir . '/sabre/dav/lib/CalDAV/Principal/User.php',
+ 'Sabre\\CalDAV\\Schedule\\IInbox' => $vendorDir . '/sabre/dav/lib/CalDAV/Schedule/IInbox.php',
+ 'Sabre\\CalDAV\\Schedule\\IMipPlugin' => $vendorDir . '/sabre/dav/lib/CalDAV/Schedule/IMipPlugin.php',
+ 'Sabre\\CalDAV\\Schedule\\IOutbox' => $vendorDir . '/sabre/dav/lib/CalDAV/Schedule/IOutbox.php',
+ 'Sabre\\CalDAV\\Schedule\\ISchedulingObject' => $vendorDir . '/sabre/dav/lib/CalDAV/Schedule/ISchedulingObject.php',
+ 'Sabre\\CalDAV\\Schedule\\Inbox' => $vendorDir . '/sabre/dav/lib/CalDAV/Schedule/Inbox.php',
+ 'Sabre\\CalDAV\\Schedule\\Outbox' => $vendorDir . '/sabre/dav/lib/CalDAV/Schedule/Outbox.php',
+ 'Sabre\\CalDAV\\Schedule\\Plugin' => $vendorDir . '/sabre/dav/lib/CalDAV/Schedule/Plugin.php',
+ 'Sabre\\CalDAV\\Schedule\\SchedulingObject' => $vendorDir . '/sabre/dav/lib/CalDAV/Schedule/SchedulingObject.php',
+ 'Sabre\\CalDAV\\SharedCalendar' => $vendorDir . '/sabre/dav/lib/CalDAV/SharedCalendar.php',
+ 'Sabre\\CalDAV\\SharingPlugin' => $vendorDir . '/sabre/dav/lib/CalDAV/SharingPlugin.php',
+ 'Sabre\\CalDAV\\Subscriptions\\ISubscription' => $vendorDir . '/sabre/dav/lib/CalDAV/Subscriptions/ISubscription.php',
+ 'Sabre\\CalDAV\\Subscriptions\\Plugin' => $vendorDir . '/sabre/dav/lib/CalDAV/Subscriptions/Plugin.php',
+ 'Sabre\\CalDAV\\Subscriptions\\Subscription' => $vendorDir . '/sabre/dav/lib/CalDAV/Subscriptions/Subscription.php',
+ 'Sabre\\CalDAV\\Xml\\Filter\\CalendarData' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Filter/CalendarData.php',
+ 'Sabre\\CalDAV\\Xml\\Filter\\CompFilter' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Filter/CompFilter.php',
+ 'Sabre\\CalDAV\\Xml\\Filter\\ParamFilter' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Filter/ParamFilter.php',
+ 'Sabre\\CalDAV\\Xml\\Filter\\PropFilter' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Filter/PropFilter.php',
+ 'Sabre\\CalDAV\\Xml\\Notification\\Invite' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Notification/Invite.php',
+ 'Sabre\\CalDAV\\Xml\\Notification\\InviteReply' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Notification/InviteReply.php',
+ 'Sabre\\CalDAV\\Xml\\Notification\\NotificationInterface' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Notification/NotificationInterface.php',
+ 'Sabre\\CalDAV\\Xml\\Notification\\SystemStatus' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Notification/SystemStatus.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\AllowedSharingModes' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Property/AllowedSharingModes.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\EmailAddressSet' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Property/EmailAddressSet.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\Invite' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Property/Invite.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\ScheduleCalendarTransp' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Property/ScheduleCalendarTransp.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\SupportedCalendarComponentSet' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarComponentSet.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\SupportedCalendarData' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarData.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\SupportedCollationSet' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Property/SupportedCollationSet.php',
+ 'Sabre\\CalDAV\\Xml\\Request\\CalendarMultiGetReport' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Request/CalendarMultiGetReport.php',
+ 'Sabre\\CalDAV\\Xml\\Request\\CalendarQueryReport' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Request/CalendarQueryReport.php',
+ 'Sabre\\CalDAV\\Xml\\Request\\FreeBusyQueryReport' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Request/FreeBusyQueryReport.php',
+ 'Sabre\\CalDAV\\Xml\\Request\\InviteReply' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Request/InviteReply.php',
+ 'Sabre\\CalDAV\\Xml\\Request\\MkCalendar' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Request/MkCalendar.php',
+ 'Sabre\\CalDAV\\Xml\\Request\\Share' => $vendorDir . '/sabre/dav/lib/CalDAV/Xml/Request/Share.php',
+ 'Sabre\\CardDAV\\AddressBook' => $vendorDir . '/sabre/dav/lib/CardDAV/AddressBook.php',
+ 'Sabre\\CardDAV\\AddressBookHome' => $vendorDir . '/sabre/dav/lib/CardDAV/AddressBookHome.php',
+ 'Sabre\\CardDAV\\AddressBookRoot' => $vendorDir . '/sabre/dav/lib/CardDAV/AddressBookRoot.php',
+ 'Sabre\\CardDAV\\Backend\\AbstractBackend' => $vendorDir . '/sabre/dav/lib/CardDAV/Backend/AbstractBackend.php',
+ 'Sabre\\CardDAV\\Backend\\BackendInterface' => $vendorDir . '/sabre/dav/lib/CardDAV/Backend/BackendInterface.php',
+ 'Sabre\\CardDAV\\Backend\\PDO' => $vendorDir . '/sabre/dav/lib/CardDAV/Backend/PDO.php',
+ 'Sabre\\CardDAV\\Backend\\SyncSupport' => $vendorDir . '/sabre/dav/lib/CardDAV/Backend/SyncSupport.php',
+ 'Sabre\\CardDAV\\Card' => $vendorDir . '/sabre/dav/lib/CardDAV/Card.php',
+ 'Sabre\\CardDAV\\IAddressBook' => $vendorDir . '/sabre/dav/lib/CardDAV/IAddressBook.php',
+ 'Sabre\\CardDAV\\ICard' => $vendorDir . '/sabre/dav/lib/CardDAV/ICard.php',
+ 'Sabre\\CardDAV\\IDirectory' => $vendorDir . '/sabre/dav/lib/CardDAV/IDirectory.php',
+ 'Sabre\\CardDAV\\Plugin' => $vendorDir . '/sabre/dav/lib/CardDAV/Plugin.php',
+ 'Sabre\\CardDAV\\VCFExportPlugin' => $vendorDir . '/sabre/dav/lib/CardDAV/VCFExportPlugin.php',
+ 'Sabre\\CardDAV\\Xml\\Filter\\AddressData' => $vendorDir . '/sabre/dav/lib/CardDAV/Xml/Filter/AddressData.php',
+ 'Sabre\\CardDAV\\Xml\\Filter\\ParamFilter' => $vendorDir . '/sabre/dav/lib/CardDAV/Xml/Filter/ParamFilter.php',
+ 'Sabre\\CardDAV\\Xml\\Filter\\PropFilter' => $vendorDir . '/sabre/dav/lib/CardDAV/Xml/Filter/PropFilter.php',
+ 'Sabre\\CardDAV\\Xml\\Property\\SupportedAddressData' => $vendorDir . '/sabre/dav/lib/CardDAV/Xml/Property/SupportedAddressData.php',
+ 'Sabre\\CardDAV\\Xml\\Property\\SupportedCollationSet' => $vendorDir . '/sabre/dav/lib/CardDAV/Xml/Property/SupportedCollationSet.php',
+ 'Sabre\\CardDAV\\Xml\\Request\\AddressBookMultiGetReport' => $vendorDir . '/sabre/dav/lib/CardDAV/Xml/Request/AddressBookMultiGetReport.php',
+ 'Sabre\\CardDAV\\Xml\\Request\\AddressBookQueryReport' => $vendorDir . '/sabre/dav/lib/CardDAV/Xml/Request/AddressBookQueryReport.php',
+ 'Sabre\\DAVACL\\ACLTrait' => $vendorDir . '/sabre/dav/lib/DAVACL/ACLTrait.php',
+ 'Sabre\\DAVACL\\AbstractPrincipalCollection' => $vendorDir . '/sabre/dav/lib/DAVACL/AbstractPrincipalCollection.php',
+ 'Sabre\\DAVACL\\Exception\\AceConflict' => $vendorDir . '/sabre/dav/lib/DAVACL/Exception/AceConflict.php',
+ 'Sabre\\DAVACL\\Exception\\NeedPrivileges' => $vendorDir . '/sabre/dav/lib/DAVACL/Exception/NeedPrivileges.php',
+ 'Sabre\\DAVACL\\Exception\\NoAbstract' => $vendorDir . '/sabre/dav/lib/DAVACL/Exception/NoAbstract.php',
+ 'Sabre\\DAVACL\\Exception\\NotRecognizedPrincipal' => $vendorDir . '/sabre/dav/lib/DAVACL/Exception/NotRecognizedPrincipal.php',
+ 'Sabre\\DAVACL\\Exception\\NotSupportedPrivilege' => $vendorDir . '/sabre/dav/lib/DAVACL/Exception/NotSupportedPrivilege.php',
+ 'Sabre\\DAVACL\\FS\\Collection' => $vendorDir . '/sabre/dav/lib/DAVACL/FS/Collection.php',
+ 'Sabre\\DAVACL\\FS\\File' => $vendorDir . '/sabre/dav/lib/DAVACL/FS/File.php',
+ 'Sabre\\DAVACL\\FS\\HomeCollection' => $vendorDir . '/sabre/dav/lib/DAVACL/FS/HomeCollection.php',
+ 'Sabre\\DAVACL\\IACL' => $vendorDir . '/sabre/dav/lib/DAVACL/IACL.php',
+ 'Sabre\\DAVACL\\IPrincipal' => $vendorDir . '/sabre/dav/lib/DAVACL/IPrincipal.php',
+ 'Sabre\\DAVACL\\IPrincipalCollection' => $vendorDir . '/sabre/dav/lib/DAVACL/IPrincipalCollection.php',
+ 'Sabre\\DAVACL\\Plugin' => $vendorDir . '/sabre/dav/lib/DAVACL/Plugin.php',
+ 'Sabre\\DAVACL\\Principal' => $vendorDir . '/sabre/dav/lib/DAVACL/Principal.php',
+ 'Sabre\\DAVACL\\PrincipalBackend\\AbstractBackend' => $vendorDir . '/sabre/dav/lib/DAVACL/PrincipalBackend/AbstractBackend.php',
+ 'Sabre\\DAVACL\\PrincipalBackend\\BackendInterface' => $vendorDir . '/sabre/dav/lib/DAVACL/PrincipalBackend/BackendInterface.php',
+ 'Sabre\\DAVACL\\PrincipalBackend\\CreatePrincipalSupport' => $vendorDir . '/sabre/dav/lib/DAVACL/PrincipalBackend/CreatePrincipalSupport.php',
+ 'Sabre\\DAVACL\\PrincipalBackend\\PDO' => $vendorDir . '/sabre/dav/lib/DAVACL/PrincipalBackend/PDO.php',
+ 'Sabre\\DAVACL\\PrincipalCollection' => $vendorDir . '/sabre/dav/lib/DAVACL/PrincipalCollection.php',
+ 'Sabre\\DAVACL\\Xml\\Property\\Acl' => $vendorDir . '/sabre/dav/lib/DAVACL/Xml/Property/Acl.php',
+ 'Sabre\\DAVACL\\Xml\\Property\\AclRestrictions' => $vendorDir . '/sabre/dav/lib/DAVACL/Xml/Property/AclRestrictions.php',
+ 'Sabre\\DAVACL\\Xml\\Property\\CurrentUserPrivilegeSet' => $vendorDir . '/sabre/dav/lib/DAVACL/Xml/Property/CurrentUserPrivilegeSet.php',
+ 'Sabre\\DAVACL\\Xml\\Property\\Principal' => $vendorDir . '/sabre/dav/lib/DAVACL/Xml/Property/Principal.php',
+ 'Sabre\\DAVACL\\Xml\\Property\\SupportedPrivilegeSet' => $vendorDir . '/sabre/dav/lib/DAVACL/Xml/Property/SupportedPrivilegeSet.php',
+ 'Sabre\\DAVACL\\Xml\\Request\\AclPrincipalPropSetReport' => $vendorDir . '/sabre/dav/lib/DAVACL/Xml/Request/AclPrincipalPropSetReport.php',
+ 'Sabre\\DAVACL\\Xml\\Request\\ExpandPropertyReport' => $vendorDir . '/sabre/dav/lib/DAVACL/Xml/Request/ExpandPropertyReport.php',
+ 'Sabre\\DAVACL\\Xml\\Request\\PrincipalMatchReport' => $vendorDir . '/sabre/dav/lib/DAVACL/Xml/Request/PrincipalMatchReport.php',
+ 'Sabre\\DAVACL\\Xml\\Request\\PrincipalPropertySearchReport' => $vendorDir . '/sabre/dav/lib/DAVACL/Xml/Request/PrincipalPropertySearchReport.php',
+ 'Sabre\\DAVACL\\Xml\\Request\\PrincipalSearchPropertySetReport' => $vendorDir . '/sabre/dav/lib/DAVACL/Xml/Request/PrincipalSearchPropertySetReport.php',
+ 'Sabre\\DAV\\Auth\\Backend\\AbstractBasic' => $vendorDir . '/sabre/dav/lib/DAV/Auth/Backend/AbstractBasic.php',
+ 'Sabre\\DAV\\Auth\\Backend\\AbstractBearer' => $vendorDir . '/sabre/dav/lib/DAV/Auth/Backend/AbstractBearer.php',
+ 'Sabre\\DAV\\Auth\\Backend\\AbstractDigest' => $vendorDir . '/sabre/dav/lib/DAV/Auth/Backend/AbstractDigest.php',
+ 'Sabre\\DAV\\Auth\\Backend\\Apache' => $vendorDir . '/sabre/dav/lib/DAV/Auth/Backend/Apache.php',
+ 'Sabre\\DAV\\Auth\\Backend\\BackendInterface' => $vendorDir . '/sabre/dav/lib/DAV/Auth/Backend/BackendInterface.php',
+ 'Sabre\\DAV\\Auth\\Backend\\BasicCallBack' => $vendorDir . '/sabre/dav/lib/DAV/Auth/Backend/BasicCallBack.php',
+ 'Sabre\\DAV\\Auth\\Backend\\File' => $vendorDir . '/sabre/dav/lib/DAV/Auth/Backend/File.php',
+ 'Sabre\\DAV\\Auth\\Backend\\PDO' => $vendorDir . '/sabre/dav/lib/DAV/Auth/Backend/PDO.php',
+ 'Sabre\\DAV\\Auth\\Plugin' => $vendorDir . '/sabre/dav/lib/DAV/Auth/Plugin.php',
+ 'Sabre\\DAV\\Browser\\GuessContentType' => $vendorDir . '/sabre/dav/lib/DAV/Browser/GuessContentType.php',
+ 'Sabre\\DAV\\Browser\\HtmlOutput' => $vendorDir . '/sabre/dav/lib/DAV/Browser/HtmlOutput.php',
+ 'Sabre\\DAV\\Browser\\HtmlOutputHelper' => $vendorDir . '/sabre/dav/lib/DAV/Browser/HtmlOutputHelper.php',
+ 'Sabre\\DAV\\Browser\\MapGetToPropFind' => $vendorDir . '/sabre/dav/lib/DAV/Browser/MapGetToPropFind.php',
+ 'Sabre\\DAV\\Browser\\Plugin' => $vendorDir . '/sabre/dav/lib/DAV/Browser/Plugin.php',
+ 'Sabre\\DAV\\Browser\\PropFindAll' => $vendorDir . '/sabre/dav/lib/DAV/Browser/PropFindAll.php',
+ 'Sabre\\DAV\\Client' => $vendorDir . '/sabre/dav/lib/DAV/Client.php',
+ 'Sabre\\DAV\\Collection' => $vendorDir . '/sabre/dav/lib/DAV/Collection.php',
+ 'Sabre\\DAV\\CorePlugin' => $vendorDir . '/sabre/dav/lib/DAV/CorePlugin.php',
+ 'Sabre\\DAV\\Exception' => $vendorDir . '/sabre/dav/lib/DAV/Exception.php',
+ 'Sabre\\DAV\\Exception\\BadRequest' => $vendorDir . '/sabre/dav/lib/DAV/Exception/BadRequest.php',
+ 'Sabre\\DAV\\Exception\\Conflict' => $vendorDir . '/sabre/dav/lib/DAV/Exception/Conflict.php',
+ 'Sabre\\DAV\\Exception\\ConflictingLock' => $vendorDir . '/sabre/dav/lib/DAV/Exception/ConflictingLock.php',
+ 'Sabre\\DAV\\Exception\\Forbidden' => $vendorDir . '/sabre/dav/lib/DAV/Exception/Forbidden.php',
+ 'Sabre\\DAV\\Exception\\InsufficientStorage' => $vendorDir . '/sabre/dav/lib/DAV/Exception/InsufficientStorage.php',
+ 'Sabre\\DAV\\Exception\\InvalidResourceType' => $vendorDir . '/sabre/dav/lib/DAV/Exception/InvalidResourceType.php',
+ 'Sabre\\DAV\\Exception\\InvalidSyncToken' => $vendorDir . '/sabre/dav/lib/DAV/Exception/InvalidSyncToken.php',
+ 'Sabre\\DAV\\Exception\\LengthRequired' => $vendorDir . '/sabre/dav/lib/DAV/Exception/LengthRequired.php',
+ 'Sabre\\DAV\\Exception\\LockTokenMatchesRequestUri' => $vendorDir . '/sabre/dav/lib/DAV/Exception/LockTokenMatchesRequestUri.php',
+ 'Sabre\\DAV\\Exception\\Locked' => $vendorDir . '/sabre/dav/lib/DAV/Exception/Locked.php',
+ 'Sabre\\DAV\\Exception\\MethodNotAllowed' => $vendorDir . '/sabre/dav/lib/DAV/Exception/MethodNotAllowed.php',
+ 'Sabre\\DAV\\Exception\\NotAuthenticated' => $vendorDir . '/sabre/dav/lib/DAV/Exception/NotAuthenticated.php',
+ 'Sabre\\DAV\\Exception\\NotFound' => $vendorDir . '/sabre/dav/lib/DAV/Exception/NotFound.php',
+ 'Sabre\\DAV\\Exception\\NotImplemented' => $vendorDir . '/sabre/dav/lib/DAV/Exception/NotImplemented.php',
+ 'Sabre\\DAV\\Exception\\PaymentRequired' => $vendorDir . '/sabre/dav/lib/DAV/Exception/PaymentRequired.php',
+ 'Sabre\\DAV\\Exception\\PreconditionFailed' => $vendorDir . '/sabre/dav/lib/DAV/Exception/PreconditionFailed.php',
+ 'Sabre\\DAV\\Exception\\ReportNotSupported' => $vendorDir . '/sabre/dav/lib/DAV/Exception/ReportNotSupported.php',
+ 'Sabre\\DAV\\Exception\\RequestedRangeNotSatisfiable' => $vendorDir . '/sabre/dav/lib/DAV/Exception/RequestedRangeNotSatisfiable.php',
+ 'Sabre\\DAV\\Exception\\ServiceUnavailable' => $vendorDir . '/sabre/dav/lib/DAV/Exception/ServiceUnavailable.php',
+ 'Sabre\\DAV\\Exception\\TooManyMatches' => $vendorDir . '/sabre/dav/lib/DAV/Exception/TooManyMatches.php',
+ 'Sabre\\DAV\\Exception\\UnsupportedMediaType' => $vendorDir . '/sabre/dav/lib/DAV/Exception/UnsupportedMediaType.php',
+ 'Sabre\\DAV\\FSExt\\Directory' => $vendorDir . '/sabre/dav/lib/DAV/FSExt/Directory.php',
+ 'Sabre\\DAV\\FSExt\\File' => $vendorDir . '/sabre/dav/lib/DAV/FSExt/File.php',
+ 'Sabre\\DAV\\FS\\Directory' => $vendorDir . '/sabre/dav/lib/DAV/FS/Directory.php',
+ 'Sabre\\DAV\\FS\\File' => $vendorDir . '/sabre/dav/lib/DAV/FS/File.php',
+ 'Sabre\\DAV\\FS\\Node' => $vendorDir . '/sabre/dav/lib/DAV/FS/Node.php',
+ 'Sabre\\DAV\\File' => $vendorDir . '/sabre/dav/lib/DAV/File.php',
+ 'Sabre\\DAV\\ICollection' => $vendorDir . '/sabre/dav/lib/DAV/ICollection.php',
+ 'Sabre\\DAV\\IExtendedCollection' => $vendorDir . '/sabre/dav/lib/DAV/IExtendedCollection.php',
+ 'Sabre\\DAV\\IFile' => $vendorDir . '/sabre/dav/lib/DAV/IFile.php',
+ 'Sabre\\DAV\\IMoveTarget' => $vendorDir . '/sabre/dav/lib/DAV/IMoveTarget.php',
+ 'Sabre\\DAV\\IMultiGet' => $vendorDir . '/sabre/dav/lib/DAV/IMultiGet.php',
+ 'Sabre\\DAV\\INode' => $vendorDir . '/sabre/dav/lib/DAV/INode.php',
+ 'Sabre\\DAV\\IProperties' => $vendorDir . '/sabre/dav/lib/DAV/IProperties.php',
+ 'Sabre\\DAV\\IQuota' => $vendorDir . '/sabre/dav/lib/DAV/IQuota.php',
+ 'Sabre\\DAV\\Locks\\Backend\\AbstractBackend' => $vendorDir . '/sabre/dav/lib/DAV/Locks/Backend/AbstractBackend.php',
+ 'Sabre\\DAV\\Locks\\Backend\\BackendInterface' => $vendorDir . '/sabre/dav/lib/DAV/Locks/Backend/BackendInterface.php',
+ 'Sabre\\DAV\\Locks\\Backend\\File' => $vendorDir . '/sabre/dav/lib/DAV/Locks/Backend/File.php',
+ 'Sabre\\DAV\\Locks\\Backend\\PDO' => $vendorDir . '/sabre/dav/lib/DAV/Locks/Backend/PDO.php',
+ 'Sabre\\DAV\\Locks\\LockInfo' => $vendorDir . '/sabre/dav/lib/DAV/Locks/LockInfo.php',
+ 'Sabre\\DAV\\Locks\\Plugin' => $vendorDir . '/sabre/dav/lib/DAV/Locks/Plugin.php',
+ 'Sabre\\DAV\\MkCol' => $vendorDir . '/sabre/dav/lib/DAV/MkCol.php',
+ 'Sabre\\DAV\\Mount\\Plugin' => $vendorDir . '/sabre/dav/lib/DAV/Mount/Plugin.php',
+ 'Sabre\\DAV\\Node' => $vendorDir . '/sabre/dav/lib/DAV/Node.php',
+ 'Sabre\\DAV\\PartialUpdate\\IPatchSupport' => $vendorDir . '/sabre/dav/lib/DAV/PartialUpdate/IPatchSupport.php',
+ 'Sabre\\DAV\\PartialUpdate\\Plugin' => $vendorDir . '/sabre/dav/lib/DAV/PartialUpdate/Plugin.php',
+ 'Sabre\\DAV\\PropFind' => $vendorDir . '/sabre/dav/lib/DAV/PropFind.php',
+ 'Sabre\\DAV\\PropPatch' => $vendorDir . '/sabre/dav/lib/DAV/PropPatch.php',
+ 'Sabre\\DAV\\PropertyStorage\\Backend\\BackendInterface' => $vendorDir . '/sabre/dav/lib/DAV/PropertyStorage/Backend/BackendInterface.php',
+ 'Sabre\\DAV\\PropertyStorage\\Backend\\PDO' => $vendorDir . '/sabre/dav/lib/DAV/PropertyStorage/Backend/PDO.php',
+ 'Sabre\\DAV\\PropertyStorage\\Plugin' => $vendorDir . '/sabre/dav/lib/DAV/PropertyStorage/Plugin.php',
+ 'Sabre\\DAV\\Server' => $vendorDir . '/sabre/dav/lib/DAV/Server.php',
+ 'Sabre\\DAV\\ServerPlugin' => $vendorDir . '/sabre/dav/lib/DAV/ServerPlugin.php',
+ 'Sabre\\DAV\\Sharing\\ISharedNode' => $vendorDir . '/sabre/dav/lib/DAV/Sharing/ISharedNode.php',
+ 'Sabre\\DAV\\Sharing\\Plugin' => $vendorDir . '/sabre/dav/lib/DAV/Sharing/Plugin.php',
+ 'Sabre\\DAV\\SimpleCollection' => $vendorDir . '/sabre/dav/lib/DAV/SimpleCollection.php',
+ 'Sabre\\DAV\\SimpleFile' => $vendorDir . '/sabre/dav/lib/DAV/SimpleFile.php',
+ 'Sabre\\DAV\\StringUtil' => $vendorDir . '/sabre/dav/lib/DAV/StringUtil.php',
+ 'Sabre\\DAV\\Sync\\ISyncCollection' => $vendorDir . '/sabre/dav/lib/DAV/Sync/ISyncCollection.php',
+ 'Sabre\\DAV\\Sync\\Plugin' => $vendorDir . '/sabre/dav/lib/DAV/Sync/Plugin.php',
+ 'Sabre\\DAV\\TemporaryFileFilterPlugin' => $vendorDir . '/sabre/dav/lib/DAV/TemporaryFileFilterPlugin.php',
+ 'Sabre\\DAV\\Tree' => $vendorDir . '/sabre/dav/lib/DAV/Tree.php',
+ 'Sabre\\DAV\\UUIDUtil' => $vendorDir . '/sabre/dav/lib/DAV/UUIDUtil.php',
+ 'Sabre\\DAV\\Version' => $vendorDir . '/sabre/dav/lib/DAV/Version.php',
+ 'Sabre\\DAV\\Xml\\Element\\Prop' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Element/Prop.php',
+ 'Sabre\\DAV\\Xml\\Element\\Response' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Element/Response.php',
+ 'Sabre\\DAV\\Xml\\Element\\Sharee' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Element/Sharee.php',
+ 'Sabre\\DAV\\Xml\\Property\\Complex' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Property/Complex.php',
+ 'Sabre\\DAV\\Xml\\Property\\GetLastModified' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Property/GetLastModified.php',
+ 'Sabre\\DAV\\Xml\\Property\\Href' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Property/Href.php',
+ 'Sabre\\DAV\\Xml\\Property\\Invite' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Property/Invite.php',
+ 'Sabre\\DAV\\Xml\\Property\\LocalHref' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Property/LocalHref.php',
+ 'Sabre\\DAV\\Xml\\Property\\LockDiscovery' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Property/LockDiscovery.php',
+ 'Sabre\\DAV\\Xml\\Property\\ResourceType' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Property/ResourceType.php',
+ 'Sabre\\DAV\\Xml\\Property\\ShareAccess' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Property/ShareAccess.php',
+ 'Sabre\\DAV\\Xml\\Property\\SupportedLock' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Property/SupportedLock.php',
+ 'Sabre\\DAV\\Xml\\Property\\SupportedMethodSet' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Property/SupportedMethodSet.php',
+ 'Sabre\\DAV\\Xml\\Property\\SupportedReportSet' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Property/SupportedReportSet.php',
+ 'Sabre\\DAV\\Xml\\Request\\Lock' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Request/Lock.php',
+ 'Sabre\\DAV\\Xml\\Request\\MkCol' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Request/MkCol.php',
+ 'Sabre\\DAV\\Xml\\Request\\PropFind' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Request/PropFind.php',
+ 'Sabre\\DAV\\Xml\\Request\\PropPatch' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Request/PropPatch.php',
+ 'Sabre\\DAV\\Xml\\Request\\ShareResource' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Request/ShareResource.php',
+ 'Sabre\\DAV\\Xml\\Request\\SyncCollectionReport' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Request/SyncCollectionReport.php',
+ 'Sabre\\DAV\\Xml\\Response\\MultiStatus' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Response/MultiStatus.php',
+ 'Sabre\\DAV\\Xml\\Service' => $vendorDir . '/sabre/dav/lib/DAV/Xml/Service.php',
+ 'Sabre\\Event\\EventEmitter' => $vendorDir . '/sabre/event/lib/EventEmitter.php',
+ 'Sabre\\Event\\EventEmitterInterface' => $vendorDir . '/sabre/event/lib/EventEmitterInterface.php',
+ 'Sabre\\Event\\EventEmitterTrait' => $vendorDir . '/sabre/event/lib/EventEmitterTrait.php',
+ 'Sabre\\Event\\Loop\\Loop' => $vendorDir . '/sabre/event/lib/Loop/Loop.php',
+ 'Sabre\\Event\\Promise' => $vendorDir . '/sabre/event/lib/Promise.php',
+ 'Sabre\\Event\\PromiseAlreadyResolvedException' => $vendorDir . '/sabre/event/lib/PromiseAlreadyResolvedException.php',
+ 'Sabre\\Event\\Version' => $vendorDir . '/sabre/event/lib/Version.php',
+ 'Sabre\\HTTP\\Auth\\AWS' => $vendorDir . '/sabre/http/lib/Auth/AWS.php',
+ 'Sabre\\HTTP\\Auth\\AbstractAuth' => $vendorDir . '/sabre/http/lib/Auth/AbstractAuth.php',
+ 'Sabre\\HTTP\\Auth\\Basic' => $vendorDir . '/sabre/http/lib/Auth/Basic.php',
+ 'Sabre\\HTTP\\Auth\\Bearer' => $vendorDir . '/sabre/http/lib/Auth/Bearer.php',
+ 'Sabre\\HTTP\\Auth\\Digest' => $vendorDir . '/sabre/http/lib/Auth/Digest.php',
+ 'Sabre\\HTTP\\Client' => $vendorDir . '/sabre/http/lib/Client.php',
+ 'Sabre\\HTTP\\ClientException' => $vendorDir . '/sabre/http/lib/ClientException.php',
+ 'Sabre\\HTTP\\ClientHttpException' => $vendorDir . '/sabre/http/lib/ClientHttpException.php',
+ 'Sabre\\HTTP\\HttpException' => $vendorDir . '/sabre/http/lib/HttpException.php',
+ 'Sabre\\HTTP\\Message' => $vendorDir . '/sabre/http/lib/Message.php',
+ 'Sabre\\HTTP\\MessageDecoratorTrait' => $vendorDir . '/sabre/http/lib/MessageDecoratorTrait.php',
+ 'Sabre\\HTTP\\MessageInterface' => $vendorDir . '/sabre/http/lib/MessageInterface.php',
+ 'Sabre\\HTTP\\Request' => $vendorDir . '/sabre/http/lib/Request.php',
+ 'Sabre\\HTTP\\RequestDecorator' => $vendorDir . '/sabre/http/lib/RequestDecorator.php',
+ 'Sabre\\HTTP\\RequestInterface' => $vendorDir . '/sabre/http/lib/RequestInterface.php',
+ 'Sabre\\HTTP\\Response' => $vendorDir . '/sabre/http/lib/Response.php',
+ 'Sabre\\HTTP\\ResponseDecorator' => $vendorDir . '/sabre/http/lib/ResponseDecorator.php',
+ 'Sabre\\HTTP\\ResponseInterface' => $vendorDir . '/sabre/http/lib/ResponseInterface.php',
+ 'Sabre\\HTTP\\Sapi' => $vendorDir . '/sabre/http/lib/Sapi.php',
+ 'Sabre\\HTTP\\URLUtil' => $vendorDir . '/sabre/http/lib/URLUtil.php',
+ 'Sabre\\HTTP\\Util' => $vendorDir . '/sabre/http/lib/Util.php',
+ 'Sabre\\HTTP\\Version' => $vendorDir . '/sabre/http/lib/Version.php',
+ 'Sabre\\Uri\\Version' => $vendorDir . '/sabre/uri/lib/Version.php',
+ 'Sabre\\VObject\\BirthdayCalendarGenerator' => $vendorDir . '/sabre/vobject/lib/BirthdayCalendarGenerator.php',
+ 'Sabre\\VObject\\Cli' => $vendorDir . '/sabre/vobject/lib/Cli.php',
+ 'Sabre\\VObject\\Component' => $vendorDir . '/sabre/vobject/lib/Component.php',
+ 'Sabre\\VObject\\Component\\Available' => $vendorDir . '/sabre/vobject/lib/Component/Available.php',
+ 'Sabre\\VObject\\Component\\VAlarm' => $vendorDir . '/sabre/vobject/lib/Component/VAlarm.php',
+ 'Sabre\\VObject\\Component\\VAvailability' => $vendorDir . '/sabre/vobject/lib/Component/VAvailability.php',
+ 'Sabre\\VObject\\Component\\VCalendar' => $vendorDir . '/sabre/vobject/lib/Component/VCalendar.php',
+ 'Sabre\\VObject\\Component\\VCard' => $vendorDir . '/sabre/vobject/lib/Component/VCard.php',
+ 'Sabre\\VObject\\Component\\VEvent' => $vendorDir . '/sabre/vobject/lib/Component/VEvent.php',
+ 'Sabre\\VObject\\Component\\VFreeBusy' => $vendorDir . '/sabre/vobject/lib/Component/VFreeBusy.php',
+ 'Sabre\\VObject\\Component\\VJournal' => $vendorDir . '/sabre/vobject/lib/Component/VJournal.php',
+ 'Sabre\\VObject\\Component\\VTimeZone' => $vendorDir . '/sabre/vobject/lib/Component/VTimeZone.php',
+ 'Sabre\\VObject\\Component\\VTodo' => $vendorDir . '/sabre/vobject/lib/Component/VTodo.php',
+ 'Sabre\\VObject\\DateTimeParser' => $vendorDir . '/sabre/vobject/lib/DateTimeParser.php',
+ 'Sabre\\VObject\\Document' => $vendorDir . '/sabre/vobject/lib/Document.php',
+ 'Sabre\\VObject\\ElementList' => $vendorDir . '/sabre/vobject/lib/ElementList.php',
+ 'Sabre\\VObject\\EofException' => $vendorDir . '/sabre/vobject/lib/EofException.php',
+ 'Sabre\\VObject\\FreeBusyData' => $vendorDir . '/sabre/vobject/lib/FreeBusyData.php',
+ 'Sabre\\VObject\\FreeBusyGenerator' => $vendorDir . '/sabre/vobject/lib/FreeBusyGenerator.php',
+ 'Sabre\\VObject\\ITip\\Broker' => $vendorDir . '/sabre/vobject/lib/ITip/Broker.php',
+ 'Sabre\\VObject\\ITip\\ITipException' => $vendorDir . '/sabre/vobject/lib/ITip/ITipException.php',
+ 'Sabre\\VObject\\ITip\\Message' => $vendorDir . '/sabre/vobject/lib/ITip/Message.php',
+ 'Sabre\\VObject\\ITip\\SameOrganizerForAllComponentsException' => $vendorDir . '/sabre/vobject/lib/ITip/SameOrganizerForAllComponentsException.php',
+ 'Sabre\\VObject\\InvalidDataException' => $vendorDir . '/sabre/vobject/lib/InvalidDataException.php',
+ 'Sabre\\VObject\\Node' => $vendorDir . '/sabre/vobject/lib/Node.php',
+ 'Sabre\\VObject\\PHPUnitAssertions' => $vendorDir . '/sabre/vobject/lib/PHPUnitAssertions.php',
+ 'Sabre\\VObject\\Parameter' => $vendorDir . '/sabre/vobject/lib/Parameter.php',
+ 'Sabre\\VObject\\ParseException' => $vendorDir . '/sabre/vobject/lib/ParseException.php',
+ 'Sabre\\VObject\\Parser\\Json' => $vendorDir . '/sabre/vobject/lib/Parser/Json.php',
+ 'Sabre\\VObject\\Parser\\MimeDir' => $vendorDir . '/sabre/vobject/lib/Parser/MimeDir.php',
+ 'Sabre\\VObject\\Parser\\Parser' => $vendorDir . '/sabre/vobject/lib/Parser/Parser.php',
+ 'Sabre\\VObject\\Parser\\XML' => $vendorDir . '/sabre/vobject/lib/Parser/XML.php',
+ 'Sabre\\VObject\\Parser\\XML\\Element\\KeyValue' => $vendorDir . '/sabre/vobject/lib/Parser/XML/Element/KeyValue.php',
+ 'Sabre\\VObject\\Property' => $vendorDir . '/sabre/vobject/lib/Property.php',
+ 'Sabre\\VObject\\Property\\Binary' => $vendorDir . '/sabre/vobject/lib/Property/Binary.php',
+ 'Sabre\\VObject\\Property\\Boolean' => $vendorDir . '/sabre/vobject/lib/Property/Boolean.php',
+ 'Sabre\\VObject\\Property\\FlatText' => $vendorDir . '/sabre/vobject/lib/Property/FlatText.php',
+ 'Sabre\\VObject\\Property\\FloatValue' => $vendorDir . '/sabre/vobject/lib/Property/FloatValue.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\CalAddress' => $vendorDir . '/sabre/vobject/lib/Property/ICalendar/CalAddress.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\Date' => $vendorDir . '/sabre/vobject/lib/Property/ICalendar/Date.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\DateTime' => $vendorDir . '/sabre/vobject/lib/Property/ICalendar/DateTime.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\Duration' => $vendorDir . '/sabre/vobject/lib/Property/ICalendar/Duration.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\Period' => $vendorDir . '/sabre/vobject/lib/Property/ICalendar/Period.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\Recur' => $vendorDir . '/sabre/vobject/lib/Property/ICalendar/Recur.php',
+ 'Sabre\\VObject\\Property\\IntegerValue' => $vendorDir . '/sabre/vobject/lib/Property/IntegerValue.php',
+ 'Sabre\\VObject\\Property\\Text' => $vendorDir . '/sabre/vobject/lib/Property/Text.php',
+ 'Sabre\\VObject\\Property\\Time' => $vendorDir . '/sabre/vobject/lib/Property/Time.php',
+ 'Sabre\\VObject\\Property\\Unknown' => $vendorDir . '/sabre/vobject/lib/Property/Unknown.php',
+ 'Sabre\\VObject\\Property\\Uri' => $vendorDir . '/sabre/vobject/lib/Property/Uri.php',
+ 'Sabre\\VObject\\Property\\UtcOffset' => $vendorDir . '/sabre/vobject/lib/Property/UtcOffset.php',
+ 'Sabre\\VObject\\Property\\VCard\\Date' => $vendorDir . '/sabre/vobject/lib/Property/VCard/Date.php',
+ 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime' => $vendorDir . '/sabre/vobject/lib/Property/VCard/DateAndOrTime.php',
+ 'Sabre\\VObject\\Property\\VCard\\DateTime' => $vendorDir . '/sabre/vobject/lib/Property/VCard/DateTime.php',
+ 'Sabre\\VObject\\Property\\VCard\\LanguageTag' => $vendorDir . '/sabre/vobject/lib/Property/VCard/LanguageTag.php',
+ 'Sabre\\VObject\\Property\\VCard\\TimeStamp' => $vendorDir . '/sabre/vobject/lib/Property/VCard/TimeStamp.php',
+ 'Sabre\\VObject\\Reader' => $vendorDir . '/sabre/vobject/lib/Reader.php',
+ 'Sabre\\VObject\\Recur\\EventIterator' => $vendorDir . '/sabre/vobject/lib/Recur/EventIterator.php',
+ 'Sabre\\VObject\\Recur\\MaxInstancesExceededException' => $vendorDir . '/sabre/vobject/lib/Recur/MaxInstancesExceededException.php',
+ 'Sabre\\VObject\\Recur\\NoInstancesException' => $vendorDir . '/sabre/vobject/lib/Recur/NoInstancesException.php',
+ 'Sabre\\VObject\\Recur\\RDateIterator' => $vendorDir . '/sabre/vobject/lib/Recur/RDateIterator.php',
+ 'Sabre\\VObject\\Recur\\RRuleIterator' => $vendorDir . '/sabre/vobject/lib/Recur/RRuleIterator.php',
+ 'Sabre\\VObject\\Settings' => $vendorDir . '/sabre/vobject/lib/Settings.php',
+ 'Sabre\\VObject\\Splitter\\ICalendar' => $vendorDir . '/sabre/vobject/lib/Splitter/ICalendar.php',
+ 'Sabre\\VObject\\Splitter\\SplitterInterface' => $vendorDir . '/sabre/vobject/lib/Splitter/SplitterInterface.php',
+ 'Sabre\\VObject\\Splitter\\VCard' => $vendorDir . '/sabre/vobject/lib/Splitter/VCard.php',
+ 'Sabre\\VObject\\StringUtil' => $vendorDir . '/sabre/vobject/lib/StringUtil.php',
+ 'Sabre\\VObject\\TimeZoneUtil' => $vendorDir . '/sabre/vobject/lib/TimeZoneUtil.php',
+ 'Sabre\\VObject\\UUIDUtil' => $vendorDir . '/sabre/vobject/lib/UUIDUtil.php',
+ 'Sabre\\VObject\\VCardConverter' => $vendorDir . '/sabre/vobject/lib/VCardConverter.php',
+ 'Sabre\\VObject\\Version' => $vendorDir . '/sabre/vobject/lib/Version.php',
+ 'Sabre\\VObject\\Writer' => $vendorDir . '/sabre/vobject/lib/Writer.php',
+ 'Sabre\\Xml\\ContextStackTrait' => $vendorDir . '/sabre/xml/lib/ContextStackTrait.php',
+ 'Sabre\\Xml\\Element' => $vendorDir . '/sabre/xml/lib/Element.php',
+ 'Sabre\\Xml\\Element\\Base' => $vendorDir . '/sabre/xml/lib/Element/Base.php',
+ 'Sabre\\Xml\\Element\\Cdata' => $vendorDir . '/sabre/xml/lib/Element/Cdata.php',
+ 'Sabre\\Xml\\Element\\Elements' => $vendorDir . '/sabre/xml/lib/Element/Elements.php',
+ 'Sabre\\Xml\\Element\\KeyValue' => $vendorDir . '/sabre/xml/lib/Element/KeyValue.php',
+ 'Sabre\\Xml\\Element\\Uri' => $vendorDir . '/sabre/xml/lib/Element/Uri.php',
+ 'Sabre\\Xml\\Element\\XmlFragment' => $vendorDir . '/sabre/xml/lib/Element/XmlFragment.php',
+ 'Sabre\\Xml\\LibXMLException' => $vendorDir . '/sabre/xml/lib/LibXMLException.php',
+ 'Sabre\\Xml\\ParseException' => $vendorDir . '/sabre/xml/lib/ParseException.php',
+ 'Sabre\\Xml\\Reader' => $vendorDir . '/sabre/xml/lib/Reader.php',
+ 'Sabre\\Xml\\Service' => $vendorDir . '/sabre/xml/lib/Service.php',
+ 'Sabre\\Xml\\Version' => $vendorDir . '/sabre/xml/lib/Version.php',
+ 'Sabre\\Xml\\Writer' => $vendorDir . '/sabre/xml/lib/Writer.php',
+ 'Sabre\\Xml\\XmlDeserializable' => $vendorDir . '/sabre/xml/lib/XmlDeserializable.php',
+ 'Sabre\\Xml\\XmlSerializable' => $vendorDir . '/sabre/xml/lib/XmlSerializable.php',
+ 'Zotlabs\\Access\\AccessList' => $baseDir . '/Zotlabs/Access/AccessList.php',
+ 'Zotlabs\\Access\\PermissionLimits' => $baseDir . '/Zotlabs/Access/PermissionLimits.php',
+ 'Zotlabs\\Access\\PermissionRoles' => $baseDir . '/Zotlabs/Access/PermissionRoles.php',
+ 'Zotlabs\\Access\\Permissions' => $baseDir . '/Zotlabs/Access/Permissions.php',
+ 'Zotlabs\\Daemon\\Checksites' => $baseDir . '/Zotlabs/Daemon/Checksites.php',
+ 'Zotlabs\\Daemon\\Cli_suggest' => $baseDir . '/Zotlabs/Daemon/Cli_suggest.php',
+ 'Zotlabs\\Daemon\\Cron' => $baseDir . '/Zotlabs/Daemon/Cron.php',
+ 'Zotlabs\\Daemon\\Cron_daily' => $baseDir . '/Zotlabs/Daemon/Cron_daily.php',
+ 'Zotlabs\\Daemon\\Cron_weekly' => $baseDir . '/Zotlabs/Daemon/Cron_weekly.php',
+ 'Zotlabs\\Daemon\\Cronhooks' => $baseDir . '/Zotlabs/Daemon/Cronhooks.php',
+ 'Zotlabs\\Daemon\\CurlAuth' => $baseDir . '/Zotlabs/Daemon/CurlAuth.php',
+ 'Zotlabs\\Daemon\\Deliver' => $baseDir . '/Zotlabs/Daemon/Deliver.php',
+ 'Zotlabs\\Daemon\\Deliver_hooks' => $baseDir . '/Zotlabs/Daemon/Deliver_hooks.php',
+ 'Zotlabs\\Daemon\\Directory' => $baseDir . '/Zotlabs/Daemon/Directory.php',
+ 'Zotlabs\\Daemon\\Expire' => $baseDir . '/Zotlabs/Daemon/Expire.php',
+ 'Zotlabs\\Daemon\\Externals' => $baseDir . '/Zotlabs/Daemon/Externals.php',
+ 'Zotlabs\\Daemon\\Gprobe' => $baseDir . '/Zotlabs/Daemon/Gprobe.php',
+ 'Zotlabs\\Daemon\\Importdoc' => $baseDir . '/Zotlabs/Daemon/Importdoc.php',
+ 'Zotlabs\\Daemon\\Master' => $baseDir . '/Zotlabs/Daemon/Master.php',
+ 'Zotlabs\\Daemon\\Notifier' => $baseDir . '/Zotlabs/Daemon/Notifier.php',
+ 'Zotlabs\\Daemon\\Onedirsync' => $baseDir . '/Zotlabs/Daemon/Onedirsync.php',
+ 'Zotlabs\\Daemon\\Onepoll' => $baseDir . '/Zotlabs/Daemon/Onepoll.php',
+ 'Zotlabs\\Daemon\\Poller' => $baseDir . '/Zotlabs/Daemon/Poller.php',
+ 'Zotlabs\\Daemon\\Queue' => $baseDir . '/Zotlabs/Daemon/Queue.php',
+ 'Zotlabs\\Daemon\\Ratenotif' => $baseDir . '/Zotlabs/Daemon/Ratenotif.php',
+ 'Zotlabs\\Extend\\Hook' => $baseDir . '/Zotlabs/Extend/Hook.php',
+ 'Zotlabs\\Identity\\BasicId\\BasicId' => $baseDir . '/Zotlabs/Identity/BasicId.php',
+ 'Zotlabs\\Identity\\ProfilePhoto\\ProfilePhoto' => $baseDir . '/Zotlabs/Identity/ProfilePhoto.php',
+ 'Zotlabs\\Lib\\AConfig' => $baseDir . '/Zotlabs/Lib/AConfig.php',
+ 'Zotlabs\\Lib\\AbConfig' => $baseDir . '/Zotlabs/Lib/AbConfig.php',
+ 'Zotlabs\\Lib\\Api_router' => $baseDir . '/Zotlabs/Lib/Api_router.php',
+ 'Zotlabs\\Lib\\Apps' => $baseDir . '/Zotlabs/Lib/Apps.php',
+ 'Zotlabs\\Lib\\Cache' => $baseDir . '/Zotlabs/Lib/Cache.php',
+ 'Zotlabs\\Lib\\Chatroom' => $baseDir . '/Zotlabs/Lib/Chatroom.php',
+ 'Zotlabs\\Lib\\Config' => $baseDir . '/Zotlabs/Lib/Config.php',
+ 'Zotlabs\\Lib\\Enotify' => $baseDir . '/Zotlabs/Lib/Enotify.php',
+ 'Zotlabs\\Lib\\ExtendedZip' => $baseDir . '/Zotlabs/Lib/ExtendedZip.php',
+ 'Zotlabs\\Lib\\IConfig' => $baseDir . '/Zotlabs/Lib/IConfig.php',
+ 'Zotlabs\\Lib\\PConfig' => $baseDir . '/Zotlabs/Lib/PConfig.php',
+ 'Zotlabs\\Lib\\PermissionDescription' => $baseDir . '/Zotlabs/Lib/PermissionDescription.php',
+ 'Zotlabs\\Lib\\ProtoDriver' => $baseDir . '/Zotlabs/Lib/ProtoDriver.php',
+ 'Zotlabs\\Lib\\SuperCurl' => $baseDir . '/Zotlabs/Lib/SuperCurl.php',
+ 'Zotlabs\\Lib\\System' => $baseDir . '/Zotlabs/Lib/System.php',
+ 'Zotlabs\\Lib\\Techlevels' => $baseDir . '/Zotlabs/Lib/Techlevels.php',
+ 'Zotlabs\\Lib\\ThreadItem' => $baseDir . '/Zotlabs/Lib/ThreadItem.php',
+ 'Zotlabs\\Lib\\ThreadStream' => $baseDir . '/Zotlabs/Lib/ThreadStream.php',
+ 'Zotlabs\\Lib\\XConfig' => $baseDir . '/Zotlabs/Lib/XConfig.php',
+ 'Zotlabs\\Lib\\ZotDriver' => $baseDir . '/Zotlabs/Lib/ZotDriver.php',
+ 'Zotlabs\\Module\\Achievements' => $baseDir . '/Zotlabs/Module/Achievements.php',
+ 'Zotlabs\\Module\\Acl' => $baseDir . '/Zotlabs/Module/Acl.php',
+ 'Zotlabs\\Module\\Admin' => $baseDir . '/Zotlabs/Module/Admin.php',
+ 'Zotlabs\\Module\\Admin\\Account_edit' => $baseDir . '/Zotlabs/Module/Admin/Account_edit.php',
+ 'Zotlabs\\Module\\Admin\\Accounts' => $baseDir . '/Zotlabs/Module/Admin/Accounts.php',
+ 'Zotlabs\\Module\\Admin\\Channels' => $baseDir . '/Zotlabs/Module/Admin/Channels.php',
+ 'Zotlabs\\Module\\Admin\\Dbsync' => $baseDir . '/Zotlabs/Module/Admin/Dbsync.php',
+ 'Zotlabs\\Module\\Admin\\Features' => $baseDir . '/Zotlabs/Module/Admin/Features.php',
+ 'Zotlabs\\Module\\Admin\\Logs' => $baseDir . '/Zotlabs/Module/Admin/Logs.php',
+ 'Zotlabs\\Module\\Admin\\Plugins' => $baseDir . '/Zotlabs/Module/Admin/Plugins.php',
+ 'Zotlabs\\Module\\Admin\\Profs' => $baseDir . '/Zotlabs/Module/Admin/Profs.php',
+ 'Zotlabs\\Module\\Admin\\Queue' => $baseDir . '/Zotlabs/Module/Admin/Queue.php',
+ 'Zotlabs\\Module\\Admin\\Security' => $baseDir . '/Zotlabs/Module/Admin/Security.php',
+ 'Zotlabs\\Module\\Admin\\Site' => $baseDir . '/Zotlabs/Module/Admin/Site.php',
+ 'Zotlabs\\Module\\Admin\\Themes' => $baseDir . '/Zotlabs/Module/Admin/Themes.php',
+ 'Zotlabs\\Module\\Api' => $baseDir . '/Zotlabs/Module/Api.php',
+ 'Zotlabs\\Module\\Appman' => $baseDir . '/Zotlabs/Module/Appman.php',
+ 'Zotlabs\\Module\\Apps' => $baseDir . '/Zotlabs/Module/Apps.php',
+ 'Zotlabs\\Module\\Attach' => $baseDir . '/Zotlabs/Module/Attach.php',
+ 'Zotlabs\\Module\\Authtest' => $baseDir . '/Zotlabs/Module/Authtest.php',
+ 'Zotlabs\\Module\\Block' => $baseDir . '/Zotlabs/Module/Block.php',
+ 'Zotlabs\\Module\\Blocks' => $baseDir . '/Zotlabs/Module/Blocks.php',
+ 'Zotlabs\\Module\\Bookmarks' => $baseDir . '/Zotlabs/Module/Bookmarks.php',
+ 'Zotlabs\\Module\\Branchtopic' => $baseDir . '/Zotlabs/Module/Branchtopic.php',
+ 'Zotlabs\\Module\\Cal' => $baseDir . '/Zotlabs/Module/Cal.php',
+ 'Zotlabs\\Module\\Channel' => $baseDir . '/Zotlabs/Module/Channel.php',
+ 'Zotlabs\\Module\\Chanview' => $baseDir . '/Zotlabs/Module/Chanview.php',
+ 'Zotlabs\\Module\\Chat' => $baseDir . '/Zotlabs/Module/Chat.php',
+ 'Zotlabs\\Module\\Chatsvc' => $baseDir . '/Zotlabs/Module/Chatsvc.php',
+ 'Zotlabs\\Module\\Cloud' => $baseDir . '/Zotlabs/Module/Cloud.php',
+ 'Zotlabs\\Module\\Common' => $baseDir . '/Zotlabs/Module/Common.php',
+ 'Zotlabs\\Module\\Connect' => $baseDir . '/Zotlabs/Module/Connect.php',
+ 'Zotlabs\\Module\\Connections' => $baseDir . '/Zotlabs/Module/Connections.php',
+ 'Zotlabs\\Module\\Connedit' => $baseDir . '/Zotlabs/Module/Connedit.php',
+ 'Zotlabs\\Module\\Contactgroup' => $baseDir . '/Zotlabs/Module/Contactgroup.php',
+ 'Zotlabs\\Module\\Cover_photo' => $baseDir . '/Zotlabs/Module/Cover_photo.php',
+ 'Zotlabs\\Module\\Dav' => $baseDir . '/Zotlabs/Module/Dav.php',
+ 'Zotlabs\\Module\\Directory' => $baseDir . '/Zotlabs/Module/Directory.php',
+ 'Zotlabs\\Module\\Dirsearch' => $baseDir . '/Zotlabs/Module/Dirsearch.php',
+ 'Zotlabs\\Module\\Display' => $baseDir . '/Zotlabs/Module/Display.php',
+ 'Zotlabs\\Module\\Dreport' => $baseDir . '/Zotlabs/Module/Dreport.php',
+ 'Zotlabs\\Module\\Editblock' => $baseDir . '/Zotlabs/Module/Editblock.php',
+ 'Zotlabs\\Module\\Editlayout' => $baseDir . '/Zotlabs/Module/Editlayout.php',
+ 'Zotlabs\\Module\\Editpost' => $baseDir . '/Zotlabs/Module/Editpost.php',
+ 'Zotlabs\\Module\\Editwebpage' => $baseDir . '/Zotlabs/Module/Editwebpage.php',
+ 'Zotlabs\\Module\\Embedphotos' => $baseDir . '/Zotlabs/Module/Embedphotos.php',
+ 'Zotlabs\\Module\\Events' => $baseDir . '/Zotlabs/Module/Events.php',
+ 'Zotlabs\\Module\\Fbrowser' => $baseDir . '/Zotlabs/Module/Fbrowser.php',
+ 'Zotlabs\\Module\\Feed' => $baseDir . '/Zotlabs/Module/Feed.php',
+ 'Zotlabs\\Module\\Ffsapi' => $baseDir . '/Zotlabs/Module/Ffsapi.php',
+ 'Zotlabs\\Module\\Fhublocs' => $baseDir . '/Zotlabs/Module/Fhublocs.php',
+ 'Zotlabs\\Module\\File_upload' => $baseDir . '/Zotlabs/Module/File_upload.php',
+ 'Zotlabs\\Module\\Filer' => $baseDir . '/Zotlabs/Module/Filer.php',
+ 'Zotlabs\\Module\\Filerm' => $baseDir . '/Zotlabs/Module/Filerm.php',
+ 'Zotlabs\\Module\\Filestorage' => $baseDir . '/Zotlabs/Module/Filestorage.php',
+ 'Zotlabs\\Module\\Follow' => $baseDir . '/Zotlabs/Module/Follow.php',
+ 'Zotlabs\\Module\\Getfile' => $baseDir . '/Zotlabs/Module/Getfile.php',
+ 'Zotlabs\\Module\\Group' => $baseDir . '/Zotlabs/Module/Group.php',
+ 'Zotlabs\\Module\\Hcard' => $baseDir . '/Zotlabs/Module/Hcard.php',
+ 'Zotlabs\\Module\\Help' => $baseDir . '/Zotlabs/Module/Help.php',
+ 'Zotlabs\\Module\\Home' => $baseDir . '/Zotlabs/Module/Home.php',
+ 'Zotlabs\\Module\\Hostxrd' => $baseDir . '/Zotlabs/Module/Hostxrd.php',
+ 'Zotlabs\\Module\\Impel' => $baseDir . '/Zotlabs/Module/Impel.php',
+ 'Zotlabs\\Module\\Import' => $baseDir . '/Zotlabs/Module/Import.php',
+ 'Zotlabs\\Module\\Import_items' => $baseDir . '/Zotlabs/Module/Import_items.php',
+ 'Zotlabs\\Module\\Invite' => $baseDir . '/Zotlabs/Module/Invite.php',
+ 'Zotlabs\\Module\\Item' => $baseDir . '/Zotlabs/Module/Item.php',
+ 'Zotlabs\\Module\\Lang' => $baseDir . '/Zotlabs/Module/Lang.php',
+ 'Zotlabs\\Module\\Layouts' => $baseDir . '/Zotlabs/Module/Layouts.php',
+ 'Zotlabs\\Module\\Like' => $baseDir . '/Zotlabs/Module/Like.php',
+ 'Zotlabs\\Module\\Linkinfo' => $baseDir . '/Zotlabs/Module/Linkinfo.php',
+ 'Zotlabs\\Module\\Lockview' => $baseDir . '/Zotlabs/Module/Lockview.php',
+ 'Zotlabs\\Module\\Locs' => $baseDir . '/Zotlabs/Module/Locs.php',
+ 'Zotlabs\\Module\\Login' => $baseDir . '/Zotlabs/Module/Login.php',
+ 'Zotlabs\\Module\\Lostpass' => $baseDir . '/Zotlabs/Module/Lostpass.php',
+ 'Zotlabs\\Module\\Magic' => $baseDir . '/Zotlabs/Module/Magic.php',
+ 'Zotlabs\\Module\\Mail' => $baseDir . '/Zotlabs/Module/Mail.php',
+ 'Zotlabs\\Module\\Manage' => $baseDir . '/Zotlabs/Module/Manage.php',
+ 'Zotlabs\\Module\\Match' => $baseDir . '/Zotlabs/Module/Match.php',
+ 'Zotlabs\\Module\\Menu' => $baseDir . '/Zotlabs/Module/Menu.php',
+ 'Zotlabs\\Module\\Message' => $baseDir . '/Zotlabs/Module/Message.php',
+ 'Zotlabs\\Module\\Mitem' => $baseDir . '/Zotlabs/Module/Mitem.php',
+ 'Zotlabs\\Module\\Mood' => $baseDir . '/Zotlabs/Module/Mood.php',
+ 'Zotlabs\\Module\\Network' => $baseDir . '/Zotlabs/Module/Network.php',
+ 'Zotlabs\\Module\\New_channel' => $baseDir . '/Zotlabs/Module/New_channel.php',
+ 'Zotlabs\\Module\\Nojs' => $baseDir . '/Zotlabs/Module/Nojs.php',
+ 'Zotlabs\\Module\\Notes' => $baseDir . '/Zotlabs/Module/Notes.php',
+ 'Zotlabs\\Module\\Notifications' => $baseDir . '/Zotlabs/Module/Notifications.php',
+ 'Zotlabs\\Module\\Notify' => $baseDir . '/Zotlabs/Module/Notify.php',
+ 'Zotlabs\\Module\\Oembed' => $baseDir . '/Zotlabs/Module/Oembed.php',
+ 'Zotlabs\\Module\\Oep' => $baseDir . '/Zotlabs/Module/Oep.php',
+ 'Zotlabs\\Module\\Oexchange' => $baseDir . '/Zotlabs/Module/Oexchange.php',
+ 'Zotlabs\\Module\\Online' => $baseDir . '/Zotlabs/Module/Online.php',
+ 'Zotlabs\\Module\\Opensearch' => $baseDir . '/Zotlabs/Module/Opensearch.php',
+ 'Zotlabs\\Module\\Page' => $baseDir . '/Zotlabs/Module/Page.php',
+ 'Zotlabs\\Module\\Pconfig' => $baseDir . '/Zotlabs/Module/Pconfig.php',
+ 'Zotlabs\\Module\\Pdledit' => $baseDir . '/Zotlabs/Module/Pdledit.php',
+ 'Zotlabs\\Module\\Photo' => $baseDir . '/Zotlabs/Module/Photo.php',
+ 'Zotlabs\\Module\\Photos' => $baseDir . '/Zotlabs/Module/Photos.php',
+ 'Zotlabs\\Module\\Ping' => $baseDir . '/Zotlabs/Module/Ping.php',
+ 'Zotlabs\\Module\\Poco' => $baseDir . '/Zotlabs/Module/Poco.php',
+ 'Zotlabs\\Module\\Poke' => $baseDir . '/Zotlabs/Module/Poke.php',
+ 'Zotlabs\\Module\\Post' => $baseDir . '/Zotlabs/Module/Post.php',
+ 'Zotlabs\\Module\\Prate' => $baseDir . '/Zotlabs/Module/Prate.php',
+ 'Zotlabs\\Module\\Pretheme' => $baseDir . '/Zotlabs/Module/Pretheme.php',
+ 'Zotlabs\\Module\\Probe' => $baseDir . '/Zotlabs/Module/Probe.php',
+ 'Zotlabs\\Module\\Profile' => $baseDir . '/Zotlabs/Module/Profile.php',
+ 'Zotlabs\\Module\\Profile_photo' => $baseDir . '/Zotlabs/Module/Profile_photo.php',
+ 'Zotlabs\\Module\\Profiles' => $baseDir . '/Zotlabs/Module/Profiles.php',
+ 'Zotlabs\\Module\\Profperm' => $baseDir . '/Zotlabs/Module/Profperm.php',
+ 'Zotlabs\\Module\\Pubsites' => $baseDir . '/Zotlabs/Module/Pubsites.php',
+ 'Zotlabs\\Module\\Pubstream' => $baseDir . '/Zotlabs/Module/Pubstream.php',
+ 'Zotlabs\\Module\\Randprof' => $baseDir . '/Zotlabs/Module/Randprof.php',
+ 'Zotlabs\\Module\\Rate' => $baseDir . '/Zotlabs/Module/Rate.php',
+ 'Zotlabs\\Module\\Ratings' => $baseDir . '/Zotlabs/Module/Ratings.php',
+ 'Zotlabs\\Module\\Ratingsearch' => $baseDir . '/Zotlabs/Module/Ratingsearch.php',
+ 'Zotlabs\\Module\\Rbmark' => $baseDir . '/Zotlabs/Module/Rbmark.php',
+ 'Zotlabs\\Module\\React' => $baseDir . '/Zotlabs/Module/React.php',
+ 'Zotlabs\\Module\\Regdir' => $baseDir . '/Zotlabs/Module/Regdir.php',
+ 'Zotlabs\\Module\\Register' => $baseDir . '/Zotlabs/Module/Register.php',
+ 'Zotlabs\\Module\\Regmod' => $baseDir . '/Zotlabs/Module/Regmod.php',
+ 'Zotlabs\\Module\\Regver' => $baseDir . '/Zotlabs/Module/Regver.php',
+ 'Zotlabs\\Module\\Removeaccount' => $baseDir . '/Zotlabs/Module/Removeaccount.php',
+ 'Zotlabs\\Module\\Removeme' => $baseDir . '/Zotlabs/Module/Removeme.php',
+ 'Zotlabs\\Module\\Rmagic' => $baseDir . '/Zotlabs/Module/Rmagic.php',
+ 'Zotlabs\\Module\\Rpost' => $baseDir . '/Zotlabs/Module/Rpost.php',
+ 'Zotlabs\\Module\\Rsd_xml' => $baseDir . '/Zotlabs/Module/Rsd_xml.php',
+ 'Zotlabs\\Module\\Search' => $baseDir . '/Zotlabs/Module/Search.php',
+ 'Zotlabs\\Module\\Search_ac' => $baseDir . '/Zotlabs/Module/Search_ac.php',
+ 'Zotlabs\\Module\\Service_limits' => $baseDir . '/Zotlabs/Module/Service_limits.php',
+ 'Zotlabs\\Module\\Settings' => $baseDir . '/Zotlabs/Module/Settings.php',
+ 'Zotlabs\\Module\\Settings\\Account' => $baseDir . '/Zotlabs/Module/Settings/Account.php',
+ 'Zotlabs\\Module\\Settings\\Channel' => $baseDir . '/Zotlabs/Module/Settings/Channel.php',
+ 'Zotlabs\\Module\\Settings\\Display' => $baseDir . '/Zotlabs/Module/Settings/Display.php',
+ 'Zotlabs\\Module\\Settings\\Featured' => $baseDir . '/Zotlabs/Module/Settings/Featured.php',
+ 'Zotlabs\\Module\\Settings\\Features' => $baseDir . '/Zotlabs/Module/Settings/Features.php',
+ 'Zotlabs\\Module\\Settings\\Oauth' => $baseDir . '/Zotlabs/Module/Settings/Oauth.php',
+ 'Zotlabs\\Module\\Settings\\Tokens' => $baseDir . '/Zotlabs/Module/Settings/Tokens.php',
+ 'Zotlabs\\Module\\Setup' => $baseDir . '/Zotlabs/Module/Setup.php',
+ 'Zotlabs\\Module\\Share' => $baseDir . '/Zotlabs/Module/Share.php',
+ 'Zotlabs\\Module\\Sharedwithme' => $baseDir . '/Zotlabs/Module/Sharedwithme.php',
+ 'Zotlabs\\Module\\Siteinfo' => $baseDir . '/Zotlabs/Module/Siteinfo.php',
+ 'Zotlabs\\Module\\Siteinfo_json' => $baseDir . '/Zotlabs/Module/Siteinfo_json.php',
+ 'Zotlabs\\Module\\Sitelist' => $baseDir . '/Zotlabs/Module/Sitelist.php',
+ 'Zotlabs\\Module\\Smilies' => $baseDir . '/Zotlabs/Module/Smilies.php',
+ 'Zotlabs\\Module\\Snap' => $baseDir . '/Zotlabs/Module/Snap.php',
+ 'Zotlabs\\Module\\Sources' => $baseDir . '/Zotlabs/Module/Sources.php',
+ 'Zotlabs\\Module\\Sslify' => $baseDir . '/Zotlabs/Module/Sslify.php',
+ 'Zotlabs\\Module\\Starred' => $baseDir . '/Zotlabs/Module/Starred.php',
+ 'Zotlabs\\Module\\Subthread' => $baseDir . '/Zotlabs/Module/Subthread.php',
+ 'Zotlabs\\Module\\Suggest' => $baseDir . '/Zotlabs/Module/Suggest.php',
+ 'Zotlabs\\Module\\Tagger' => $baseDir . '/Zotlabs/Module/Tagger.php',
+ 'Zotlabs\\Module\\Tagrm' => $baseDir . '/Zotlabs/Module/Tagrm.php',
+ 'Zotlabs\\Module\\Tasks' => $baseDir . '/Zotlabs/Module/Tasks.php',
+ 'Zotlabs\\Module\\Theme_info' => $baseDir . '/Zotlabs/Module/Theme_info.php',
+ 'Zotlabs\\Module\\Thing' => $baseDir . '/Zotlabs/Module/Thing.php',
+ 'Zotlabs\\Module\\Toggle_mobile' => $baseDir . '/Zotlabs/Module/Toggle_mobile.php',
+ 'Zotlabs\\Module\\Toggle_safesearch' => $baseDir . '/Zotlabs/Module/Toggle_safesearch.php',
+ 'Zotlabs\\Module\\Uexport' => $baseDir . '/Zotlabs/Module/Uexport.php',
+ 'Zotlabs\\Module\\Update_channel' => $baseDir . '/Zotlabs/Module/Update_channel.php',
+ 'Zotlabs\\Module\\Update_display' => $baseDir . '/Zotlabs/Module/Update_display.php',
+ 'Zotlabs\\Module\\Update_home' => $baseDir . '/Zotlabs/Module/Update_home.php',
+ 'Zotlabs\\Module\\Update_network' => $baseDir . '/Zotlabs/Module/Update_network.php',
+ 'Zotlabs\\Module\\Update_pubstream' => $baseDir . '/Zotlabs/Module/Update_pubstream.php',
+ 'Zotlabs\\Module\\Update_search' => $baseDir . '/Zotlabs/Module/Update_search.php',
+ 'Zotlabs\\Module\\View' => $baseDir . '/Zotlabs/Module/View.php',
+ 'Zotlabs\\Module\\Viewconnections' => $baseDir . '/Zotlabs/Module/Viewconnections.php',
+ 'Zotlabs\\Module\\Viewsrc' => $baseDir . '/Zotlabs/Module/Viewsrc.php',
+ 'Zotlabs\\Module\\Wall_attach' => $baseDir . '/Zotlabs/Module/Wall_attach.php',
+ 'Zotlabs\\Module\\Wall_upload' => $baseDir . '/Zotlabs/Module/Wall_upload.php',
+ 'Zotlabs\\Module\\Webfinger' => $baseDir . '/Zotlabs/Module/Webfinger.php',
+ 'Zotlabs\\Module\\Webpages' => $baseDir . '/Zotlabs/Module/Webpages.php',
+ 'Zotlabs\\Module\\Well_known' => $baseDir . '/Zotlabs/Module/Well_known.php',
+ 'Zotlabs\\Module\\Wfinger' => $baseDir . '/Zotlabs/Module/Wfinger.php',
+ 'Zotlabs\\Module\\Wiki' => $baseDir . '/Zotlabs/Module/Wiki.php',
+ 'Zotlabs\\Module\\Xchan' => $baseDir . '/Zotlabs/Module/Xchan.php',
+ 'Zotlabs\\Module\\Xpoco' => $baseDir . '/Zotlabs/Module/Xpoco.php',
+ 'Zotlabs\\Module\\Xrd' => $baseDir . '/Zotlabs/Module/Xrd.php',
+ 'Zotlabs\\Module\\Xref' => $baseDir . '/Zotlabs/Module/Xref.php',
+ 'Zotlabs\\Module\\Zfinger' => $baseDir . '/Zotlabs/Module/Zfinger.php',
+ 'Zotlabs\\Module\\Zotfeed' => $baseDir . '/Zotlabs/Module/Zotfeed.php',
+ 'Zotlabs\\Module\\Zping' => $baseDir . '/Zotlabs/Module/Zping.php',
+ 'Zotlabs\\Render\\Comanche' => $baseDir . '/Zotlabs/Render/Comanche.php',
+ 'Zotlabs\\Render\\SimpleTemplate' => $baseDir . '/Zotlabs/Render/SimpleTemplate.php',
+ 'Zotlabs\\Render\\SmartyInterface' => $baseDir . '/Zotlabs/Render/SmartyInterface.php',
+ 'Zotlabs\\Render\\SmartyTemplate' => $baseDir . '/Zotlabs/Render/SmartyTemplate.php',
+ 'Zotlabs\\Render\\TemplateEngine' => $baseDir . '/Zotlabs/Render/TemplateEngine.php',
+ 'Zotlabs\\Render\\Theme' => $baseDir . '/Zotlabs/Render/Theme.php',
+ 'Zotlabs\\Storage\\BasicAuth' => $baseDir . '/Zotlabs/Storage/BasicAuth.php',
+ 'Zotlabs\\Storage\\Browser' => $baseDir . '/Zotlabs/Storage/Browser.php',
+ 'Zotlabs\\Storage\\CalDAVClient' => $baseDir . '/Zotlabs/Storage/CalDAVClient.php',
+ 'Zotlabs\\Storage\\Directory' => $baseDir . '/Zotlabs/Storage/Directory.php',
+ 'Zotlabs\\Storage\\File' => $baseDir . '/Zotlabs/Storage/File.php',
+ 'Zotlabs\\Storage\\GitRepo' => $baseDir . '/Zotlabs/Storage/GitRepo.php',
+ 'Zotlabs\\Text\\Tagadelic' => $baseDir . '/Zotlabs/Text/Tagadelic.php',
+ 'Zotlabs\\Web\\CheckJS' => $baseDir . '/Zotlabs/Web/CheckJS.php',
+ 'Zotlabs\\Web\\Controller' => $baseDir . '/Zotlabs/Web/Controller.php',
+ 'Zotlabs\\Web\\HttpMeta' => $baseDir . '/Zotlabs/Web/HttpMeta.php',
+ 'Zotlabs\\Web\\Router' => $baseDir . '/Zotlabs/Web/Router.php',
+ 'Zotlabs\\Web\\Session' => $baseDir . '/Zotlabs/Web/Session.php',
+ 'Zotlabs\\Web\\SessionHandler' => $baseDir . '/Zotlabs/Web/SessionHandler.php',
+ 'Zotlabs\\Web\\SubModule' => $baseDir . '/Zotlabs/Web/SubModule.php',
+ 'Zotlabs\\Web\\WebServer' => $baseDir . '/Zotlabs/Web/WebServer.php',
+ 'Zotlabs\\Zot\\Auth' => $baseDir . '/Zotlabs/Zot/Auth.php',
+ 'Zotlabs\\Zot\\DReport' => $baseDir . '/Zotlabs/Zot/DReport.php',
+ 'Zotlabs\\Zot\\Finger' => $baseDir . '/Zotlabs/Zot/Finger.php',
+ 'Zotlabs\\Zot\\IHandler' => $baseDir . '/Zotlabs/Zot/IHandler.php',
+ 'Zotlabs\\Zot\\Receiver' => $baseDir . '/Zotlabs/Zot/Receiver.php',
+ 'Zotlabs\\Zot\\Verify' => $baseDir . '/Zotlabs/Zot/Verify.php',
+ 'Zotlabs\\Zot\\ZotHandler' => $baseDir . '/Zotlabs/Zot/ZotHandler.php',
);
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index 24ffd3718..a78cbe6fb 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -7,10 +7,10 @@ $baseDir = dirname($vendorDir);
return array(
'383eaff206634a77a1be54e64e6459c7' => $vendorDir . '/sabre/uri/lib/functions.php',
- '3569eecfeed3bcf0bad3c998a494ecb8' => $vendorDir . '/sabre/xml/lib/Deserializer/functions.php',
- '93aa591bc4ca510c520999e34229ee79' => $vendorDir . '/sabre/xml/lib/Serializer/functions.php',
'2b9d0f43f9552984cfa82fee95491826' => $vendorDir . '/sabre/event/lib/coroutine.php',
'd81bab31d3feb45bfe2f283ea3c8fdf7' => $vendorDir . '/sabre/event/lib/Loop/functions.php',
'a1cce3d26cc15c00fcd0b3354bd72c88' => $vendorDir . '/sabre/event/lib/Promise/functions.php',
+ '3569eecfeed3bcf0bad3c998a494ecb8' => $vendorDir . '/sabre/xml/lib/Deserializer/functions.php',
+ '93aa591bc4ca510c520999e34229ee79' => $vendorDir . '/sabre/xml/lib/Serializer/functions.php',
'ebdb698ed4152ae445614b69b5e4bb6a' => $vendorDir . '/sabre/http/lib/functions.php',
);
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
index 10c9b8207..b7fc0125d 100644
--- a/vendor/composer/autoload_namespaces.php
+++ b/vendor/composer/autoload_namespaces.php
@@ -6,5 +6,4 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
- 'Psr\\Log\\' => array($vendorDir . '/psr/log'),
);
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 8e90b0195..e8ea2ed78 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -6,6 +6,7 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ 'Zotlabs\\' => array($baseDir . '/Zotlabs'),
'Sabre\\Xml\\' => array($vendorDir . '/sabre/xml/lib'),
'Sabre\\VObject\\' => array($vendorDir . '/sabre/vobject/lib'),
'Sabre\\Uri\\' => array($vendorDir . '/sabre/uri/lib'),
@@ -15,4 +16,6 @@ return array(
'Sabre\\DAVACL\\' => array($vendorDir . '/sabre/dav/lib/DAVACL'),
'Sabre\\CardDAV\\' => array($vendorDir . '/sabre/dav/lib/CardDAV'),
'Sabre\\CalDAV\\' => array($vendorDir . '/sabre/dav/lib/CalDAV'),
+ 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
+ 'Hubzilla\\' => array($baseDir . '/include'),
);
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
index 16f7dea85..24b45085d 100644
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
-class ComposerAutoloaderInit02c7a5bb99a87a4c8dbf069d69b1a15c
+class ComposerAutoloaderInit7b34d7e50a62201ec5d5e526a5b8b35d
{
private static $loader;
@@ -19,15 +19,15 @@ class ComposerAutoloaderInit02c7a5bb99a87a4c8dbf069d69b1a15c
return self::$loader;
}
- spl_autoload_register(array('ComposerAutoloaderInit02c7a5bb99a87a4c8dbf069d69b1a15c', 'loadClassLoader'), true, true);
+ spl_autoload_register(array('ComposerAutoloaderInit7b34d7e50a62201ec5d5e526a5b8b35d', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
- spl_autoload_unregister(array('ComposerAutoloaderInit02c7a5bb99a87a4c8dbf069d69b1a15c', 'loadClassLoader'));
+ spl_autoload_unregister(array('ComposerAutoloaderInit7b34d7e50a62201ec5d5e526a5b8b35d', 'loadClassLoader'));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION');
if ($useStaticLoader) {
require_once __DIR__ . '/autoload_static.php';
- call_user_func(\Composer\Autoload\ComposerStaticInit02c7a5bb99a87a4c8dbf069d69b1a15c::getInitializer($loader));
+ call_user_func(\Composer\Autoload\ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::getInitializer($loader));
} else {
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
@@ -48,19 +48,19 @@ class ComposerAutoloaderInit02c7a5bb99a87a4c8dbf069d69b1a15c
$loader->register(true);
if ($useStaticLoader) {
- $includeFiles = Composer\Autoload\ComposerStaticInit02c7a5bb99a87a4c8dbf069d69b1a15c::$files;
+ $includeFiles = Composer\Autoload\ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
foreach ($includeFiles as $fileIdentifier => $file) {
- composerRequire02c7a5bb99a87a4c8dbf069d69b1a15c($fileIdentifier, $file);
+ composerRequire7b34d7e50a62201ec5d5e526a5b8b35d($fileIdentifier, $file);
}
return $loader;
}
}
-function composerRequire02c7a5bb99a87a4c8dbf069d69b1a15c($fileIdentifier, $file)
+function composerRequire7b34d7e50a62201ec5d5e526a5b8b35d($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
require $file;
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 15dc46f55..7f2551665 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -4,19 +4,23 @@
namespace Composer\Autoload;
-class ComposerStaticInit02c7a5bb99a87a4c8dbf069d69b1a15c
+class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
{
public static $files = array (
'383eaff206634a77a1be54e64e6459c7' => __DIR__ . '/..' . '/sabre/uri/lib/functions.php',
- '3569eecfeed3bcf0bad3c998a494ecb8' => __DIR__ . '/..' . '/sabre/xml/lib/Deserializer/functions.php',
- '93aa591bc4ca510c520999e34229ee79' => __DIR__ . '/..' . '/sabre/xml/lib/Serializer/functions.php',
'2b9d0f43f9552984cfa82fee95491826' => __DIR__ . '/..' . '/sabre/event/lib/coroutine.php',
'd81bab31d3feb45bfe2f283ea3c8fdf7' => __DIR__ . '/..' . '/sabre/event/lib/Loop/functions.php',
'a1cce3d26cc15c00fcd0b3354bd72c88' => __DIR__ . '/..' . '/sabre/event/lib/Promise/functions.php',
+ '3569eecfeed3bcf0bad3c998a494ecb8' => __DIR__ . '/..' . '/sabre/xml/lib/Deserializer/functions.php',
+ '93aa591bc4ca510c520999e34229ee79' => __DIR__ . '/..' . '/sabre/xml/lib/Serializer/functions.php',
'ebdb698ed4152ae445614b69b5e4bb6a' => __DIR__ . '/..' . '/sabre/http/lib/functions.php',
);
public static $prefixLengthsPsr4 = array (
+ 'Z' =>
+ array (
+ 'Zotlabs\\' => 8,
+ ),
'S' =>
array (
'Sabre\\Xml\\' => 10,
@@ -29,9 +33,21 @@ class ComposerStaticInit02c7a5bb99a87a4c8dbf069d69b1a15c
'Sabre\\CardDAV\\' => 14,
'Sabre\\CalDAV\\' => 13,
),
+ 'P' =>
+ array (
+ 'Psr\\Log\\' => 8,
+ ),
+ 'H' =>
+ array (
+ 'Hubzilla\\' => 9,
+ ),
);
public static $prefixDirsPsr4 = array (
+ 'Zotlabs\\' =>
+ array (
+ 0 => __DIR__ . '/../..' . '/Zotlabs',
+ ),
'Sabre\\Xml\\' =>
array (
0 => __DIR__ . '/..' . '/sabre/xml/lib',
@@ -68,24 +84,630 @@ class ComposerStaticInit02c7a5bb99a87a4c8dbf069d69b1a15c
array (
0 => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV',
),
- );
-
- public static $prefixesPsr0 = array (
- 'P' =>
+ 'Psr\\Log\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
+ ),
+ 'Hubzilla\\' =>
array (
- 'Psr\\Log\\' =>
- array (
- 0 => __DIR__ . '/..' . '/psr/log',
- ),
+ 0 => __DIR__ . '/../..' . '/include',
),
);
+ public static $classMap = array (
+ 'Hubzilla\\Import\\Import' => __DIR__ . '/../..' . '/include/Import/Importer.php',
+ 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php',
+ 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php',
+ 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php',
+ 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareInterface.php',
+ 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerAwareTrait.php',
+ 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php',
+ 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php',
+ 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php',
+ 'Sabre\\CalDAV\\Backend\\AbstractBackend' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Backend/AbstractBackend.php',
+ 'Sabre\\CalDAV\\Backend\\BackendInterface' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Backend/BackendInterface.php',
+ 'Sabre\\CalDAV\\Backend\\NotificationSupport' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Backend/NotificationSupport.php',
+ 'Sabre\\CalDAV\\Backend\\PDO' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Backend/PDO.php',
+ 'Sabre\\CalDAV\\Backend\\SchedulingSupport' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Backend/SchedulingSupport.php',
+ 'Sabre\\CalDAV\\Backend\\SharingSupport' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Backend/SharingSupport.php',
+ 'Sabre\\CalDAV\\Backend\\SimplePDO' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Backend/SimplePDO.php',
+ 'Sabre\\CalDAV\\Backend\\SubscriptionSupport' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Backend/SubscriptionSupport.php',
+ 'Sabre\\CalDAV\\Backend\\SyncSupport' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Backend/SyncSupport.php',
+ 'Sabre\\CalDAV\\Calendar' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Calendar.php',
+ 'Sabre\\CalDAV\\CalendarHome' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/CalendarHome.php',
+ 'Sabre\\CalDAV\\CalendarObject' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/CalendarObject.php',
+ 'Sabre\\CalDAV\\CalendarQueryValidator' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/CalendarQueryValidator.php',
+ 'Sabre\\CalDAV\\CalendarRoot' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/CalendarRoot.php',
+ 'Sabre\\CalDAV\\Exception\\InvalidComponentType' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Exception/InvalidComponentType.php',
+ 'Sabre\\CalDAV\\ICSExportPlugin' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/ICSExportPlugin.php',
+ 'Sabre\\CalDAV\\ICalendar' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/ICalendar.php',
+ 'Sabre\\CalDAV\\ICalendarObject' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/ICalendarObject.php',
+ 'Sabre\\CalDAV\\ICalendarObjectContainer' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/ICalendarObjectContainer.php',
+ 'Sabre\\CalDAV\\ISharedCalendar' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/ISharedCalendar.php',
+ 'Sabre\\CalDAV\\Notifications\\Collection' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Notifications/Collection.php',
+ 'Sabre\\CalDAV\\Notifications\\ICollection' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Notifications/ICollection.php',
+ 'Sabre\\CalDAV\\Notifications\\INode' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Notifications/INode.php',
+ 'Sabre\\CalDAV\\Notifications\\Node' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Notifications/Node.php',
+ 'Sabre\\CalDAV\\Notifications\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Notifications/Plugin.php',
+ 'Sabre\\CalDAV\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Plugin.php',
+ 'Sabre\\CalDAV\\Principal\\Collection' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Principal/Collection.php',
+ 'Sabre\\CalDAV\\Principal\\IProxyRead' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Principal/IProxyRead.php',
+ 'Sabre\\CalDAV\\Principal\\IProxyWrite' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Principal/IProxyWrite.php',
+ 'Sabre\\CalDAV\\Principal\\ProxyRead' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Principal/ProxyRead.php',
+ 'Sabre\\CalDAV\\Principal\\ProxyWrite' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Principal/ProxyWrite.php',
+ 'Sabre\\CalDAV\\Principal\\User' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Principal/User.php',
+ 'Sabre\\CalDAV\\Schedule\\IInbox' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Schedule/IInbox.php',
+ 'Sabre\\CalDAV\\Schedule\\IMipPlugin' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Schedule/IMipPlugin.php',
+ 'Sabre\\CalDAV\\Schedule\\IOutbox' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Schedule/IOutbox.php',
+ 'Sabre\\CalDAV\\Schedule\\ISchedulingObject' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Schedule/ISchedulingObject.php',
+ 'Sabre\\CalDAV\\Schedule\\Inbox' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Schedule/Inbox.php',
+ 'Sabre\\CalDAV\\Schedule\\Outbox' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Schedule/Outbox.php',
+ 'Sabre\\CalDAV\\Schedule\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Schedule/Plugin.php',
+ 'Sabre\\CalDAV\\Schedule\\SchedulingObject' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Schedule/SchedulingObject.php',
+ 'Sabre\\CalDAV\\SharedCalendar' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/SharedCalendar.php',
+ 'Sabre\\CalDAV\\SharingPlugin' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/SharingPlugin.php',
+ 'Sabre\\CalDAV\\Subscriptions\\ISubscription' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Subscriptions/ISubscription.php',
+ 'Sabre\\CalDAV\\Subscriptions\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Subscriptions/Plugin.php',
+ 'Sabre\\CalDAV\\Subscriptions\\Subscription' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Subscriptions/Subscription.php',
+ 'Sabre\\CalDAV\\Xml\\Filter\\CalendarData' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Filter/CalendarData.php',
+ 'Sabre\\CalDAV\\Xml\\Filter\\CompFilter' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Filter/CompFilter.php',
+ 'Sabre\\CalDAV\\Xml\\Filter\\ParamFilter' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Filter/ParamFilter.php',
+ 'Sabre\\CalDAV\\Xml\\Filter\\PropFilter' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Filter/PropFilter.php',
+ 'Sabre\\CalDAV\\Xml\\Notification\\Invite' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Notification/Invite.php',
+ 'Sabre\\CalDAV\\Xml\\Notification\\InviteReply' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Notification/InviteReply.php',
+ 'Sabre\\CalDAV\\Xml\\Notification\\NotificationInterface' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Notification/NotificationInterface.php',
+ 'Sabre\\CalDAV\\Xml\\Notification\\SystemStatus' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Notification/SystemStatus.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\AllowedSharingModes' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Property/AllowedSharingModes.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\EmailAddressSet' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Property/EmailAddressSet.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\Invite' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Property/Invite.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\ScheduleCalendarTransp' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Property/ScheduleCalendarTransp.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\SupportedCalendarComponentSet' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarComponentSet.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\SupportedCalendarData' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarData.php',
+ 'Sabre\\CalDAV\\Xml\\Property\\SupportedCollationSet' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Property/SupportedCollationSet.php',
+ 'Sabre\\CalDAV\\Xml\\Request\\CalendarMultiGetReport' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Request/CalendarMultiGetReport.php',
+ 'Sabre\\CalDAV\\Xml\\Request\\CalendarQueryReport' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Request/CalendarQueryReport.php',
+ 'Sabre\\CalDAV\\Xml\\Request\\FreeBusyQueryReport' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Request/FreeBusyQueryReport.php',
+ 'Sabre\\CalDAV\\Xml\\Request\\InviteReply' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Request/InviteReply.php',
+ 'Sabre\\CalDAV\\Xml\\Request\\MkCalendar' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Request/MkCalendar.php',
+ 'Sabre\\CalDAV\\Xml\\Request\\Share' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Xml/Request/Share.php',
+ 'Sabre\\CardDAV\\AddressBook' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/AddressBook.php',
+ 'Sabre\\CardDAV\\AddressBookHome' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/AddressBookHome.php',
+ 'Sabre\\CardDAV\\AddressBookRoot' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/AddressBookRoot.php',
+ 'Sabre\\CardDAV\\Backend\\AbstractBackend' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/Backend/AbstractBackend.php',
+ 'Sabre\\CardDAV\\Backend\\BackendInterface' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/Backend/BackendInterface.php',
+ 'Sabre\\CardDAV\\Backend\\PDO' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/Backend/PDO.php',
+ 'Sabre\\CardDAV\\Backend\\SyncSupport' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/Backend/SyncSupport.php',
+ 'Sabre\\CardDAV\\Card' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/Card.php',
+ 'Sabre\\CardDAV\\IAddressBook' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/IAddressBook.php',
+ 'Sabre\\CardDAV\\ICard' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/ICard.php',
+ 'Sabre\\CardDAV\\IDirectory' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/IDirectory.php',
+ 'Sabre\\CardDAV\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/Plugin.php',
+ 'Sabre\\CardDAV\\VCFExportPlugin' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/VCFExportPlugin.php',
+ 'Sabre\\CardDAV\\Xml\\Filter\\AddressData' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/Xml/Filter/AddressData.php',
+ 'Sabre\\CardDAV\\Xml\\Filter\\ParamFilter' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/Xml/Filter/ParamFilter.php',
+ 'Sabre\\CardDAV\\Xml\\Filter\\PropFilter' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/Xml/Filter/PropFilter.php',
+ 'Sabre\\CardDAV\\Xml\\Property\\SupportedAddressData' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/Xml/Property/SupportedAddressData.php',
+ 'Sabre\\CardDAV\\Xml\\Property\\SupportedCollationSet' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/Xml/Property/SupportedCollationSet.php',
+ 'Sabre\\CardDAV\\Xml\\Request\\AddressBookMultiGetReport' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/Xml/Request/AddressBookMultiGetReport.php',
+ 'Sabre\\CardDAV\\Xml\\Request\\AddressBookQueryReport' => __DIR__ . '/..' . '/sabre/dav/lib/CardDAV/Xml/Request/AddressBookQueryReport.php',
+ 'Sabre\\DAVACL\\ACLTrait' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/ACLTrait.php',
+ 'Sabre\\DAVACL\\AbstractPrincipalCollection' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/AbstractPrincipalCollection.php',
+ 'Sabre\\DAVACL\\Exception\\AceConflict' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Exception/AceConflict.php',
+ 'Sabre\\DAVACL\\Exception\\NeedPrivileges' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Exception/NeedPrivileges.php',
+ 'Sabre\\DAVACL\\Exception\\NoAbstract' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Exception/NoAbstract.php',
+ 'Sabre\\DAVACL\\Exception\\NotRecognizedPrincipal' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Exception/NotRecognizedPrincipal.php',
+ 'Sabre\\DAVACL\\Exception\\NotSupportedPrivilege' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Exception/NotSupportedPrivilege.php',
+ 'Sabre\\DAVACL\\FS\\Collection' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/FS/Collection.php',
+ 'Sabre\\DAVACL\\FS\\File' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/FS/File.php',
+ 'Sabre\\DAVACL\\FS\\HomeCollection' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/FS/HomeCollection.php',
+ 'Sabre\\DAVACL\\IACL' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/IACL.php',
+ 'Sabre\\DAVACL\\IPrincipal' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/IPrincipal.php',
+ 'Sabre\\DAVACL\\IPrincipalCollection' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/IPrincipalCollection.php',
+ 'Sabre\\DAVACL\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Plugin.php',
+ 'Sabre\\DAVACL\\Principal' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Principal.php',
+ 'Sabre\\DAVACL\\PrincipalBackend\\AbstractBackend' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/PrincipalBackend/AbstractBackend.php',
+ 'Sabre\\DAVACL\\PrincipalBackend\\BackendInterface' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/PrincipalBackend/BackendInterface.php',
+ 'Sabre\\DAVACL\\PrincipalBackend\\CreatePrincipalSupport' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/PrincipalBackend/CreatePrincipalSupport.php',
+ 'Sabre\\DAVACL\\PrincipalBackend\\PDO' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/PrincipalBackend/PDO.php',
+ 'Sabre\\DAVACL\\PrincipalCollection' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/PrincipalCollection.php',
+ 'Sabre\\DAVACL\\Xml\\Property\\Acl' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Xml/Property/Acl.php',
+ 'Sabre\\DAVACL\\Xml\\Property\\AclRestrictions' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Xml/Property/AclRestrictions.php',
+ 'Sabre\\DAVACL\\Xml\\Property\\CurrentUserPrivilegeSet' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Xml/Property/CurrentUserPrivilegeSet.php',
+ 'Sabre\\DAVACL\\Xml\\Property\\Principal' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Xml/Property/Principal.php',
+ 'Sabre\\DAVACL\\Xml\\Property\\SupportedPrivilegeSet' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Xml/Property/SupportedPrivilegeSet.php',
+ 'Sabre\\DAVACL\\Xml\\Request\\AclPrincipalPropSetReport' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Xml/Request/AclPrincipalPropSetReport.php',
+ 'Sabre\\DAVACL\\Xml\\Request\\ExpandPropertyReport' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Xml/Request/ExpandPropertyReport.php',
+ 'Sabre\\DAVACL\\Xml\\Request\\PrincipalMatchReport' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Xml/Request/PrincipalMatchReport.php',
+ 'Sabre\\DAVACL\\Xml\\Request\\PrincipalPropertySearchReport' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Xml/Request/PrincipalPropertySearchReport.php',
+ 'Sabre\\DAVACL\\Xml\\Request\\PrincipalSearchPropertySetReport' => __DIR__ . '/..' . '/sabre/dav/lib/DAVACL/Xml/Request/PrincipalSearchPropertySetReport.php',
+ 'Sabre\\DAV\\Auth\\Backend\\AbstractBasic' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Auth/Backend/AbstractBasic.php',
+ 'Sabre\\DAV\\Auth\\Backend\\AbstractBearer' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Auth/Backend/AbstractBearer.php',
+ 'Sabre\\DAV\\Auth\\Backend\\AbstractDigest' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Auth/Backend/AbstractDigest.php',
+ 'Sabre\\DAV\\Auth\\Backend\\Apache' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Auth/Backend/Apache.php',
+ 'Sabre\\DAV\\Auth\\Backend\\BackendInterface' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Auth/Backend/BackendInterface.php',
+ 'Sabre\\DAV\\Auth\\Backend\\BasicCallBack' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Auth/Backend/BasicCallBack.php',
+ 'Sabre\\DAV\\Auth\\Backend\\File' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Auth/Backend/File.php',
+ 'Sabre\\DAV\\Auth\\Backend\\PDO' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Auth/Backend/PDO.php',
+ 'Sabre\\DAV\\Auth\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Auth/Plugin.php',
+ 'Sabre\\DAV\\Browser\\GuessContentType' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Browser/GuessContentType.php',
+ 'Sabre\\DAV\\Browser\\HtmlOutput' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Browser/HtmlOutput.php',
+ 'Sabre\\DAV\\Browser\\HtmlOutputHelper' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Browser/HtmlOutputHelper.php',
+ 'Sabre\\DAV\\Browser\\MapGetToPropFind' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Browser/MapGetToPropFind.php',
+ 'Sabre\\DAV\\Browser\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Browser/Plugin.php',
+ 'Sabre\\DAV\\Browser\\PropFindAll' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Browser/PropFindAll.php',
+ 'Sabre\\DAV\\Client' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Client.php',
+ 'Sabre\\DAV\\Collection' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Collection.php',
+ 'Sabre\\DAV\\CorePlugin' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/CorePlugin.php',
+ 'Sabre\\DAV\\Exception' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception.php',
+ 'Sabre\\DAV\\Exception\\BadRequest' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/BadRequest.php',
+ 'Sabre\\DAV\\Exception\\Conflict' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/Conflict.php',
+ 'Sabre\\DAV\\Exception\\ConflictingLock' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/ConflictingLock.php',
+ 'Sabre\\DAV\\Exception\\Forbidden' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/Forbidden.php',
+ 'Sabre\\DAV\\Exception\\InsufficientStorage' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/InsufficientStorage.php',
+ 'Sabre\\DAV\\Exception\\InvalidResourceType' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/InvalidResourceType.php',
+ 'Sabre\\DAV\\Exception\\InvalidSyncToken' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/InvalidSyncToken.php',
+ 'Sabre\\DAV\\Exception\\LengthRequired' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/LengthRequired.php',
+ 'Sabre\\DAV\\Exception\\LockTokenMatchesRequestUri' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/LockTokenMatchesRequestUri.php',
+ 'Sabre\\DAV\\Exception\\Locked' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/Locked.php',
+ 'Sabre\\DAV\\Exception\\MethodNotAllowed' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/MethodNotAllowed.php',
+ 'Sabre\\DAV\\Exception\\NotAuthenticated' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/NotAuthenticated.php',
+ 'Sabre\\DAV\\Exception\\NotFound' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/NotFound.php',
+ 'Sabre\\DAV\\Exception\\NotImplemented' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/NotImplemented.php',
+ 'Sabre\\DAV\\Exception\\PaymentRequired' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/PaymentRequired.php',
+ 'Sabre\\DAV\\Exception\\PreconditionFailed' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/PreconditionFailed.php',
+ 'Sabre\\DAV\\Exception\\ReportNotSupported' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/ReportNotSupported.php',
+ 'Sabre\\DAV\\Exception\\RequestedRangeNotSatisfiable' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/RequestedRangeNotSatisfiable.php',
+ 'Sabre\\DAV\\Exception\\ServiceUnavailable' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/ServiceUnavailable.php',
+ 'Sabre\\DAV\\Exception\\TooManyMatches' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/TooManyMatches.php',
+ 'Sabre\\DAV\\Exception\\UnsupportedMediaType' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Exception/UnsupportedMediaType.php',
+ 'Sabre\\DAV\\FSExt\\Directory' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/FSExt/Directory.php',
+ 'Sabre\\DAV\\FSExt\\File' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/FSExt/File.php',
+ 'Sabre\\DAV\\FS\\Directory' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/FS/Directory.php',
+ 'Sabre\\DAV\\FS\\File' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/FS/File.php',
+ 'Sabre\\DAV\\FS\\Node' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/FS/Node.php',
+ 'Sabre\\DAV\\File' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/File.php',
+ 'Sabre\\DAV\\ICollection' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/ICollection.php',
+ 'Sabre\\DAV\\IExtendedCollection' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/IExtendedCollection.php',
+ 'Sabre\\DAV\\IFile' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/IFile.php',
+ 'Sabre\\DAV\\IMoveTarget' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/IMoveTarget.php',
+ 'Sabre\\DAV\\IMultiGet' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/IMultiGet.php',
+ 'Sabre\\DAV\\INode' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/INode.php',
+ 'Sabre\\DAV\\IProperties' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/IProperties.php',
+ 'Sabre\\DAV\\IQuota' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/IQuota.php',
+ 'Sabre\\DAV\\Locks\\Backend\\AbstractBackend' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Locks/Backend/AbstractBackend.php',
+ 'Sabre\\DAV\\Locks\\Backend\\BackendInterface' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Locks/Backend/BackendInterface.php',
+ 'Sabre\\DAV\\Locks\\Backend\\File' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Locks/Backend/File.php',
+ 'Sabre\\DAV\\Locks\\Backend\\PDO' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Locks/Backend/PDO.php',
+ 'Sabre\\DAV\\Locks\\LockInfo' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Locks/LockInfo.php',
+ 'Sabre\\DAV\\Locks\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Locks/Plugin.php',
+ 'Sabre\\DAV\\MkCol' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/MkCol.php',
+ 'Sabre\\DAV\\Mount\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Mount/Plugin.php',
+ 'Sabre\\DAV\\Node' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Node.php',
+ 'Sabre\\DAV\\PartialUpdate\\IPatchSupport' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/PartialUpdate/IPatchSupport.php',
+ 'Sabre\\DAV\\PartialUpdate\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/PartialUpdate/Plugin.php',
+ 'Sabre\\DAV\\PropFind' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/PropFind.php',
+ 'Sabre\\DAV\\PropPatch' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/PropPatch.php',
+ 'Sabre\\DAV\\PropertyStorage\\Backend\\BackendInterface' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/PropertyStorage/Backend/BackendInterface.php',
+ 'Sabre\\DAV\\PropertyStorage\\Backend\\PDO' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/PropertyStorage/Backend/PDO.php',
+ 'Sabre\\DAV\\PropertyStorage\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/PropertyStorage/Plugin.php',
+ 'Sabre\\DAV\\Server' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Server.php',
+ 'Sabre\\DAV\\ServerPlugin' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/ServerPlugin.php',
+ 'Sabre\\DAV\\Sharing\\ISharedNode' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Sharing/ISharedNode.php',
+ 'Sabre\\DAV\\Sharing\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Sharing/Plugin.php',
+ 'Sabre\\DAV\\SimpleCollection' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/SimpleCollection.php',
+ 'Sabre\\DAV\\SimpleFile' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/SimpleFile.php',
+ 'Sabre\\DAV\\StringUtil' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/StringUtil.php',
+ 'Sabre\\DAV\\Sync\\ISyncCollection' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Sync/ISyncCollection.php',
+ 'Sabre\\DAV\\Sync\\Plugin' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Sync/Plugin.php',
+ 'Sabre\\DAV\\TemporaryFileFilterPlugin' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/TemporaryFileFilterPlugin.php',
+ 'Sabre\\DAV\\Tree' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Tree.php',
+ 'Sabre\\DAV\\UUIDUtil' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/UUIDUtil.php',
+ 'Sabre\\DAV\\Version' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Version.php',
+ 'Sabre\\DAV\\Xml\\Element\\Prop' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Element/Prop.php',
+ 'Sabre\\DAV\\Xml\\Element\\Response' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Element/Response.php',
+ 'Sabre\\DAV\\Xml\\Element\\Sharee' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Element/Sharee.php',
+ 'Sabre\\DAV\\Xml\\Property\\Complex' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Property/Complex.php',
+ 'Sabre\\DAV\\Xml\\Property\\GetLastModified' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Property/GetLastModified.php',
+ 'Sabre\\DAV\\Xml\\Property\\Href' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Property/Href.php',
+ 'Sabre\\DAV\\Xml\\Property\\Invite' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Property/Invite.php',
+ 'Sabre\\DAV\\Xml\\Property\\LocalHref' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Property/LocalHref.php',
+ 'Sabre\\DAV\\Xml\\Property\\LockDiscovery' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Property/LockDiscovery.php',
+ 'Sabre\\DAV\\Xml\\Property\\ResourceType' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Property/ResourceType.php',
+ 'Sabre\\DAV\\Xml\\Property\\ShareAccess' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Property/ShareAccess.php',
+ 'Sabre\\DAV\\Xml\\Property\\SupportedLock' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Property/SupportedLock.php',
+ 'Sabre\\DAV\\Xml\\Property\\SupportedMethodSet' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Property/SupportedMethodSet.php',
+ 'Sabre\\DAV\\Xml\\Property\\SupportedReportSet' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Property/SupportedReportSet.php',
+ 'Sabre\\DAV\\Xml\\Request\\Lock' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Request/Lock.php',
+ 'Sabre\\DAV\\Xml\\Request\\MkCol' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Request/MkCol.php',
+ 'Sabre\\DAV\\Xml\\Request\\PropFind' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Request/PropFind.php',
+ 'Sabre\\DAV\\Xml\\Request\\PropPatch' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Request/PropPatch.php',
+ 'Sabre\\DAV\\Xml\\Request\\ShareResource' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Request/ShareResource.php',
+ 'Sabre\\DAV\\Xml\\Request\\SyncCollectionReport' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Request/SyncCollectionReport.php',
+ 'Sabre\\DAV\\Xml\\Response\\MultiStatus' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Response/MultiStatus.php',
+ 'Sabre\\DAV\\Xml\\Service' => __DIR__ . '/..' . '/sabre/dav/lib/DAV/Xml/Service.php',
+ 'Sabre\\Event\\EventEmitter' => __DIR__ . '/..' . '/sabre/event/lib/EventEmitter.php',
+ 'Sabre\\Event\\EventEmitterInterface' => __DIR__ . '/..' . '/sabre/event/lib/EventEmitterInterface.php',
+ 'Sabre\\Event\\EventEmitterTrait' => __DIR__ . '/..' . '/sabre/event/lib/EventEmitterTrait.php',
+ 'Sabre\\Event\\Loop\\Loop' => __DIR__ . '/..' . '/sabre/event/lib/Loop/Loop.php',
+ 'Sabre\\Event\\Promise' => __DIR__ . '/..' . '/sabre/event/lib/Promise.php',
+ 'Sabre\\Event\\PromiseAlreadyResolvedException' => __DIR__ . '/..' . '/sabre/event/lib/PromiseAlreadyResolvedException.php',
+ 'Sabre\\Event\\Version' => __DIR__ . '/..' . '/sabre/event/lib/Version.php',
+ 'Sabre\\HTTP\\Auth\\AWS' => __DIR__ . '/..' . '/sabre/http/lib/Auth/AWS.php',
+ 'Sabre\\HTTP\\Auth\\AbstractAuth' => __DIR__ . '/..' . '/sabre/http/lib/Auth/AbstractAuth.php',
+ 'Sabre\\HTTP\\Auth\\Basic' => __DIR__ . '/..' . '/sabre/http/lib/Auth/Basic.php',
+ 'Sabre\\HTTP\\Auth\\Bearer' => __DIR__ . '/..' . '/sabre/http/lib/Auth/Bearer.php',
+ 'Sabre\\HTTP\\Auth\\Digest' => __DIR__ . '/..' . '/sabre/http/lib/Auth/Digest.php',
+ 'Sabre\\HTTP\\Client' => __DIR__ . '/..' . '/sabre/http/lib/Client.php',
+ 'Sabre\\HTTP\\ClientException' => __DIR__ . '/..' . '/sabre/http/lib/ClientException.php',
+ 'Sabre\\HTTP\\ClientHttpException' => __DIR__ . '/..' . '/sabre/http/lib/ClientHttpException.php',
+ 'Sabre\\HTTP\\HttpException' => __DIR__ . '/..' . '/sabre/http/lib/HttpException.php',
+ 'Sabre\\HTTP\\Message' => __DIR__ . '/..' . '/sabre/http/lib/Message.php',
+ 'Sabre\\HTTP\\MessageDecoratorTrait' => __DIR__ . '/..' . '/sabre/http/lib/MessageDecoratorTrait.php',
+ 'Sabre\\HTTP\\MessageInterface' => __DIR__ . '/..' . '/sabre/http/lib/MessageInterface.php',
+ 'Sabre\\HTTP\\Request' => __DIR__ . '/..' . '/sabre/http/lib/Request.php',
+ 'Sabre\\HTTP\\RequestDecorator' => __DIR__ . '/..' . '/sabre/http/lib/RequestDecorator.php',
+ 'Sabre\\HTTP\\RequestInterface' => __DIR__ . '/..' . '/sabre/http/lib/RequestInterface.php',
+ 'Sabre\\HTTP\\Response' => __DIR__ . '/..' . '/sabre/http/lib/Response.php',
+ 'Sabre\\HTTP\\ResponseDecorator' => __DIR__ . '/..' . '/sabre/http/lib/ResponseDecorator.php',
+ 'Sabre\\HTTP\\ResponseInterface' => __DIR__ . '/..' . '/sabre/http/lib/ResponseInterface.php',
+ 'Sabre\\HTTP\\Sapi' => __DIR__ . '/..' . '/sabre/http/lib/Sapi.php',
+ 'Sabre\\HTTP\\URLUtil' => __DIR__ . '/..' . '/sabre/http/lib/URLUtil.php',
+ 'Sabre\\HTTP\\Util' => __DIR__ . '/..' . '/sabre/http/lib/Util.php',
+ 'Sabre\\HTTP\\Version' => __DIR__ . '/..' . '/sabre/http/lib/Version.php',
+ 'Sabre\\Uri\\Version' => __DIR__ . '/..' . '/sabre/uri/lib/Version.php',
+ 'Sabre\\VObject\\BirthdayCalendarGenerator' => __DIR__ . '/..' . '/sabre/vobject/lib/BirthdayCalendarGenerator.php',
+ 'Sabre\\VObject\\Cli' => __DIR__ . '/..' . '/sabre/vobject/lib/Cli.php',
+ 'Sabre\\VObject\\Component' => __DIR__ . '/..' . '/sabre/vobject/lib/Component.php',
+ 'Sabre\\VObject\\Component\\Available' => __DIR__ . '/..' . '/sabre/vobject/lib/Component/Available.php',
+ 'Sabre\\VObject\\Component\\VAlarm' => __DIR__ . '/..' . '/sabre/vobject/lib/Component/VAlarm.php',
+ 'Sabre\\VObject\\Component\\VAvailability' => __DIR__ . '/..' . '/sabre/vobject/lib/Component/VAvailability.php',
+ 'Sabre\\VObject\\Component\\VCalendar' => __DIR__ . '/..' . '/sabre/vobject/lib/Component/VCalendar.php',
+ 'Sabre\\VObject\\Component\\VCard' => __DIR__ . '/..' . '/sabre/vobject/lib/Component/VCard.php',
+ 'Sabre\\VObject\\Component\\VEvent' => __DIR__ . '/..' . '/sabre/vobject/lib/Component/VEvent.php',
+ 'Sabre\\VObject\\Component\\VFreeBusy' => __DIR__ . '/..' . '/sabre/vobject/lib/Component/VFreeBusy.php',
+ 'Sabre\\VObject\\Component\\VJournal' => __DIR__ . '/..' . '/sabre/vobject/lib/Component/VJournal.php',
+ 'Sabre\\VObject\\Component\\VTimeZone' => __DIR__ . '/..' . '/sabre/vobject/lib/Component/VTimeZone.php',
+ 'Sabre\\VObject\\Component\\VTodo' => __DIR__ . '/..' . '/sabre/vobject/lib/Component/VTodo.php',
+ 'Sabre\\VObject\\DateTimeParser' => __DIR__ . '/..' . '/sabre/vobject/lib/DateTimeParser.php',
+ 'Sabre\\VObject\\Document' => __DIR__ . '/..' . '/sabre/vobject/lib/Document.php',
+ 'Sabre\\VObject\\ElementList' => __DIR__ . '/..' . '/sabre/vobject/lib/ElementList.php',
+ 'Sabre\\VObject\\EofException' => __DIR__ . '/..' . '/sabre/vobject/lib/EofException.php',
+ 'Sabre\\VObject\\FreeBusyData' => __DIR__ . '/..' . '/sabre/vobject/lib/FreeBusyData.php',
+ 'Sabre\\VObject\\FreeBusyGenerator' => __DIR__ . '/..' . '/sabre/vobject/lib/FreeBusyGenerator.php',
+ 'Sabre\\VObject\\ITip\\Broker' => __DIR__ . '/..' . '/sabre/vobject/lib/ITip/Broker.php',
+ 'Sabre\\VObject\\ITip\\ITipException' => __DIR__ . '/..' . '/sabre/vobject/lib/ITip/ITipException.php',
+ 'Sabre\\VObject\\ITip\\Message' => __DIR__ . '/..' . '/sabre/vobject/lib/ITip/Message.php',
+ 'Sabre\\VObject\\ITip\\SameOrganizerForAllComponentsException' => __DIR__ . '/..' . '/sabre/vobject/lib/ITip/SameOrganizerForAllComponentsException.php',
+ 'Sabre\\VObject\\InvalidDataException' => __DIR__ . '/..' . '/sabre/vobject/lib/InvalidDataException.php',
+ 'Sabre\\VObject\\Node' => __DIR__ . '/..' . '/sabre/vobject/lib/Node.php',
+ 'Sabre\\VObject\\PHPUnitAssertions' => __DIR__ . '/..' . '/sabre/vobject/lib/PHPUnitAssertions.php',
+ 'Sabre\\VObject\\Parameter' => __DIR__ . '/..' . '/sabre/vobject/lib/Parameter.php',
+ 'Sabre\\VObject\\ParseException' => __DIR__ . '/..' . '/sabre/vobject/lib/ParseException.php',
+ 'Sabre\\VObject\\Parser\\Json' => __DIR__ . '/..' . '/sabre/vobject/lib/Parser/Json.php',
+ 'Sabre\\VObject\\Parser\\MimeDir' => __DIR__ . '/..' . '/sabre/vobject/lib/Parser/MimeDir.php',
+ 'Sabre\\VObject\\Parser\\Parser' => __DIR__ . '/..' . '/sabre/vobject/lib/Parser/Parser.php',
+ 'Sabre\\VObject\\Parser\\XML' => __DIR__ . '/..' . '/sabre/vobject/lib/Parser/XML.php',
+ 'Sabre\\VObject\\Parser\\XML\\Element\\KeyValue' => __DIR__ . '/..' . '/sabre/vobject/lib/Parser/XML/Element/KeyValue.php',
+ 'Sabre\\VObject\\Property' => __DIR__ . '/..' . '/sabre/vobject/lib/Property.php',
+ 'Sabre\\VObject\\Property\\Binary' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/Binary.php',
+ 'Sabre\\VObject\\Property\\Boolean' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/Boolean.php',
+ 'Sabre\\VObject\\Property\\FlatText' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/FlatText.php',
+ 'Sabre\\VObject\\Property\\FloatValue' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/FloatValue.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\CalAddress' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/ICalendar/CalAddress.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\Date' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/ICalendar/Date.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\DateTime' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/ICalendar/DateTime.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\Duration' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/ICalendar/Duration.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\Period' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/ICalendar/Period.php',
+ 'Sabre\\VObject\\Property\\ICalendar\\Recur' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/ICalendar/Recur.php',
+ 'Sabre\\VObject\\Property\\IntegerValue' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/IntegerValue.php',
+ 'Sabre\\VObject\\Property\\Text' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/Text.php',
+ 'Sabre\\VObject\\Property\\Time' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/Time.php',
+ 'Sabre\\VObject\\Property\\Unknown' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/Unknown.php',
+ 'Sabre\\VObject\\Property\\Uri' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/Uri.php',
+ 'Sabre\\VObject\\Property\\UtcOffset' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/UtcOffset.php',
+ 'Sabre\\VObject\\Property\\VCard\\Date' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/VCard/Date.php',
+ 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/VCard/DateAndOrTime.php',
+ 'Sabre\\VObject\\Property\\VCard\\DateTime' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/VCard/DateTime.php',
+ 'Sabre\\VObject\\Property\\VCard\\LanguageTag' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/VCard/LanguageTag.php',
+ 'Sabre\\VObject\\Property\\VCard\\TimeStamp' => __DIR__ . '/..' . '/sabre/vobject/lib/Property/VCard/TimeStamp.php',
+ 'Sabre\\VObject\\Reader' => __DIR__ . '/..' . '/sabre/vobject/lib/Reader.php',
+ 'Sabre\\VObject\\Recur\\EventIterator' => __DIR__ . '/..' . '/sabre/vobject/lib/Recur/EventIterator.php',
+ 'Sabre\\VObject\\Recur\\MaxInstancesExceededException' => __DIR__ . '/..' . '/sabre/vobject/lib/Recur/MaxInstancesExceededException.php',
+ 'Sabre\\VObject\\Recur\\NoInstancesException' => __DIR__ . '/..' . '/sabre/vobject/lib/Recur/NoInstancesException.php',
+ 'Sabre\\VObject\\Recur\\RDateIterator' => __DIR__ . '/..' . '/sabre/vobject/lib/Recur/RDateIterator.php',
+ 'Sabre\\VObject\\Recur\\RRuleIterator' => __DIR__ . '/..' . '/sabre/vobject/lib/Recur/RRuleIterator.php',
+ 'Sabre\\VObject\\Settings' => __DIR__ . '/..' . '/sabre/vobject/lib/Settings.php',
+ 'Sabre\\VObject\\Splitter\\ICalendar' => __DIR__ . '/..' . '/sabre/vobject/lib/Splitter/ICalendar.php',
+ 'Sabre\\VObject\\Splitter\\SplitterInterface' => __DIR__ . '/..' . '/sabre/vobject/lib/Splitter/SplitterInterface.php',
+ 'Sabre\\VObject\\Splitter\\VCard' => __DIR__ . '/..' . '/sabre/vobject/lib/Splitter/VCard.php',
+ 'Sabre\\VObject\\StringUtil' => __DIR__ . '/..' . '/sabre/vobject/lib/StringUtil.php',
+ 'Sabre\\VObject\\TimeZoneUtil' => __DIR__ . '/..' . '/sabre/vobject/lib/TimeZoneUtil.php',
+ 'Sabre\\VObject\\UUIDUtil' => __DIR__ . '/..' . '/sabre/vobject/lib/UUIDUtil.php',
+ 'Sabre\\VObject\\VCardConverter' => __DIR__ . '/..' . '/sabre/vobject/lib/VCardConverter.php',
+ 'Sabre\\VObject\\Version' => __DIR__ . '/..' . '/sabre/vobject/lib/Version.php',
+ 'Sabre\\VObject\\Writer' => __DIR__ . '/..' . '/sabre/vobject/lib/Writer.php',
+ 'Sabre\\Xml\\ContextStackTrait' => __DIR__ . '/..' . '/sabre/xml/lib/ContextStackTrait.php',
+ 'Sabre\\Xml\\Element' => __DIR__ . '/..' . '/sabre/xml/lib/Element.php',
+ 'Sabre\\Xml\\Element\\Base' => __DIR__ . '/..' . '/sabre/xml/lib/Element/Base.php',
+ 'Sabre\\Xml\\Element\\Cdata' => __DIR__ . '/..' . '/sabre/xml/lib/Element/Cdata.php',
+ 'Sabre\\Xml\\Element\\Elements' => __DIR__ . '/..' . '/sabre/xml/lib/Element/Elements.php',
+ 'Sabre\\Xml\\Element\\KeyValue' => __DIR__ . '/..' . '/sabre/xml/lib/Element/KeyValue.php',
+ 'Sabre\\Xml\\Element\\Uri' => __DIR__ . '/..' . '/sabre/xml/lib/Element/Uri.php',
+ 'Sabre\\Xml\\Element\\XmlFragment' => __DIR__ . '/..' . '/sabre/xml/lib/Element/XmlFragment.php',
+ 'Sabre\\Xml\\LibXMLException' => __DIR__ . '/..' . '/sabre/xml/lib/LibXMLException.php',
+ 'Sabre\\Xml\\ParseException' => __DIR__ . '/..' . '/sabre/xml/lib/ParseException.php',
+ 'Sabre\\Xml\\Reader' => __DIR__ . '/..' . '/sabre/xml/lib/Reader.php',
+ 'Sabre\\Xml\\Service' => __DIR__ . '/..' . '/sabre/xml/lib/Service.php',
+ 'Sabre\\Xml\\Version' => __DIR__ . '/..' . '/sabre/xml/lib/Version.php',
+ 'Sabre\\Xml\\Writer' => __DIR__ . '/..' . '/sabre/xml/lib/Writer.php',
+ 'Sabre\\Xml\\XmlDeserializable' => __DIR__ . '/..' . '/sabre/xml/lib/XmlDeserializable.php',
+ 'Sabre\\Xml\\XmlSerializable' => __DIR__ . '/..' . '/sabre/xml/lib/XmlSerializable.php',
+ 'Zotlabs\\Access\\AccessList' => __DIR__ . '/../..' . '/Zotlabs/Access/AccessList.php',
+ 'Zotlabs\\Access\\PermissionLimits' => __DIR__ . '/../..' . '/Zotlabs/Access/PermissionLimits.php',
+ 'Zotlabs\\Access\\PermissionRoles' => __DIR__ . '/../..' . '/Zotlabs/Access/PermissionRoles.php',
+ 'Zotlabs\\Access\\Permissions' => __DIR__ . '/../..' . '/Zotlabs/Access/Permissions.php',
+ 'Zotlabs\\Daemon\\Checksites' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Checksites.php',
+ 'Zotlabs\\Daemon\\Cli_suggest' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Cli_suggest.php',
+ 'Zotlabs\\Daemon\\Cron' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Cron.php',
+ 'Zotlabs\\Daemon\\Cron_daily' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Cron_daily.php',
+ 'Zotlabs\\Daemon\\Cron_weekly' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Cron_weekly.php',
+ 'Zotlabs\\Daemon\\Cronhooks' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Cronhooks.php',
+ 'Zotlabs\\Daemon\\CurlAuth' => __DIR__ . '/../..' . '/Zotlabs/Daemon/CurlAuth.php',
+ 'Zotlabs\\Daemon\\Deliver' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Deliver.php',
+ 'Zotlabs\\Daemon\\Deliver_hooks' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Deliver_hooks.php',
+ 'Zotlabs\\Daemon\\Directory' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Directory.php',
+ 'Zotlabs\\Daemon\\Expire' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Expire.php',
+ 'Zotlabs\\Daemon\\Externals' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Externals.php',
+ 'Zotlabs\\Daemon\\Gprobe' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Gprobe.php',
+ 'Zotlabs\\Daemon\\Importdoc' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Importdoc.php',
+ 'Zotlabs\\Daemon\\Master' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Master.php',
+ 'Zotlabs\\Daemon\\Notifier' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Notifier.php',
+ 'Zotlabs\\Daemon\\Onedirsync' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Onedirsync.php',
+ 'Zotlabs\\Daemon\\Onepoll' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Onepoll.php',
+ 'Zotlabs\\Daemon\\Poller' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Poller.php',
+ 'Zotlabs\\Daemon\\Queue' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Queue.php',
+ 'Zotlabs\\Daemon\\Ratenotif' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Ratenotif.php',
+ 'Zotlabs\\Extend\\Hook' => __DIR__ . '/../..' . '/Zotlabs/Extend/Hook.php',
+ 'Zotlabs\\Identity\\BasicId\\BasicId' => __DIR__ . '/../..' . '/Zotlabs/Identity/BasicId.php',
+ 'Zotlabs\\Identity\\ProfilePhoto\\ProfilePhoto' => __DIR__ . '/../..' . '/Zotlabs/Identity/ProfilePhoto.php',
+ 'Zotlabs\\Lib\\AConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/AConfig.php',
+ 'Zotlabs\\Lib\\AbConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/AbConfig.php',
+ 'Zotlabs\\Lib\\Api_router' => __DIR__ . '/../..' . '/Zotlabs/Lib/Api_router.php',
+ 'Zotlabs\\Lib\\Apps' => __DIR__ . '/../..' . '/Zotlabs/Lib/Apps.php',
+ 'Zotlabs\\Lib\\Cache' => __DIR__ . '/../..' . '/Zotlabs/Lib/Cache.php',
+ 'Zotlabs\\Lib\\Chatroom' => __DIR__ . '/../..' . '/Zotlabs/Lib/Chatroom.php',
+ 'Zotlabs\\Lib\\Config' => __DIR__ . '/../..' . '/Zotlabs/Lib/Config.php',
+ 'Zotlabs\\Lib\\Enotify' => __DIR__ . '/../..' . '/Zotlabs/Lib/Enotify.php',
+ 'Zotlabs\\Lib\\ExtendedZip' => __DIR__ . '/../..' . '/Zotlabs/Lib/ExtendedZip.php',
+ 'Zotlabs\\Lib\\IConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/IConfig.php',
+ 'Zotlabs\\Lib\\PConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/PConfig.php',
+ 'Zotlabs\\Lib\\PermissionDescription' => __DIR__ . '/../..' . '/Zotlabs/Lib/PermissionDescription.php',
+ 'Zotlabs\\Lib\\ProtoDriver' => __DIR__ . '/../..' . '/Zotlabs/Lib/ProtoDriver.php',
+ 'Zotlabs\\Lib\\SuperCurl' => __DIR__ . '/../..' . '/Zotlabs/Lib/SuperCurl.php',
+ 'Zotlabs\\Lib\\System' => __DIR__ . '/../..' . '/Zotlabs/Lib/System.php',
+ 'Zotlabs\\Lib\\Techlevels' => __DIR__ . '/../..' . '/Zotlabs/Lib/Techlevels.php',
+ 'Zotlabs\\Lib\\ThreadItem' => __DIR__ . '/../..' . '/Zotlabs/Lib/ThreadItem.php',
+ 'Zotlabs\\Lib\\ThreadStream' => __DIR__ . '/../..' . '/Zotlabs/Lib/ThreadStream.php',
+ 'Zotlabs\\Lib\\XConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/XConfig.php',
+ 'Zotlabs\\Lib\\ZotDriver' => __DIR__ . '/../..' . '/Zotlabs/Lib/ZotDriver.php',
+ 'Zotlabs\\Module\\Achievements' => __DIR__ . '/../..' . '/Zotlabs/Module/Achievements.php',
+ 'Zotlabs\\Module\\Acl' => __DIR__ . '/../..' . '/Zotlabs/Module/Acl.php',
+ 'Zotlabs\\Module\\Admin' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin.php',
+ 'Zotlabs\\Module\\Admin\\Account_edit' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Account_edit.php',
+ 'Zotlabs\\Module\\Admin\\Accounts' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Accounts.php',
+ 'Zotlabs\\Module\\Admin\\Channels' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Channels.php',
+ 'Zotlabs\\Module\\Admin\\Dbsync' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Dbsync.php',
+ 'Zotlabs\\Module\\Admin\\Features' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Features.php',
+ 'Zotlabs\\Module\\Admin\\Logs' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Logs.php',
+ 'Zotlabs\\Module\\Admin\\Plugins' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Plugins.php',
+ 'Zotlabs\\Module\\Admin\\Profs' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Profs.php',
+ 'Zotlabs\\Module\\Admin\\Queue' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Queue.php',
+ 'Zotlabs\\Module\\Admin\\Security' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Security.php',
+ 'Zotlabs\\Module\\Admin\\Site' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Site.php',
+ 'Zotlabs\\Module\\Admin\\Themes' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Themes.php',
+ 'Zotlabs\\Module\\Api' => __DIR__ . '/../..' . '/Zotlabs/Module/Api.php',
+ 'Zotlabs\\Module\\Appman' => __DIR__ . '/../..' . '/Zotlabs/Module/Appman.php',
+ 'Zotlabs\\Module\\Apps' => __DIR__ . '/../..' . '/Zotlabs/Module/Apps.php',
+ 'Zotlabs\\Module\\Attach' => __DIR__ . '/../..' . '/Zotlabs/Module/Attach.php',
+ 'Zotlabs\\Module\\Authtest' => __DIR__ . '/../..' . '/Zotlabs/Module/Authtest.php',
+ 'Zotlabs\\Module\\Block' => __DIR__ . '/../..' . '/Zotlabs/Module/Block.php',
+ 'Zotlabs\\Module\\Blocks' => __DIR__ . '/../..' . '/Zotlabs/Module/Blocks.php',
+ 'Zotlabs\\Module\\Bookmarks' => __DIR__ . '/../..' . '/Zotlabs/Module/Bookmarks.php',
+ 'Zotlabs\\Module\\Branchtopic' => __DIR__ . '/../..' . '/Zotlabs/Module/Branchtopic.php',
+ 'Zotlabs\\Module\\Cal' => __DIR__ . '/../..' . '/Zotlabs/Module/Cal.php',
+ 'Zotlabs\\Module\\Channel' => __DIR__ . '/../..' . '/Zotlabs/Module/Channel.php',
+ 'Zotlabs\\Module\\Chanview' => __DIR__ . '/../..' . '/Zotlabs/Module/Chanview.php',
+ 'Zotlabs\\Module\\Chat' => __DIR__ . '/../..' . '/Zotlabs/Module/Chat.php',
+ 'Zotlabs\\Module\\Chatsvc' => __DIR__ . '/../..' . '/Zotlabs/Module/Chatsvc.php',
+ 'Zotlabs\\Module\\Cloud' => __DIR__ . '/../..' . '/Zotlabs/Module/Cloud.php',
+ 'Zotlabs\\Module\\Common' => __DIR__ . '/../..' . '/Zotlabs/Module/Common.php',
+ 'Zotlabs\\Module\\Connect' => __DIR__ . '/../..' . '/Zotlabs/Module/Connect.php',
+ 'Zotlabs\\Module\\Connections' => __DIR__ . '/../..' . '/Zotlabs/Module/Connections.php',
+ 'Zotlabs\\Module\\Connedit' => __DIR__ . '/../..' . '/Zotlabs/Module/Connedit.php',
+ 'Zotlabs\\Module\\Contactgroup' => __DIR__ . '/../..' . '/Zotlabs/Module/Contactgroup.php',
+ 'Zotlabs\\Module\\Cover_photo' => __DIR__ . '/../..' . '/Zotlabs/Module/Cover_photo.php',
+ 'Zotlabs\\Module\\Dav' => __DIR__ . '/../..' . '/Zotlabs/Module/Dav.php',
+ 'Zotlabs\\Module\\Directory' => __DIR__ . '/../..' . '/Zotlabs/Module/Directory.php',
+ 'Zotlabs\\Module\\Dirsearch' => __DIR__ . '/../..' . '/Zotlabs/Module/Dirsearch.php',
+ 'Zotlabs\\Module\\Display' => __DIR__ . '/../..' . '/Zotlabs/Module/Display.php',
+ 'Zotlabs\\Module\\Dreport' => __DIR__ . '/../..' . '/Zotlabs/Module/Dreport.php',
+ 'Zotlabs\\Module\\Editblock' => __DIR__ . '/../..' . '/Zotlabs/Module/Editblock.php',
+ 'Zotlabs\\Module\\Editlayout' => __DIR__ . '/../..' . '/Zotlabs/Module/Editlayout.php',
+ 'Zotlabs\\Module\\Editpost' => __DIR__ . '/../..' . '/Zotlabs/Module/Editpost.php',
+ 'Zotlabs\\Module\\Editwebpage' => __DIR__ . '/../..' . '/Zotlabs/Module/Editwebpage.php',
+ 'Zotlabs\\Module\\Embedphotos' => __DIR__ . '/../..' . '/Zotlabs/Module/Embedphotos.php',
+ 'Zotlabs\\Module\\Events' => __DIR__ . '/../..' . '/Zotlabs/Module/Events.php',
+ 'Zotlabs\\Module\\Fbrowser' => __DIR__ . '/../..' . '/Zotlabs/Module/Fbrowser.php',
+ 'Zotlabs\\Module\\Feed' => __DIR__ . '/../..' . '/Zotlabs/Module/Feed.php',
+ 'Zotlabs\\Module\\Ffsapi' => __DIR__ . '/../..' . '/Zotlabs/Module/Ffsapi.php',
+ 'Zotlabs\\Module\\Fhublocs' => __DIR__ . '/../..' . '/Zotlabs/Module/Fhublocs.php',
+ 'Zotlabs\\Module\\File_upload' => __DIR__ . '/../..' . '/Zotlabs/Module/File_upload.php',
+ 'Zotlabs\\Module\\Filer' => __DIR__ . '/../..' . '/Zotlabs/Module/Filer.php',
+ 'Zotlabs\\Module\\Filerm' => __DIR__ . '/../..' . '/Zotlabs/Module/Filerm.php',
+ 'Zotlabs\\Module\\Filestorage' => __DIR__ . '/../..' . '/Zotlabs/Module/Filestorage.php',
+ 'Zotlabs\\Module\\Follow' => __DIR__ . '/../..' . '/Zotlabs/Module/Follow.php',
+ 'Zotlabs\\Module\\Getfile' => __DIR__ . '/../..' . '/Zotlabs/Module/Getfile.php',
+ 'Zotlabs\\Module\\Group' => __DIR__ . '/../..' . '/Zotlabs/Module/Group.php',
+ 'Zotlabs\\Module\\Hcard' => __DIR__ . '/../..' . '/Zotlabs/Module/Hcard.php',
+ 'Zotlabs\\Module\\Help' => __DIR__ . '/../..' . '/Zotlabs/Module/Help.php',
+ 'Zotlabs\\Module\\Home' => __DIR__ . '/../..' . '/Zotlabs/Module/Home.php',
+ 'Zotlabs\\Module\\Hostxrd' => __DIR__ . '/../..' . '/Zotlabs/Module/Hostxrd.php',
+ 'Zotlabs\\Module\\Impel' => __DIR__ . '/../..' . '/Zotlabs/Module/Impel.php',
+ 'Zotlabs\\Module\\Import' => __DIR__ . '/../..' . '/Zotlabs/Module/Import.php',
+ 'Zotlabs\\Module\\Import_items' => __DIR__ . '/../..' . '/Zotlabs/Module/Import_items.php',
+ 'Zotlabs\\Module\\Invite' => __DIR__ . '/../..' . '/Zotlabs/Module/Invite.php',
+ 'Zotlabs\\Module\\Item' => __DIR__ . '/../..' . '/Zotlabs/Module/Item.php',
+ 'Zotlabs\\Module\\Lang' => __DIR__ . '/../..' . '/Zotlabs/Module/Lang.php',
+ 'Zotlabs\\Module\\Layouts' => __DIR__ . '/../..' . '/Zotlabs/Module/Layouts.php',
+ 'Zotlabs\\Module\\Like' => __DIR__ . '/../..' . '/Zotlabs/Module/Like.php',
+ 'Zotlabs\\Module\\Linkinfo' => __DIR__ . '/../..' . '/Zotlabs/Module/Linkinfo.php',
+ 'Zotlabs\\Module\\Lockview' => __DIR__ . '/../..' . '/Zotlabs/Module/Lockview.php',
+ 'Zotlabs\\Module\\Locs' => __DIR__ . '/../..' . '/Zotlabs/Module/Locs.php',
+ 'Zotlabs\\Module\\Login' => __DIR__ . '/../..' . '/Zotlabs/Module/Login.php',
+ 'Zotlabs\\Module\\Lostpass' => __DIR__ . '/../..' . '/Zotlabs/Module/Lostpass.php',
+ 'Zotlabs\\Module\\Magic' => __DIR__ . '/../..' . '/Zotlabs/Module/Magic.php',
+ 'Zotlabs\\Module\\Mail' => __DIR__ . '/../..' . '/Zotlabs/Module/Mail.php',
+ 'Zotlabs\\Module\\Manage' => __DIR__ . '/../..' . '/Zotlabs/Module/Manage.php',
+ 'Zotlabs\\Module\\Match' => __DIR__ . '/../..' . '/Zotlabs/Module/Match.php',
+ 'Zotlabs\\Module\\Menu' => __DIR__ . '/../..' . '/Zotlabs/Module/Menu.php',
+ 'Zotlabs\\Module\\Message' => __DIR__ . '/../..' . '/Zotlabs/Module/Message.php',
+ 'Zotlabs\\Module\\Mitem' => __DIR__ . '/../..' . '/Zotlabs/Module/Mitem.php',
+ 'Zotlabs\\Module\\Mood' => __DIR__ . '/../..' . '/Zotlabs/Module/Mood.php',
+ 'Zotlabs\\Module\\Network' => __DIR__ . '/../..' . '/Zotlabs/Module/Network.php',
+ 'Zotlabs\\Module\\New_channel' => __DIR__ . '/../..' . '/Zotlabs/Module/New_channel.php',
+ 'Zotlabs\\Module\\Nojs' => __DIR__ . '/../..' . '/Zotlabs/Module/Nojs.php',
+ 'Zotlabs\\Module\\Notes' => __DIR__ . '/../..' . '/Zotlabs/Module/Notes.php',
+ 'Zotlabs\\Module\\Notifications' => __DIR__ . '/../..' . '/Zotlabs/Module/Notifications.php',
+ 'Zotlabs\\Module\\Notify' => __DIR__ . '/../..' . '/Zotlabs/Module/Notify.php',
+ 'Zotlabs\\Module\\Oembed' => __DIR__ . '/../..' . '/Zotlabs/Module/Oembed.php',
+ 'Zotlabs\\Module\\Oep' => __DIR__ . '/../..' . '/Zotlabs/Module/Oep.php',
+ 'Zotlabs\\Module\\Oexchange' => __DIR__ . '/../..' . '/Zotlabs/Module/Oexchange.php',
+ 'Zotlabs\\Module\\Online' => __DIR__ . '/../..' . '/Zotlabs/Module/Online.php',
+ 'Zotlabs\\Module\\Opensearch' => __DIR__ . '/../..' . '/Zotlabs/Module/Opensearch.php',
+ 'Zotlabs\\Module\\Page' => __DIR__ . '/../..' . '/Zotlabs/Module/Page.php',
+ 'Zotlabs\\Module\\Pconfig' => __DIR__ . '/../..' . '/Zotlabs/Module/Pconfig.php',
+ 'Zotlabs\\Module\\Pdledit' => __DIR__ . '/../..' . '/Zotlabs/Module/Pdledit.php',
+ 'Zotlabs\\Module\\Photo' => __DIR__ . '/../..' . '/Zotlabs/Module/Photo.php',
+ 'Zotlabs\\Module\\Photos' => __DIR__ . '/../..' . '/Zotlabs/Module/Photos.php',
+ 'Zotlabs\\Module\\Ping' => __DIR__ . '/../..' . '/Zotlabs/Module/Ping.php',
+ 'Zotlabs\\Module\\Poco' => __DIR__ . '/../..' . '/Zotlabs/Module/Poco.php',
+ 'Zotlabs\\Module\\Poke' => __DIR__ . '/../..' . '/Zotlabs/Module/Poke.php',
+ 'Zotlabs\\Module\\Post' => __DIR__ . '/../..' . '/Zotlabs/Module/Post.php',
+ 'Zotlabs\\Module\\Prate' => __DIR__ . '/../..' . '/Zotlabs/Module/Prate.php',
+ 'Zotlabs\\Module\\Pretheme' => __DIR__ . '/../..' . '/Zotlabs/Module/Pretheme.php',
+ 'Zotlabs\\Module\\Probe' => __DIR__ . '/../..' . '/Zotlabs/Module/Probe.php',
+ 'Zotlabs\\Module\\Profile' => __DIR__ . '/../..' . '/Zotlabs/Module/Profile.php',
+ 'Zotlabs\\Module\\Profile_photo' => __DIR__ . '/../..' . '/Zotlabs/Module/Profile_photo.php',
+ 'Zotlabs\\Module\\Profiles' => __DIR__ . '/../..' . '/Zotlabs/Module/Profiles.php',
+ 'Zotlabs\\Module\\Profperm' => __DIR__ . '/../..' . '/Zotlabs/Module/Profperm.php',
+ 'Zotlabs\\Module\\Pubsites' => __DIR__ . '/../..' . '/Zotlabs/Module/Pubsites.php',
+ 'Zotlabs\\Module\\Pubstream' => __DIR__ . '/../..' . '/Zotlabs/Module/Pubstream.php',
+ 'Zotlabs\\Module\\Randprof' => __DIR__ . '/../..' . '/Zotlabs/Module/Randprof.php',
+ 'Zotlabs\\Module\\Rate' => __DIR__ . '/../..' . '/Zotlabs/Module/Rate.php',
+ 'Zotlabs\\Module\\Ratings' => __DIR__ . '/../..' . '/Zotlabs/Module/Ratings.php',
+ 'Zotlabs\\Module\\Ratingsearch' => __DIR__ . '/../..' . '/Zotlabs/Module/Ratingsearch.php',
+ 'Zotlabs\\Module\\Rbmark' => __DIR__ . '/../..' . '/Zotlabs/Module/Rbmark.php',
+ 'Zotlabs\\Module\\React' => __DIR__ . '/../..' . '/Zotlabs/Module/React.php',
+ 'Zotlabs\\Module\\Regdir' => __DIR__ . '/../..' . '/Zotlabs/Module/Regdir.php',
+ 'Zotlabs\\Module\\Register' => __DIR__ . '/../..' . '/Zotlabs/Module/Register.php',
+ 'Zotlabs\\Module\\Regmod' => __DIR__ . '/../..' . '/Zotlabs/Module/Regmod.php',
+ 'Zotlabs\\Module\\Regver' => __DIR__ . '/../..' . '/Zotlabs/Module/Regver.php',
+ 'Zotlabs\\Module\\Removeaccount' => __DIR__ . '/../..' . '/Zotlabs/Module/Removeaccount.php',
+ 'Zotlabs\\Module\\Removeme' => __DIR__ . '/../..' . '/Zotlabs/Module/Removeme.php',
+ 'Zotlabs\\Module\\Rmagic' => __DIR__ . '/../..' . '/Zotlabs/Module/Rmagic.php',
+ 'Zotlabs\\Module\\Rpost' => __DIR__ . '/../..' . '/Zotlabs/Module/Rpost.php',
+ 'Zotlabs\\Module\\Rsd_xml' => __DIR__ . '/../..' . '/Zotlabs/Module/Rsd_xml.php',
+ 'Zotlabs\\Module\\Search' => __DIR__ . '/../..' . '/Zotlabs/Module/Search.php',
+ 'Zotlabs\\Module\\Search_ac' => __DIR__ . '/../..' . '/Zotlabs/Module/Search_ac.php',
+ 'Zotlabs\\Module\\Service_limits' => __DIR__ . '/../..' . '/Zotlabs/Module/Service_limits.php',
+ 'Zotlabs\\Module\\Settings' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings.php',
+ 'Zotlabs\\Module\\Settings\\Account' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Account.php',
+ 'Zotlabs\\Module\\Settings\\Channel' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Channel.php',
+ 'Zotlabs\\Module\\Settings\\Display' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Display.php',
+ 'Zotlabs\\Module\\Settings\\Featured' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Featured.php',
+ 'Zotlabs\\Module\\Settings\\Features' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Features.php',
+ 'Zotlabs\\Module\\Settings\\Oauth' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Oauth.php',
+ 'Zotlabs\\Module\\Settings\\Tokens' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Tokens.php',
+ 'Zotlabs\\Module\\Setup' => __DIR__ . '/../..' . '/Zotlabs/Module/Setup.php',
+ 'Zotlabs\\Module\\Share' => __DIR__ . '/../..' . '/Zotlabs/Module/Share.php',
+ 'Zotlabs\\Module\\Sharedwithme' => __DIR__ . '/../..' . '/Zotlabs/Module/Sharedwithme.php',
+ 'Zotlabs\\Module\\Siteinfo' => __DIR__ . '/../..' . '/Zotlabs/Module/Siteinfo.php',
+ 'Zotlabs\\Module\\Siteinfo_json' => __DIR__ . '/../..' . '/Zotlabs/Module/Siteinfo_json.php',
+ 'Zotlabs\\Module\\Sitelist' => __DIR__ . '/../..' . '/Zotlabs/Module/Sitelist.php',
+ 'Zotlabs\\Module\\Smilies' => __DIR__ . '/../..' . '/Zotlabs/Module/Smilies.php',
+ 'Zotlabs\\Module\\Snap' => __DIR__ . '/../..' . '/Zotlabs/Module/Snap.php',
+ 'Zotlabs\\Module\\Sources' => __DIR__ . '/../..' . '/Zotlabs/Module/Sources.php',
+ 'Zotlabs\\Module\\Sslify' => __DIR__ . '/../..' . '/Zotlabs/Module/Sslify.php',
+ 'Zotlabs\\Module\\Starred' => __DIR__ . '/../..' . '/Zotlabs/Module/Starred.php',
+ 'Zotlabs\\Module\\Subthread' => __DIR__ . '/../..' . '/Zotlabs/Module/Subthread.php',
+ 'Zotlabs\\Module\\Suggest' => __DIR__ . '/../..' . '/Zotlabs/Module/Suggest.php',
+ 'Zotlabs\\Module\\Tagger' => __DIR__ . '/../..' . '/Zotlabs/Module/Tagger.php',
+ 'Zotlabs\\Module\\Tagrm' => __DIR__ . '/../..' . '/Zotlabs/Module/Tagrm.php',
+ 'Zotlabs\\Module\\Tasks' => __DIR__ . '/../..' . '/Zotlabs/Module/Tasks.php',
+ 'Zotlabs\\Module\\Theme_info' => __DIR__ . '/../..' . '/Zotlabs/Module/Theme_info.php',
+ 'Zotlabs\\Module\\Thing' => __DIR__ . '/../..' . '/Zotlabs/Module/Thing.php',
+ 'Zotlabs\\Module\\Toggle_mobile' => __DIR__ . '/../..' . '/Zotlabs/Module/Toggle_mobile.php',
+ 'Zotlabs\\Module\\Toggle_safesearch' => __DIR__ . '/../..' . '/Zotlabs/Module/Toggle_safesearch.php',
+ 'Zotlabs\\Module\\Uexport' => __DIR__ . '/../..' . '/Zotlabs/Module/Uexport.php',
+ 'Zotlabs\\Module\\Update_channel' => __DIR__ . '/../..' . '/Zotlabs/Module/Update_channel.php',
+ 'Zotlabs\\Module\\Update_display' => __DIR__ . '/../..' . '/Zotlabs/Module/Update_display.php',
+ 'Zotlabs\\Module\\Update_home' => __DIR__ . '/../..' . '/Zotlabs/Module/Update_home.php',
+ 'Zotlabs\\Module\\Update_network' => __DIR__ . '/../..' . '/Zotlabs/Module/Update_network.php',
+ 'Zotlabs\\Module\\Update_pubstream' => __DIR__ . '/../..' . '/Zotlabs/Module/Update_pubstream.php',
+ 'Zotlabs\\Module\\Update_search' => __DIR__ . '/../..' . '/Zotlabs/Module/Update_search.php',
+ 'Zotlabs\\Module\\View' => __DIR__ . '/../..' . '/Zotlabs/Module/View.php',
+ 'Zotlabs\\Module\\Viewconnections' => __DIR__ . '/../..' . '/Zotlabs/Module/Viewconnections.php',
+ 'Zotlabs\\Module\\Viewsrc' => __DIR__ . '/../..' . '/Zotlabs/Module/Viewsrc.php',
+ 'Zotlabs\\Module\\Wall_attach' => __DIR__ . '/../..' . '/Zotlabs/Module/Wall_attach.php',
+ 'Zotlabs\\Module\\Wall_upload' => __DIR__ . '/../..' . '/Zotlabs/Module/Wall_upload.php',
+ 'Zotlabs\\Module\\Webfinger' => __DIR__ . '/../..' . '/Zotlabs/Module/Webfinger.php',
+ 'Zotlabs\\Module\\Webpages' => __DIR__ . '/../..' . '/Zotlabs/Module/Webpages.php',
+ 'Zotlabs\\Module\\Well_known' => __DIR__ . '/../..' . '/Zotlabs/Module/Well_known.php',
+ 'Zotlabs\\Module\\Wfinger' => __DIR__ . '/../..' . '/Zotlabs/Module/Wfinger.php',
+ 'Zotlabs\\Module\\Wiki' => __DIR__ . '/../..' . '/Zotlabs/Module/Wiki.php',
+ 'Zotlabs\\Module\\Xchan' => __DIR__ . '/../..' . '/Zotlabs/Module/Xchan.php',
+ 'Zotlabs\\Module\\Xpoco' => __DIR__ . '/../..' . '/Zotlabs/Module/Xpoco.php',
+ 'Zotlabs\\Module\\Xrd' => __DIR__ . '/../..' . '/Zotlabs/Module/Xrd.php',
+ 'Zotlabs\\Module\\Xref' => __DIR__ . '/../..' . '/Zotlabs/Module/Xref.php',
+ 'Zotlabs\\Module\\Zfinger' => __DIR__ . '/../..' . '/Zotlabs/Module/Zfinger.php',
+ 'Zotlabs\\Module\\Zotfeed' => __DIR__ . '/../..' . '/Zotlabs/Module/Zotfeed.php',
+ 'Zotlabs\\Module\\Zping' => __DIR__ . '/../..' . '/Zotlabs/Module/Zping.php',
+ 'Zotlabs\\Render\\Comanche' => __DIR__ . '/../..' . '/Zotlabs/Render/Comanche.php',
+ 'Zotlabs\\Render\\SimpleTemplate' => __DIR__ . '/../..' . '/Zotlabs/Render/SimpleTemplate.php',
+ 'Zotlabs\\Render\\SmartyInterface' => __DIR__ . '/../..' . '/Zotlabs/Render/SmartyInterface.php',
+ 'Zotlabs\\Render\\SmartyTemplate' => __DIR__ . '/../..' . '/Zotlabs/Render/SmartyTemplate.php',
+ 'Zotlabs\\Render\\TemplateEngine' => __DIR__ . '/../..' . '/Zotlabs/Render/TemplateEngine.php',
+ 'Zotlabs\\Render\\Theme' => __DIR__ . '/../..' . '/Zotlabs/Render/Theme.php',
+ 'Zotlabs\\Storage\\BasicAuth' => __DIR__ . '/../..' . '/Zotlabs/Storage/BasicAuth.php',
+ 'Zotlabs\\Storage\\Browser' => __DIR__ . '/../..' . '/Zotlabs/Storage/Browser.php',
+ 'Zotlabs\\Storage\\CalDAVClient' => __DIR__ . '/../..' . '/Zotlabs/Storage/CalDAVClient.php',
+ 'Zotlabs\\Storage\\Directory' => __DIR__ . '/../..' . '/Zotlabs/Storage/Directory.php',
+ 'Zotlabs\\Storage\\File' => __DIR__ . '/../..' . '/Zotlabs/Storage/File.php',
+ 'Zotlabs\\Storage\\GitRepo' => __DIR__ . '/../..' . '/Zotlabs/Storage/GitRepo.php',
+ 'Zotlabs\\Text\\Tagadelic' => __DIR__ . '/../..' . '/Zotlabs/Text/Tagadelic.php',
+ 'Zotlabs\\Web\\CheckJS' => __DIR__ . '/../..' . '/Zotlabs/Web/CheckJS.php',
+ 'Zotlabs\\Web\\Controller' => __DIR__ . '/../..' . '/Zotlabs/Web/Controller.php',
+ 'Zotlabs\\Web\\HttpMeta' => __DIR__ . '/../..' . '/Zotlabs/Web/HttpMeta.php',
+ 'Zotlabs\\Web\\Router' => __DIR__ . '/../..' . '/Zotlabs/Web/Router.php',
+ 'Zotlabs\\Web\\Session' => __DIR__ . '/../..' . '/Zotlabs/Web/Session.php',
+ 'Zotlabs\\Web\\SessionHandler' => __DIR__ . '/../..' . '/Zotlabs/Web/SessionHandler.php',
+ 'Zotlabs\\Web\\SubModule' => __DIR__ . '/../..' . '/Zotlabs/Web/SubModule.php',
+ 'Zotlabs\\Web\\WebServer' => __DIR__ . '/../..' . '/Zotlabs/Web/WebServer.php',
+ 'Zotlabs\\Zot\\Auth' => __DIR__ . '/../..' . '/Zotlabs/Zot/Auth.php',
+ 'Zotlabs\\Zot\\DReport' => __DIR__ . '/../..' . '/Zotlabs/Zot/DReport.php',
+ 'Zotlabs\\Zot\\Finger' => __DIR__ . '/../..' . '/Zotlabs/Zot/Finger.php',
+ 'Zotlabs\\Zot\\IHandler' => __DIR__ . '/../..' . '/Zotlabs/Zot/IHandler.php',
+ 'Zotlabs\\Zot\\Receiver' => __DIR__ . '/../..' . '/Zotlabs/Zot/Receiver.php',
+ 'Zotlabs\\Zot\\Verify' => __DIR__ . '/../..' . '/Zotlabs/Zot/Verify.php',
+ 'Zotlabs\\Zot\\ZotHandler' => __DIR__ . '/../..' . '/Zotlabs/Zot/ZotHandler.php',
+ );
+
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
- $loader->prefixLengthsPsr4 = ComposerStaticInit02c7a5bb99a87a4c8dbf069d69b1a15c::$prefixLengthsPsr4;
- $loader->prefixDirsPsr4 = ComposerStaticInit02c7a5bb99a87a4c8dbf069d69b1a15c::$prefixDirsPsr4;
- $loader->prefixesPsr0 = ComposerStaticInit02c7a5bb99a87a4c8dbf069d69b1a15c::$prefixesPsr0;
+ $loader->prefixLengthsPsr4 = ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::$prefixLengthsPsr4;
+ $loader->prefixDirsPsr4 = ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::$prefixDirsPsr4;
+ $loader->classMap = ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::$classMap;
}, null, ClassLoader::class);
}
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 835190d7f..88acfc40c 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -53,83 +53,18 @@
]
},
{
- "name": "sabre/xml",
- "version": "1.4.2",
- "version_normalized": "1.4.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/fruux/sabre-xml.git",
- "reference": "f48d98c22a4a4bef76cabb5968ffaddbb2bb593e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-xml/zipball/f48d98c22a4a4bef76cabb5968ffaddbb2bb593e",
- "reference": "f48d98c22a4a4bef76cabb5968ffaddbb2bb593e",
- "shasum": ""
- },
- "require": {
- "ext-dom": "*",
- "ext-xmlreader": "*",
- "ext-xmlwriter": "*",
- "lib-libxml": ">=2.6.20",
- "php": ">=5.4.1",
- "sabre/uri": "~1.0"
- },
- "require-dev": {
- "phpunit/phpunit": "*",
- "sabre/cs": "~0.0.2"
- },
- "time": "2016-05-19 21:56:49",
- "type": "library",
- "installation-source": "dist",
- "autoload": {
- "psr-4": {
- "Sabre\\Xml\\": "lib/"
- },
- "files": [
- "lib/Deserializer/functions.php",
- "lib/Serializer/functions.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Evert Pot",
- "email": "me@evertpot.com",
- "homepage": "http://evertpot.com/",
- "role": "Developer"
- },
- {
- "name": "Markus Staab",
- "email": "markus.staab@redaxo.de",
- "role": "Developer"
- }
- ],
- "description": "sabre/xml is an XML library that you may not hate.",
- "homepage": "https://sabre.io/xml/",
- "keywords": [
- "XMLReader",
- "XMLWriter",
- "dom",
- "xml"
- ]
- },
- {
"name": "sabre/vobject",
- "version": "4.1.0",
- "version_normalized": "4.1.0.0",
+ "version": "4.1.1",
+ "version_normalized": "4.1.1.0",
"source": {
"type": "git",
"url": "https://github.com/fruux/sabre-vobject.git",
- "reference": "8899c0e856b3178b17f4e9a4e85010209f32a2fa"
+ "reference": "a3a59b06947f122af2d45d52b72172cdc1efd68f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/8899c0e856b3178b17f4e9a4e85010209f32a2fa",
- "reference": "8899c0e856b3178b17f4e9a4e85010209f32a2fa",
+ "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/a3a59b06947f122af2d45d52b72172cdc1efd68f",
+ "reference": "a3a59b06947f122af2d45d52b72172cdc1efd68f",
"shasum": ""
},
"require": {
@@ -144,7 +79,7 @@
"suggest": {
"hoa/bench": "If you would like to run the benchmark scripts"
},
- "time": "2016-04-07 00:48:27",
+ "time": "2016-07-15 19:52:17",
"bin": [
"bin/vobject",
"bin/generate_vcards"
@@ -191,6 +126,7 @@
"availability",
"freebusy",
"iCalendar",
+ "ical",
"ics",
"jCal",
"jCard",
@@ -208,6 +144,7 @@
"rfc6638",
"rfc6715",
"rfc6868",
+ "vCalendar",
"vCard",
"vcf",
"xCal",
@@ -331,46 +268,6 @@
]
},
{
- "name": "psr/log",
- "version": "1.0.0",
- "version_normalized": "1.0.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
- "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
- "shasum": ""
- },
- "time": "2012-12-21 11:40:51",
- "type": "library",
- "installation-source": "dist",
- "autoload": {
- "psr-0": {
- "Psr\\Log\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common interface for logging libraries",
- "keywords": [
- "log",
- "psr",
- "psr-3"
- ]
- },
- {
"name": "sabre/dav",
"version": "3.2.0",
"version_normalized": "3.2.0.0",
@@ -454,5 +351,119 @@
"framework",
"iCalendar"
]
+ },
+ {
+ "name": "sabre/xml",
+ "version": "1.5.0",
+ "version_normalized": "1.5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-xml.git",
+ "reference": "59b20e5bbace9912607481634f97d05a776ffca7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-xml/zipball/59b20e5bbace9912607481634f97d05a776ffca7",
+ "reference": "59b20e5bbace9912607481634f97d05a776ffca7",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlreader": "*",
+ "ext-xmlwriter": "*",
+ "lib-libxml": ">=2.6.20",
+ "php": ">=5.5.5",
+ "sabre/uri": ">=1.0,<3.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*",
+ "sabre/cs": "~1.0.0"
+ },
+ "time": "2016-10-09 22:57:52",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Sabre\\Xml\\": "lib/"
+ },
+ "files": [
+ "lib/Deserializer/functions.php",
+ "lib/Serializer/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ },
+ {
+ "name": "Markus Staab",
+ "email": "markus.staab@redaxo.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "sabre/xml is an XML library that you may not hate.",
+ "homepage": "https://sabre.io/xml/",
+ "keywords": [
+ "XMLReader",
+ "XMLWriter",
+ "dom",
+ "xml"
+ ]
+ },
+ {
+ "name": "psr/log",
+ "version": "1.0.2",
+ "version_normalized": "1.0.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2016-10-10 12:19:37",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ]
}
]
diff --git a/vendor/psr/log/Psr/Log/AbstractLogger.php b/vendor/psr/log/Psr/Log/AbstractLogger.php
index 00f903452..90e721af2 100644
--- a/vendor/psr/log/Psr/Log/AbstractLogger.php
+++ b/vendor/psr/log/Psr/Log/AbstractLogger.php
@@ -15,8 +15,9 @@ abstract class AbstractLogger implements LoggerInterface
* System is unusable.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function emergency($message, array $context = array())
{
@@ -30,8 +31,9 @@ abstract class AbstractLogger implements LoggerInterface
* trigger the SMS alerts and wake you up.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function alert($message, array $context = array())
{
@@ -44,8 +46,9 @@ abstract class AbstractLogger implements LoggerInterface
* Example: Application component unavailable, unexpected exception.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function critical($message, array $context = array())
{
@@ -57,8 +60,9 @@ abstract class AbstractLogger implements LoggerInterface
* be logged and monitored.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function error($message, array $context = array())
{
@@ -72,8 +76,9 @@ abstract class AbstractLogger implements LoggerInterface
* that are not necessarily wrong.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function warning($message, array $context = array())
{
@@ -84,8 +89,9 @@ abstract class AbstractLogger implements LoggerInterface
* Normal but significant events.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function notice($message, array $context = array())
{
@@ -98,8 +104,9 @@ abstract class AbstractLogger implements LoggerInterface
* Example: User logs in, SQL logs.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function info($message, array $context = array())
{
@@ -110,8 +117,9 @@ abstract class AbstractLogger implements LoggerInterface
* Detailed debug information.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function debug($message, array $context = array())
{
diff --git a/vendor/psr/log/Psr/Log/LogLevel.php b/vendor/psr/log/Psr/Log/LogLevel.php
index e32c151cb..9cebcace6 100644
--- a/vendor/psr/log/Psr/Log/LogLevel.php
+++ b/vendor/psr/log/Psr/Log/LogLevel.php
@@ -3,16 +3,16 @@
namespace Psr\Log;
/**
- * Describes log levels
+ * Describes log levels.
*/
class LogLevel
{
const EMERGENCY = 'emergency';
- const ALERT = 'alert';
- const CRITICAL = 'critical';
- const ERROR = 'error';
- const WARNING = 'warning';
- const NOTICE = 'notice';
- const INFO = 'info';
- const DEBUG = 'debug';
+ const ALERT = 'alert';
+ const CRITICAL = 'critical';
+ const ERROR = 'error';
+ const WARNING = 'warning';
+ const NOTICE = 'notice';
+ const INFO = 'info';
+ const DEBUG = 'debug';
}
diff --git a/vendor/psr/log/Psr/Log/LoggerAwareInterface.php b/vendor/psr/log/Psr/Log/LoggerAwareInterface.php
index 2eebc4ebd..4d64f4786 100644
--- a/vendor/psr/log/Psr/Log/LoggerAwareInterface.php
+++ b/vendor/psr/log/Psr/Log/LoggerAwareInterface.php
@@ -3,15 +3,16 @@
namespace Psr\Log;
/**
- * Describes a logger-aware instance
+ * Describes a logger-aware instance.
*/
interface LoggerAwareInterface
{
/**
- * Sets a logger instance on the object
+ * Sets a logger instance on the object.
*
* @param LoggerInterface $logger
- * @return null
+ *
+ * @return void
*/
public function setLogger(LoggerInterface $logger);
}
diff --git a/vendor/psr/log/Psr/Log/LoggerAwareTrait.php b/vendor/psr/log/Psr/Log/LoggerAwareTrait.php
index f087a3dac..639f79bda 100644
--- a/vendor/psr/log/Psr/Log/LoggerAwareTrait.php
+++ b/vendor/psr/log/Psr/Log/LoggerAwareTrait.php
@@ -7,12 +7,16 @@ namespace Psr\Log;
*/
trait LoggerAwareTrait
{
- /** @var LoggerInterface */
+ /**
+ * The logger instance.
+ *
+ * @var LoggerInterface
+ */
protected $logger;
/**
* Sets a logger.
- *
+ *
* @param LoggerInterface $logger
*/
public function setLogger(LoggerInterface $logger)
diff --git a/vendor/psr/log/Psr/Log/LoggerInterface.php b/vendor/psr/log/Psr/Log/LoggerInterface.php
index 476bb962a..5ea72438b 100644
--- a/vendor/psr/log/Psr/Log/LoggerInterface.php
+++ b/vendor/psr/log/Psr/Log/LoggerInterface.php
@@ -3,14 +3,14 @@
namespace Psr\Log;
/**
- * Describes a logger instance
+ * Describes a logger instance.
*
* The message MUST be a string or object implementing __toString().
*
* The message MAY contain placeholders in the form: {foo} where foo
* will be replaced by the context data in key "foo".
*
- * The context array can contain arbitrary data, the only assumption that
+ * The context array can contain arbitrary data. The only assumption that
* can be made by implementors is that if an Exception instance is given
* to produce a stack trace, it MUST be in a key named "exception".
*
@@ -23,8 +23,9 @@ interface LoggerInterface
* System is unusable.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function emergency($message, array $context = array());
@@ -35,8 +36,9 @@ interface LoggerInterface
* trigger the SMS alerts and wake you up.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function alert($message, array $context = array());
@@ -46,8 +48,9 @@ interface LoggerInterface
* Example: Application component unavailable, unexpected exception.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function critical($message, array $context = array());
@@ -56,8 +59,9 @@ interface LoggerInterface
* be logged and monitored.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function error($message, array $context = array());
@@ -68,8 +72,9 @@ interface LoggerInterface
* that are not necessarily wrong.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function warning($message, array $context = array());
@@ -77,8 +82,9 @@ interface LoggerInterface
* Normal but significant events.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function notice($message, array $context = array());
@@ -88,8 +94,9 @@ interface LoggerInterface
* Example: User logs in, SQL logs.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function info($message, array $context = array());
@@ -97,18 +104,20 @@ interface LoggerInterface
* Detailed debug information.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function debug($message, array $context = array());
/**
* Logs with an arbitrary level.
*
- * @param mixed $level
+ * @param mixed $level
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function log($level, $message, array $context = array());
}
diff --git a/vendor/psr/log/Psr/Log/LoggerTrait.php b/vendor/psr/log/Psr/Log/LoggerTrait.php
index 591249600..867225df1 100644
--- a/vendor/psr/log/Psr/Log/LoggerTrait.php
+++ b/vendor/psr/log/Psr/Log/LoggerTrait.php
@@ -6,8 +6,8 @@ namespace Psr\Log;
* This is a simple Logger trait that classes unable to extend AbstractLogger
* (because they extend another class, etc) can include.
*
- * It simply delegates all log-level-specific methods to the `log` method to
- * reduce boilerplate code that a simple Logger that does the same thing with
+ * It simply delegates all log-level-specific methods to the `log` method to
+ * reduce boilerplate code that a simple Logger that does the same thing with
* messages regardless of the error level has to implement.
*/
trait LoggerTrait
@@ -16,8 +16,9 @@ trait LoggerTrait
* System is unusable.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function emergency($message, array $context = array())
{
@@ -31,8 +32,9 @@ trait LoggerTrait
* trigger the SMS alerts and wake you up.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function alert($message, array $context = array())
{
@@ -45,8 +47,9 @@ trait LoggerTrait
* Example: Application component unavailable, unexpected exception.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function critical($message, array $context = array())
{
@@ -58,8 +61,9 @@ trait LoggerTrait
* be logged and monitored.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function error($message, array $context = array())
{
@@ -73,8 +77,9 @@ trait LoggerTrait
* that are not necessarily wrong.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function warning($message, array $context = array())
{
@@ -85,8 +90,9 @@ trait LoggerTrait
* Normal but significant events.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function notice($message, array $context = array())
{
@@ -99,8 +105,9 @@ trait LoggerTrait
* Example: User logs in, SQL logs.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function info($message, array $context = array())
{
@@ -111,8 +118,9 @@ trait LoggerTrait
* Detailed debug information.
*
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function debug($message, array $context = array())
{
@@ -122,10 +130,11 @@ trait LoggerTrait
/**
* Logs with an arbitrary level.
*
- * @param mixed $level
+ * @param mixed $level
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
abstract public function log($level, $message, array $context = array());
}
diff --git a/vendor/psr/log/Psr/Log/NullLogger.php b/vendor/psr/log/Psr/Log/NullLogger.php
index 553a3c593..d8cd682c8 100644
--- a/vendor/psr/log/Psr/Log/NullLogger.php
+++ b/vendor/psr/log/Psr/Log/NullLogger.php
@@ -3,7 +3,7 @@
namespace Psr\Log;
/**
- * This Logger can be used to avoid conditional log calls
+ * This Logger can be used to avoid conditional log calls.
*
* Logging should always be optional, and if no logger is provided to your
* library creating a NullLogger instance to have something to throw logs at
@@ -15,10 +15,11 @@ class NullLogger extends AbstractLogger
/**
* Logs with an arbitrary level.
*
- * @param mixed $level
+ * @param mixed $level
* @param string $message
- * @param array $context
- * @return null
+ * @param array $context
+ *
+ * @return void
*/
public function log($level, $message, array $context = array())
{
diff --git a/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php b/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php
deleted file mode 100644
index a93281511..000000000
--- a/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php
-
-namespace Psr\Log\Test;
-
-use Psr\Log\LogLevel;
-
-/**
- * Provides a base test class for ensuring compliance with the LoggerInterface
- *
- * Implementors can extend the class and implement abstract methods to run this as part of their test suite
- */
-abstract class LoggerInterfaceTest extends \PHPUnit_Framework_TestCase
-{
- /**
- * @return LoggerInterface
- */
- abstract function getLogger();
-
- /**
- * This must return the log messages in order with a simple formatting: "<LOG LEVEL> <MESSAGE>"
- *
- * Example ->error('Foo') would yield "error Foo"
- *
- * @return string[]
- */
- abstract function getLogs();
-
- public function testImplements()
- {
- $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger());
- }
-
- /**
- * @dataProvider provideLevelsAndMessages
- */
- public function testLogsAtAllLevels($level, $message)
- {
- $logger = $this->getLogger();
- $logger->{$level}($message, array('user' => 'Bob'));
- $logger->log($level, $message, array('user' => 'Bob'));
-
- $expected = array(
- $level.' message of level '.$level.' with context: Bob',
- $level.' message of level '.$level.' with context: Bob',
- );
- $this->assertEquals($expected, $this->getLogs());
- }
-
- public function provideLevelsAndMessages()
- {
- return array(
- LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'),
- LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'),
- LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'),
- LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'),
- LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'),
- LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'),
- LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'),
- LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'),
- );
- }
-
- /**
- * @expectedException Psr\Log\InvalidArgumentException
- */
- public function testThrowsOnInvalidLevel()
- {
- $logger = $this->getLogger();
- $logger->log('invalid level', 'Foo');
- }
-
- public function testContextReplacement()
- {
- $logger = $this->getLogger();
- $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar'));
-
- $expected = array('info {Message {nothing} Bob Bar a}');
- $this->assertEquals($expected, $this->getLogs());
- }
-
- public function testObjectCastToString()
- {
- $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString'));
- $dummy->expects($this->once())
- ->method('__toString')
- ->will($this->returnValue('DUMMY'));
-
- $this->getLogger()->warning($dummy);
- }
-
- public function testContextCanContainAnything()
- {
- $context = array(
- 'bool' => true,
- 'null' => null,
- 'string' => 'Foo',
- 'int' => 0,
- 'float' => 0.5,
- 'nested' => array('with object' => new DummyTest),
- 'object' => new \DateTime,
- 'resource' => fopen('php://memory', 'r'),
- );
-
- $this->getLogger()->warning('Crazy context data', $context);
- }
-
- public function testContextExceptionKeyCanBeExceptionOrOtherValues()
- {
- $this->getLogger()->warning('Random message', array('exception' => 'oops'));
- $this->getLogger()->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail')));
- }
-}
-
-class DummyTest
-{
-} \ No newline at end of file
diff --git a/vendor/psr/log/composer.json b/vendor/psr/log/composer.json
new file mode 100644
index 000000000..87934d707
--- /dev/null
+++ b/vendor/psr/log/composer.json
@@ -0,0 +1,26 @@
+{
+ "name": "psr/log",
+ "description": "Common interface for logging libraries",
+ "keywords": ["psr", "psr-3", "log"],
+ "homepage": "https://github.com/php-fig/log",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
diff --git a/vendor/sabre/dav/composer.json b/vendor/sabre/dav/composer.json
new file mode 100644
index 000000000..f85d9655e
--- /dev/null
+++ b/vendor/sabre/dav/composer.json
@@ -0,0 +1,68 @@
+{
+ "name": "sabre/dav",
+ "type": "library",
+ "description": "WebDAV Framework for PHP",
+ "keywords": ["Framework", "WebDAV", "CalDAV", "CardDAV", "iCalendar"],
+ "homepage": "http://sabre.io/",
+ "license" : "BSD-3-Clause",
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage" : "http://evertpot.com/",
+ "role" : "Developer"
+ }
+ ],
+ "require": {
+ "php": ">=5.5.0",
+ "sabre/vobject": "^4.1.0",
+ "sabre/event" : ">=2.0.0, <4.0.0",
+ "sabre/xml" : "^1.4.0",
+ "sabre/http" : "^4.2.1",
+ "sabre/uri" : "^1.0.1",
+ "ext-dom": "*",
+ "ext-pcre": "*",
+ "ext-spl": "*",
+ "ext-simplexml": "*",
+ "ext-mbstring" : "*",
+ "ext-ctype" : "*",
+ "ext-date" : "*",
+ "ext-iconv" : "*",
+ "lib-libxml" : ">=2.7.0",
+ "psr/log": "^1.0"
+ },
+ "require-dev" : {
+ "phpunit/phpunit" : "> 4.8, <=6.0.0",
+ "evert/phpdoc-md" : "~0.1.0",
+ "sabre/cs" : "~0.0.5",
+ "monolog/monolog": "^1.18"
+ },
+ "suggest" : {
+ "ext-curl" : "*",
+ "ext-pdo" : "*"
+ },
+ "autoload": {
+ "psr-4" : {
+ "Sabre\\DAV\\" : "lib/DAV/",
+ "Sabre\\DAVACL\\" : "lib/DAVACL/",
+ "Sabre\\CalDAV\\" : "lib/CalDAV/",
+ "Sabre\\CardDAV\\" : "lib/CardDAV/"
+ }
+ },
+ "support" : {
+ "forum" : "https://groups.google.com/group/sabredav-discuss",
+ "source" : "https://github.com/fruux/sabre-dav"
+ },
+ "bin" : [
+ "bin/sabredav",
+ "bin/naturalselection"
+ ],
+ "config" : {
+ "bin-dir" : "./bin"
+ },
+ "extra" : {
+ "branch-alias": {
+ "dev-master": "3.1.0-dev"
+ }
+ }
+}
diff --git a/vendor/sabre/dav/lib/DAV/Browser/Plugin.php b/vendor/sabre/dav/lib/DAV/Browser/Plugin.php
index 4959193ea..49359a045 100644
--- a/vendor/sabre/dav/lib/DAV/Browser/Plugin.php
+++ b/vendor/sabre/dav/lib/DAV/Browser/Plugin.php
@@ -163,7 +163,7 @@ class Plugin extends DAV\ServerPlugin {
* @return bool
*/
function httpPOST(RequestInterface $request, ResponseInterface $response) {
-
+
$contentType = $request->getHeader('Content-Type');
list($contentType) = explode(';', $contentType);
if ($contentType !== 'application/x-www-form-urlencoded' &&
@@ -179,7 +179,7 @@ class Plugin extends DAV\ServerPlugin {
if ($this->server->emit('onBrowserPostAction', [$uri, $postVars['sabreAction'], $postVars])) {
- switch ($postVars['sabreAction']) {
+ switch ($postVars['sabreAction']) {
case 'mkcol' :
if (isset($postVars['name']) && trim($postVars['name'])) {
@@ -221,7 +221,7 @@ class Plugin extends DAV\ServerPlugin {
if ($_FILES) $file = current($_FILES);
else break;
-
+
list(, $newName) = URLUtil::splitPath(trim($file['name']));
if (isset($postVars['name']) && trim($postVars['name']))
$newName = trim($postVars['name']);
diff --git a/vendor/sabre/event/composer.json b/vendor/sabre/event/composer.json
new file mode 100644
index 000000000..9a11b01aa
--- /dev/null
+++ b/vendor/sabre/event/composer.json
@@ -0,0 +1,47 @@
+{
+ "name": "sabre/event",
+ "description": "sabre/event is a library for lightweight event-based programming",
+ "keywords": [
+ "Events",
+ "EventEmitter",
+ "Promise",
+ "Hooks",
+ "Plugin",
+ "Signal",
+ "Async"
+ ],
+ "homepage": "http://sabre.io/event/",
+ "license": "BSD-3-Clause",
+ "require": {
+ "php": ">=5.5"
+ },
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "support": {
+ "forum": "https://groups.google.com/group/sabredav-discuss",
+ "source": "https://github.com/fruux/sabre-event"
+ },
+ "autoload": {
+ "psr-4": {
+ "Sabre\\Event\\": "lib/"
+ },
+ "files" : [
+ "lib/coroutine.php",
+ "lib/Loop/functions.php",
+ "lib/Promise/functions.php"
+ ]
+ },
+ "require-dev": {
+ "sabre/cs": "~0.0.4",
+ "phpunit/phpunit" : "*"
+ },
+ "config" : {
+ "bin-dir" : "bin/"
+ }
+}
diff --git a/vendor/sabre/http/composer.json b/vendor/sabre/http/composer.json
new file mode 100644
index 000000000..b061194cf
--- /dev/null
+++ b/vendor/sabre/http/composer.json
@@ -0,0 +1,43 @@
+{
+ "name": "sabre/http",
+ "description" : "The sabre/http library provides utilities for dealing with http requests and responses. ",
+ "keywords" : [ "HTTP" ],
+ "homepage" : "https://github.com/fruux/sabre-http",
+ "license" : "BSD-3-Clause",
+ "require" : {
+ "php" : ">=5.4",
+ "ext-mbstring" : "*",
+ "sabre/event" : ">=1.0.0,<4.0.0",
+ "sabre/uri" : "~1.0"
+ },
+ "require-dev" : {
+ "phpunit/phpunit" : "~4.3",
+ "sabre/cs" : "~0.0.1"
+ },
+ "suggest" : {
+ "ext-curl" : " to make http requests with the Client class"
+ },
+ "authors" : [
+ {
+ "name" : "Evert Pot",
+ "email" : "me@evertpot.com",
+ "homepage" : "http://evertpot.com/",
+ "role" : "Developer"
+ }
+ ],
+ "support" : {
+ "forum" : "https://groups.google.com/group/sabredav-discuss",
+ "source" : "https://github.com/fruux/sabre-http"
+ },
+ "autoload" : {
+ "files" : [
+ "lib/functions.php"
+ ],
+ "psr-4" : {
+ "Sabre\\HTTP\\" : "lib/"
+ }
+ },
+ "config" : {
+ "bin-dir" : "bin/"
+ }
+}
diff --git a/vendor/sabre/uri/composer.json b/vendor/sabre/uri/composer.json
new file mode 100644
index 000000000..7b48acb71
--- /dev/null
+++ b/vendor/sabre/uri/composer.json
@@ -0,0 +1,41 @@
+{
+ "name": "sabre/uri",
+ "description": "Functions for making sense out of URIs.",
+ "keywords": [
+ "URI",
+ "URL",
+ "rfc3986"
+ ],
+ "homepage": "http://sabre.io/uri/",
+ "license": "BSD-3-Clause",
+ "require": {
+ "php": ">=5.4.7"
+ },
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "support": {
+ "forum": "https://groups.google.com/group/sabredav-discuss",
+ "source": "https://github.com/fruux/sabre-uri"
+ },
+ "autoload": {
+ "files" : [
+ "lib/functions.php"
+ ],
+ "psr-4" : {
+ "Sabre\\Uri\\" : "lib/"
+ }
+ },
+ "require-dev": {
+ "sabre/cs": "~0.0.1",
+ "phpunit/phpunit" : "*"
+ },
+ "config" : {
+ "bin-dir" : "bin/"
+ }
+}
diff --git a/vendor/sabre/vobject/.travis.yml b/vendor/sabre/vobject/.travis.yml
index 06bbdf8a0..b7266a878 100644
--- a/vendor/sabre/vobject/.travis.yml
+++ b/vendor/sabre/vobject/.travis.yml
@@ -3,14 +3,9 @@ php:
- 5.5
- 5.6
- 7
- - hhvm
sudo: false
-matrix:
- allow_failures:
- - php: hhvm
-
script:
- phpunit --configuration tests/phpunit.xml
- ./bin/sabre-cs-fixer fix . --dry-run --diff
diff --git a/vendor/sabre/vobject/CHANGELOG.md b/vendor/sabre/vobject/CHANGELOG.md
index 0bd7d53bd..4c72680f8 100644
--- a/vendor/sabre/vobject/CHANGELOG.md
+++ b/vendor/sabre/vobject/CHANGELOG.md
@@ -1,6 +1,19 @@
ChangeLog
=========
+4.1.1 (2016-07-15)
+------------------
+
+* #327: Throwing `InvalidDataException` in more cases where invalid iCalendar
+ dates and times were provided. (@rsto)
+* #331: Fix dealing with multiple overridden instances falling on the same
+ date/time (@afedyk-sugarcrm).
+* #333: Fix endless loop on invalid `BYMONTH` values in recurrence.
+ (@PHPGangsta)
+* #339: Fixed a few `validate()` results when repair is off. (@PHPGangsta)
+* #338: Stripping invalid `BYMONTH=` rules during `validate()` (@PHPGangsta)
+* #336: Fix incorrect `BYSECOND=` validation. (@PHPGangsta)
+
4.1.0 (2016-04-06)
------------------
@@ -130,6 +143,20 @@ ChangeLog
and `IntegerValue` to allow PHP 7 compatibility.
+3.5.3 (????-??-??)
+------------------
+
+* #331: Fix dealing with multiple overridden instances falling on the same
+ date/time (@afedyk-sugarcrm).
+
+
+3.5.2 (2016-04-24)
+-----------------
+
+* #312: Backported a fix related to iTip processing of events with timezones,
+ without a master event.
+
+
3.5.1 (2016-04-06)
------------------
diff --git a/vendor/sabre/vobject/bin/bench.php b/vendor/sabre/vobject/bin/bench.php
index 807b40777..807b40777 100644..100755
--- a/vendor/sabre/vobject/bin/bench.php
+++ b/vendor/sabre/vobject/bin/bench.php
diff --git a/vendor/sabre/vobject/bin/fetch_windows_zones.php b/vendor/sabre/vobject/bin/fetch_windows_zones.php
index 1b1fdc37c..1b1fdc37c 100644..100755
--- a/vendor/sabre/vobject/bin/fetch_windows_zones.php
+++ b/vendor/sabre/vobject/bin/fetch_windows_zones.php
diff --git a/vendor/sabre/vobject/bin/generateicalendardata.php b/vendor/sabre/vobject/bin/generateicalendardata.php
index dfcf18780..a2df3c63a 100644..100755
--- a/vendor/sabre/vobject/bin/generateicalendardata.php
+++ b/vendor/sabre/vobject/bin/generateicalendardata.php
@@ -29,7 +29,7 @@ include __DIR__ . '/../vendor/autoload.php';
fwrite(STDERR, "Generating " . $events . " events\n");
-$currentDate = new DateTime('-' . round($events / 2) . ' days');
+$currentDate = new DateTime('-' . round($events / 2) . ' days');
$calendar = new VObject\Component\VCalendar();
diff --git a/vendor/sabre/vobject/bin/mergeduplicates.php b/vendor/sabre/vobject/bin/mergeduplicates.php
index 1662e7bf3..076524d36 100644..100755
--- a/vendor/sabre/vobject/bin/mergeduplicates.php
+++ b/vendor/sabre/vobject/bin/mergeduplicates.php
@@ -157,7 +157,7 @@ while ($vcard = $splitter->getNext()) {
// echo $newProp->serialize() . " does not appear in earlier vcard!\n";
$stats['Error']++;
- if ($debug) fwrite($debug, "Missing '" . $newProp->name . "' property in duplicate. Earlier vcard:\n" . $collectedNames[$fn]->serialize() . "\n\nLater:\n" . $vcard->serialize() . "\n\n");
+ if ($debug) fwrite($debug, "Missing '" . $newProp->name . "' property in duplicate. Earlier vcard:\n" . $collectedNames[$fn]->serialize() . "\n\nLater:\n" . $vcard->serialize() . "\n\n");
$vcard->destroy();
continue 2;
diff --git a/vendor/sabre/vobject/composer.json b/vendor/sabre/vobject/composer.json
new file mode 100644
index 000000000..bd6348a82
--- /dev/null
+++ b/vendor/sabre/vobject/composer.json
@@ -0,0 +1,88 @@
+{
+ "name": "sabre/vobject",
+ "description" : "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects",
+ "keywords" : [
+ "iCalendar",
+ "iCal",
+ "vCalendar",
+ "vCard",
+ "jCard",
+ "jCal",
+ "ics",
+ "vcf",
+ "xCard",
+ "xCal",
+ "freebusy",
+ "recurrence",
+ "availability",
+ "rfc2425",
+ "rfc2426",
+ "rfc2739",
+ "rfc4770",
+ "rfc5545",
+ "rfc5546",
+ "rfc6321",
+ "rfc6350",
+ "rfc6351",
+ "rfc6474",
+ "rfc6638",
+ "rfc6715",
+ "rfc6868"
+ ],
+ "homepage" : "http://sabre.io/vobject/",
+ "license" : "BSD-3-Clause",
+ "require" : {
+ "php" : ">=5.5",
+ "ext-mbstring" : "*",
+ "sabre/xml" : "~1.1"
+ },
+ "require-dev" : {
+ "phpunit/phpunit" : "*",
+ "sabre/cs" : "~0.0.3"
+
+ },
+ "suggest" : {
+ "hoa/bench" : "If you would like to run the benchmark scripts"
+ },
+ "authors" : [
+ {
+ "name" : "Evert Pot",
+ "email" : "me@evertpot.com",
+ "homepage" : "http://evertpot.com/",
+ "role" : "Developer"
+ },
+ {
+ "name" : "Dominik Tobschall",
+ "email" : "dominik@fruux.com",
+ "homepage" : "http://tobschall.de/",
+ "role" : "Developer"
+ },
+ {
+ "name" : "Ivan Enderlin",
+ "email" : "ivan.enderlin@hoa-project.net",
+ "homepage" : "http://mnt.io/",
+ "role" : "Developer"
+ }
+ ],
+ "support" : {
+ "forum" : "https://groups.google.com/group/sabredav-discuss",
+ "source" : "https://github.com/fruux/sabre-vobject"
+ },
+ "autoload" : {
+ "psr-4" : {
+ "Sabre\\VObject\\" : "lib/"
+ }
+ },
+ "bin" : [
+ "bin/vobject",
+ "bin/generate_vcards"
+ ],
+ "extra" : {
+ "branch-alias" : {
+ "dev-master" : "4.0.x-dev"
+ }
+ },
+ "config" : {
+ "bin-dir" : "bin"
+ }
+}
diff --git a/vendor/sabre/vobject/lib/Component/VTimeZone.php b/vendor/sabre/vobject/lib/Component/VTimeZone.php
index d5d886947..f6eb6cba1 100644
--- a/vendor/sabre/vobject/lib/Component/VTimeZone.php
+++ b/vendor/sabre/vobject/lib/Component/VTimeZone.php
@@ -53,8 +53,7 @@ class VTimeZone extends VObject\Component {
'LAST-MODIFIED' => '?',
'TZURL' => '?',
- // At least 1 STANDARD or DAYLIGHT must appear, or more. But both
- // cannot appear in the same VTIMEZONE.
+ // At least 1 STANDARD or DAYLIGHT must appear.
//
// The validator is not specific yet to pick this up, so these
// rules are too loose.
diff --git a/vendor/sabre/vobject/lib/DateTimeParser.php b/vendor/sabre/vobject/lib/DateTimeParser.php
index fc568abb0..443bbb660 100644
--- a/vendor/sabre/vobject/lib/DateTimeParser.php
+++ b/vendor/sabre/vobject/lib/DateTimeParser.php
@@ -43,7 +43,12 @@ class DateTimeParser {
if ($matches[7] === 'Z' || is_null($tz)) {
$tz = new DateTimeZone('UTC');
}
- $date = new DateTimeImmutable($matches[1] . '-' . $matches[2] . '-' . $matches[3] . ' ' . $matches[4] . ':' . $matches[5] . ':' . $matches[6], $tz);
+
+ try {
+ $date = new DateTimeImmutable($matches[1] . '-' . $matches[2] . '-' . $matches[3] . ' ' . $matches[4] . ':' . $matches[5] . ':' . $matches[6], $tz);
+ } catch (\Exception $e) {
+ throw new InvalidDataException('The supplied iCalendar datetime value is incorrect: ' . $dt);
+ }
return $date;
@@ -70,7 +75,11 @@ class DateTimeParser {
$tz = new DateTimeZone('UTC');
}
- $date = new DateTimeImmutable($matches[1] . '-' . $matches[2] . '-' . $matches[3], $tz);
+ try {
+ $date = new DateTimeImmutable($matches[1] . '-' . $matches[2] . '-' . $matches[3], $tz);
+ } catch (\Exception $e) {
+ throw new InvalidDataException('The supplied iCalendar date value is incorrect: ' . $date);
+ }
return $date;
diff --git a/vendor/sabre/vobject/lib/Property.php b/vendor/sabre/vobject/lib/Property.php
index 112775131..1aaa3ed58 100644
--- a/vendor/sabre/vobject/lib/Property.php
+++ b/vendor/sabre/vobject/lib/Property.php
@@ -579,7 +579,7 @@ abstract class Property extends Node {
// Checking if the propertyname does not contain any invalid bytes.
if (!preg_match('/^([A-Z0-9-]+)$/', $this->name)) {
$warnings[] = [
- 'level' => 1,
+ 'level' => $options & self::REPAIR ? 1 : 3,
'message' => 'The propertyname: ' . $this->name . ' contains invalid characters. Only A-Z, 0-9 and - are allowed',
'node' => $this,
];
@@ -599,7 +599,7 @@ abstract class Property extends Node {
if ($this->root->getDocumentType() === Document::VCARD40) {
$warnings[] = [
- 'level' => 1,
+ 'level' => 3,
'message' => 'ENCODING parameter is not valid in vCard 4.',
'node' => $this
];
@@ -623,7 +623,7 @@ abstract class Property extends Node {
}
if ($allowedEncoding && !in_array(strtoupper($encoding), $allowedEncoding)) {
$warnings[] = [
- 'level' => 1,
+ 'level' => 3,
'message' => 'ENCODING=' . strtoupper($encoding) . ' is not valid for this document type.',
'node' => $this
];
diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php b/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php
index a3c36dc64..8392a5cc1 100644
--- a/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php
+++ b/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php
@@ -260,21 +260,39 @@ class Recur extends Property {
foreach ($values as $key => $value) {
- if (empty($value)) {
+ if ($value === '') {
$warnings[] = [
- 'level' => $repair ? 3 : 1,
+ 'level' => $repair ? 1 : 3,
'message' => 'Invalid value for ' . $key . ' in ' . $this->name,
'node' => $this
];
if ($repair) {
unset($values[$key]);
}
+ } elseif ($key == 'BYMONTH') {
+ $byMonth = (array)$value;
+ foreach ($byMonth as $i => $v) {
+ if (!is_numeric($v) || (int)$v < 1 || (int)$v > 12) {
+ $warnings[] = [
+ 'level' => $repair ? 1 : 3,
+ 'message' => 'BYMONTH in RRULE must have value(s) between 1 and 12!',
+ 'node' => $this
+ ];
+ if ($repair) {
+ if (is_array($value)) {
+ unset($values[$key][$i]);
+ } else {
+ unset($values[$key]);
+ }
+ }
+ }
+ }
}
}
if (!isset($values['FREQ'])) {
$warnings[] = [
- 'level' => $repair ? 3 : 1,
+ 'level' => $repair ? 1 : 3,
'message' => 'FREQ is required in ' . $this->name,
'node' => $this
];
diff --git a/vendor/sabre/vobject/lib/Property/Text.php b/vendor/sabre/vobject/lib/Property/Text.php
index 2e16ac534..abc17563f 100644
--- a/vendor/sabre/vobject/lib/Property/Text.php
+++ b/vendor/sabre/vobject/lib/Property/Text.php
@@ -397,7 +397,7 @@ class Text extends Property {
if (count($parts) < $minimum) {
$warnings[] = [
'level' => $options & self::REPAIR ? 1 : 3,
- 'message' => 'The ' . $this->name . ' property must have at least ' . $minimum . ' values. It only has ' . count($parts),
+ 'message' => 'The ' . $this->name . ' property must have at least ' . $minimum . ' values. It only has ' . count($parts),
'node' => $this,
];
if ($options & self::REPAIR) {
diff --git a/vendor/sabre/vobject/lib/Recur/EventIterator.php b/vendor/sabre/vobject/lib/Recur/EventIterator.php
index 86c996aec..f91c336bc 100644
--- a/vendor/sabre/vobject/lib/Recur/EventIterator.php
+++ b/vendor/sabre/vobject/lib/Recur/EventIterator.php
@@ -325,7 +325,7 @@ class EventIterator implements \Iterator {
$index = [];
foreach ($this->overriddenEvents as $key => $event) {
$stamp = $event->DTSTART->getDateTime($this->timeZone)->getTimeStamp();
- $index[$stamp] = $key;
+ $index[$stamp][] = $key;
}
krsort($index);
$this->counter = 0;
@@ -372,8 +372,9 @@ class EventIterator implements \Iterator {
// overridden event may cut ahead.
if ($this->overriddenEventsIndex) {
- $offset = end($this->overriddenEventsIndex);
+ $offsets = end($this->overriddenEventsIndex);
$timestamp = key($this->overriddenEventsIndex);
+ $offset = end($offsets);
if (!$nextDate || $timestamp < $nextDate->getTimeStamp()) {
// Overridden event comes first.
$this->currentOverriddenEvent = $this->overriddenEvents[$offset];
@@ -383,7 +384,10 @@ class EventIterator implements \Iterator {
$this->currentDate = $this->currentOverriddenEvent->DTSTART->getDateTime($this->timeZone);
// Ensuring that this item will only be used once.
- array_pop($this->overriddenEventsIndex);
+ array_pop($this->overriddenEventsIndex[$timestamp]);
+ if (!$this->overriddenEventsIndex[$timestamp]) {
+ array_pop($this->overriddenEventsIndex);
+ }
// Exit point!
return;
@@ -451,7 +455,7 @@ class EventIterator implements \Iterator {
/**
* Overridden event index.
*
- * Key is timestamp, value is the index of the item in the $overriddenEvent
+ * Key is timestamp, value is the list of indexes of the item in the $overriddenEvent
* property.
*
* @var array
diff --git a/vendor/sabre/vobject/lib/Recur/RRuleIterator.php b/vendor/sabre/vobject/lib/Recur/RRuleIterator.php
index 402e2de83..4c89f3ce4 100644
--- a/vendor/sabre/vobject/lib/Recur/RRuleIterator.php
+++ b/vendor/sabre/vobject/lib/Recur/RRuleIterator.php
@@ -718,6 +718,11 @@ class RRuleIterator implements Iterator {
case 'BYMONTH' :
$this->byMonth = (array)$value;
+ foreach ($this->byMonth as $byMonth) {
+ if (!is_numeric($byMonth) || (int)$byMonth < 1 || (int)$byMonth > 12) {
+ throw new InvalidDataException('BYMONTH in RRULE must have value(s) betweeen 1 and 12!');
+ }
+ }
break;
case 'BYSETPOS' :
diff --git a/vendor/sabre/vobject/lib/TimeZoneUtil.php b/vendor/sabre/vobject/lib/TimeZoneUtil.php
index 4873daf92..2a95ae898 100644
--- a/vendor/sabre/vobject/lib/TimeZoneUtil.php
+++ b/vendor/sabre/vobject/lib/TimeZoneUtil.php
@@ -240,10 +240,10 @@ class TimeZoneUtil {
if (!is_null(self::$map)) return;
self::$map = array_merge(
- include __DIR__ . '/timezonedata/windowszones.php',
- include __DIR__ . '/timezonedata/lotuszones.php',
- include __DIR__ . '/timezonedata/exchangezones.php',
- include __DIR__ . '/timezonedata/php-workaround.php'
+ include __DIR__ . '/timezonedata/windowszones.php',
+ include __DIR__ . '/timezonedata/lotuszones.php',
+ include __DIR__ . '/timezonedata/exchangezones.php',
+ include __DIR__ . '/timezonedata/php-workaround.php'
);
}
@@ -260,7 +260,7 @@ class TimeZoneUtil {
* @return array
*/
static function getIdentifiersBC() {
- return include __DIR__ . '/timezonedata/php-bc.php';
+ return include __DIR__ . '/timezonedata/php-bc.php';
}
}
diff --git a/vendor/sabre/vobject/lib/Version.php b/vendor/sabre/vobject/lib/Version.php
index 0b0e16c03..ca9f21960 100644
--- a/vendor/sabre/vobject/lib/Version.php
+++ b/vendor/sabre/vobject/lib/Version.php
@@ -14,6 +14,6 @@ class Version {
/**
* Full version number.
*/
- const VERSION = '4.1.0';
+ const VERSION = '4.1.1';
}
diff --git a/vendor/sabre/xml/.travis.yml b/vendor/sabre/xml/.travis.yml
index 9bba4d451..96396564e 100644
--- a/vendor/sabre/xml/.travis.yml
+++ b/vendor/sabre/xml/.travis.yml
@@ -1,11 +1,9 @@
language: php
php:
- - 5.4
- 5.5
- 5.6
- - 7
- - nightly
- - hhvm
+ - 7.0
+ - 7.1
matrix:
fast_finish: true
@@ -16,10 +14,13 @@ cache:
directories:
- $HOME/.composer/cache
+before_install:
+ - phpenv config-rm xdebug.ini; true
+
+install:
+ - composer install
+
script:
- ./bin/phpunit --configuration tests/phpunit.xml.dist
- ./bin/sabre-cs-fixer fix . --dry-run --diff
-before_script:
- - phpenv config-rm xdebug.ini; true
- - composer install
diff --git a/vendor/sabre/xml/CHANGELOG.md b/vendor/sabre/xml/CHANGELOG.md
index a8085401b..39a39bffe 100644
--- a/vendor/sabre/xml/CHANGELOG.md
+++ b/vendor/sabre/xml/CHANGELOG.md
@@ -1,7 +1,16 @@
ChangeLog
=========
-1.4.2 (????-??-??)
+1.5.0 (2016-10-09)
+------------------
+
+* Now requires PHP 5.5.
+* Using `finally` to always roll back the context stack when serializing.
+* #94: Fixed an infinite loop condition when reading some invalid XML
+ documents.
+
+
+1.4.2 (2016-05-19)
------------------
* The `contextStack` in the Reader object is now correctly rolled back in
diff --git a/vendor/sabre/xml/composer.json b/vendor/sabre/xml/composer.json
new file mode 100644
index 000000000..386f8213f
--- /dev/null
+++ b/vendor/sabre/xml/composer.json
@@ -0,0 +1,53 @@
+{
+ "name": "sabre/xml",
+ "description" : "sabre/xml is an XML library that you may not hate.",
+ "keywords" : [ "XML", "XMLReader", "XMLWriter", "DOM" ],
+ "homepage" : "https://sabre.io/xml/",
+ "license" : "BSD-3-Clause",
+ "require" : {
+ "php" : ">=5.5.5",
+ "ext-xmlwriter" : "*",
+ "ext-xmlreader" : "*",
+ "ext-dom" : "*",
+ "lib-libxml" : ">=2.6.20",
+ "sabre/uri" : ">=1.0,<3.0.0"
+ },
+ "authors" : [
+ {
+ "name" : "Evert Pot",
+ "email" : "me@evertpot.com",
+ "homepage" : "http://evertpot.com/",
+ "role" : "Developer"
+ },
+ {
+ "name": "Markus Staab",
+ "email": "markus.staab@redaxo.de",
+ "role" : "Developer"
+ }
+ ],
+ "support" : {
+ "forum" : "https://groups.google.com/group/sabredav-discuss",
+ "source" : "https://github.com/fruux/sabre-xml"
+ },
+ "autoload" : {
+ "psr-4" : {
+ "Sabre\\Xml\\" : "lib/"
+ },
+ "files": [
+ "lib/Deserializer/functions.php",
+ "lib/Serializer/functions.php"
+ ]
+ },
+ "autoload-dev" : {
+ "psr-4" : {
+ "Sabre\\Xml\\" : "tests/Sabre/Xml/"
+ }
+ },
+ "require-dev": {
+ "sabre/cs": "~1.0.0",
+ "phpunit/phpunit" : "*"
+ },
+ "config" : {
+ "bin-dir" : "bin/"
+ }
+}
diff --git a/vendor/sabre/xml/lib/Element/XmlFragment.php b/vendor/sabre/xml/lib/Element/XmlFragment.php
index 0abfac132..642241ca4 100644
--- a/vendor/sabre/xml/lib/Element/XmlFragment.php
+++ b/vendor/sabre/xml/lib/Element/XmlFragment.php
@@ -2,9 +2,9 @@
namespace Sabre\Xml\Element;
+use Sabre\Xml\Element;
use Sabre\Xml\Reader;
use Sabre\Xml\Writer;
-use Sabre\Xml\Element;
/**
* The XmlFragment element allows you to extract a portion of your xml tree,
diff --git a/vendor/sabre/xml/lib/Reader.php b/vendor/sabre/xml/lib/Reader.php
index f35dc8537..92e5dba96 100644
--- a/vendor/sabre/xml/lib/Reader.php
+++ b/vendor/sabre/xml/lib/Reader.php
@@ -59,22 +59,26 @@ class Reader extends XMLReader {
$previousEntityState = libxml_disable_entity_loader(true);
$previousSetting = libxml_use_internal_errors(true);
- // Really sorry about the silence operator, seems like I have no
- // choice. See:
- //
- // https://bugs.php.net/bug.php?id=64230
- while ($this->nodeType !== self::ELEMENT && @$this->read()) {
- // noop
- }
- $result = $this->parseCurrentElement();
+ try {
+
+ // Really sorry about the silence operator, seems like I have no
+ // choice. See:
+ //
+ // https://bugs.php.net/bug.php?id=64230
+ while ($this->nodeType !== self::ELEMENT && @$this->read()) {
+ // noop
+ }
+ $result = $this->parseCurrentElement();
- $errors = libxml_get_errors();
- libxml_clear_errors();
- libxml_use_internal_errors($previousSetting);
- libxml_disable_entity_loader($previousEntityState);
+ $errors = libxml_get_errors();
+ libxml_clear_errors();
+ if ($errors) {
+ throw new LibXMLException($errors);
+ }
- if ($errors) {
- throw new LibXMLException($errors);
+ } finally {
+ libxml_use_internal_errors($previousSetting);
+ libxml_disable_entity_loader($previousEntityState);
}
return $result;
@@ -138,60 +142,62 @@ class Reader extends XMLReader {
$this->elementMap = $elementMap;
}
- // Really sorry about the silence operator, seems like I have no
- // choice. See:
- //
- // https://bugs.php.net/bug.php?id=64230
- if (!@$this->read()) {
- if (!is_null($elementMap)) {
- $this->popContext();
- }
- return false;
- }
-
- while (true) {
-
- if (!$this->isValid()) {
+ try {
+ // Really sorry about the silence operator, seems like I have no
+ // choice. See:
+ //
+ // https://bugs.php.net/bug.php?id=64230
+ if (!@$this->read()) {
$errors = libxml_get_errors();
-
+ libxml_clear_errors();
if ($errors) {
- libxml_clear_errors();
- if (!is_null($elementMap)) {
- $this->popContext();
- }
throw new LibXMLException($errors);
}
+ throw new ParseException('This should never happen (famous last words)');
}
- switch ($this->nodeType) {
- case self::ELEMENT :
- $elements[] = $this->parseCurrentElement();
- break;
- case self::TEXT :
- case self::CDATA :
- $text .= $this->value;
- $this->read();
- break;
- case self::END_ELEMENT :
- // Ensuring we are moving the cursor after the end element.
- $this->read();
- break 2;
- case self::NONE :
- if (!is_null($elementMap)) {
- $this->popContext();
+ while (true) {
+
+ if (!$this->isValid()) {
+
+ $errors = libxml_get_errors();
+
+ if ($errors) {
+ libxml_clear_errors();
+ throw new LibXMLException($errors);
}
- throw new ParseException('We hit the end of the document prematurely. This likely means that some parser "eats" too many elements. Do not attempt to continue parsing.');
- default :
- // Advance to the next element
- $this->read();
- break;
+ }
+
+ switch ($this->nodeType) {
+ case self::ELEMENT :
+ $elements[] = $this->parseCurrentElement();
+ break;
+ case self::TEXT :
+ case self::CDATA :
+ $text .= $this->value;
+ $this->read();
+ break;
+ case self::END_ELEMENT :
+ // Ensuring we are moving the cursor after the end element.
+ $this->read();
+ break 2;
+ case self::NONE :
+ throw new ParseException('We hit the end of the document prematurely. This likely means that some parser "eats" too many elements. Do not attempt to continue parsing.');
+ default :
+ // Advance to the next element
+ $this->read();
+ break;
+ }
+
}
- }
+ } finally {
+
+ if (!is_null($elementMap)) {
+ $this->popContext();
+ }
- if (!is_null($elementMap)) {
- $this->popContext();
}
return ($elements ? $elements : $text);
@@ -304,7 +310,7 @@ class Reader extends XMLReader {
$deserializer = $this->elementMap[$name];
if (is_subclass_of($deserializer, 'Sabre\\Xml\\XmlDeserializable')) {
- return [ $deserializer, 'xmlDeserialize' ];
+ return [$deserializer, 'xmlDeserialize'];
}
if (is_callable($deserializer)) {
diff --git a/vendor/sabre/xml/lib/Version.php b/vendor/sabre/xml/lib/Version.php
index f199e7158..7edb40d67 100644
--- a/vendor/sabre/xml/lib/Version.php
+++ b/vendor/sabre/xml/lib/Version.php
@@ -14,6 +14,6 @@ class Version {
/**
* Full version number
*/
- const VERSION = '1.4.1';
+ const VERSION = '1.5.0';
}
diff --git a/vendor/sabre/xml/lib/Writer.php b/vendor/sabre/xml/lib/Writer.php
index adfbe0cb0..09d4cb321 100644
--- a/vendor/sabre/xml/lib/Writer.php
+++ b/vendor/sabre/xml/lib/Writer.php
@@ -127,7 +127,7 @@ class Writer extends XMLWriter {
if (array_key_exists($namespace, $this->namespaceMap)) {
$result = $this->startElementNS(
- $this->namespaceMap[$namespace] === '' ? null : $this->namespaceMap[$namespace],
+ $this->namespaceMap[$namespace] === '' ? null : $this->namespaceMap[$namespace],
$localName,
null
);
diff --git a/view/css/bootstrap-red.css b/view/css/bootstrap-red.css
index b68517e25..cea911440 100644
--- a/view/css/bootstrap-red.css
+++ b/view/css/bootstrap-red.css
@@ -60,8 +60,7 @@ aside .nav-pills > li > a,
padding: 6px 10px;
}
-.wall-item-tools .dropdown-menu,
-.section-title-wrapper .dropdown-menu {
+.wall-item-tools .dropdown-menu {
min-width: auto;
}
diff --git a/view/css/conversation.css b/view/css/conversation.css
index 9272ed3f6..aec457302 100644
--- a/view/css/conversation.css
+++ b/view/css/conversation.css
@@ -203,6 +203,10 @@ a.wall-item-name-link {
filter:alpha(opacity=100);
}
+.item-act-list {
+ width: 20px;
+}
+
.shared_header {
margin-bottom: 20px;
}
@@ -332,6 +336,19 @@ a.wall-item-name-link {
/* bb-code */
+/* prevent [toc] bbcode links to scroll the titles behind the navbar */
+.section-content-wrapper h1,
+.section-content-wrapper h2,
+.section-content-wrapper h3,
+.section-content-wrapper h4 {
+ padding-top: 60px;
+ margin-top: -40px;
+}
+
+.toc {
+ margin-top: 1em;
+}
+
code {
font-family: Courier, monospace;
font-size: 1em;
diff --git a/view/css/default.css b/view/css/default.css
index db0628cb3..67a411d6e 100644
--- a/view/css/default.css
+++ b/view/css/default.css
@@ -15,12 +15,14 @@ main {
}
aside {
+ position: relative;
display: table-cell;
vertical-align: top;
padding: 71px 7px 0px 7px;
}
section {
+ position: relative;
width: 100%;
display: table-cell;
vertical-align: top;
diff --git a/view/css/mod_help.css b/view/css/mod_help.css
new file mode 100644
index 000000000..f59a40894
--- /dev/null
+++ b/view/css/mod_help.css
@@ -0,0 +1,29 @@
+.doco-list-group-item > a {
+ font-weight: bold;
+}
+
+.sub-menu {
+ margin: 3px 0px 10px 10px;
+}
+
+#doco-content h3 {
+ border-bottom: #ccc 3px solid;
+ padding-bottom: 0.3em;
+}
+
+#doco-content h4 {
+ text-decoration: underline;
+}
+
+#doco-content h5 {
+ text-decoration: underline;
+}
+
+#region_1 .widget ul ul {
+ list-style-type: none;
+}
+
+.toc-content li,
+ #doco-top-toc li {
+ padding: 3px 0px;
+}
diff --git a/view/css/mod_wiki.css b/view/css/mod_wiki.css
new file mode 100644
index 000000000..49eb89ecc
--- /dev/null
+++ b/view/css/mod_wiki.css
@@ -0,0 +1,54 @@
+#ace-editor {
+ position: relative;
+ width: 100%;
+ height: 500px;
+ border: 1px solid #ccc;
+ border-top: 0px;
+}
+
+#editor {
+ width: 100%;
+ height: 500px;
+ border: 1px solid #ccc;
+ border-top: 0px;
+ display: inherit;
+}
+
+#id_commitMsg_wrapper {
+ margin-top: 3px;
+}
+
+.fade.in {
+ -webkit-transition: opacity 0.5s 0.5s ease;
+ -moz-transition: opacity 0.5s 0.5s ease;
+ -o-transition: opacity 0.5s 0.5s ease;
+ transition: opacity 0.5s 0.5s ease;
+}
+
+#new-wiki-form-wrapper {
+ display: none;
+}
+
+#wikis-index {
+ width: 100%;
+}
+
+#wikis-index th:nth-child(1),
+#wikis-index td:nth-child(1){
+ padding: 7px 3px 7px 10px;
+}
+
+#wikis-index th:nth-child(4),
+#wikis-index td:nth-child(4){
+ padding: 7px 10px 7px 7px;
+}
+
+#wikis-index th:nth-child(5),
+#wikis-index td:nth-child(5){
+ padding: 7px 10px 7px 7px;
+}
+
+.wikis-index-tool {
+ padding: 7px 10px;
+}
+
diff --git a/view/css/widgets.css b/view/css/widgets.css
index 2a7c57f53..abaf03038 100644
--- a/view/css/widgets.css
+++ b/view/css/widgets.css
@@ -18,6 +18,41 @@
word-wrap: break-word;
}
+.widget-nav-pills-icons {
+ opacity: 0;
+ padding: 6px 10px;
+ float: right;
+ position: relative;
+ z-index:1;
+}
+
+
+.widget-nav-pills-checkbox {
+ padding: 6px 10px;
+ float: right;
+ position: relative;
+ z-index:1;
+ cursor: pointer;
+}
+
+i.widget-nav-pills-icons,
+i.widget-nav-pills-checkbox {
+ margin-top: 2px;
+}
+
+.widget-nav-pills-icons:hover + a {
+ background-color: #eee;
+}
+
+.widget-nav-pills-checkbox:hover + a {
+ background-color: #eee;
+}
+
+li:hover .widget-nav-pills-icons {
+ opacity: 1;
+}
+
+
/* suggest */
.suggest-widget-more {
@@ -30,7 +65,7 @@
padding: 5px;
width: 100%;
resize: vertical;
- height: 250px;
+ min-height: 250px;
}
/* saved searches */
@@ -151,3 +186,7 @@ li:hover .group-edit-icon {
.cover-photo-subtitle {
font-size: 20px;
}
+
+a.wikilist {
+ z-index: 1;
+}
diff --git a/view/de/hmessages.po b/view/de/hmessages.po
index 8282f354f..fbdb33166 100644
--- a/view/de/hmessages.po
+++ b/view/de/hmessages.po
@@ -1,6 +1,6 @@
-# Hubzilla Project
-# Copyright (C) 2012-2014 the Hubzilla Project
-# This file is distributed under the same license as the Red package.
+# hubzilla
+# Copyright (C) 2012-2016 hubzilla
+# This file is distributed under the same license as the hubzilla package.
#
# Translators:
# Alex <info@pixelbits.de>, 2013
@@ -10,6 +10,7 @@
# Einer von Vielen <tom@jfellow.net>, 2013
# Ettore Atalan <atalanttore@googlemail.com>, 2015-2016
# Frank Dieckmann <frank@lumina-verte.org>, 2013
+# Harald Klimach <harald@klimachs.de>, 2016
# JooBee <d13@raclan.de>, 2014
# Kai <kai@proppower.de>, 2015
# Oliver <post@toktan.org>, 2015-2016
@@ -24,8 +25,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-09-17 14:51-0700\n"
-"PO-Revision-Date: 2016-09-22 11:28+0000\n"
+"POT-Creation-Date: 2016-12-09 00:05-0800\n"
+"PO-Revision-Date: 2016-12-10 12:27+0000\n"
"Last-Translator: Phellmes <forum@suschka.de>\n"
"Language-Team: German (http://www.transifex.com/Friendica/red-matrix/language/de/)\n"
"MIME-Version: 1.0\n"
@@ -34,378 +35,412 @@ msgstr ""
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../../Zotlabs/Access/PermissionRoles.php:182
+#: ../../Zotlabs/Access/PermissionRoles.php:227
#: ../../include/permissions.php:945
msgid "Social Networking"
msgstr "Soziales Netzwerk"
-#: ../../Zotlabs/Access/PermissionRoles.php:183
+#: ../../Zotlabs/Access/PermissionRoles.php:228
#: ../../include/permissions.php:945
msgid "Social - Mostly Public"
msgstr "Soziales Netzwerk - Weitgehend öffentlich"
-#: ../../Zotlabs/Access/PermissionRoles.php:184
+#: ../../Zotlabs/Access/PermissionRoles.php:229
#: ../../include/permissions.php:945
msgid "Social - Restricted"
msgstr "Soziales Netzwerk - Beschränkt"
-#: ../../Zotlabs/Access/PermissionRoles.php:185
+#: ../../Zotlabs/Access/PermissionRoles.php:230
#: ../../include/permissions.php:945
msgid "Social - Private"
msgstr "Soziales Netzwerk - Privat"
-#: ../../Zotlabs/Access/PermissionRoles.php:188
+#: ../../Zotlabs/Access/PermissionRoles.php:233
#: ../../include/permissions.php:946
msgid "Community Forum"
msgstr "Forum"
-#: ../../Zotlabs/Access/PermissionRoles.php:189
+#: ../../Zotlabs/Access/PermissionRoles.php:234
#: ../../include/permissions.php:946
msgid "Forum - Mostly Public"
msgstr "Forum - Weitgehend öffentlich"
-#: ../../Zotlabs/Access/PermissionRoles.php:190
+#: ../../Zotlabs/Access/PermissionRoles.php:235
#: ../../include/permissions.php:946
msgid "Forum - Restricted"
msgstr "Forum - Beschränkt"
-#: ../../Zotlabs/Access/PermissionRoles.php:191
+#: ../../Zotlabs/Access/PermissionRoles.php:236
#: ../../include/permissions.php:946
msgid "Forum - Private"
msgstr "Forum - Privat"
-#: ../../Zotlabs/Access/PermissionRoles.php:194
+#: ../../Zotlabs/Access/PermissionRoles.php:239
#: ../../include/permissions.php:947
msgid "Feed Republish"
msgstr "Teilen von Feeds"
-#: ../../Zotlabs/Access/PermissionRoles.php:195
+#: ../../Zotlabs/Access/PermissionRoles.php:240
#: ../../include/permissions.php:947
msgid "Feed - Mostly Public"
msgstr "Feeds - Weitgehend öffentlich"
-#: ../../Zotlabs/Access/PermissionRoles.php:196
+#: ../../Zotlabs/Access/PermissionRoles.php:241
#: ../../include/permissions.php:947
msgid "Feed - Restricted"
msgstr "Feeds - Beschränkt"
-#: ../../Zotlabs/Access/PermissionRoles.php:199
+#: ../../Zotlabs/Access/PermissionRoles.php:244
#: ../../include/permissions.php:948
msgid "Special Purpose"
msgstr "Für besondere Zwecke"
-#: ../../Zotlabs/Access/PermissionRoles.php:200
+#: ../../Zotlabs/Access/PermissionRoles.php:245
#: ../../include/permissions.php:948
msgid "Special - Celebrity/Soapbox"
msgstr "Speziell - Mitteilungs-Kanal (keine Kommentare)"
-#: ../../Zotlabs/Access/PermissionRoles.php:201
+#: ../../Zotlabs/Access/PermissionRoles.php:246
#: ../../include/permissions.php:948
msgid "Special - Group Repository"
msgstr "Speziell - Gruppenarchiv"
-#: ../../Zotlabs/Access/PermissionRoles.php:204
+#: ../../Zotlabs/Access/PermissionRoles.php:249
#: ../../Zotlabs/Module/Register.php:213
#: ../../Zotlabs/Module/New_channel.php:132
-#: ../../Zotlabs/Module/Settings/Channel.php:442
-#: ../../include/permissions.php:949 ../../include/selectors.php:49
-#: ../../include/selectors.php:66 ../../include/selectors.php:104
-#: ../../include/selectors.php:140
+#: ../../Zotlabs/Module/Settings/Channel.php:445
+#: ../../extend/addon/addon/cdav/cdav.php:277
+#: ../../extend/addon/addon/cdav/cdav.php:284
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1148
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+#: ../../include/selectors.php:104 ../../include/selectors.php:140
+#: ../../include/permissions.php:949
msgid "Other"
msgstr "Andere"
-#: ../../Zotlabs/Access/PermissionRoles.php:205
+#: ../../Zotlabs/Access/PermissionRoles.php:250
#: ../../include/permissions.php:949
msgid "Custom/Expert Mode"
msgstr "Benutzerdefiniert/Expertenmodus"
-#: ../../Zotlabs/Access/Permissions.php:30
+#: ../../Zotlabs/Access/Permissions.php:46
msgid "Can view my channel stream and posts"
msgstr "Kann meinen Kanal-Stream und meine Beiträge sehen"
-#: ../../Zotlabs/Access/Permissions.php:31 ../../include/permissions.php:42
+#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
msgid "Can send me their channel stream and posts"
msgstr "Kann mir die Beiträge aus seinem/ihrem Kanal schicken"
-#: ../../Zotlabs/Access/Permissions.php:32 ../../include/permissions.php:36
+#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
msgid "Can view my default channel profile"
msgstr "Kann mein Standardprofil sehen"
-#: ../../Zotlabs/Access/Permissions.php:33 ../../include/permissions.php:37
+#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
msgid "Can view my connections"
msgstr "Kann meine Verbindungen sehen"
-#: ../../Zotlabs/Access/Permissions.php:34 ../../include/permissions.php:38
+#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
msgid "Can view my file storage and photos"
msgstr "Kann meine Datei- und Bilderordner sehen"
-#: ../../Zotlabs/Access/Permissions.php:35
+#: ../../Zotlabs/Access/Permissions.php:51
msgid "Can upload/modify my file storage and photos"
msgstr "Kann in meine Datei- und Bilderordner hochladen/ändern"
-#: ../../Zotlabs/Access/Permissions.php:36
+#: ../../Zotlabs/Access/Permissions.php:52
msgid "Can view my channel webpages"
msgstr "Kann die Webseiten meines Kanals sehen"
-#: ../../Zotlabs/Access/Permissions.php:37
+#: ../../Zotlabs/Access/Permissions.php:53
msgid "Can create/edit my channel webpages"
msgstr "Kann Webseiten in meinem Kanal erstellen/ändern"
-#: ../../Zotlabs/Access/Permissions.php:38
+#: ../../Zotlabs/Access/Permissions.php:54
msgid "Can post on my channel (wall) page"
msgstr "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen"
-#: ../../Zotlabs/Access/Permissions.php:39 ../../include/permissions.php:44
+#: ../../Zotlabs/Access/Permissions.php:55 ../../include/permissions.php:44
msgid "Can comment on or like my posts"
msgstr "Darf meine Beiträge kommentieren und mögen/nicht mögen"
-#: ../../Zotlabs/Access/Permissions.php:40 ../../include/permissions.php:45
+#: ../../Zotlabs/Access/Permissions.php:56 ../../include/permissions.php:45
msgid "Can send me private mail messages"
msgstr "Kann mir private Nachrichten schicken"
-#: ../../Zotlabs/Access/Permissions.php:41
+#: ../../Zotlabs/Access/Permissions.php:57
msgid "Can like/dislike profiles and profile things"
msgstr "Kann Profile und Profilsachen mögen/nicht mögen"
-#: ../../Zotlabs/Access/Permissions.php:42
+#: ../../Zotlabs/Access/Permissions.php:58
msgid "Can forward to all my channel connections via @+ mentions in posts"
msgstr "Kann an alle meine Verbindungen via @-Erwähnungen Nachrichten weiterleiten"
-#: ../../Zotlabs/Access/Permissions.php:43
+#: ../../Zotlabs/Access/Permissions.php:59
msgid "Can chat with me"
msgstr "Kann mit mir chatten"
-#: ../../Zotlabs/Access/Permissions.php:44 ../../include/permissions.php:53
+#: ../../Zotlabs/Access/Permissions.php:60 ../../include/permissions.php:53
msgid "Can source my public posts in derived channels"
msgstr "Kann meine öffentlichen Beiträge als Quellen für Kanäle verwenden"
-#: ../../Zotlabs/Access/Permissions.php:45
+#: ../../Zotlabs/Access/Permissions.php:61
msgid "Can administer my channel"
msgstr "Kann meinen Kanal administrieren"
-#: ../../Zotlabs/Storage/Browser.php:107 ../../Zotlabs/Storage/Browser.php:239
+#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
msgid "parent"
msgstr "Übergeordnetes Verzeichnis"
-#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2711
+#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2682
msgid "Collection"
msgstr "Sammlung"
-#: ../../Zotlabs/Storage/Browser.php:134
+#: ../../Zotlabs/Storage/Browser.php:133
msgid "Principal"
msgstr "Prinzipal"
-#: ../../Zotlabs/Storage/Browser.php:137
+#: ../../Zotlabs/Storage/Browser.php:136
msgid "Addressbook"
msgstr "Adressbuch"
-#: ../../Zotlabs/Storage/Browser.php:140
+#: ../../Zotlabs/Storage/Browser.php:139
msgid "Calendar"
msgstr "Kalender"
-#: ../../Zotlabs/Storage/Browser.php:143
+#: ../../Zotlabs/Storage/Browser.php:142
msgid "Schedule Inbox"
msgstr "Posteingang für überwachte Kalender"
-#: ../../Zotlabs/Storage/Browser.php:146
+#: ../../Zotlabs/Storage/Browser.php:145
msgid "Schedule Outbox"
msgstr "Postausgang für überwachte Kalender"
-#: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Module/Photos.php:789
+#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Module/Photos.php:789
#: ../../Zotlabs/Module/Photos.php:1249
-#: ../../Zotlabs/Module/Embedphotos.php:147 ../../Zotlabs/Lib/Apps.php:490
-#: ../../Zotlabs/Lib/Apps.php:565 ../../include/conversation.php:1033
-#: ../../include/widgets.php:1679
+#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:490
+#: ../../Zotlabs/Lib/Apps.php:565
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
+#: ../../include/widgets.php:1754 ../../include/conversation.php:1047
msgid "Unknown"
msgstr "Unbekannt"
-#: ../../Zotlabs/Storage/Browser.php:226 ../../Zotlabs/Module/Fbrowser.php:85
+#: ../../Zotlabs/Storage/Browser.php:224 ../../Zotlabs/Module/Fbrowser.php:85
#: ../../Zotlabs/Lib/Apps.php:217 ../../include/nav.php:96
-#: ../../include/conversation.php:1678
+#: ../../include/conversation.php:1699
msgid "Files"
msgstr "Dateien"
-#: ../../Zotlabs/Storage/Browser.php:227
+#: ../../Zotlabs/Storage/Browser.php:225
msgid "Total"
msgstr "Summe"
-#: ../../Zotlabs/Storage/Browser.php:229
+#: ../../Zotlabs/Storage/Browser.php:227
msgid "Shared"
msgstr "Geteilt"
-#: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:323
-#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/Webpages.php:239
-#: ../../Zotlabs/Module/New_channel.php:147
+#: ../../Zotlabs/Storage/Browser.php:228 ../../Zotlabs/Storage/Browser.php:321
+#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/New_channel.php:147
#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Layouts.php:184
+#: ../../Zotlabs/Module/Webpages.php:239
+#: ../../extend/addon/addon/cdav/include/widgets.php:127
+#: ../../extend/addon/addon/cdav/include/widgets.php:164
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1151
+#: ../../include/widgets.php:969
msgid "Create"
msgstr "Erstelle"
-#: ../../Zotlabs/Storage/Browser.php:231 ../../Zotlabs/Storage/Browser.php:325
+#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:323
#: ../../Zotlabs/Module/Cover_photo.php:357
-#: ../../Zotlabs/Module/Profile_photo.php:390
#: ../../Zotlabs/Module/Photos.php:816 ../../Zotlabs/Module/Photos.php:1370
-#: ../../Zotlabs/Module/Embedphotos.php:159 ../../include/widgets.php:1692
+#: ../../Zotlabs/Module/Profile_photo.php:410
+#: ../../Zotlabs/Module/Embedphotos.php:157
+#: ../../extend/addon/addon/cdav/include/widgets.php:132
+#: ../../extend/addon/addon/cdav/include/widgets.php:168
+#: ../../include/widgets.php:1767
msgid "Upload"
msgstr "Hochladen"
-#: ../../Zotlabs/Storage/Browser.php:235
-#: ../../Zotlabs/Module/Admin/Channels.php:163
-#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Chat.php:250
+#: ../../Zotlabs/Storage/Browser.php:233
+#: ../../Zotlabs/Module/Admin/Channels.php:159
+#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Wiki.php:151
#: ../../Zotlabs/Module/Settings/Oauth.php:89
#: ../../Zotlabs/Module/Settings/Oauth.php:115
+#: ../../Zotlabs/Module/Chat.php:250
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1136
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:132
msgid "Name"
msgstr "Name"
-#: ../../Zotlabs/Storage/Browser.php:236
+#: ../../Zotlabs/Storage/Browser.php:234 ../../Zotlabs/Module/Wiki.php:152
msgid "Type"
msgstr "Typ"
-#: ../../Zotlabs/Storage/Browser.php:237
-#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1372
+#: ../../Zotlabs/Storage/Browser.php:235
+#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1390
msgid "Size"
msgstr "Größe"
-#: ../../Zotlabs/Storage/Browser.php:238
+#: ../../Zotlabs/Storage/Browser.php:236
#: ../../Zotlabs/Module/Sharedwithme.php:102
msgid "Last Modified"
msgstr "Zuletzt geändert"
-#: ../../Zotlabs/Storage/Browser.php:240
-#: ../../Zotlabs/Module/Admin/Profs.php:154
+#: ../../Zotlabs/Storage/Browser.php:238
#: ../../Zotlabs/Module/Connections.php:290
#: ../../Zotlabs/Module/Connections.php:310
-#: ../../Zotlabs/Module/Editblock.php:109
+#: ../../Zotlabs/Module/Admin/Profs.php:154
#: ../../Zotlabs/Module/Editlayout.php:114
#: ../../Zotlabs/Module/Editwebpage.php:145 ../../Zotlabs/Module/Menu.php:112
-#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Blocks.php:160
-#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Editpost.php:84
-#: ../../Zotlabs/Module/Thing.php:260
-#: ../../Zotlabs/Module/Settings/Oauth.php:149 ../../Zotlabs/Lib/Apps.php:341
-#: ../../Zotlabs/Lib/ThreadItem.php:106 ../../include/page_widgets.php:9
-#: ../../include/page_widgets.php:39 ../../include/channel.php:959
-#: ../../include/channel.php:963 ../../include/menu.php:113
+#: ../../Zotlabs/Module/Editblock.php:109 ../../Zotlabs/Module/Editpost.php:84
+#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:192
+#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Wiki.php:144
+#: ../../Zotlabs/Module/Wiki.php:252
+#: ../../Zotlabs/Module/Settings/Oauth.php:149
+#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Lib/Apps.php:341
+#: ../../Zotlabs/Lib/ThreadItem.php:106
+#: ../../extend/addon/addon/cdav/include/widgets.php:125
+#: ../../extend/addon/addon/cdav/include/widgets.php:161
+#: ../../include/channel.php:961 ../../include/channel.php:965
+#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
+#: ../../include/menu.php:113 ../../include/widgets.php:965
msgid "Edit"
msgstr "Bearbeiten"
-#: ../../Zotlabs/Storage/Browser.php:241
-#: ../../Zotlabs/Module/Admin/Accounts.php:174
-#: ../../Zotlabs/Module/Admin/Channels.php:153
-#: ../../Zotlabs/Module/Admin/Profs.php:155
+#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Module/Connedit.php:635
#: ../../Zotlabs/Module/Connections.php:263
-#: ../../Zotlabs/Module/Editblock.php:134
+#: ../../Zotlabs/Module/Admin/Profs.php:155
+#: ../../Zotlabs/Module/Admin/Accounts.php:173
+#: ../../Zotlabs/Module/Admin/Channels.php:149
#: ../../Zotlabs/Module/Editlayout.php:137
-#: ../../Zotlabs/Module/Editwebpage.php:170 ../../Zotlabs/Module/Group.php:177
-#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Module/Blocks.php:162
-#: ../../Zotlabs/Module/Connedit.php:607 ../../Zotlabs/Module/Thing.php:261
-#: ../../Zotlabs/Module/Photos.php:1179
-#: ../../Zotlabs/Module/Settings/Oauth.php:150 ../../Zotlabs/Lib/Apps.php:342
-#: ../../Zotlabs/Lib/ThreadItem.php:126 ../../include/conversation.php:660
+#: ../../Zotlabs/Module/Editwebpage.php:170
+#: ../../Zotlabs/Module/Editblock.php:134 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Photos.php:1179 ../../Zotlabs/Module/Blocks.php:162
+#: ../../Zotlabs/Module/Webpages.php:242
+#: ../../Zotlabs/Module/Settings/Oauth.php:150
+#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Lib/Apps.php:342
+#: ../../Zotlabs/Lib/ThreadItem.php:126
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:864
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1153
+#: ../../include/conversation.php:676
msgid "Delete"
msgstr "Löschen"
-#: ../../Zotlabs/Storage/Browser.php:301
+#: ../../Zotlabs/Storage/Browser.php:299
#, php-format
msgid "You are using %1$s of your available file storage."
msgstr "Sie verwenden %1$s von Ihrem verfügbaren Dateispeicher."
-#: ../../Zotlabs/Storage/Browser.php:306
+#: ../../Zotlabs/Storage/Browser.php:304
#, php-format
msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
msgstr "Sie verwenden %1$s von %2$s verfügbarem Dateispeicher. (%3$s&#37;)"
-#: ../../Zotlabs/Storage/Browser.php:317
+#: ../../Zotlabs/Storage/Browser.php:315
msgid "WARNING:"
msgstr "WARNUNG:"
-#: ../../Zotlabs/Storage/Browser.php:322
+#: ../../Zotlabs/Storage/Browser.php:320
msgid "Create new folder"
msgstr "Neuen Ordner anlegen"
-#: ../../Zotlabs/Storage/Browser.php:324
+#: ../../Zotlabs/Storage/Browser.php:322
msgid "Upload file"
msgstr "Datei hochladen"
-#: ../../Zotlabs/Storage/Browser.php:337
+#: ../../Zotlabs/Storage/Browser.php:335
msgid "Drop files here to immediately upload"
msgstr "Dateien zum sofortigen Hochladen hier fallen lassen"
-#: ../../Zotlabs/Web/Router.php:65 ../../Zotlabs/Web/WebServer.php:128
+#: ../../Zotlabs/Web/Router.php:67 ../../Zotlabs/Web/WebServer.php:128
#: ../../Zotlabs/Module/Achievements.php:34
-#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Authtest.php:16
-#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Page.php:35
-#: ../../Zotlabs/Module/Page.php:91 ../../Zotlabs/Module/Connections.php:33
+#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Connedit.php:397
+#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Bookmarks.php:61
+#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Page.php:35
+#: ../../Zotlabs/Module/Page.php:91 ../../Zotlabs/Module/Manage.php:10
+#: ../../Zotlabs/Module/Connections.php:33
#: ../../Zotlabs/Module/Cover_photo.php:277
#: ../../Zotlabs/Module/Cover_photo.php:290
-#: ../../Zotlabs/Module/Editblock.php:67
#: ../../Zotlabs/Module/Editlayout.php:67
#: ../../Zotlabs/Module/Editlayout.php:90
#: ../../Zotlabs/Module/Editwebpage.php:68
#: ../../Zotlabs/Module/Editwebpage.php:89
#: ../../Zotlabs/Module/Editwebpage.php:104
-#: ../../Zotlabs/Module/Editwebpage.php:126 ../../Zotlabs/Module/Menu.php:78
-#: ../../Zotlabs/Module/Appman.php:75 ../../Zotlabs/Module/Mail.php:121
-#: ../../Zotlabs/Module/Settings.php:59
+#: ../../Zotlabs/Module/Editwebpage.php:126
+#: ../../Zotlabs/Module/Channel.php:107 ../../Zotlabs/Module/Channel.php:237
+#: ../../Zotlabs/Module/Channel.php:277 ../../Zotlabs/Module/Network.php:15
+#: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Appman.php:75
#: ../../Zotlabs/Module/Filestorage.php:23
#: ../../Zotlabs/Module/Filestorage.php:78
#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Group.php:13
-#: ../../Zotlabs/Module/Webpages.php:116 ../../Zotlabs/Module/Block.php:26
-#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Invite.php:17
-#: ../../Zotlabs/Module/Invite.php:91 ../../Zotlabs/Module/Locs.php:87
-#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Like.php:181
-#: ../../Zotlabs/Module/Manage.php:10 ../../Zotlabs/Module/Mitem.php:115
-#: ../../Zotlabs/Module/Message.php:18 ../../Zotlabs/Module/Rate.php:113
-#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Profiles.php:203
-#: ../../Zotlabs/Module/Profiles.php:601 ../../Zotlabs/Module/Api.php:12
-#: ../../Zotlabs/Module/Events.php:264 ../../Zotlabs/Module/Item.php:214
-#: ../../Zotlabs/Module/Item.php:222 ../../Zotlabs/Module/Item.php:1073
+#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Item.php:220
+#: ../../Zotlabs/Module/Item.php:230 ../../Zotlabs/Module/Item.php:1098
+#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Mail.php:135
+#: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76
+#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94
+#: ../../Zotlabs/Module/Editblock.php:67 ../../Zotlabs/Module/Group.php:13
+#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Message.php:18
+#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Photos.php:73
+#: ../../Zotlabs/Module/Setup.php:212 ../../Zotlabs/Module/Editpost.php:17
#: ../../Zotlabs/Module/New_channel.php:77
#: ../../Zotlabs/Module/New_channel.php:104
-#: ../../Zotlabs/Module/Notifications.php:70 ../../Zotlabs/Module/Poke.php:137
-#: ../../Zotlabs/Module/Setup.php:220 ../../Zotlabs/Module/Profile.php:68
-#: ../../Zotlabs/Module/Profile.php:76 ../../Zotlabs/Module/Blocks.php:73
-#: ../../Zotlabs/Module/Blocks.php:80 ../../Zotlabs/Module/Layouts.php:71
-#: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89
-#: ../../Zotlabs/Module/Profile_photo.php:265
-#: ../../Zotlabs/Module/Profile_photo.php:278
-#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Pdledit.php:29
-#: ../../Zotlabs/Module/Connedit.php:395 ../../Zotlabs/Module/Regmod.php:21
-#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Channel.php:104
-#: ../../Zotlabs/Module/Channel.php:228 ../../Zotlabs/Module/Channel.php:269
+#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Profiles.php:197 ../../Zotlabs/Module/Profiles.php:595
+#: ../../Zotlabs/Module/Profile.php:68 ../../Zotlabs/Module/Profile.php:76
+#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
+#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
+#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Rate.php:113
+#: ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Profile_photo.php:273
+#: ../../Zotlabs/Module/Profile_photo.php:286
+#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Api.php:24
+#: ../../Zotlabs/Module/Regmod.php:21 ../../Zotlabs/Module/Pdledit.php:29
#: ../../Zotlabs/Module/Service_limits.php:11
-#: ../../Zotlabs/Module/Thing.php:274 ../../Zotlabs/Module/Thing.php:294
-#: ../../Zotlabs/Module/Thing.php:335 ../../Zotlabs/Module/Sharedwithme.php:11
-#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Suggest.php:30
-#: ../../Zotlabs/Module/Photos.php:73
+#: ../../Zotlabs/Module/Webpages.php:116
+#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Wiki.php:189
+#: ../../Zotlabs/Module/Wiki.php:302 ../../Zotlabs/Module/Sources.php:74
+#: ../../Zotlabs/Module/Suggest.php:30 ../../Zotlabs/Module/Thing.php:274
+#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
#: ../../Zotlabs/Module/Viewconnections.php:28
#: ../../Zotlabs/Module/Viewconnections.php:33
#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Chat.php:100
-#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Lib/Chatroom.php:137
-#: ../../include/photos.php:27 ../../include/items.php:3496
-#: ../../include/attach.php:142 ../../include/attach.php:190
-#: ../../include/attach.php:253 ../../include/attach.php:267
-#: ../../include/attach.php:274 ../../include/attach.php:339
-#: ../../include/attach.php:353 ../../include/attach.php:360
-#: ../../include/attach.php:440 ../../include/attach.php:902
-#: ../../include/attach.php:973 ../../include/attach.php:1125
+#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Module/Events.php:267
+#: ../../Zotlabs/Lib/Chatroom.php:137
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:55
+#: ../../extend/addon/addon/keepout/keepout.php:36
+#: ../../extend/addon/addon/pumpio/pumpio.php:40
+#: ../../extend/addon/addon/openid/Mod_Id.php:53
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:58
+#: ../../include/items.php:3422 ../../include/attach.php:142
+#: ../../include/attach.php:189 ../../include/attach.php:253
+#: ../../include/attach.php:267 ../../include/attach.php:274
+#: ../../include/attach.php:341 ../../include/attach.php:355
+#: ../../include/attach.php:362 ../../include/attach.php:439
+#: ../../include/attach.php:906 ../../include/attach.php:977
+#: ../../include/attach.php:1135 ../../include/photos.php:27
msgid "Permission denied."
msgstr "Berechtigung verweigert."
-#: ../../Zotlabs/Web/Router.php:146 ../../include/help.php:53
+#: ../../Zotlabs/Web/Router.php:148 ../../include/help.php:63
msgid "Not Found"
msgstr "Nicht gefunden"
-#: ../../Zotlabs/Web/Router.php:149 ../../Zotlabs/Module/Page.php:94
+#: ../../Zotlabs/Web/Router.php:151 ../../Zotlabs/Module/Page.php:94
#: ../../Zotlabs/Module/Display.php:120 ../../Zotlabs/Module/Block.php:79
-#: ../../include/help.php:56
+#: ../../include/help.php:66
msgid "Page not found."
msgstr "Seite nicht gefunden."
#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Dreport.php:10
-#: ../../Zotlabs/Module/Dreport.php:66 ../../Zotlabs/Module/Group.php:72
-#: ../../Zotlabs/Module/Import_items.php:114 ../../Zotlabs/Module/Like.php:283
-#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
-#: ../../include/items.php:403
+#: ../../Zotlabs/Module/Dreport.php:68
+#: ../../Zotlabs/Module/Import_items.php:114 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Like.php:283
+#: ../../Zotlabs/Module/Subthread.php:62
+#: ../../extend/addon/addon/frphotos/frphotos.php:81
+#: ../../extend/addon/addon/redfiles/redfiles.php:109
+#: ../../extend/addon/addon/redphotos/redphotos.php:119
+#: ../../include/items.php:327
msgid "Permission denied"
msgstr "Keine Berechtigung"
@@ -415,19 +450,21 @@ msgid ""
" logout and retry."
msgstr "Fern-Authentifizierung blockiert. Du bist lokal auf diesem Server angemeldet. Bitte melde Dich ab und versuche es erneut."
-#: ../../Zotlabs/Zot/Auth.php:246
+#: ../../Zotlabs/Zot/Auth.php:250
+#: ../../extend/addon/addon/openid/Mod_Openid.php:76
+#: ../../extend/addon/addon/openid/Mod_Openid.php:183
#, php-format
msgid "Welcome %s. Remote authentication successful."
msgstr "Willkommen %s. Entfernte Authentifizierung erfolgreich."
#: ../../Zotlabs/Module/Achievements.php:15
-#: ../../Zotlabs/Module/Editblock.php:31
-#: ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editlayout.php:31
#: ../../Zotlabs/Module/Editwebpage.php:32
-#: ../../Zotlabs/Module/Filestorage.php:59 ../../Zotlabs/Module/Connect.php:17
-#: ../../Zotlabs/Module/Webpages.php:33 ../../Zotlabs/Module/Hcard.php:12
+#: ../../Zotlabs/Module/Filestorage.php:59
+#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Hcard.php:12
#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Blocks.php:33
-#: ../../Zotlabs/Module/Layouts.php:31 ../../include/channel.php:859
+#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Webpages.php:33
+#: ../../include/channel.php:862
msgid "Requested profile is not available."
msgstr "Das angefragte Profil ist nicht verfügbar."
@@ -443,76 +480,6 @@ msgstr "Abwesend"
msgid "Online"
msgstr "Online"
-#: ../../Zotlabs/Module/Dreport.php:44
-msgid "Invalid message"
-msgstr "Ungültige Beitrags-ID (mid)"
-
-#: ../../Zotlabs/Module/Dreport.php:76
-msgid "no results"
-msgstr "keine Ergebnisse"
-
-#: ../../Zotlabs/Module/Dreport.php:91
-msgid "channel sync processed"
-msgstr "Kanal-Sync verarbeitet"
-
-#: ../../Zotlabs/Module/Dreport.php:95
-msgid "queued"
-msgstr "zur Warteschlange hinzugefügt"
-
-#: ../../Zotlabs/Module/Dreport.php:99
-msgid "posted"
-msgstr "zugestellt"
-
-#: ../../Zotlabs/Module/Dreport.php:103
-msgid "accepted for delivery"
-msgstr "für Zustellung akzeptiert"
-
-#: ../../Zotlabs/Module/Dreport.php:107
-msgid "updated"
-msgstr "aktualisiert"
-
-#: ../../Zotlabs/Module/Dreport.php:110
-msgid "update ignored"
-msgstr "Aktualisierung ignoriert"
-
-#: ../../Zotlabs/Module/Dreport.php:113
-msgid "permission denied"
-msgstr "Zugriff verweigert"
-
-#: ../../Zotlabs/Module/Dreport.php:117
-msgid "recipient not found"
-msgstr "Empfänger nicht gefunden."
-
-#: ../../Zotlabs/Module/Dreport.php:120
-msgid "mail recalled"
-msgstr "Mail widerrufen"
-
-#: ../../Zotlabs/Module/Dreport.php:123
-msgid "duplicate mail received"
-msgstr "Doppelte Mail erhalten"
-
-#: ../../Zotlabs/Module/Dreport.php:126
-msgid "mail delivered"
-msgstr "Mail zugestellt"
-
-#: ../../Zotlabs/Module/Dreport.php:146
-#, php-format
-msgid "Delivery report for %1$s"
-msgstr "Zustellungsbericht für %1$s"
-
-#: ../../Zotlabs/Module/Dreport.php:149
-msgid "Options"
-msgstr "Optionen"
-
-#: ../../Zotlabs/Module/Dreport.php:150
-msgid "Redeliver"
-msgstr "Erneut zustellen"
-
-#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
-#, php-format
-msgid "Fetching URL returns error: %1$s"
-msgstr "Abrufen der URL gab einen Fehler zurück: %1$s"
-
#: ../../Zotlabs/Module/Register.php:49
msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
msgstr "Maximale Anzahl täglicher Neuanmeldungen erreicht. Bitte versuche es morgen noch einmal."
@@ -558,7 +525,7 @@ msgid ""
"Please try again tomorrow."
msgstr "Die maximale Anzahl täglicher Registrierungen auf diesem Server wurde überschritten. Bitte versuche es morgen noch einmal."
-#: ../../Zotlabs/Module/Register.php:221
+#: ../../Zotlabs/Module/Register.php:221 ../../Zotlabs/Module/Siteinfo.php:27
msgid "Terms of Service"
msgstr "Nutzungsbedingungen"
@@ -635,7 +602,7 @@ msgid "yes"
msgstr "ja"
#: ../../Zotlabs/Module/Register.php:253
-#: ../../Zotlabs/Module/Admin/Site.php:268
+#: ../../Zotlabs/Module/Admin/Site.php:261
msgid "Registration"
msgstr "Registrierung"
@@ -643,8 +610,8 @@ msgstr "Registrierung"
msgid "Membership on this site is by invitation only."
msgstr "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
-#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:152
-#: ../../boot.php:1721
+#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:150
+#: ../../boot.php:1701
msgid "Register"
msgstr "Registrieren"
@@ -652,308 +619,1088 @@ msgstr "Registrieren"
msgid ""
"This site may require email verification after submitting this form. If you "
"are returned to a login page, please check your email for instructions."
-msgstr "Diese Seite verlangt möglicherweise eine Emailbestätigung nach dem Ansenden des Formulars. Wenn Du auf eine Login-Seite zurückgeleitet wirst, prüfe bitte auf neue Mail mit entsprechenden Hinweisen."
+msgstr "Diese Seite verlangt möglicherweise eine Emailbestätigung nach dem Absenden des Formulars. Wenn Du auf eine Login-Seite zurückgeleitet wirst, prüfe bitte Deinen Posteingang auf neue Mails mit entsprechenden Hinweisen."
-#: ../../Zotlabs/Module/Admin/Accounts.php:36
+#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
#, php-format
-msgid "%s account blocked/unblocked"
-msgid_plural "%s account blocked/unblocked"
-msgstr[0] "%s Konto blockiert/freigegeben"
-msgstr[1] "%s Konten blockiert/freigegeben"
+msgid "Fetching URL returns error: %1$s"
+msgstr "Abrufen der URL gab einen Fehler zurück: %1$s"
-#: ../../Zotlabs/Module/Admin/Accounts.php:43
-#, php-format
-msgid "%s account deleted"
-msgid_plural "%s accounts deleted"
-msgstr[0] "%s Konto gelöscht"
-msgstr[1] "%s Konten gelöscht"
+#: ../../Zotlabs/Module/Match.php:26
+msgid "Profile Match"
+msgstr "Profil-Übereinstimmungen"
-#: ../../Zotlabs/Module/Admin/Accounts.php:79
-msgid "Account not found"
-msgstr "Konto nicht gefunden"
+#: ../../Zotlabs/Module/Match.php:35
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Keine Schlüsselwörter für den Abgleich gefunden. Bitte füge Schlüsselwörter zu Deinem Standardprofil hinzu."
-#: ../../Zotlabs/Module/Admin/Accounts.php:90
-#, php-format
-msgid "Account '%s' deleted"
-msgstr "Konto '%s' gelöscht"
+#: ../../Zotlabs/Module/Match.php:67
+msgid "is interested in:"
+msgstr "interessiert sich für:"
-#: ../../Zotlabs/Module/Admin/Accounts.php:98
+#: ../../Zotlabs/Module/Match.php:68 ../../Zotlabs/Module/Directory.php:328
+#: ../../Zotlabs/Module/Suggest.php:56 ../../include/channel.php:1036
+#: ../../include/connections.php:78 ../../include/widgets.php:147
+#: ../../include/widgets.php:184 ../../include/conversation.php:971
+msgid "Connect"
+msgstr "Verbinden"
+
+#: ../../Zotlabs/Module/Match.php:74
+msgid "No matches"
+msgstr "Keine Übereinstimmungen"
+
+#: ../../Zotlabs/Module/Connedit.php:82
+msgid "Could not access contact record."
+msgstr "Konnte nicht auf den Kontakteintrag zugreifen."
+
+#: ../../Zotlabs/Module/Connedit.php:106
+msgid "Could not locate selected profile."
+msgstr "Gewähltes Profil nicht gefunden."
+
+#: ../../Zotlabs/Module/Connedit.php:258
+msgid "Connection updated."
+msgstr "Verbindung aktualisiert."
+
+#: ../../Zotlabs/Module/Connedit.php:260
+msgid "Failed to update connection record."
+msgstr "Konnte den Verbindungseintrag nicht aktualisieren."
+
+#: ../../Zotlabs/Module/Connedit.php:310
+msgid "is now connected to"
+msgstr "ist jetzt verbunden mit"
+
+#: ../../Zotlabs/Module/Connedit.php:411 ../../Zotlabs/Module/Connedit.php:716
+#: ../../Zotlabs/Module/Admin/Site.php:218 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
+#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653
+#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:97
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:159
+#: ../../Zotlabs/Module/Settings/Channel.php:289
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+#: ../../extend/addon/addon/libertree/libertree.php:69
+#: ../../extend/addon/addon/libertree/libertree.php:81
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+#: ../../extend/addon/addon/nofed/nofed.php:72
+#: ../../extend/addon/addon/nofed/nofed.php:76
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+#: ../../extend/addon/addon/planets/planets.php:153
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+#: ../../extend/addon/addon/redred/redred.php:95
+#: ../../extend/addon/addon/redred/redred.php:99
+#: ../../extend/addon/addon/rtof/rtof.php:81
+#: ../../extend/addon/addon/rtof/rtof.php:85
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../extend/addon/addon/twitter/twitter.php:246
+#: ../../extend/addon/addon/twitter/twitter.php:255
+#: ../../extend/addon/addon/visage/visage.php:166
+#: ../../extend/addon/addon/wppost/wppost.php:82
+#: ../../extend/addon/addon/wppost/wppost.php:105
+#: ../../extend/addon/addon/wppost/wppost.php:109
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+#: ../../extend/addon/addon/cdav/cdav.php:234 ../../include/dir_fns.php:143
+#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
+#: ../../include/widgets.php:978 ../../view/theme/redbasic/php/config.php:111
+#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1723
+msgid "No"
+msgstr "Nein"
+
+#: ../../Zotlabs/Module/Connedit.php:411
+#: ../../Zotlabs/Module/Admin/Site.php:220 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
+#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653
+#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:96
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:159
+#: ../../Zotlabs/Module/Settings/Channel.php:289
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+#: ../../extend/addon/addon/libertree/libertree.php:69
+#: ../../extend/addon/addon/libertree/libertree.php:81
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+#: ../../extend/addon/addon/nofed/nofed.php:72
+#: ../../extend/addon/addon/nofed/nofed.php:76
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+#: ../../extend/addon/addon/planets/planets.php:153
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+#: ../../extend/addon/addon/redred/redred.php:95
+#: ../../extend/addon/addon/redred/redred.php:99
+#: ../../extend/addon/addon/rtof/rtof.php:81
+#: ../../extend/addon/addon/rtof/rtof.php:85
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../extend/addon/addon/twitter/twitter.php:246
+#: ../../extend/addon/addon/twitter/twitter.php:255
+#: ../../extend/addon/addon/visage/visage.php:166
+#: ../../extend/addon/addon/wppost/wppost.php:82
+#: ../../extend/addon/addon/wppost/wppost.php:105
+#: ../../extend/addon/addon/wppost/wppost.php:109
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+#: ../../extend/addon/addon/cdav/cdav.php:234 ../../include/dir_fns.php:143
+#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
+#: ../../include/widgets.php:978 ../../view/theme/redbasic/php/config.php:111
+#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1723
+msgid "Yes"
+msgstr "Ja"
+
+#: ../../Zotlabs/Module/Connedit.php:443
+msgid "Could not access address book record."
+msgstr "Konnte nicht auf den Adressbuch-Eintrag zugreifen."
+
+#: ../../Zotlabs/Module/Connedit.php:463
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar."
+
+#: ../../Zotlabs/Module/Connedit.php:478 ../../Zotlabs/Module/Connedit.php:487
+#: ../../Zotlabs/Module/Connedit.php:496 ../../Zotlabs/Module/Connedit.php:505
+#: ../../Zotlabs/Module/Connedit.php:518
+msgid "Unable to set address book parameters."
+msgstr "Konnte die Adressbuch-Parameter nicht setzen."
+
+#: ../../Zotlabs/Module/Connedit.php:542
+msgid "Connection has been removed."
+msgstr "Verbindung wurde gelöscht."
+
+#: ../../Zotlabs/Module/Connedit.php:582 ../../Zotlabs/Lib/Apps.php:221
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
+#: ../../include/nav.php:89 ../../include/conversation.php:969
+msgid "View Profile"
+msgstr "Profil ansehen"
+
+#: ../../Zotlabs/Module/Connedit.php:585
#, php-format
-msgid "Account '%s' blocked"
-msgstr "Konto '%s' blockiert"
+msgid "View %s's profile"
+msgstr "%ss Profil ansehen"
-#: ../../Zotlabs/Module/Admin/Accounts.php:106
+#: ../../Zotlabs/Module/Connedit.php:589
+msgid "Refresh Permissions"
+msgstr "Zugriffsrechte neu laden"
+
+#: ../../Zotlabs/Module/Connedit.php:592
+msgid "Fetch updated permissions"
+msgstr "Aktualisierte Zugriffsrechte abfragen"
+
+#: ../../Zotlabs/Module/Connedit.php:596
+msgid "Recent Activity"
+msgstr "Kürzliche Aktivitäten"
+
+#: ../../Zotlabs/Module/Connedit.php:599
+msgid "View recent posts and comments"
+msgstr "Betrachte die neuesten Beiträge und Kommentare"
+
+#: ../../Zotlabs/Module/Connedit.php:603
+#: ../../Zotlabs/Module/Admin/Accounts.php:175
+msgid "Unblock"
+msgstr "Freigeben"
+
+#: ../../Zotlabs/Module/Connedit.php:603
+#: ../../Zotlabs/Module/Admin/Accounts.php:174
+msgid "Block"
+msgstr "Blockieren"
+
+#: ../../Zotlabs/Module/Connedit.php:606
+msgid "Block (or Unblock) all communications with this connection"
+msgstr "Jegliche Kommunikation mit dieser Verbindung blockieren/zulassen"
+
+#: ../../Zotlabs/Module/Connedit.php:607
+msgid "This connection is blocked!"
+msgstr "Die Verbindung ist geblockt!"
+
+#: ../../Zotlabs/Module/Connedit.php:611
+msgid "Unignore"
+msgstr "Nicht ignorieren"
+
+#: ../../Zotlabs/Module/Connedit.php:611
+#: ../../Zotlabs/Module/Connections.php:277
+msgid "Ignore"
+msgstr "Ignorieren"
+
+#: ../../Zotlabs/Module/Connedit.php:614
+msgid "Ignore (or Unignore) all inbound communications from this connection"
+msgstr "Jegliche eingehende Kommunikation von dieser Verbindung ignorieren/zulassen"
+
+#: ../../Zotlabs/Module/Connedit.php:615
+msgid "This connection is ignored!"
+msgstr "Die Verbindung wird ignoriert!"
+
+#: ../../Zotlabs/Module/Connedit.php:619
+msgid "Unarchive"
+msgstr "Aus Archiv zurückholen"
+
+#: ../../Zotlabs/Module/Connedit.php:619
+msgid "Archive"
+msgstr "Archivieren"
+
+#: ../../Zotlabs/Module/Connedit.php:622
+msgid ""
+"Archive (or Unarchive) this connection - mark channel dead but keep content"
+msgstr "Verbindung archivieren/aus dem Archiv zurückholen (Archiv = Kanal als erloschen markieren, aber die Beiträge behalten)"
+
+#: ../../Zotlabs/Module/Connedit.php:623
+msgid "This connection is archived!"
+msgstr "Die Verbindung ist archiviert!"
+
+#: ../../Zotlabs/Module/Connedit.php:627
+msgid "Unhide"
+msgstr "Wieder sichtbar machen"
+
+#: ../../Zotlabs/Module/Connedit.php:627
+msgid "Hide"
+msgstr "Verstecken"
+
+#: ../../Zotlabs/Module/Connedit.php:630
+msgid "Hide or Unhide this connection from your other connections"
+msgstr "Diese Verbindung vor anderen Verbindungen verstecken/zeigen"
+
+#: ../../Zotlabs/Module/Connedit.php:631
+msgid "This connection is hidden!"
+msgstr "Die Verbindung ist versteckt!"
+
+#: ../../Zotlabs/Module/Connedit.php:638
+msgid "Delete this connection"
+msgstr "Verbindung löschen"
+
+#: ../../Zotlabs/Module/Connedit.php:655 ../../include/widgets.php:529
+msgid "Me"
+msgstr "Ich"
+
+#: ../../Zotlabs/Module/Connedit.php:656 ../../include/widgets.php:530
+msgid "Family"
+msgstr "Familie"
+
+#: ../../Zotlabs/Module/Connedit.php:657
+#: ../../Zotlabs/Module/Settings/Channel.php:61
+#: ../../Zotlabs/Module/Settings/Channel.php:65
+#: ../../Zotlabs/Module/Settings/Channel.php:66
+#: ../../Zotlabs/Module/Settings/Channel.php:69
+#: ../../Zotlabs/Module/Settings/Channel.php:80
+#: ../../include/selectors.php:123 ../../include/channel.php:402
+#: ../../include/channel.php:403 ../../include/channel.php:410
+#: ../../include/widgets.php:531
+msgid "Friends"
+msgstr "Freunde"
+
+#: ../../Zotlabs/Module/Connedit.php:658 ../../include/widgets.php:532
+msgid "Acquaintances"
+msgstr "Bekannte"
+
+#: ../../Zotlabs/Module/Connedit.php:659
+#: ../../Zotlabs/Module/Connections.php:92
+#: ../../Zotlabs/Module/Connections.php:107 ../../include/widgets.php:533
+msgid "All"
+msgstr "Alle"
+
+#: ../../Zotlabs/Module/Connedit.php:716
+msgid "Approve this connection"
+msgstr "Verbindung genehmigen"
+
+#: ../../Zotlabs/Module/Connedit.php:716
+msgid "Accept connection to allow communication"
+msgstr "Akzeptiere die Verbindung, um Kommunikation zu ermöglichen"
+
+#: ../../Zotlabs/Module/Connedit.php:721
+msgid "Set Affinity"
+msgstr "Beziehung festlegen"
+
+#: ../../Zotlabs/Module/Connedit.php:724
+msgid "Set Profile"
+msgstr "Profil festlegen"
+
+#: ../../Zotlabs/Module/Connedit.php:727
+msgid "Set Affinity & Profile"
+msgstr "Beziehung und Profile festlegen"
+
+#: ../../Zotlabs/Module/Connedit.php:776
+msgid "none"
+msgstr "Keine"
+
+#: ../../Zotlabs/Module/Connedit.php:780 ../../include/widgets.php:656
+msgid "Connection Default Permissions"
+msgstr "Standardzugriffsrechte für neue Verbindungen:"
+
+#: ../../Zotlabs/Module/Connedit.php:780 ../../include/items.php:3909
#, php-format
-msgid "Account '%s' unblocked"
-msgstr "Konto '%s' freigegeben"
+msgid "Connection: %s"
+msgstr "Verbindung: %s"
-#: ../../Zotlabs/Module/Admin/Accounts.php:165
-#: ../../Zotlabs/Module/Admin/Channels.php:149
-#: ../../Zotlabs/Module/Admin/Logs.php:82
-#: ../../Zotlabs/Module/Admin/Plugins.php:336
-#: ../../Zotlabs/Module/Admin/Plugins.php:427
-#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin/Site.php:265
-#: ../../Zotlabs/Module/Admin/Themes.php:120
-#: ../../Zotlabs/Module/Admin/Themes.php:154
-#: ../../Zotlabs/Module/Admin.php:141
-msgid "Administration"
-msgstr "Administration"
+#: ../../Zotlabs/Module/Connedit.php:781
+msgid "Apply these permissions automatically"
+msgstr "Diese Berechtigungen automatisch anwenden"
-#: ../../Zotlabs/Module/Admin/Accounts.php:166
-#: ../../Zotlabs/Module/Admin/Accounts.php:179 ../../include/widgets.php:1557
-msgid "Accounts"
-msgstr "Konten"
+#: ../../Zotlabs/Module/Connedit.php:781
+msgid "Connection requests will be approved without your interaction"
+msgstr "Verbindungsanfragen werden sofort bestätigt, ohne dass Deine aktive Zustimmung erforderlich ist."
-#: ../../Zotlabs/Module/Admin/Accounts.php:167
-#: ../../Zotlabs/Module/Admin/Channels.php:151
+#: ../../Zotlabs/Module/Connedit.php:784
+msgid "This connection's primary address is"
+msgstr "Die Hauptadresse der Verbindung ist"
+
+#: ../../Zotlabs/Module/Connedit.php:785
+msgid "Available locations:"
+msgstr "Verfügbare Klone:"
+
+#: ../../Zotlabs/Module/Connedit.php:789
+msgid ""
+"The permissions indicated on this page will be applied to all new "
+"connections."
+msgstr "Die auf dieser Seite angegebenen Berechtigungen werden auf alle neuen Verbindungen angewendet."
+
+#: ../../Zotlabs/Module/Connedit.php:790
+msgid "Connection Tools"
+msgstr "Verbindungswerkzeuge"
+
+#: ../../Zotlabs/Module/Connedit.php:792
+msgid "Slide to adjust your degree of friendship"
+msgstr "Verschieben, um den Grad der Freundschaft zu einzustellen"
+
+#: ../../Zotlabs/Module/Connedit.php:793 ../../Zotlabs/Module/Rate.php:155
+#: ../../include/js_strings.php:20
+msgid "Rating"
+msgstr "Bewertung"
+
+#: ../../Zotlabs/Module/Connedit.php:794
+msgid "Slide to adjust your rating"
+msgstr "Verschieben, um Deine Bewertung einzustellen"
+
+#: ../../Zotlabs/Module/Connedit.php:795 ../../Zotlabs/Module/Connedit.php:800
+msgid "Optionally explain your rating"
+msgstr "Optional kannst Du Deine Bewertung begründen"
+
+#: ../../Zotlabs/Module/Connedit.php:797
+msgid "Custom Filter"
+msgstr "Benutzerdefinierter Filter"
+
+#: ../../Zotlabs/Module/Connedit.php:798
+msgid "Only import posts with this text"
+msgstr "Nur Beiträge mit diesem Text importieren"
+
+#: ../../Zotlabs/Module/Connedit.php:798 ../../Zotlabs/Module/Connedit.php:799
+msgid ""
+"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
+"all posts"
+msgstr "Einzelne Wörter pro Zeile, #Tags oder /Reguläre Ausdrücke/. lang=xx (z.B. lang=de) ermöglicht Filterung nach Sprache. Leer lassen, um alle Beiträge zu importieren."
+
+#: ../../Zotlabs/Module/Connedit.php:799
+msgid "Do not import posts with this text"
+msgstr "Beiträge mit diesem Text nicht importieren"
+
+#: ../../Zotlabs/Module/Connedit.php:801
+msgid "This information is public!"
+msgstr "Diese Information ist öffentlich!"
+
+#: ../../Zotlabs/Module/Connedit.php:806
+msgid "Connection Pending Approval"
+msgstr "Verbindung wartet auf Bestätigung"
+
+#: ../../Zotlabs/Module/Connedit.php:809
+#: ../../Zotlabs/Module/Settings/Tokens.php:163
+msgid "inherited"
+msgstr "geerbt"
+
+#: ../../Zotlabs/Module/Connedit.php:810 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Connect.php:98
#: ../../Zotlabs/Module/Admin/Features.php:66
#: ../../Zotlabs/Module/Admin/Logs.php:84
#: ../../Zotlabs/Module/Admin/Plugins.php:429
#: ../../Zotlabs/Module/Admin/Profs.php:157
#: ../../Zotlabs/Module/Admin/Security.php:104
-#: ../../Zotlabs/Module/Admin/Site.php:267
#: ../../Zotlabs/Module/Admin/Themes.php:156
-#: ../../Zotlabs/Module/Import.php:560 ../../Zotlabs/Module/Appman.php:126
-#: ../../Zotlabs/Module/Mail.php:370 ../../Zotlabs/Module/Filestorage.php:165
-#: ../../Zotlabs/Module/Connect.php:98 ../../Zotlabs/Module/Group.php:85
+#: ../../Zotlabs/Module/Admin/Account_edit.php:74
+#: ../../Zotlabs/Module/Admin/Accounts.php:166
+#: ../../Zotlabs/Module/Admin/Channels.php:147
+#: ../../Zotlabs/Module/Admin/Site.php:260 ../../Zotlabs/Module/Appman.php:126
+#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Mail.php:384
#: ../../Zotlabs/Module/Import_items.php:122
-#: ../../Zotlabs/Module/Invite.php:146 ../../Zotlabs/Module/Locs.php:121
-#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Rate.php:166
-#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Profiles.php:687
-#: ../../Zotlabs/Module/Events.php:484 ../../Zotlabs/Module/Poke.php:186
-#: ../../Zotlabs/Module/Setup.php:317 ../../Zotlabs/Module/Setup.php:365
-#: ../../Zotlabs/Module/Pconfig.php:107 ../../Zotlabs/Module/Cal.php:338
-#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Connedit.php:779
-#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
-#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
+#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Group.php:85
+#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Mood.php:139
#: ../../Zotlabs/Module/Photos.php:668 ../../Zotlabs/Module/Photos.php:1058
#: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1216
-#: ../../Zotlabs/Module/Chat.php:196 ../../Zotlabs/Module/Chat.php:241
-#: ../../Zotlabs/Module/Xchan.php:15
-#: ../../Zotlabs/Module/Settings/Account.php:126
-#: ../../Zotlabs/Module/Settings/Channel.php:452
-#: ../../Zotlabs/Module/Settings/Display.php:194
+#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Pconfig.php:107 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Cal.php:342
+#: ../../Zotlabs/Module/Wiki.php:148 ../../Zotlabs/Module/Sources.php:114
+#: ../../Zotlabs/Module/Sources.php:149
#: ../../Zotlabs/Module/Settings/Features.php:47
#: ../../Zotlabs/Module/Settings/Oauth.php:87
#: ../../Zotlabs/Module/Settings/Tokens.php:167
-#: ../../Zotlabs/Lib/ThreadItem.php:712 ../../include/js_strings.php:22
-#: ../../include/widgets.php:796 ../../view/theme/redbasic/php/config.php:106
+#: ../../Zotlabs/Module/Settings/Account.php:118
+#: ../../Zotlabs/Module/Settings/Channel.php:455
+#: ../../Zotlabs/Module/Settings/Display.php:196
+#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
+#: ../../Zotlabs/Module/Import.php:543 ../../Zotlabs/Module/Chat.php:196
+#: ../../Zotlabs/Module/Chat.php:241 ../../Zotlabs/Module/Xchan.php:15
+#: ../../Zotlabs/Module/Events.php:484 ../../Zotlabs/Lib/ThreadItem.php:729
+#: ../../extend/addon/addon/chords/Mod_Chords.php:60
+#: ../../extend/addon/addon/diaspora/diaspora.php:710
+#: ../../extend/addon/addon/dwpost/dwpost.php:89
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
+#: ../../extend/addon/addon/friendica/friendica.php:128
+#: ../../extend/addon/addon/frphotos/frphotos.php:96
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
+#: ../../extend/addon/addon/hubwall/hubwall.php:95
+#: ../../extend/addon/addon/ijpost/ijpost.php:89
+#: ../../extend/addon/addon/irc/irc.php:53
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
+#: ../../extend/addon/addon/libertree/libertree.php:85
+#: ../../extend/addon/addon/ljpost/ljpost.php:86
+#: ../../extend/addon/addon/logrot/logrot.php:35
+#: ../../extend/addon/addon/mailhost/mailhost.php:40
+#: ../../extend/addon/addon/nofed/nofed.php:80
+#: ../../extend/addon/addon/nsabait/nsabait.php:161
+#: ../../extend/addon/addon/nsfw/nsfw.php:92
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:52
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:168
+#: ../../extend/addon/addon/pageheader/pageheader.php:48
+#: ../../extend/addon/addon/piwik/piwik.php:95
+#: ../../extend/addon/addon/planets/planets.php:157
+#: ../../extend/addon/addon/pumpio/pumpio.php:237
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
+#: ../../extend/addon/addon/redfiles/redfiles.php:124
+#: ../../extend/addon/addon/redphotos/redphotos.php:136
+#: ../../extend/addon/addon/redred/redred.php:119
+#: ../../extend/addon/addon/rtof/rtof.php:101
+#: ../../extend/addon/addon/skeleton/skeleton.php:65
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
+#: ../../extend/addon/addon/startpage/startpage.php:113
+#: ../../extend/addon/addon/statusnet/statusnet.php:322
+#: ../../extend/addon/addon/statusnet/statusnet.php:380
+#: ../../extend/addon/addon/statusnet/statusnet.php:432
+#: ../../extend/addon/addon/statusnet/statusnet.php:899
+#: ../../extend/addon/addon/superblock/superblock.php:114
+#: ../../extend/addon/addon/twitter/twitter.php:217
+#: ../../extend/addon/addon/twitter/twitter.php:259
+#: ../../extend/addon/addon/visage/visage.php:170
+#: ../../extend/addon/addon/wppost/wppost.php:113
+#: ../../extend/addon/addon/xmpp/xmpp.php:69
+#: ../../extend/addon/addon/cdav/cdav.php:246
+#: ../../extend/addon/addon/likebanner/likebanner.php:57
+#: ../../extend/addon/addon/mailtest/mailtest.php:100
+#: ../../include/js_strings.php:22 ../../include/widgets.php:796
+#: ../../view/theme/redbasic/php/config.php:106
msgid "Submit"
msgstr "Absenden"
-#: ../../Zotlabs/Module/Admin/Accounts.php:168
-#: ../../Zotlabs/Module/Admin/Channels.php:152
-msgid "select all"
-msgstr "Alle auswählen"
+#: ../../Zotlabs/Module/Connedit.php:811
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Bitte wähle ein Profil, das wir %s zeigen sollen, wenn Deine Profilseite über eine verifizierte Verbindung aufgerufen wird."
-#: ../../Zotlabs/Module/Admin/Accounts.php:169
-msgid "Registrations waiting for confirm"
-msgstr "Registrierungen warten auf Bestätigung"
+#: ../../Zotlabs/Module/Connedit.php:813
+#: ../../Zotlabs/Module/Settings/Tokens.php:160
+msgid "Their Settings"
+msgstr "Deren Einstellungen"
-#: ../../Zotlabs/Module/Admin/Accounts.php:170
-msgid "Request date"
-msgstr "Antragsdatum"
+#: ../../Zotlabs/Module/Connedit.php:814
+#: ../../Zotlabs/Module/Settings/Tokens.php:161
+msgid "My Settings"
+msgstr "Meine Einstellungen"
-#: ../../Zotlabs/Module/Admin/Accounts.php:170
-#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/network.php:2208
-msgid "Email"
-msgstr "E-Mail"
+#: ../../Zotlabs/Module/Connedit.php:816
+#: ../../Zotlabs/Module/Settings/Tokens.php:165
+msgid "Individual Permissions"
+msgstr "Individuelle Zugriffsrechte"
-#: ../../Zotlabs/Module/Admin/Accounts.php:171
-msgid "No registrations."
-msgstr "Keine Registrierungen."
+#: ../../Zotlabs/Module/Connedit.php:817
+#: ../../Zotlabs/Module/Settings/Tokens.php:166
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can <strong>not</strong> change those"
+" settings here."
+msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals vererbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung und können hier nicht verändert werden."
-#: ../../Zotlabs/Module/Admin/Accounts.php:172
-#: ../../Zotlabs/Module/Connections.php:275
-msgid "Approve"
-msgstr "Genehmigen"
+#: ../../Zotlabs/Module/Connedit.php:818
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can change those settings here but "
+"they wont have any impact unless the inherited setting changes."
+msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen."
-#: ../../Zotlabs/Module/Admin/Accounts.php:173
-msgid "Deny"
-msgstr "Verweigern"
+#: ../../Zotlabs/Module/Connedit.php:819
+msgid "Last update:"
+msgstr "Letzte Aktualisierung:"
-#: ../../Zotlabs/Module/Admin/Accounts.php:175
-#: ../../Zotlabs/Module/Connedit.php:575
-msgid "Block"
-msgstr "Blockieren"
+#: ../../Zotlabs/Module/Dreport.php:45
+msgid "Invalid message"
+msgstr "Ungültige Beitrags-ID (mid)"
-#: ../../Zotlabs/Module/Admin/Accounts.php:176
-#: ../../Zotlabs/Module/Connedit.php:575
-msgid "Unblock"
-msgstr "Freigeben"
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "no results"
+msgstr "keine Ergebnisse"
-#: ../../Zotlabs/Module/Admin/Accounts.php:181
-msgid "ID"
-msgstr "ID"
+#: ../../Zotlabs/Module/Dreport.php:93
+msgid "channel sync processed"
+msgstr "Kanal-Sync verarbeitet"
-#: ../../Zotlabs/Module/Admin/Accounts.php:183 ../../include/group.php:267
-msgid "All Channels"
-msgstr "Alle Kanäle"
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "queued"
+msgstr "zur Warteschlange hinzugefügt"
-#: ../../Zotlabs/Module/Admin/Accounts.php:184
-msgid "Register date"
-msgstr "Registrierungs-Datum"
+#: ../../Zotlabs/Module/Dreport.php:101
+msgid "posted"
+msgstr "zugestellt"
-#: ../../Zotlabs/Module/Admin/Accounts.php:185
-msgid "Last login"
-msgstr "Letzte Anmeldung"
+#: ../../Zotlabs/Module/Dreport.php:105
+msgid "accepted for delivery"
+msgstr "für Zustellung akzeptiert"
-#: ../../Zotlabs/Module/Admin/Accounts.php:186
-msgid "Expires"
-msgstr "Verfällt"
+#: ../../Zotlabs/Module/Dreport.php:109
+msgid "updated"
+msgstr "aktualisiert"
-#: ../../Zotlabs/Module/Admin/Accounts.php:187
-msgid "Service Class"
-msgstr "Service-Klasse"
+#: ../../Zotlabs/Module/Dreport.php:112
+msgid "update ignored"
+msgstr "Aktualisierung ignoriert"
-#: ../../Zotlabs/Module/Admin/Accounts.php:189
-msgid ""
-"Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
-" on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Die ausgewählten Konten werden gelöscht!\\n\\nAlles, was diese Konten auf diesem Hub veröffentlicht haben, wird endgültig gelöscht werden!\\n\\nBist du dir sicher?"
+#: ../../Zotlabs/Module/Dreport.php:115
+msgid "permission denied"
+msgstr "Zugriff verweigert"
-#: ../../Zotlabs/Module/Admin/Accounts.php:190
-msgid ""
-"The account {0} will be deleted!\\n\\nEverything this account has posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Das Konto {0} wird gelöscht!\\n\\nAlles, was dieses Konto auf diesem Hub veröffentlicht hat, wird endgültig gelöscht werden!\\n\\nBist Du sicher?"
+#: ../../Zotlabs/Module/Dreport.php:119
+msgid "recipient not found"
+msgstr "Empfänger nicht gefunden."
-#: ../../Zotlabs/Module/Admin/Channels.php:30
-#, php-format
-msgid "%s channel censored/uncensored"
-msgid_plural "%s channels censored/uncensored"
-msgstr[0] "%s Kanal gesperrt/freigegeben"
-msgstr[1] "%s Kanäle gesperrt/freigegeben"
+#: ../../Zotlabs/Module/Dreport.php:122
+msgid "mail recalled"
+msgstr "Mail widerrufen"
-#: ../../Zotlabs/Module/Admin/Channels.php:39
-#, php-format
-msgid "%s channel code allowed/disallowed"
-msgid_plural "%s channels code allowed/disallowed"
-msgstr[0] "Code für %s Kanal gesperrt/freigegeben"
-msgstr[1] "Code für %s Kanäle gesperrt/freigegeben"
+#: ../../Zotlabs/Module/Dreport.php:125
+msgid "duplicate mail received"
+msgstr "Doppelte Mail erhalten"
+
+#: ../../Zotlabs/Module/Dreport.php:128
+msgid "mail delivered"
+msgstr "Mail zugestellt"
-#: ../../Zotlabs/Module/Admin/Channels.php:45
+#: ../../Zotlabs/Module/Dreport.php:148
#, php-format
-msgid "%s channel deleted"
-msgid_plural "%s channels deleted"
-msgstr[0] "%s Kanal gelöscht"
-msgstr[1] "%s Kanäle gelöscht"
+msgid "Delivery report for %1$s"
+msgstr "Zustellungsbericht für %1$s"
-#: ../../Zotlabs/Module/Admin/Channels.php:66
-msgid "Channel not found"
-msgstr "Kanal nicht gefunden"
+#: ../../Zotlabs/Module/Dreport.php:151
+msgid "Options"
+msgstr "Optionen"
-#: ../../Zotlabs/Module/Admin/Channels.php:76
-#, php-format
-msgid "Channel '%s' deleted"
-msgstr "Kanal '%s' gelöscht"
+#: ../../Zotlabs/Module/Dreport.php:152
+msgid "Redeliver"
+msgstr "Erneut zustellen"
-#: ../../Zotlabs/Module/Admin/Channels.php:88
-#, php-format
-msgid "Channel '%s' censored"
-msgstr "Kanal '%s' gesperrt"
+#: ../../Zotlabs/Module/Bookmarks.php:53
+msgid "Bookmark added"
+msgstr "Lesezeichen hinzugefügt"
-#: ../../Zotlabs/Module/Admin/Channels.php:88
-#, php-format
-msgid "Channel '%s' uncensored"
-msgstr "Kanal '%s' freigegeben"
+#: ../../Zotlabs/Module/Bookmarks.php:75
+msgid "My Bookmarks"
+msgstr "Meine Lesezeichen"
-#: ../../Zotlabs/Module/Admin/Channels.php:99
-#, php-format
-msgid "Channel '%s' code allowed"
-msgstr "Code für Kanal '%s' freigegeben"
+#: ../../Zotlabs/Module/Bookmarks.php:86
+msgid "My Connections Bookmarks"
+msgstr "Lesezeichen meiner Kontakte"
-#: ../../Zotlabs/Module/Admin/Channels.php:99
-#, php-format
-msgid "Channel '%s' code disallowed"
-msgstr "Code für Kanal '%s' gesperrt"
+#: ../../Zotlabs/Module/Acl.php:313
+msgid "network"
+msgstr "Netzwerk"
-#: ../../Zotlabs/Module/Admin/Channels.php:150 ../../include/widgets.php:1558
-msgid "Channels"
-msgstr "Kanäle"
+#: ../../Zotlabs/Module/Acl.php:323
+msgid "RSS"
+msgstr "RSS"
-#: ../../Zotlabs/Module/Admin/Channels.php:154
-msgid "Censor"
-msgstr "Sperren"
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
+msgstr "Klon nicht gefunden."
-#: ../../Zotlabs/Module/Admin/Channels.php:155
-msgid "Uncensor"
-msgstr "Freigeben"
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
+msgstr "Nachschlagen des Kanal-Ortes fehlgeschlagen"
-#: ../../Zotlabs/Module/Admin/Channels.php:156
-msgid "Allow Code"
-msgstr "Code erlauben"
+#: ../../Zotlabs/Module/Locs.php:66
+msgid ""
+"Please select another location to become primary before removing the primary"
+" location."
+msgstr "Bitte mache einen anderen Kanal-Ort zum primären Ort, bevor Du den primären Ort löschst."
-#: ../../Zotlabs/Module/Admin/Channels.php:157
-msgid "Disallow Code"
-msgstr "Code sperren"
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
+msgstr "Synchronisiere Klone"
-#: ../../Zotlabs/Module/Admin/Channels.php:158
-#: ../../include/conversation.php:1650
-msgid "Channel"
-msgstr "Kanal"
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
+msgstr "Keine Klon-Adressen gefunden."
-#: ../../Zotlabs/Module/Admin/Channels.php:162
-msgid "UID"
-msgstr "UID"
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
+msgstr "Klon-Adressen verwalten"
-#: ../../Zotlabs/Module/Admin/Channels.php:164
-#: ../../Zotlabs/Module/Locs.php:118 ../../Zotlabs/Module/Profiles.php:470
+#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
+#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:692
+#: ../../Zotlabs/Module/Events.php:468
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839
+#: ../../include/js_strings.php:25
+msgid "Location"
+msgstr "Ort"
+
+#: ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Profiles.php:464
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143
msgid "Address"
msgstr "Adresse"
-#: ../../Zotlabs/Module/Admin/Channels.php:166
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
+msgstr "Primär"
+
+#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
+msgid "Drop"
+msgstr "Löschen"
+
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
+msgstr "Jetzt synchronisieren"
+
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
+msgstr "Bitte warte mehrere Minuten zwischen dem Ausführen zweier Operationen!"
+
+#: ../../Zotlabs/Module/Locs.php:124
msgid ""
-"Selected channels will be deleted!\\n\\nEverything that was posted in these "
-"channels on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Alle ausgewählten Kanäle werden gelöscht!\\n\\nAlles was von diesen Kanälen auf diesem Server geschrieben wurde, wird dauerhaft gelöscht!\\n\\nBist Du sicher?"
+"When possible, drop a location by logging into that website/hub and removing"
+" your channel."
+msgstr "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub einloggst und den Kanal dort löschst."
+
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
+msgstr "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt."
-#: ../../Zotlabs/Module/Admin/Channels.php:167
+#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
+msgid "Continue"
+msgstr "Fortfahren"
+
+#: ../../Zotlabs/Module/Connect.php:90
+msgid "Premium Channel Setup"
+msgstr "Premium-Kanal-Einrichtung"
+
+#: ../../Zotlabs/Module/Connect.php:92
+msgid "Enable premium channel connection restrictions"
+msgstr "Einschränkungen für einen Premium-Kanal aktivieren"
+
+#: ../../Zotlabs/Module/Connect.php:93
msgid ""
-"The channel {0} will be deleted!\\n\\nEverything that was posted in this "
-"channel on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Der Kanal {0} wird gelöscht!\\n\\nAlles was von diesem Kanal auf diesem Server geschrieben wurde, wird gelöscht!\\n\\nBist Du sicher?"
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Bitte gib Deine Nutzungsbedingungen ein, z.B. Paypal-Quittung, Richtlinien etc."
-#: ../../Zotlabs/Module/Admin/Dbsync.php:19
-msgid "Update has been marked successful"
-msgstr "Update wurde als erfolgreich markiert"
+#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Unter Umständen sind weitere Schritte oder die Bestätigung der folgenden Bedingungen vor dem Verbinden mit diesem Kanal nötig."
-#: ../../Zotlabs/Module/Admin/Dbsync.php:29
+#: ../../Zotlabs/Module/Connect.php:96
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Potentielle Kontakte werden den folgenden Text sehen, bevor fortgefahren wird:"
+
+#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
+msgid ""
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "Indem ich fortfahre, bestätige ich die Erfüllung aller Anweisungen auf dieser Seite."
+
+#: ../../Zotlabs/Module/Connect.php:106
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(Der Kanal-Besitzer hat keine speziellen Anweisungen hinterlegt.)"
+
+#: ../../Zotlabs/Module/Connect.php:114
+msgid "Restricted or Premium Channel"
+msgstr "Eingeschränkter oder Premium-Kanal"
+
+#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
+msgid "Invalid item."
+msgstr "Ungültiges Element."
+
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Chanview.php:96
+#: ../../Zotlabs/Module/Block.php:43 ../../Zotlabs/Module/Cal.php:62
+#: ../../Zotlabs/Module/Wall_upload.php:31
+msgid "Channel not found."
+msgstr "Kanal nicht gefunden."
+
+#: ../../Zotlabs/Module/Page.php:131
+msgid ""
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
+" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
+"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "Save to Folder:"
+msgstr "Speichern in Ordner:"
+
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "- select -"
+msgstr "– auswählen –"
+
+#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin/Profs.php:74
+#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/text.php:987
+#: ../../include/text.php:999 ../../include/widgets.php:201
+msgid "Save"
+msgstr "Speichern"
+
+#: ../../Zotlabs/Module/Manage.php:136
+#: ../../Zotlabs/Module/New_channel.php:121
#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr "Ausführen von %s fehlgeschlagen. Überprüfe die Systemprotokolle."
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet."
-#: ../../Zotlabs/Module/Admin/Dbsync.php:32
+#: ../../Zotlabs/Module/Manage.php:143
+msgid "Create a new channel"
+msgstr "Neuen Kanal anlegen"
+
+#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:772
+#: ../../Zotlabs/Module/Wiki.php:147 ../../Zotlabs/Module/Chat.php:255
+msgid "Create New"
+msgstr "Neu anlegen"
+
+#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:214
+#: ../../include/nav.php:209
+msgid "Channel Manager"
+msgstr "Kanal-Manager"
+
+#: ../../Zotlabs/Module/Manage.php:165
+msgid "Current Channel"
+msgstr "Aktueller Kanal"
+
+#: ../../Zotlabs/Module/Manage.php:167
+msgid "Switch to one of your channels by selecting it."
+msgstr "Wechsle zu einem Deiner Kanäle, indem Du auf ihn klickst."
+
+#: ../../Zotlabs/Module/Manage.php:168
+msgid "Default Channel"
+msgstr "Standard Kanal"
+
+#: ../../Zotlabs/Module/Manage.php:169
+msgid "Make Default"
+msgstr "Zum Standard machen"
+
+#: ../../Zotlabs/Module/Manage.php:172
#, php-format
-msgid "Update %s was successfully applied."
-msgstr "Update %s wurde erfolgreich ausgeführt."
+msgid "%d new messages"
+msgstr "%d neue Nachrichten"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:36
+#: ../../Zotlabs/Module/Manage.php:173
#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr "Update %s lieferte keinen Rückgabewert. Erfolg unbekannt."
+msgid "%d new introductions"
+msgstr "%d neue Vorstellungen"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:39
+#: ../../Zotlabs/Module/Manage.php:175
+msgid "Delegated Channel"
+msgstr "Delegierte Kanäle"
+
+#: ../../Zotlabs/Module/Connections.php:56
+#: ../../Zotlabs/Module/Connections.php:161
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Blocked"
+msgstr "Blockiert"
+
+#: ../../Zotlabs/Module/Connections.php:61
+#: ../../Zotlabs/Module/Connections.php:168
+#: ../../Zotlabs/Module/Connections.php:241
+msgid "Ignored"
+msgstr "Ignoriert"
+
+#: ../../Zotlabs/Module/Connections.php:66
+#: ../../Zotlabs/Module/Connections.php:182
+#: ../../Zotlabs/Module/Connections.php:240
+msgid "Hidden"
+msgstr "Versteckt"
+
+#: ../../Zotlabs/Module/Connections.php:71
+#: ../../Zotlabs/Module/Connections.php:175
+#: ../../Zotlabs/Module/Connections.php:239
+msgid "Archived"
+msgstr "Archiviert"
+
+#: ../../Zotlabs/Module/Connections.php:76
+#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1594
+msgid "New"
+msgstr "Neu"
+
+#: ../../Zotlabs/Module/Connections.php:138
+msgid "New Connections"
+msgstr "Neue Verbindungen"
+
+#: ../../Zotlabs/Module/Connections.php:141
+msgid "Show pending (new) connections"
+msgstr "Ausstehende (neue) Verbindungsanfragen anzeigen"
+
+#: ../../Zotlabs/Module/Connections.php:145
+#: ../../Zotlabs/Module/Profperm.php:144
+msgid "All Connections"
+msgstr "Alle Verbindungen"
+
+#: ../../Zotlabs/Module/Connections.php:148
+msgid "Show all connections"
+msgstr "Alle Verbindungen anzeigen"
+
+#: ../../Zotlabs/Module/Connections.php:164
+msgid "Only show blocked connections"
+msgstr "Nur blockierte Verbindungen anzeigen"
+
+#: ../../Zotlabs/Module/Connections.php:171
+msgid "Only show ignored connections"
+msgstr "Nur ignorierte Verbindungen anzeigen"
+
+#: ../../Zotlabs/Module/Connections.php:178
+msgid "Only show archived connections"
+msgstr "Nur archivierte Verbindungen anzeigen"
+
+#: ../../Zotlabs/Module/Connections.php:185
+msgid "Only show hidden connections"
+msgstr "Nur versteckte Verbindungen anzeigen"
+
+#: ../../Zotlabs/Module/Connections.php:238
+msgid "Pending approval"
+msgstr "Wartet auf Genehmigung"
+
+#: ../../Zotlabs/Module/Connections.php:254
#, php-format
-msgid "Update function %s could not be found."
-msgstr "Update-Funktion %s konnte nicht gefunden werden."
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:55
-msgid "No failed updates."
-msgstr "Keine fehlgeschlagenen Aktualisierungen."
+#: ../../Zotlabs/Module/Connections.php:255
+msgid "Edit connection"
+msgstr "Verbindung bearbeiten"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:59
-msgid "Failed Updates"
-msgstr "Fehlgeschlagene Aktualisierungen"
+#: ../../Zotlabs/Module/Connections.php:256
+msgid "Delete connection"
+msgstr "Verbindung löschen"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:61
-msgid "Mark success (if update was manually applied)"
-msgstr "Als erfolgreich markieren (wenn das Update manuell ausgeführt wurde)"
+#: ../../Zotlabs/Module/Connections.php:265
+msgid "Channel address"
+msgstr "Kanaladresse"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:62
-msgid "Attempt to execute this update step automatically"
-msgstr "Versuche, diesen Updateschritt automatisch auszuführen"
+#: ../../Zotlabs/Module/Connections.php:267
+msgid "Network"
+msgstr "Netzwerk"
+
+#: ../../Zotlabs/Module/Connections.php:270
+msgid "Status"
+msgstr "Status"
+
+#: ../../Zotlabs/Module/Connections.php:272
+msgid "Connected"
+msgstr "Verbunden"
+
+#: ../../Zotlabs/Module/Connections.php:274
+msgid "Approve connection"
+msgstr "Verbindung genehmigen"
+
+#: ../../Zotlabs/Module/Connections.php:275
+#: ../../Zotlabs/Module/Admin/Accounts.php:171
+msgid "Approve"
+msgstr "Genehmigen"
+
+#: ../../Zotlabs/Module/Connections.php:276
+msgid "Ignore connection"
+msgstr "Verbindung ignorieren"
+
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Recent activity"
+msgstr "Kürzliche Aktivitäten"
+
+#: ../../Zotlabs/Module/Connections.php:302 ../../Zotlabs/Lib/Apps.php:209
+#: ../../include/nav.php:189 ../../include/text.php:916
+msgid "Connections"
+msgstr "Verbindungen"
+
+#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44
+#: ../../Zotlabs/Lib/Apps.php:230 ../../include/nav.php:168
+#: ../../include/text.php:986 ../../include/text.php:998
+#: ../../include/widgets.php:315 ../../include/acl_selectors.php:203
+msgid "Search"
+msgstr "Suche"
+
+#: ../../Zotlabs/Module/Connections.php:307
+msgid "Search your connections"
+msgstr "Verbindungen durchsuchen"
+
+#: ../../Zotlabs/Module/Connections.php:308
+msgid "Connections search"
+msgstr "Verbindung suchen"
+
+#: ../../Zotlabs/Module/Connections.php:309
+#: ../../Zotlabs/Module/Directory.php:391
+#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
+msgid "Find"
+msgstr "Finde"
+
+#: ../../Zotlabs/Module/Cover_photo.php:58
+#: ../../Zotlabs/Module/Profile_photo.php:61
+msgid "Image uploaded but image cropping failed."
+msgstr "Bild hochgeladen, aber das Zurechtschneiden schlug fehl."
+
+#: ../../Zotlabs/Module/Cover_photo.php:134
+#: ../../Zotlabs/Module/Cover_photo.php:181
+msgid "Cover Photos"
+msgstr "Cover Foto"
+
+#: ../../Zotlabs/Module/Cover_photo.php:154
+#: ../../Zotlabs/Module/Profile_photo.php:135
+msgid "Image resize failed."
+msgstr "Bild-Anpassung fehlgeschlagen."
+
+#: ../../Zotlabs/Module/Cover_photo.php:168
+#: ../../Zotlabs/Module/Profile_photo.php:196 ../../include/photos.php:149
+msgid "Unable to process image"
+msgstr "Kann Bild nicht verarbeiten"
+
+#: ../../Zotlabs/Module/Cover_photo.php:192
+#: ../../Zotlabs/Module/Profile_photo.php:231
+msgid "Image upload failed."
+msgstr "Hochladen des Bilds fehlgeschlagen."
+
+#: ../../Zotlabs/Module/Cover_photo.php:210
+#: ../../Zotlabs/Module/Profile_photo.php:250
+msgid "Unable to process image."
+msgstr "Kann Bild nicht verarbeiten."
+
+#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4253
+msgid "female"
+msgstr "weiblich"
+
+#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4254
+#, php-format
+msgid "%1$s updated her %2$s"
+msgstr "%1$s hat ihr %2$s aktualisiert"
+
+#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4255
+msgid "male"
+msgstr "männlich"
+
+#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4256
+#, php-format
+msgid "%1$s updated his %2$s"
+msgstr "%1$s hat sein %2$s aktualisiert"
+
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4258
+#, php-format
+msgid "%1$s updated their %2$s"
+msgstr "%1$s hat sein/ihr %2$s aktualisiert"
+
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1677
+msgid "cover photo"
+msgstr "Cover Foto"
+
+#: ../../Zotlabs/Module/Cover_photo.php:303
+#: ../../Zotlabs/Module/Cover_photo.php:318
+#: ../../Zotlabs/Module/Profile_photo.php:311
+#: ../../Zotlabs/Module/Profile_photo.php:352
+msgid "Photo not available."
+msgstr "Foto nicht verfügbar."
+
+#: ../../Zotlabs/Module/Cover_photo.php:354
+#: ../../Zotlabs/Module/Profile_photo.php:407
+msgid "Upload File:"
+msgstr "Datei hochladen:"
+
+#: ../../Zotlabs/Module/Cover_photo.php:355
+#: ../../Zotlabs/Module/Profile_photo.php:408
+msgid "Select a profile:"
+msgstr "Wähle ein Profil:"
+
+#: ../../Zotlabs/Module/Cover_photo.php:356
+msgid "Upload Cover Photo"
+msgstr "Cover Foto hochladen"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:416
+#: ../../Zotlabs/Module/Settings/Channel.php:399
+msgid "or"
+msgstr "oder"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:416
+msgid "skip this step"
+msgstr "diesen Schritt überspringen"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:416
+msgid "select a photo from your photo albums"
+msgstr "ein Foto aus meinen Fotoalben"
+
+#: ../../Zotlabs/Module/Cover_photo.php:377
+#: ../../Zotlabs/Module/Profile_photo.php:435
+msgid "Crop Image"
+msgstr "Bild zuschneiden"
+
+#: ../../Zotlabs/Module/Cover_photo.php:378
+#: ../../Zotlabs/Module/Profile_photo.php:436
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Bitte schneide das Bild für eine optimale Anzeige passend zu."
+
+#: ../../Zotlabs/Module/Cover_photo.php:380
+#: ../../Zotlabs/Module/Profile_photo.php:438
+msgid "Done Editing"
+msgstr "Bearbeitung fertigstellen"
#: ../../Zotlabs/Module/Admin/Features.php:55
#: ../../Zotlabs/Module/Admin/Features.php:56
@@ -980,8 +1727,20 @@ msgstr "Zusätzliche Funktionen verwalten"
msgid "Log settings updated."
msgstr "Protokoll-Einstellungen aktualisiert."
-#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1583
-#: ../../include/widgets.php:1593
+#: ../../Zotlabs/Module/Admin/Logs.php:82
+#: ../../Zotlabs/Module/Admin/Plugins.php:336
+#: ../../Zotlabs/Module/Admin/Plugins.php:427
+#: ../../Zotlabs/Module/Admin/Security.php:86
+#: ../../Zotlabs/Module/Admin/Themes.php:120
+#: ../../Zotlabs/Module/Admin/Themes.php:154
+#: ../../Zotlabs/Module/Admin/Accounts.php:164
+#: ../../Zotlabs/Module/Admin/Channels.php:145
+#: ../../Zotlabs/Module/Admin/Site.php:258 ../../Zotlabs/Module/Admin.php:137
+msgid "Administration"
+msgstr "Administration"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1658
+#: ../../include/widgets.php:1668
msgid "Logs"
msgstr "Protokolle"
@@ -1009,9 +1768,9 @@ msgstr "Protokollstufe"
#: ../../Zotlabs/Module/Admin/Plugins.php:254
#: ../../Zotlabs/Module/Admin/Themes.php:69
-#: ../../Zotlabs/Module/Display.php:40 ../../Zotlabs/Module/Filestorage.php:32
-#: ../../Zotlabs/Module/Thing.php:89 ../../Zotlabs/Module/Viewsrc.php:24
-#: ../../Zotlabs/Module/Admin.php:62 ../../include/items.php:3417
+#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Display.php:40
+#: ../../Zotlabs/Module/Admin.php:60 ../../Zotlabs/Module/Thing.php:89
+#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3343
msgid "Item not found."
msgstr "Element nicht gefunden."
@@ -1036,7 +1795,7 @@ msgid "Enable"
msgstr "Aktivieren"
#: ../../Zotlabs/Module/Admin/Plugins.php:337
-#: ../../Zotlabs/Module/Admin/Plugins.php:428 ../../include/widgets.php:1561
+#: ../../Zotlabs/Module/Admin/Plugins.php:428 ../../include/widgets.php:1636
msgid "Plugins"
msgstr "Plug-Ins"
@@ -1047,7 +1806,7 @@ msgstr "Umschalten"
#: ../../Zotlabs/Module/Admin/Plugins.php:339
#: ../../Zotlabs/Module/Admin/Themes.php:123 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/nav.php:213 ../../include/widgets.php:680
+#: ../../include/nav.php:211 ../../include/widgets.php:680
msgid "Settings"
msgstr "Einstellungen"
@@ -1116,11 +1875,15 @@ msgstr "Installieren"
#: ../../Zotlabs/Module/Admin/Plugins.php:414
#: ../../Zotlabs/Module/Fbrowser.php:66 ../../Zotlabs/Module/Fbrowser.php:88
-#: ../../Zotlabs/Module/Wiki.php:171 ../../Zotlabs/Module/Wiki.php:211
-#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
+#: ../../Zotlabs/Module/Wiki.php:242 ../../Zotlabs/Module/Wiki.php:277
#: ../../Zotlabs/Module/Settings/Oauth.php:88
#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../include/conversation.php:1247 ../../include/conversation.php:1296
+#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
+#: ../../extend/addon/addon/friendica/dfrn_request.php:879
+#: ../../extend/addon/addon/js_upload/js_upload.php:46
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154
+#: ../../include/conversation.php:1264 ../../include/conversation.php:1313
msgid "Cancel"
msgstr "Abbrechen"
@@ -1139,6 +1902,7 @@ msgstr "Ein neues Plugin-Repository installieren"
#: ../../Zotlabs/Module/Admin/Plugins.php:443
#: ../../Zotlabs/Module/Settings/Oauth.php:42
#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:334
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152
msgid "Update"
msgstr "Aktualisieren"
@@ -1147,7 +1911,8 @@ msgid "Switch branch"
msgstr "Zweig/Branch wechseln"
#: ../../Zotlabs/Module/Admin/Plugins.php:445
-#: ../../Zotlabs/Module/Tagrm.php:137 ../../Zotlabs/Module/Photos.php:989
+#: ../../Zotlabs/Module/Photos.php:989 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../extend/addon/addon/superblock/superblock.php:110
msgid "Remove"
msgstr "Entfernen"
@@ -1190,14 +1955,6 @@ msgstr "Hilfetext"
msgid "Additional info (optional)"
msgstr "Zusätzliche Informationen (optional)"
-#: ../../Zotlabs/Module/Admin/Profs.php:74
-#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Filer.php:53
-#: ../../Zotlabs/Module/Rbmark.php:32 ../../Zotlabs/Module/Rbmark.php:104
-#: ../../include/text.php:972 ../../include/text.php:984
-#: ../../include/widgets.php:201
-msgid "Save"
-msgstr "Speichern"
-
#: ../../Zotlabs/Module/Admin/Profs.php:83
msgid "Field definition not found"
msgstr "Feld-Definition nicht gefunden"
@@ -1206,7 +1963,7 @@ msgstr "Feld-Definition nicht gefunden"
msgid "Edit Profile Field"
msgstr "Profilfeld bearbeiten"
-#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1564
+#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1639
msgid "Profile Fields"
msgstr "Profil Felder"
@@ -1286,7 +2043,7 @@ msgid ""
"embedded content from that site is explicitly blocked."
msgstr "Alle anderen eingebetteten Inhalte werden gefiltert, <strong>es sei denn</strong>, eingebettete Inhalte von einer bestimmten Seite sind explizit blockiert."
-#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1559
+#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1634
msgid "Security"
msgstr "Sicherheit"
@@ -1374,999 +2131,732 @@ msgstr "Eine Website/Domain pro Zeile. Standardmäßig wird eingebetteter Inhalt
msgid "Block embedded HTML from these domains"
msgstr "Eingebettete HTML Inhalte von diesen Seiten blockieren"
-#: ../../Zotlabs/Module/Admin/Site.php:135
+#: ../../Zotlabs/Module/Admin/Themes.php:18
+msgid "Theme settings updated."
+msgstr "Theme-Einstellungen aktualisiert."
+
+#: ../../Zotlabs/Module/Admin/Themes.php:58
+msgid "No themes found."
+msgstr "Keine Theme gefunden."
+
+#: ../../Zotlabs/Module/Admin/Themes.php:114
+msgid "Screenshot"
+msgstr "Bildschirmfoto"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:121
+#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1637
+msgid "Themes"
+msgstr "Themes"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:160
+msgid "[Experimental]"
+msgstr "[Experimentell]"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:161
+msgid "[Unsupported]"
+msgstr "[Nicht unterstützt]"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:29
+#, php-format
+msgid "Password changed for account %d."
+msgstr "Passwort für Konto %d geändert."
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:46
+msgid "Account settings updated."
+msgstr "Kontoeinstellungen aktualisiert."
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:61
+msgid "Account not found."
+msgstr "Konto nicht gefunden."
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:68
+msgid "Account Edit"
+msgstr "Kontobearbeitung"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:69
+msgid "New Password"
+msgstr "Neues Passwort"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:70
+msgid "New Password again"
+msgstr "Neues Passwort wiederholen"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:71
+msgid "Technical skill level"
+msgstr "Technische Qualifikationsstufe"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:72
+msgid "Account language (for emails)"
+msgstr "Kontosprache (für E-Mails)"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:73
+msgid "Service class"
+msgstr "Dienstklasse"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:36
+#, php-format
+msgid "%s account blocked/unblocked"
+msgid_plural "%s account blocked/unblocked"
+msgstr[0] "%s Konto blockiert/freigegeben"
+msgstr[1] "%s Konten blockiert/freigegeben"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:43
+#, php-format
+msgid "%s account deleted"
+msgid_plural "%s accounts deleted"
+msgstr[0] "%s Konto gelöscht"
+msgstr[1] "%s Konten gelöscht"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:79
+msgid "Account not found"
+msgstr "Konto nicht gefunden"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:90
+#, php-format
+msgid "Account '%s' deleted"
+msgstr "Konto '%s' gelöscht"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:98
+#, php-format
+msgid "Account '%s' blocked"
+msgstr "Konto '%s' blockiert"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:106
+#, php-format
+msgid "Account '%s' unblocked"
+msgstr "Konto '%s' freigegeben"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:165
+#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1632
+msgid "Accounts"
+msgstr "Konten"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:167
+#: ../../Zotlabs/Module/Admin/Channels.php:148
+msgid "select all"
+msgstr "Alle auswählen"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:168
+msgid "Registrations waiting for confirm"
+msgstr "Registrierungen warten auf Bestätigung"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:169
+msgid "Request date"
+msgstr "Antragsdatum"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:169
+#: ../../Zotlabs/Module/Admin/Accounts.php:181
+#: ../../extend/addon/addon/redred/redred.php:107
+#: ../../extend/addon/addon/rtof/rtof.php:93
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1140
+#: ../../extend/addon/addon/openid/MysqlProvider.php:56
+#: ../../extend/addon/addon/openid/MysqlProvider.php:57
+#: ../../include/network.php:2237
+msgid "Email"
+msgstr "E-Mail"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:170
+msgid "No registrations."
+msgstr "Keine Registrierungen."
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:172
+msgid "Deny"
+msgstr "Verweigern"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:180
+msgid "ID"
+msgstr "ID"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:267
+msgid "All Channels"
+msgstr "Alle Kanäle"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:183
+msgid "Register date"
+msgstr "Registrierungs-Datum"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:184
+msgid "Last login"
+msgstr "Letzte Anmeldung"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:185
+msgid "Expires"
+msgstr "Verfällt"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:186
+msgid "Service Class"
+msgstr "Service-Klasse"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:188
+msgid ""
+"Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
+" on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Die ausgewählten Konten werden gelöscht!\\n\\nAlles, was diese Konten auf diesem Hub veröffentlicht haben, wird endgültig gelöscht werden!\\n\\nBist du dir sicher?"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:189
+msgid ""
+"The account {0} will be deleted!\\n\\nEverything this account has posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Das Konto {0} wird gelöscht!\\n\\nAlles, was dieses Konto auf diesem Hub veröffentlicht hat, wird endgültig gelöscht werden!\\n\\nBist Du sicher?"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:31
+#, php-format
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channels censored/uncensored"
+msgstr[0] "%s Kanal gesperrt/freigegeben"
+msgstr[1] "%s Kanäle gesperrt/freigegeben"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:40
+#, php-format
+msgid "%s channel code allowed/disallowed"
+msgid_plural "%s channels code allowed/disallowed"
+msgstr[0] "Code für %s Kanal gesperrt/freigegeben"
+msgstr[1] "Code für %s Kanäle gesperrt/freigegeben"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:46
+#, php-format
+msgid "%s channel deleted"
+msgid_plural "%s channels deleted"
+msgstr[0] "%s Kanal gelöscht"
+msgstr[1] "%s Kanäle gelöscht"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:65
+msgid "Channel not found"
+msgstr "Kanal nicht gefunden"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:75
+#, php-format
+msgid "Channel '%s' deleted"
+msgstr "Kanal '%s' gelöscht"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:87
+#, php-format
+msgid "Channel '%s' censored"
+msgstr "Kanal '%s' gesperrt"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:87
+#, php-format
+msgid "Channel '%s' uncensored"
+msgstr "Kanal '%s' freigegeben"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:98
+#, php-format
+msgid "Channel '%s' code allowed"
+msgstr "Code für Kanal '%s' freigegeben"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:98
+#, php-format
+msgid "Channel '%s' code disallowed"
+msgstr "Code für Kanal '%s' gesperrt"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1633
+msgid "Channels"
+msgstr "Kanäle"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:150
+msgid "Censor"
+msgstr "Sperren"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:151
+msgid "Uncensor"
+msgstr "Freigeben"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:152
+msgid "Allow Code"
+msgstr "Code erlauben"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:153
+msgid "Disallow Code"
+msgstr "Code sperren"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:154
+#: ../../include/conversation.php:1671
+msgid "Channel"
+msgstr "Kanal"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:158
+msgid "UID"
+msgstr "UID"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:162
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Alle ausgewählten Kanäle werden gelöscht!\\n\\nAlles was von diesen Kanälen auf diesem Server geschrieben wurde, wird dauerhaft gelöscht!\\n\\nBist Du sicher?"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:163
+msgid ""
+"The channel {0} will be deleted!\\n\\nEverything that was posted in this "
+"channel on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Der Kanal {0} wird gelöscht!\\n\\nAlles was von diesem Kanal auf diesem Server geschrieben wurde, wird gelöscht!\\n\\nBist Du sicher?"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:19
+msgid "Update has been marked successful"
+msgstr "Update wurde als erfolgreich markiert"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:29
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "Ausführen von %s fehlgeschlagen. Überprüfe die Systemprotokolle."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:32
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "Update %s wurde erfolgreich ausgeführt."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:36
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "Update %s lieferte keinen Rückgabewert. Erfolg unbekannt."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:39
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "Update-Funktion %s konnte nicht gefunden werden."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:55
+msgid "No failed updates."
+msgstr "Keine fehlgeschlagenen Aktualisierungen."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:59
+msgid "Failed Updates"
+msgstr "Fehlgeschlagene Aktualisierungen"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:61
+msgid "Mark success (if update was manually applied)"
+msgstr "Als erfolgreich markieren (wenn das Update manuell ausgeführt wurde)"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:62
+msgid "Attempt to execute this update step automatically"
+msgstr "Versuche, diesen Updateschritt automatisch auszuführen"
+
+#: ../../Zotlabs/Module/Admin/Site.php:133
msgid "Site settings updated."
msgstr "Site-Einstellungen aktualisiert."
-#: ../../Zotlabs/Module/Admin/Site.php:162 ../../include/text.php:2942
+#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2918
msgid "Default"
msgstr "Standard"
-#: ../../Zotlabs/Module/Admin/Site.php:172
-#: ../../Zotlabs/Module/Settings/Display.php:141
+#: ../../Zotlabs/Module/Admin/Site.php:169
+#: ../../Zotlabs/Module/Settings/Display.php:143
msgid "mobile"
msgstr "mobil"
-#: ../../Zotlabs/Module/Admin/Site.php:174
+#: ../../Zotlabs/Module/Admin/Site.php:171
msgid "experimental"
msgstr "experimentell"
-#: ../../Zotlabs/Module/Admin/Site.php:176
+#: ../../Zotlabs/Module/Admin/Site.php:173
msgid "unsupported"
msgstr "nicht unterstützt"
-#: ../../Zotlabs/Module/Admin/Site.php:221 ../../Zotlabs/Module/Menu.php:100
-#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Profiles.php:647
-#: ../../Zotlabs/Module/Api.php:85 ../../Zotlabs/Module/Events.php:462
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:472
-#: ../../Zotlabs/Module/Connedit.php:408 ../../Zotlabs/Module/Connedit.php:686
-#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Photos.php:653
-#: ../../Zotlabs/Module/Settings/Channel.php:289
-#: ../../Zotlabs/Module/Settings/Display.php:101 ../../include/dir_fns.php:143
-#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
-#: ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1743
-msgid "No"
-msgstr "Nein"
-
-#: ../../Zotlabs/Module/Admin/Site.php:222
+#: ../../Zotlabs/Module/Admin/Site.php:219
msgid "Yes - with approval"
msgstr "Ja - mit Zustimmung"
-#: ../../Zotlabs/Module/Admin/Site.php:223 ../../Zotlabs/Module/Menu.php:100
-#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Profiles.php:647
-#: ../../Zotlabs/Module/Api.php:84 ../../Zotlabs/Module/Events.php:462
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:472
-#: ../../Zotlabs/Module/Connedit.php:408 ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Photos.php:653
-#: ../../Zotlabs/Module/Settings/Channel.php:289
-#: ../../Zotlabs/Module/Settings/Display.php:101 ../../include/dir_fns.php:143
-#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
-#: ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1743
-msgid "Yes"
-msgstr "Ja"
-
-#: ../../Zotlabs/Module/Admin/Site.php:228
+#: ../../Zotlabs/Module/Admin/Site.php:225
msgid "My site is not a public server"
msgstr "Mein Server ist kein öffentlicher Server"
-#: ../../Zotlabs/Module/Admin/Site.php:229
+#: ../../Zotlabs/Module/Admin/Site.php:226
msgid "My site has paid access only"
msgstr "Meine Seite hat nur bezahlten Zugriff"
-#: ../../Zotlabs/Module/Admin/Site.php:230
+#: ../../Zotlabs/Module/Admin/Site.php:227
msgid "My site has free access only"
msgstr "Meine Seite hat nur freien Zugriff"
-#: ../../Zotlabs/Module/Admin/Site.php:231
+#: ../../Zotlabs/Module/Admin/Site.php:228
msgid "My site offers free accounts with optional paid upgrades"
msgstr "Mein Server bietet kostenlose Konten mit der Möglichkeit zu bezahlten Upgrades"
-#: ../../Zotlabs/Module/Admin/Site.php:242 ../../Zotlabs/Module/Setup.php:336
+#: ../../Zotlabs/Module/Admin/Site.php:239 ../../Zotlabs/Module/Setup.php:328
msgid "Basic/Minimal Social Networking"
msgstr "Einfaches/minimales soziales Netzwerken"
-#: ../../Zotlabs/Module/Admin/Site.php:243 ../../Zotlabs/Module/Setup.php:337
+#: ../../Zotlabs/Module/Admin/Site.php:240 ../../Zotlabs/Module/Setup.php:329
msgid "Standard Configuration (default)"
msgstr "Standardkonfiguration (Standard)"
-#: ../../Zotlabs/Module/Admin/Site.php:244 ../../Zotlabs/Module/Setup.php:338
+#: ../../Zotlabs/Module/Admin/Site.php:241 ../../Zotlabs/Module/Setup.php:330
msgid "Professional"
msgstr "Professionell"
-#: ../../Zotlabs/Module/Admin/Site.php:249
-#: ../../Zotlabs/Module/Settings/Account.php:105
+#: ../../Zotlabs/Module/Admin/Site.php:245 ../../Zotlabs/Lib/Techlevels.php:10
msgid "Beginner/Basic"
msgstr "Anfänger/Basis"
-#: ../../Zotlabs/Module/Admin/Site.php:250
-#: ../../Zotlabs/Module/Settings/Account.php:106
+#: ../../Zotlabs/Module/Admin/Site.php:246 ../../Zotlabs/Lib/Techlevels.php:11
msgid "Novice - not skilled but willing to learn"
msgstr "Anfänger - unerfahren, aber bereit zu lernen"
-#: ../../Zotlabs/Module/Admin/Site.php:251
-#: ../../Zotlabs/Module/Settings/Account.php:107
+#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Lib/Techlevels.php:12
msgid "Intermediate - somewhat comfortable"
msgstr "Fortgeschritten - relativ komfortabel"
-#: ../../Zotlabs/Module/Admin/Site.php:252
-#: ../../Zotlabs/Module/Settings/Account.php:108
+#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Lib/Techlevels.php:13
msgid "Advanced - very comfortable"
msgstr "Fortgeschritten - sehr komfortabel"
-#: ../../Zotlabs/Module/Admin/Site.php:253
-#: ../../Zotlabs/Module/Settings/Account.php:109
+#: ../../Zotlabs/Module/Admin/Site.php:249 ../../Zotlabs/Lib/Techlevels.php:14
msgid "Expert - I can write computer code"
msgstr "Experte - Ich kann Computercode schreiben"
-#: ../../Zotlabs/Module/Admin/Site.php:254
-#: ../../Zotlabs/Module/Settings/Account.php:110
+#: ../../Zotlabs/Module/Admin/Site.php:250 ../../Zotlabs/Lib/Techlevels.php:15
msgid "Wizard - I probably know more than you do"
msgstr "Zauberer - ich kann wahrscheinlich mehr als Du"
-#: ../../Zotlabs/Module/Admin/Site.php:266 ../../include/widgets.php:1556
+#: ../../Zotlabs/Module/Admin/Site.php:259 ../../include/widgets.php:1631
msgid "Site"
msgstr "Seite"
-#: ../../Zotlabs/Module/Admin/Site.php:269
+#: ../../Zotlabs/Module/Admin/Site.php:262
msgid "File upload"
msgstr "Dateiupload"
-#: ../../Zotlabs/Module/Admin/Site.php:270
+#: ../../Zotlabs/Module/Admin/Site.php:263
msgid "Policies"
msgstr "Richtlinien"
-#: ../../Zotlabs/Module/Admin/Site.php:271
+#: ../../Zotlabs/Module/Admin/Site.php:264
#: ../../include/contact_widgets.php:16
msgid "Advanced"
msgstr "Fortgeschritten"
-#: ../../Zotlabs/Module/Admin/Site.php:275
+#: ../../Zotlabs/Module/Admin/Site.php:268
+#: ../../extend/addon/addon/statusnet/statusnet.php:890
msgid "Site name"
msgstr "Seitenname"
-#: ../../Zotlabs/Module/Admin/Site.php:277 ../../Zotlabs/Module/Setup.php:359
+#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Module/Setup.php:351
msgid "Server Configuration/Role"
msgstr "Serverkonfiguration/Rolle"
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:272
msgid "Site default technical skill level"
msgstr "Standard-Qualifikationsstufe der Website"
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:272
msgid "Used to provide a member experience matched to technical comfort level"
msgstr "Dies wird verwendet, um eine Benutzererfahrung passend zur technischen Qualifikationsstufe zu bieten."
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:274
msgid "Lock the technical skill level setting"
msgstr "Sperre die technische Qualifikationsstufe"
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:274
msgid "Members can set their own technical comfort level by default"
msgstr "Benutzer können standardmäßig ihre eigene technische Qualifikationsstufe einstellen"
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:276
msgid "Banner/Logo"
msgstr "Banner/Logo"
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:277
msgid "Administrator Information"
msgstr "Administrator-Informationen"
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:277
msgid ""
"Contact information for site administrators. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Kontaktinformationen für Administratoren des Servers. Wird auf der siteinfo-Seite angezeigt. BBCode kann verwendet werden."
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Siteinfo.php:23
+msgid "Site Information"
+msgstr "Seiteninformationen"
+
+#: ../../Zotlabs/Module/Admin/Site.php:278
+msgid ""
+"Publicly visible description of this site. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Öffentlich sichtbare Beschreibung dieses Servers. Wird auf der siteinfo-Seite angezeigt. BBCode kann hier verwendet werden."
+
+#: ../../Zotlabs/Module/Admin/Site.php:279
msgid "System language"
msgstr "System-Sprache"
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:280
msgid "System theme"
msgstr "System-Theme"
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:280
msgid ""
"Default system theme - may be over-ridden by user profiles - <a href='#' "
"id='cnftheme'>change theme settings</a>"
msgstr "Standard-System-Theme – kann durch Nutzerprofile überschieben werden – <a href='#' id='cnftheme'>Theme-Einstellungen ändern</a>"
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Mobile system theme"
msgstr "Mobile System-Theme:"
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Theme for mobile devices"
msgstr "Theme für mobile Geräte"
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "Allow Feeds as Connections"
msgstr "Feeds als Verbindungen erlauben"
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "(Heavy system resource usage)"
msgstr "(führt zu hoher Systemlast)"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:284
msgid "Maximum image size"
msgstr "Maximale Bildgröße"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:284
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr "Maximale Größe hochgeladener Bilder in Bytes. Standard ist 0 (keine Einschränkung)."
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:285
msgid "Does this site allow new member registration?"
msgstr "Erlaubt dieser Server die Registrierung neuer Nutzer?"
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid "Invitation only"
msgstr "Nur mit Einladung"
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid ""
"Only allow new member registrations with an invitation code. Above register "
"policy must be set to Yes."
msgstr "Erlaube die Neuregistrierung von Mitglieder nur mit einem Einladungscode. Die Registrierungs-Politik muss oben auf Ja gesetzt werden."
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:287
msgid "Which best describes the types of account offered by this hub?"
msgstr "Was ist die passendste Beschreibung der Konten auf diesem Hub?"
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:288
msgid "Register text"
msgstr "Registrierungstext"
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:288
msgid "Will be displayed prominently on the registration page."
msgstr "Wird gut sichtbar auf der Registrierungs-Seite angezeigt."
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid "Site homepage to show visitors (default: login box)"
msgstr "Homepage des Hubs, die Besuchern angezeigt wird (Voreinstellung: Anmeldemaske)"
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid ""
"example: 'public' to show public stream, 'page/sys/home' to show a system "
"webpage called 'home' or 'include:home.html' to include a file."
msgstr "Beispiele: 'public', um den Stream aller öffentlichen Beiträge anzuzeigen, 'page/sys/home', um eine System-Webseite namens 'home' anzuzeigen, 'include:home.html', um eine Datei einzufügen."
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid "Preserve site homepage URL"
msgstr "Homepage-URL schützen"
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid ""
"Present the site homepage in a frame at the original location instead of "
"redirecting"
msgstr "Zeigt die Homepage an der Original-URL in einem Frame an, statt auf die eigentliche Adresse der Seite umzuleiten."
-#: ../../Zotlabs/Module/Admin/Site.php:298
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Accounts abandoned after x days"
msgstr "Konten gelten nach X Tagen als unbenutzt"
-#: ../../Zotlabs/Module/Admin/Site.php:298
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr "Verschwende keine Systemressourcen auf das Pollen von externen Seiten, wenn das Konto nicht mehr benutzt wird. Trage hier 0 für kein zeitliches Limit."
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid "Allowed friend domains"
msgstr "Erlaubte Domains für Kontakte"
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid ""
"Comma separated list of domains which are allowed to establish friendships "
"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr "Liste der Domains, die für Freundschaften erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben."
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Verify Email Addresses"
msgstr "E-Mail-Adressen überprüfen"
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid ""
"Check to verify email addresses used in account registration (recommended)."
msgstr "Aktivieren, um die Überprüfung von E-Mail-Adressen bei der Registrierung von Benutzerkonten zu aktivieren (empfohlen)."
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:294
msgid "Force publish"
msgstr "Veröffentlichung erzwingen"
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:294
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr "Die Veröffentlichung aller Profile dieses Servers im Verzeichnis erzwingen."
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid "Import Public Streams"
msgstr "Öffentliche Beiträge importieren"
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid ""
"Import and allow access to public content pulled from other sites. Warning: "
"this content is unmoderated."
msgstr "Öffentliche Beiträge von anderen Servern importieren und zur Verfügung stellen. Warnung: Diese Inhalte sind nicht moderiert."
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Login on Homepage"
msgstr "Log-in auf der Startseite"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid ""
"Present a login box to visitors on the home page if no other content has "
"been configured."
msgstr "Zeigt Besuchern der Homepage eine Anmeldemaske, falls keine anderen Inhalte konfiguriert wurden."
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid "Enable context help"
msgstr "Kontext-Hilfe aktivieren"
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid ""
"Display contextual help for the current page when the help button is "
"pressed."
msgstr "Zeigt Kontext-sensitive Hilfe für die aktuelle Seite an, wenn der Hilfe-Knopf geklickt wird."
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "Directory Server URL"
msgstr "Verzeichnisserver-URL"
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "Default directory server"
msgstr "Standard-Verzeichnisserver"
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:301
msgid "Proxy user"
msgstr "Proxy Benutzer"
-#: ../../Zotlabs/Module/Admin/Site.php:309
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "Proxy URL"
msgstr "Proxy URL"
-#: ../../Zotlabs/Module/Admin/Site.php:310
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Network timeout"
msgstr "Netzwerk-Timeout"
-#: ../../Zotlabs/Module/Admin/Site.php:310
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr "Wert in Sekunden. 0 für unbegrenzt (nicht empfohlen)."
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid "Delivery interval"
msgstr "Auslieferung Intervall"
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid ""
"Delay background delivery processes by this many seconds to reduce system "
"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
"for large dedicated servers."
msgstr "Verzögere im Hintergrund laufende Auslieferungsprozesse um die angegebene Anzahl Sekunden, um die Systemlast zu verringern. Empfehlungen: 4-5 für Shared Hosts, 2-3 für VPS, 0-1 für große dedizierte Server."
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid "Deliveries per process"
msgstr "Zustellungen pro Prozess"
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid ""
"Number of deliveries to attempt in a single operating system process. Adjust"
" if necessary to tune system performance. Recommend: 1-5."
msgstr "Anzahl der Zustellungen, die innerhalb eines einzelnen Betriebssystemprozesses versucht werden. Anpassen, falls nötig, um die System-Performance zu verbessern. Empfehlung: 1-5."
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid "Poll interval"
msgstr "Abfrageintervall"
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid ""
"Delay background polling processes by this many seconds to reduce system "
"load. If 0, use delivery interval."
msgstr "Verzögere Hintergrundprozesse um diese Anzahl Sekunden, um die Systemlast zu reduzieren. Bei 0 wird das Auslieferungsintervall verwendet."
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Maximum Load Average"
msgstr "Maximales Load Average"
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default 50."
msgstr "Maximale Systemlast, bevor Verteil- und Empfangsprozesse verschoben werden – Standard 50"
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "Expiration period in days for imported (grid/network) content"
msgstr "Setze den Zeitraum (in Tagen), ab wann importierte (aus dem Netzwerk) Inhalte ablaufen sollen"
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "0 for no expiration of imported content"
msgstr "0 = keine Löschung importierter Inhalte"
-#: ../../Zotlabs/Module/Admin/Themes.php:18
-msgid "Theme settings updated."
-msgstr "Theme-Einstellungen aktualisiert."
-
-#: ../../Zotlabs/Module/Admin/Themes.php:58
-msgid "No themes found."
-msgstr "Keine Theme gefunden."
-
-#: ../../Zotlabs/Module/Admin/Themes.php:114
-msgid "Screenshot"
-msgstr "Bildschirmfoto"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:121
-#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1562
-msgid "Themes"
-msgstr "Themes"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:160
-msgid "[Experimental]"
-msgstr "[Experimentell]"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:161
-msgid "[Unsupported]"
-msgstr "[Nicht unterstützt]"
-
-#: ../../Zotlabs/Module/Import.php:33
-#, php-format
-msgid "Your service plan only allows %d channels."
-msgstr "Dein Vertrag erlaubt nur %d Kanäle."
-
-#: ../../Zotlabs/Module/Import.php:71 ../../Zotlabs/Module/Import_items.php:42
-msgid "Nothing to import."
-msgstr "Nichts zu importieren."
-
-#: ../../Zotlabs/Module/Import.php:95 ../../Zotlabs/Module/Import_items.php:66
-msgid "Unable to download data from old server"
-msgstr "Daten können vom alten Server nicht heruntergeladen werden"
-
-#: ../../Zotlabs/Module/Import.php:101
-#: ../../Zotlabs/Module/Import_items.php:72
-msgid "Imported file is empty."
-msgstr "Die importierte Datei ist leer."
-
-#: ../../Zotlabs/Module/Import.php:123
-#: ../../Zotlabs/Module/Import_items.php:88
-#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
-msgstr "Achtung: Datenbankversionen unterscheiden sich um %1$d Aktualisierungen."
-
-#: ../../Zotlabs/Module/Import.php:153 ../../include/import.php:107
-msgid "Cloned channel not found. Import failed."
-msgstr "Geklonter Kanal nicht gefunden. Import fehlgeschlagen."
-
-#: ../../Zotlabs/Module/Import.php:163
-msgid "No channel. Import failed."
-msgstr "Kein Kanal. Import fehlgeschlagen."
-
-#: ../../Zotlabs/Module/Import.php:520
-#: ../../include/Import/import_diaspora.php:142
-msgid "Import completed."
-msgstr "Import abgeschlossen."
-
-#: ../../Zotlabs/Module/Import.php:542
-msgid "You must be logged in to use this feature."
-msgstr "Du musst angemeldet sein um diese Funktion zu nutzen."
-
-#: ../../Zotlabs/Module/Import.php:547
-msgid "Import Channel"
-msgstr "Kanal importieren"
-
-#: ../../Zotlabs/Module/Import.php:548
-msgid ""
-"Use this form to import an existing channel from a different server/hub. You"
-" may retrieve the channel identity from the old server/hub via the network "
-"or provide an export file."
-msgstr "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren."
-
-#: ../../Zotlabs/Module/Import.php:549
-#: ../../Zotlabs/Module/Import_items.php:121
-msgid "File to Upload"
-msgstr "Hochzuladende Datei:"
-
-#: ../../Zotlabs/Module/Import.php:550
-msgid "Or provide the old server/hub details"
-msgstr "Oder gib die Details Deines bisherigen $Projectname-Hubs ein"
-
-#: ../../Zotlabs/Module/Import.php:551
-msgid "Your old identity address (xyz@example.com)"
-msgstr "Bisherige Kanal-Adresse (xyz@example.com)"
-
-#: ../../Zotlabs/Module/Import.php:552
-msgid "Your old login email address"
-msgstr "Deine alte Login-E-Mail-Adresse"
-
-#: ../../Zotlabs/Module/Import.php:553
-msgid "Your old login password"
-msgstr "Dein altes Passwort"
-
-#: ../../Zotlabs/Module/Import.php:554
-msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be"
-" able to post from either location, but only one can be marked as the "
-"primary location for files, photos, and media."
-msgstr "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige $Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein."
-
-#: ../../Zotlabs/Module/Import.php:555
-msgid "Make this hub my primary location"
-msgstr "Dieser $Pojectname-Hub ist mein primärer Hub."
-
-#: ../../Zotlabs/Module/Import.php:556
-msgid ""
-"Import existing posts if possible (experimental - limited by available "
-"memory"
-msgstr "Importiere bestehende Beiträge falls möglich (experimentell - begrenzt durch zur Verfügung stehenden Speicher"
+#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1454
+msgid "Public Hubs"
+msgstr "Öffentliche Hubs"
-#: ../../Zotlabs/Module/Import.php:557
+#: ../../Zotlabs/Module/Pubsites.php:27
msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
-msgstr "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur einmal ab und lasse diese Seite bis zur Fertigstellung offen."
-
-#: ../../Zotlabs/Module/Directory.php:63 ../../Zotlabs/Module/Ratings.php:83
-#: ../../Zotlabs/Module/Display.php:17 ../../Zotlabs/Module/Search.php:17
-#: ../../Zotlabs/Module/Photos.php:509
-#: ../../Zotlabs/Module/Viewconnections.php:23
-msgid "Public access denied."
-msgstr "Öffentlichen Zugriff verweigert."
-
-#: ../../Zotlabs/Module/Directory.php:243
-#, php-format
-msgid "%d rating"
-msgid_plural "%d ratings"
-msgstr[0] "%d Bewertung"
-msgstr[1] "%d Bewertungen"
-
-#: ../../Zotlabs/Module/Directory.php:254
-msgid "Gender: "
-msgstr "Geschlecht:"
-
-#: ../../Zotlabs/Module/Directory.php:256
-msgid "Status: "
-msgstr "Status:"
-
-#: ../../Zotlabs/Module/Directory.php:258
-msgid "Homepage: "
-msgstr "Webseite:"
-
-#: ../../Zotlabs/Module/Directory.php:306 ../../include/channel.php:1207
-msgid "Age:"
-msgstr "Alter:"
-
-#: ../../Zotlabs/Module/Directory.php:311 ../../include/event.php:52
-#: ../../include/event.php:84 ../../include/bb2diaspora.php:507
-#: ../../include/channel.php:1049
-msgid "Location:"
-msgstr "Ort:"
-
-#: ../../Zotlabs/Module/Directory.php:317
-msgid "Description:"
-msgstr "Beschreibung:"
-
-#: ../../Zotlabs/Module/Directory.php:322 ../../include/channel.php:1223
-msgid "Hometown:"
-msgstr "Heimatstadt:"
-
-#: ../../Zotlabs/Module/Directory.php:324 ../../include/channel.php:1231
-msgid "About:"
-msgstr "Über:"
-
-#: ../../Zotlabs/Module/Directory.php:325 ../../Zotlabs/Module/Match.php:68
-#: ../../Zotlabs/Module/Suggest.php:56 ../../include/channel.php:1034
-#: ../../include/connections.php:78 ../../include/conversation.php:957
-#: ../../include/widgets.php:147 ../../include/widgets.php:184
-msgid "Connect"
-msgstr "Verbinden"
-
-#: ../../Zotlabs/Module/Directory.php:326
-msgid "Public Forum:"
-msgstr "Öffentliches Forum:"
-
-#: ../../Zotlabs/Module/Directory.php:329
-msgid "Keywords: "
-msgstr "Schlüsselwörter:"
-
-#: ../../Zotlabs/Module/Directory.php:332
-msgid "Don't suggest"
-msgstr "Nicht vorschlagen"
-
-#: ../../Zotlabs/Module/Directory.php:334
-msgid "Common connections:"
-msgstr "Gemeinsame Verbindungen:"
-
-#: ../../Zotlabs/Module/Directory.php:383
-msgid "Global Directory"
-msgstr "Globales Verzeichnis"
-
-#: ../../Zotlabs/Module/Directory.php:383
-msgid "Local Directory"
-msgstr "Lokales Verzeichnis"
-
-#: ../../Zotlabs/Module/Directory.php:388
-#: ../../Zotlabs/Module/Directory.php:393
-#: ../../Zotlabs/Module/Connections.php:309
-#: ../../include/contact_widgets.php:23
-msgid "Find"
-msgstr "Finde"
-
-#: ../../Zotlabs/Module/Directory.php:389
-msgid "Finding:"
-msgstr "Ergebnisse:"
-
-#: ../../Zotlabs/Module/Directory.php:392 ../../Zotlabs/Module/Suggest.php:64
-#: ../../include/contact_widgets.php:24
-msgid "Channel Suggestions"
-msgstr "Kanal-Vorschläge"
-
-#: ../../Zotlabs/Module/Directory.php:394
-msgid "next page"
-msgstr "nächste Seite"
-
-#: ../../Zotlabs/Module/Directory.php:394
-msgid "previous page"
-msgstr "vorherige Seite"
-
-#: ../../Zotlabs/Module/Directory.php:395
-msgid "Sort options"
-msgstr "Sortieroptionen"
-
-#: ../../Zotlabs/Module/Directory.php:396
-msgid "Alphabetic"
-msgstr "alphabetisch"
-
-#: ../../Zotlabs/Module/Directory.php:397
-msgid "Reverse Alphabetic"
-msgstr "Entgegengesetzt alphabetisch"
-
-#: ../../Zotlabs/Module/Directory.php:398
-msgid "Newest to Oldest"
-msgstr "Neueste zuerst"
-
-#: ../../Zotlabs/Module/Directory.php:399
-msgid "Oldest to Newest"
-msgstr "Älteste zuerst"
-
-#: ../../Zotlabs/Module/Directory.php:416
-msgid "No entries (some entries may be hidden)."
-msgstr "Keine Einträge gefunden (einige könnten versteckt sein)."
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
+msgstr "Die hier aufgeführten Hubs sind öffentlich und erlauben die Registrierung im $Projectname Netzwerk. Alle Hubs dieses Netzwerks sind miteinander verbunden, so dass die Mitgliedschaft auf einem Hub die Verbindung zu beliebigen Seiten und Kanälen auf anderen Hubs ermöglicht. Es könnte sein, dass einige dieser Hubs kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den Seiten der einzelnen Hubs <strong>könnten</strong> jeweils nähere Informationen dazu stehen."
-#: ../../Zotlabs/Module/Bookmarks.php:53
-msgid "Bookmark added"
-msgstr "Lesezeichen hinzugefügt"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Hub URL"
+msgstr "Hub-URL"
-#: ../../Zotlabs/Module/Bookmarks.php:75
-msgid "My Bookmarks"
-msgstr "Meine Lesezeichen"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Access Type"
+msgstr "Zugriffstyp"
-#: ../../Zotlabs/Module/Bookmarks.php:86
-msgid "My Connections Bookmarks"
-msgstr "Lesezeichen meiner Kontakte"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Registration Policy"
+msgstr "Registrierungsrichtlinien"
-#: ../../Zotlabs/Module/Rpost.php:138 ../../Zotlabs/Module/Editpost.php:106
-msgid "Edit post"
-msgstr "Bearbeite Beitrag"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Stats"
+msgstr "Statistiken"
-#: ../../Zotlabs/Module/Ratings.php:70
-msgid "No ratings"
-msgstr "Keine Bewertungen"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Software"
+msgstr "Software"
-#: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35
-#: ../../include/conversation.php:960
+#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
+#: ../../include/conversation.php:974
msgid "Ratings"
msgstr "Bewertungen"
-#: ../../Zotlabs/Module/Ratings.php:98
-msgid "Rating: "
-msgstr "Bewertung: "
-
-#: ../../Zotlabs/Module/Ratings.php:99
-msgid "Website: "
-msgstr "Webseite: "
-
-#: ../../Zotlabs/Module/Ratings.php:101
-msgid "Description: "
-msgstr "Beschreibung: "
-
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:222
-#: ../../include/nav.php:95 ../../include/conversation.php:1671
-msgid "Photos"
-msgstr "Fotos"
-
-#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
-msgid "Invalid item."
-msgstr "Ungültiges Element."
-
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Block.php:43
-#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Wall_upload.php:33
-msgid "Channel not found."
-msgstr "Kanal nicht gefunden."
-
-#: ../../Zotlabs/Module/Page.php:131
-msgid ""
-"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
-"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
-" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
-"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
-"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
-"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "Save to Folder:"
-msgstr "Speichern in Ordner:"
-
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "- select -"
-msgstr "– auswählen –"
-
-#: ../../Zotlabs/Module/Connections.php:56
-#: ../../Zotlabs/Module/Connections.php:161
-#: ../../Zotlabs/Module/Connections.php:242
-msgid "Blocked"
-msgstr "Blockiert"
-
-#: ../../Zotlabs/Module/Connections.php:61
-#: ../../Zotlabs/Module/Connections.php:168
-#: ../../Zotlabs/Module/Connections.php:241
-msgid "Ignored"
-msgstr "Ignoriert"
-
-#: ../../Zotlabs/Module/Connections.php:66
-#: ../../Zotlabs/Module/Connections.php:182
-#: ../../Zotlabs/Module/Connections.php:240
-msgid "Hidden"
-msgstr "Versteckt"
-
-#: ../../Zotlabs/Module/Connections.php:71
-#: ../../Zotlabs/Module/Connections.php:175
-#: ../../Zotlabs/Module/Connections.php:239
-msgid "Archived"
-msgstr "Archiviert"
-
-#: ../../Zotlabs/Module/Connections.php:76
-#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1572
-msgid "New"
-msgstr "Neu"
-
-#: ../../Zotlabs/Module/Connections.php:92
-#: ../../Zotlabs/Module/Connections.php:107
-#: ../../Zotlabs/Module/Connedit.php:629 ../../include/widgets.php:533
-msgid "All"
-msgstr "Alle"
-
-#: ../../Zotlabs/Module/Connections.php:138
-msgid "New Connections"
-msgstr "Neue Verbindungen"
-
-#: ../../Zotlabs/Module/Connections.php:141
-msgid "Show pending (new) connections"
-msgstr "Ausstehende (neue) Verbindungsanfragen anzeigen"
-
-#: ../../Zotlabs/Module/Connections.php:145
-#: ../../Zotlabs/Module/Profperm.php:144
-msgid "All Connections"
-msgstr "Alle Verbindungen"
-
-#: ../../Zotlabs/Module/Connections.php:148
-msgid "Show all connections"
-msgstr "Alle Verbindungen anzeigen"
-
-#: ../../Zotlabs/Module/Connections.php:164
-msgid "Only show blocked connections"
-msgstr "Nur blockierte Verbindungen anzeigen"
-
-#: ../../Zotlabs/Module/Connections.php:171
-msgid "Only show ignored connections"
-msgstr "Nur ignorierte Verbindungen anzeigen"
-
-#: ../../Zotlabs/Module/Connections.php:178
-msgid "Only show archived connections"
-msgstr "Nur archivierte Verbindungen anzeigen"
-
-#: ../../Zotlabs/Module/Connections.php:185
-msgid "Only show hidden connections"
-msgstr "Nur versteckte Verbindungen anzeigen"
-
-#: ../../Zotlabs/Module/Connections.php:238
-msgid "Pending approval"
-msgstr "Wartet auf Genehmigung"
-
-#: ../../Zotlabs/Module/Connections.php:254
-#, php-format
-msgid "%1$s [%2$s]"
-msgstr "%1$s [%2$s]"
-
-#: ../../Zotlabs/Module/Connections.php:255
-msgid "Edit connection"
-msgstr "Verbindung bearbeiten"
-
-#: ../../Zotlabs/Module/Connections.php:256
-msgid "Delete connection"
-msgstr "Verbindung löschen"
-
-#: ../../Zotlabs/Module/Connections.php:265
-msgid "Channel address"
-msgstr "Kanaladresse"
-
-#: ../../Zotlabs/Module/Connections.php:267
-msgid "Network"
-msgstr "Netzwerk"
-
-#: ../../Zotlabs/Module/Connections.php:270
-msgid "Status"
-msgstr "Status"
-
-#: ../../Zotlabs/Module/Connections.php:272
-msgid "Connected"
-msgstr "Verbunden"
-
-#: ../../Zotlabs/Module/Connections.php:274
-msgid "Approve connection"
-msgstr "Verbindung genehmigen"
-
-#: ../../Zotlabs/Module/Connections.php:276
-msgid "Ignore connection"
-msgstr "Verbindung ignorieren"
-
-#: ../../Zotlabs/Module/Connections.php:277
-#: ../../Zotlabs/Module/Notifications.php:55
-#: ../../Zotlabs/Module/Connedit.php:583
-msgid "Ignore"
-msgstr "Ignorieren"
-
-#: ../../Zotlabs/Module/Connections.php:278
-msgid "Recent activity"
-msgstr "Kürzliche Aktivitäten"
-
-#: ../../Zotlabs/Module/Connections.php:302 ../../Zotlabs/Lib/Apps.php:209
-#: ../../include/nav.php:191 ../../include/text.php:901
-msgid "Connections"
-msgstr "Verbindungen"
-
-#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44
-#: ../../Zotlabs/Lib/Apps.php:230 ../../include/nav.php:170
-#: ../../include/acl_selectors.php:174 ../../include/text.php:971
-#: ../../include/text.php:983 ../../include/widgets.php:315
-msgid "Search"
-msgstr "Suche"
-
-#: ../../Zotlabs/Module/Connections.php:307
-msgid "Search your connections"
-msgstr "Verbindungen durchsuchen"
-
-#: ../../Zotlabs/Module/Connections.php:308
-msgid "Connections search"
-msgstr "Verbindung suchen"
-
-#: ../../Zotlabs/Module/Cover_photo.php:58
-#: ../../Zotlabs/Module/Profile_photo.php:61
-msgid "Image uploaded but image cropping failed."
-msgstr "Bild hochgeladen, aber das Zurechtschneiden schlug fehl."
-
-#: ../../Zotlabs/Module/Cover_photo.php:134
-#: ../../Zotlabs/Module/Cover_photo.php:181
-msgid "Cover Photos"
-msgstr "Cover Foto"
-
-#: ../../Zotlabs/Module/Cover_photo.php:154
-#: ../../Zotlabs/Module/Profile_photo.php:135
-msgid "Image resize failed."
-msgstr "Bild-Anpassung fehlgeschlagen."
-
-#: ../../Zotlabs/Module/Cover_photo.php:168
-#: ../../Zotlabs/Module/Profile_photo.php:196 ../../include/photos.php:148
-msgid "Unable to process image"
-msgstr "Kann Bild nicht verarbeiten"
-
-#: ../../Zotlabs/Module/Cover_photo.php:192
-#: ../../Zotlabs/Module/Profile_photo.php:223
-msgid "Image upload failed."
-msgstr "Hochladen des Bilds fehlgeschlagen."
-
-#: ../../Zotlabs/Module/Cover_photo.php:210
-#: ../../Zotlabs/Module/Profile_photo.php:242
-msgid "Unable to process image."
-msgstr "Kann Bild nicht verarbeiten."
-
-#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4331
-msgid "female"
-msgstr "weiblich"
-
-#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4332
-#, php-format
-msgid "%1$s updated her %2$s"
-msgstr "%1$s hat ihr %2$s aktualisiert"
-
-#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4333
-msgid "male"
-msgstr "männlich"
-
-#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4334
-#, php-format
-msgid "%1$s updated his %2$s"
-msgstr "%1$s hat sein %2$s aktualisiert"
-
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4336
-#, php-format
-msgid "%1$s updated their %2$s"
-msgstr "%1$s hat sein/ihr %2$s aktualisiert"
-
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1731
-msgid "cover photo"
-msgstr "Cover Foto"
-
-#: ../../Zotlabs/Module/Cover_photo.php:303
-#: ../../Zotlabs/Module/Cover_photo.php:318
-#: ../../Zotlabs/Module/Profile_photo.php:300
-#: ../../Zotlabs/Module/Profile_photo.php:341
-msgid "Photo not available."
-msgstr "Foto nicht verfügbar."
-
-#: ../../Zotlabs/Module/Cover_photo.php:354
-#: ../../Zotlabs/Module/Profile_photo.php:387
-msgid "Upload File:"
-msgstr "Datei hochladen:"
-
-#: ../../Zotlabs/Module/Cover_photo.php:355
-#: ../../Zotlabs/Module/Profile_photo.php:388
-msgid "Select a profile:"
-msgstr "Wähle ein Profil:"
-
-#: ../../Zotlabs/Module/Cover_photo.php:356
-msgid "Upload Cover Photo"
-msgstr "Cover Foto hochladen"
-
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:396
-#: ../../Zotlabs/Module/Settings/Channel.php:399
-msgid "or"
-msgstr "oder"
-
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:396
-msgid "skip this step"
-msgstr "diesen Schritt überspringen"
-
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:396
-msgid "select a photo from your photo albums"
-msgstr "ein Foto aus meinen Fotoalben"
-
-#: ../../Zotlabs/Module/Cover_photo.php:377
-#: ../../Zotlabs/Module/Profile_photo.php:415
-msgid "Crop Image"
-msgstr "Bild zuschneiden"
-
-#: ../../Zotlabs/Module/Cover_photo.php:378
-#: ../../Zotlabs/Module/Profile_photo.php:416
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Bitte schneide das Bild für eine optimale Anzeige passend zu."
+#: ../../Zotlabs/Module/Pubsites.php:48
+msgid "Rate"
+msgstr "Bewerten"
-#: ../../Zotlabs/Module/Cover_photo.php:380
-#: ../../Zotlabs/Module/Profile_photo.php:418
-msgid "Done Editing"
-msgstr "Bearbeitung fertigstellen"
+#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166
+#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Webpages.php:246
+#: ../../Zotlabs/Module/Wiki.php:146 ../../Zotlabs/Module/Events.php:685
+#: ../../include/page_widgets.php:42 ../../include/widgets.php:967
+msgid "View"
+msgstr "Ansicht"
-#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
#: ../../Zotlabs/Module/Editlayout.php:79
#: ../../Zotlabs/Module/Editwebpage.php:80
+#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
#: ../../Zotlabs/Module/Editpost.php:24
msgid "Item not found"
msgstr "Element nicht gefunden"
-#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
-#: ../../Zotlabs/Module/Blocks.php:155
-msgid "Block Name"
-msgstr "Block-Name"
-
-#: ../../Zotlabs/Module/Editblock.php:111
-#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:244
-#: ../../Zotlabs/Module/Mail.php:369 ../../Zotlabs/Module/Chat.php:207
-#: ../../include/conversation.php:1148
-msgid "Insert web link"
-msgstr "Link einfügen"
-
-#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1259
-msgid "Title (optional)"
-msgstr "Titel (optional)"
-
-#: ../../Zotlabs/Module/Editblock.php:133
-msgid "Edit Block"
-msgstr "Block bearbeiten"
-
#: ../../Zotlabs/Module/Editlayout.php:127
#: ../../Zotlabs/Module/Layouts.php:128 ../../Zotlabs/Module/Layouts.php:188
msgid "Layout Name"
@@ -2385,10 +2875,67 @@ msgstr "Layout bearbeiten"
msgid "Page link"
msgstr "Seiten-Link"
+#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:258
+#: ../../Zotlabs/Module/Mail.php:383 ../../Zotlabs/Module/Editblock.php:111
+#: ../../Zotlabs/Module/Chat.php:207 ../../include/conversation.php:1165
+msgid "Insert web link"
+msgstr "Link einfügen"
+
#: ../../Zotlabs/Module/Editwebpage.php:169
msgid "Edit Webpage"
msgstr "Webseite bearbeiten"
+#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:222
+#: ../../include/nav.php:95 ../../include/conversation.php:1692
+msgid "Photos"
+msgstr "Fotos"
+
+#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Wiki.php:20
+#: ../../Zotlabs/Module/Chat.php:25
+#: ../../extend/addon/addon/chess/chess.php:400
+msgid "You must be logged in to see this page."
+msgstr "Du musst angemeldet sein, um diese Seite betrachten zu können."
+
+#: ../../Zotlabs/Module/Channel.php:44
+msgid "Posts and comments"
+msgstr "Beiträge und Kommentare"
+
+#: ../../Zotlabs/Module/Channel.php:45
+msgid "Only posts"
+msgstr "Nur Beiträge"
+
+#: ../../Zotlabs/Module/Channel.php:104
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet."
+
+#: ../../Zotlabs/Module/Network.php:96
+msgid "No such group"
+msgstr "Gruppe nicht gefunden"
+
+#: ../../Zotlabs/Module/Network.php:136
+msgid "No such channel"
+msgstr "Kanal nicht gefunden"
+
+#: ../../Zotlabs/Module/Network.php:141
+msgid "forum"
+msgstr "Forum"
+
+#: ../../Zotlabs/Module/Network.php:153
+msgid "Search Results For:"
+msgstr "Suchergebnisse für:"
+
+#: ../../Zotlabs/Module/Network.php:221
+msgid "Privacy group is empty"
+msgstr "Gruppe ist leer"
+
+#: ../../Zotlabs/Module/Network.php:230
+msgid "Privacy group: "
+msgstr "Gruppe:"
+
+#: ../../Zotlabs/Module/Network.php:256
+msgid "Invalid connection."
+msgstr "Ungültige Verbindung."
+
#: ../../Zotlabs/Module/Menu.php:49
msgid "Unable to update menu."
msgstr "Kann Menü nicht aktualisieren."
@@ -2425,22 +2972,18 @@ msgstr "Im Menü können gespeicherte Lesezeichen abgelegt werden"
msgid "Submit and proceed"
msgstr "Absenden und fortfahren"
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2309
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2271
msgid "Menus"
msgstr "Menüs"
-#: ../../Zotlabs/Module/Menu.php:113 ../../Zotlabs/Module/Locs.php:120
-msgid "Drop"
-msgstr "Löschen"
-
-#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Webpages.php:251
-#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Layouts.php:190
+#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Blocks.php:157
+#: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Webpages.php:251
#: ../../include/page_widgets.php:47
msgid "Created"
msgstr "Erstellt"
-#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Webpages.php:252
-#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Layouts.php:191
+#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Blocks.php:158
+#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:252
#: ../../include/page_widgets.php:48
msgid "Edited"
msgstr "Geändert"
@@ -2527,9 +3070,9 @@ msgid "Name of app"
msgstr "Name der App"
#: ../../Zotlabs/Module/Appman.php:115 ../../Zotlabs/Module/Appman.php:116
-#: ../../Zotlabs/Module/Profiles.php:709 ../../Zotlabs/Module/Profiles.php:713
-#: ../../Zotlabs/Module/Events.php:452 ../../Zotlabs/Module/Events.php:457
-#: ../../include/datetime.php:245
+#: ../../Zotlabs/Module/Profiles.php:703 ../../Zotlabs/Module/Profiles.php:707
+#: ../../Zotlabs/Module/Events.php:453 ../../Zotlabs/Module/Events.php:458
+#: ../../include/datetime.php:259
msgid "Required"
msgstr "Benötigt"
@@ -2537,8 +3080,10 @@ msgstr "Benötigt"
msgid "Location (URL) of app"
msgstr "Ort (URL) der App"
-#: ../../Zotlabs/Module/Appman.php:117 ../../Zotlabs/Module/Events.php:465
-#: ../../Zotlabs/Module/Rbmark.php:101
+#: ../../Zotlabs/Module/Appman.php:117 ../../Zotlabs/Module/Rbmark.php:101
+#: ../../Zotlabs/Module/Events.php:466
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:133
msgid "Description"
msgstr "Beschreibung"
@@ -2566,121 +3111,17 @@ msgstr "Preis der App"
msgid "Location (URL) to purchase app"
msgstr "Ort (URL), um die App zu kaufen"
-#: ../../Zotlabs/Module/Connedit.php:602
-msgid "Unhide"
-msgstr "Wieder sichtbar machen"
-
-#: ../../Zotlabs/Module/Connedit.php:602
-msgid "Hide"
-msgstr "Verstecken"
-
-#: ../../Zotlabs/Module/Connedit.php:605
-msgid "Hide or Unhide this connection from your other connections"
-msgstr "Diese Verbindung vor anderen Verbindungen verstecken/zeigen"
-
-#: ../../Zotlabs/Module/Mail.php:70
-msgid "Selected channel has private message restrictions. Send failed."
-msgstr "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen."
-
-#: ../../Zotlabs/Module/Mail.php:135
-msgid "Messages"
-msgstr "Nachrichten"
-
-#: ../../Zotlabs/Module/Mail.php:170
-msgid "Message recalled."
-msgstr "Nachricht widerrufen."
-
-#: ../../Zotlabs/Module/Mail.php:183
-msgid "Conversation removed."
-msgstr "Unterhaltung gelöscht."
-
-#: ../../Zotlabs/Module/Mail.php:197 ../../Zotlabs/Module/Mail.php:306
-#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1183
-msgid "Please enter a link URL:"
-msgstr "Gib eine URL ein:"
-
-#: ../../Zotlabs/Module/Mail.php:198 ../../Zotlabs/Module/Mail.php:307
-msgid "Expires YYYY-MM-DD HH:MM"
-msgstr "Verfällt YYYY-MM-DD HH;MM"
-
-#: ../../Zotlabs/Module/Mail.php:226
-msgid "Requested channel is not in this network"
-msgstr "Angeforderter Kanal ist nicht in diesem Netzwerk."
-
-#: ../../Zotlabs/Module/Mail.php:234
-msgid "Send Private Message"
-msgstr "Private Nachricht senden"
-
-#: ../../Zotlabs/Module/Mail.php:235 ../../Zotlabs/Module/Mail.php:360
-msgid "To:"
-msgstr "An:"
-
-#: ../../Zotlabs/Module/Mail.php:238 ../../Zotlabs/Module/Mail.php:362
-msgid "Subject:"
-msgstr "Betreff:"
-
-#: ../../Zotlabs/Module/Mail.php:241 ../../Zotlabs/Module/Invite.php:135
-msgid "Your message:"
-msgstr "Deine Nachricht:"
-
-#: ../../Zotlabs/Module/Mail.php:243 ../../Zotlabs/Module/Mail.php:368
-#: ../../include/conversation.php:1243
-msgid "Attach file"
-msgstr "Datei anhängen"
-
-#: ../../Zotlabs/Module/Mail.php:245
-msgid "Send"
-msgstr "Absenden"
-
-#: ../../Zotlabs/Module/Mail.php:248 ../../Zotlabs/Module/Mail.php:373
-#: ../../include/conversation.php:1288
-msgid "Set expiration date"
-msgstr "Verfallsdatum"
-
-#: ../../Zotlabs/Module/Mail.php:250 ../../Zotlabs/Module/Mail.php:375
-#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:724
-#: ../../include/conversation.php:1293
-msgid "Encrypt text"
-msgstr "Text verschlüsseln"
-
-#: ../../Zotlabs/Module/Mail.php:332
-msgid "Delete message"
-msgstr "Nachricht löschen"
-
-#: ../../Zotlabs/Module/Mail.php:333
-msgid "Delivery report"
-msgstr "Zustellungsbericht"
-
-#: ../../Zotlabs/Module/Mail.php:334
-msgid "Recall message"
-msgstr "Nachricht widerrufen"
-
-#: ../../Zotlabs/Module/Mail.php:336
-msgid "Message has been recalled."
-msgstr "Die Nachricht wurde widerrufen."
-
-#: ../../Zotlabs/Module/Mail.php:353
-msgid "Delete Conversation"
-msgstr "Unterhaltung löschen"
-
-#: ../../Zotlabs/Module/Mail.php:355
-msgid ""
-"The permissions indicated on this page will be applied to all new "
-"connections."
-msgstr "Die auf dieser Seite angegebenen Berechtigungen werden auf alle neuen Verbindungen angewendet."
-
-#: ../../Zotlabs/Module/Mail.php:359
-msgid "Send Reply"
-msgstr "Antwort senden"
+#: ../../Zotlabs/Module/Rpost.php:138 ../../Zotlabs/Module/Editpost.php:107
+msgid "Edit post"
+msgstr "Bearbeite Beitrag"
-#: ../../Zotlabs/Module/Mail.php:364
-#, php-format
-msgid "Your message for %s (%s):"
-msgstr "Deine Nachricht für %s (%s):"
+#: ../../Zotlabs/Module/Help.php:23
+msgid "Documentation Search"
+msgstr "Suche in der Dokumentation"
-#: ../../Zotlabs/Module/Attach.php:13
-msgid "Item not available."
-msgstr "Element nicht verfügbar."
+#: ../../Zotlabs/Module/Help.php:82
+msgid "$Projectname Documentation"
+msgstr "$Projectname-Dokumentation"
#: ../../Zotlabs/Module/Ffsapi.php:12
msgid "Share content from Firefox to $Projectname"
@@ -2690,16 +3131,12 @@ msgstr "Inhalte von Firefox nach $Projectname teilen"
msgid "Activate the Firefox $Projectname provider"
msgstr "Aktiviert den $Projectname-Provider für firefox"
-#: ../../Zotlabs/Module/Help.php:27
-msgid "Documentation Search"
-msgstr "Suche in der Dokumentation"
-
-#: ../../Zotlabs/Module/Help.php:57
-msgid "$Projectname Documentation"
-msgstr "$Projectname-Dokumentation"
+#: ../../Zotlabs/Module/Apps.php:46 ../../include/nav.php:166
+#: ../../include/widgets.php:102
+msgid "Apps"
+msgstr "Apps"
#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
-#: ../../Zotlabs/Module/Siteinfo.php:48
msgid "$Projectname"
msgstr "$Projectname"
@@ -2708,14 +3145,6 @@ msgstr "$Projectname"
msgid "Welcome to %s"
msgstr "Willkommen auf %s"
-#: ../../Zotlabs/Module/Lockview.php:75
-msgid "Remote privacy information not available."
-msgstr "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar."
-
-#: ../../Zotlabs/Module/Lockview.php:96
-msgid "Visible to:"
-msgstr "Sichtbar für:"
-
#: ../../Zotlabs/Module/Filestorage.php:87
msgid "Permission Denied."
msgstr "Zugriff verweigert."
@@ -2728,10 +3157,10 @@ msgstr "Datei nicht gefunden."
msgid "Edit file permissions"
msgstr "Dateiberechtigungen bearbeiten"
-#: ../../Zotlabs/Module/Filestorage.php:152 ../../Zotlabs/Module/Thing.php:313
-#: ../../Zotlabs/Module/Thing.php:363 ../../Zotlabs/Module/Photos.php:658
-#: ../../Zotlabs/Module/Photos.php:1047 ../../Zotlabs/Module/Chat.php:234
-#: ../../include/acl_selectors.php:179
+#: ../../Zotlabs/Module/Filestorage.php:152
+#: ../../Zotlabs/Module/Photos.php:658 ../../Zotlabs/Module/Photos.php:1047
+#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
+#: ../../Zotlabs/Module/Chat.php:234 ../../include/acl_selectors.php:208
msgid "Permissions"
msgstr "Berechtigungen"
@@ -2767,190 +3196,287 @@ msgstr "URL zu dieser Datei anzeigen"
msgid "Notify your contacts about this file"
msgstr "Meine Kontakte über diese Datei benachrichtigen"
-#: ../../Zotlabs/Module/Magic.php:71
-msgid "Hub not found."
-msgstr "Server nicht gefunden."
+#: ../../Zotlabs/Module/Directory.php:64 ../../Zotlabs/Module/Display.php:17
+#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Photos.php:509
+#: ../../Zotlabs/Module/Search.php:17
+#: ../../Zotlabs/Module/Viewconnections.php:23
+#: ../../extend/addon/addon/friendica/dfrn_request.php:794
+msgid "Public access denied."
+msgstr "Öffentlichen Zugriff verweigert."
-#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
-msgid "Continue"
-msgstr "Fortfahren"
+#: ../../Zotlabs/Module/Directory.php:245
+#, php-format
+msgid "%d rating"
+msgid_plural "%d ratings"
+msgstr[0] "%d Bewertung"
+msgstr[1] "%d Bewertungen"
-#: ../../Zotlabs/Module/Connect.php:90
-msgid "Premium Channel Setup"
-msgstr "Premium-Kanal-Einrichtung"
+#: ../../Zotlabs/Module/Directory.php:256
+msgid "Gender: "
+msgstr "Geschlecht:"
-#: ../../Zotlabs/Module/Connect.php:92
-msgid "Enable premium channel connection restrictions"
-msgstr "Einschränkungen für einen Premium-Kanal aktivieren"
+#: ../../Zotlabs/Module/Directory.php:258
+msgid "Status: "
+msgstr "Status:"
-#: ../../Zotlabs/Module/Connect.php:93
-msgid ""
-"Please enter your restrictions or conditions, such as paypal receipt, usage "
-"guidelines, etc."
-msgstr "Bitte gib Deine Nutzungsbedingungen ein, z.B. Paypal-Quittung, Richtlinien etc."
+#: ../../Zotlabs/Module/Directory.php:260
+msgid "Homepage: "
+msgstr "Webseite:"
-#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
-msgid ""
-"This channel may require additional steps or acknowledgement of the "
-"following conditions prior to connecting:"
-msgstr "Unter Umständen sind weitere Schritte oder die Bestätigung der folgenden Bedingungen vor dem Verbinden mit diesem Kanal nötig."
+#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1215
+msgid "Age:"
+msgstr "Alter:"
-#: ../../Zotlabs/Module/Connect.php:96
-msgid ""
-"Potential connections will then see the following text before proceeding:"
-msgstr "Potentielle Kontakte werden den folgenden Text sehen, bevor fortgefahren wird:"
+#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1051
+#: ../../include/event.php:52 ../../include/event.php:84
+#: ../../include/bb2diaspora.php:520
+msgid "Location:"
+msgstr "Ort:"
-#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
-msgid ""
-"By continuing, I certify that I have complied with any instructions provided"
-" on this page."
-msgstr "Indem ich fortfahre, bestätige ich die Erfüllung aller Anweisungen auf dieser Seite."
+#: ../../Zotlabs/Module/Directory.php:320
+msgid "Description:"
+msgstr "Beschreibung:"
-#: ../../Zotlabs/Module/Connect.php:106
-msgid "(No specific instructions have been provided by the channel owner.)"
-msgstr "(Der Kanal-Besitzer hat keine speziellen Anweisungen hinterlegt.)"
+#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1231
+msgid "Hometown:"
+msgstr "Heimatstadt:"
-#: ../../Zotlabs/Module/Connect.php:114
-msgid "Restricted or Premium Channel"
-msgstr "Eingeschränkter oder Premium-Kanal"
+#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1239
+msgid "About:"
+msgstr "Über:"
-#: ../../Zotlabs/Module/Group.php:24
-msgid "Privacy group created."
-msgstr "Gruppe wurde erstellt."
+#: ../../Zotlabs/Module/Directory.php:329
+msgid "Public Forum:"
+msgstr "Öffentliches Forum:"
-#: ../../Zotlabs/Module/Group.php:30
-msgid "Could not create privacy group."
-msgstr "Gruppe konnte nicht erstellt werden."
+#: ../../Zotlabs/Module/Directory.php:332
+msgid "Keywords: "
+msgstr "Schlüsselwörter:"
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3950
-msgid "Privacy group not found."
-msgstr "Gruppe nicht gefunden."
+#: ../../Zotlabs/Module/Directory.php:335
+msgid "Don't suggest"
+msgstr "Nicht vorschlagen"
-#: ../../Zotlabs/Module/Group.php:58
-msgid "Privacy group updated."
-msgstr "Gruppe wurde aktualisiert."
+#: ../../Zotlabs/Module/Directory.php:337
+msgid "Common connections:"
+msgstr "Gemeinsame Verbindungen:"
-#: ../../Zotlabs/Module/Group.php:90
-msgid "Create a group of channels."
-msgstr "Erstelle eine Gruppe für Kanäle."
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Global Directory"
+msgstr "Globales Verzeichnis"
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
-msgid "Privacy group name: "
-msgstr "Gruppenname:"
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Local Directory"
+msgstr "Lokales Verzeichnis"
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
-msgid "Members are visible to other channels"
-msgstr "Mitglieder sind sichtbar für andere Kanäle"
+#: ../../Zotlabs/Module/Directory.php:392
+msgid "Finding:"
+msgstr "Ergebnisse:"
-#: ../../Zotlabs/Module/Group.php:111
-msgid "Privacy group removed."
-msgstr "Gruppe wurde entfernt."
+#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:64
+#: ../../include/contact_widgets.php:24
+msgid "Channel Suggestions"
+msgstr "Kanal-Vorschläge"
-#: ../../Zotlabs/Module/Group.php:113
-msgid "Unable to remove privacy group."
-msgstr "Gruppe konnte nicht entfernt werden."
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "next page"
+msgstr "nächste Seite"
-#: ../../Zotlabs/Module/Group.php:183
-msgid "Privacy group editor"
-msgstr "Gruppeneditor"
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "previous page"
+msgstr "vorherige Seite"
-#: ../../Zotlabs/Module/Group.php:197
-msgid "Members"
-msgstr "Mitglieder"
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "Sort options"
+msgstr "Sortieroptionen"
-#: ../../Zotlabs/Module/Group.php:199
-msgid "All Connected Channels"
-msgstr "Alle verbundenen Kanäle"
+#: ../../Zotlabs/Module/Directory.php:399
+msgid "Alphabetic"
+msgstr "alphabetisch"
-#: ../../Zotlabs/Module/Group.php:231
-msgid "Click on a channel to add or remove."
-msgstr "Wähle einen Kanal zum hinzufügen oder entfernen aus."
+#: ../../Zotlabs/Module/Directory.php:400
+msgid "Reverse Alphabetic"
+msgstr "Entgegengesetzt alphabetisch"
-#: ../../Zotlabs/Module/Webpages.php:52
-msgid "Import Webpage Elements"
-msgstr "Webseitenelemente importieren"
+#: ../../Zotlabs/Module/Directory.php:401
+msgid "Newest to Oldest"
+msgstr "Neueste zuerst"
-#: ../../Zotlabs/Module/Webpages.php:53
-msgid "Import selected"
-msgstr "Import ausgewählt"
+#: ../../Zotlabs/Module/Directory.php:402
+msgid "Oldest to Newest"
+msgstr "Älteste zuerst"
-#: ../../Zotlabs/Module/Webpages.php:76
-msgid "Export Webpage Elements"
-msgstr "Webseitenelemente exportieren"
+#: ../../Zotlabs/Module/Directory.php:419
+msgid "No entries (some entries may be hidden)."
+msgstr "Keine Einträge gefunden (einige könnten versteckt sein)."
-#: ../../Zotlabs/Module/Webpages.php:77
-msgid "Export selected"
-msgstr "Exportieren ausgewählt"
+#: ../../Zotlabs/Module/Item.php:184
+msgid "Unable to locate original post."
+msgstr "Originalbeitrag nicht gefunden."
-#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:218
-#: ../../include/nav.php:109 ../../include/conversation.php:1724
-msgid "Webpages"
-msgstr "Webseiten"
+#: ../../Zotlabs/Module/Item.php:447
+msgid "Empty post discarded."
+msgstr "Leeren Beitrag verworfen."
-#: ../../Zotlabs/Module/Webpages.php:241 ../../Zotlabs/Module/Blocks.php:161
-#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Photos.php:1078
-#: ../../include/conversation.php:1231
-msgid "Share"
-msgstr "Teilen"
+#: ../../Zotlabs/Module/Item.php:489
+msgid "Executable content type not permitted to this channel."
+msgstr "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben."
-#: ../../Zotlabs/Module/Webpages.php:246 ../../Zotlabs/Module/Events.php:680
-#: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Layouts.php:197
-#: ../../Zotlabs/Module/Pubsites.php:59 ../../include/page_widgets.php:42
-msgid "View"
-msgstr "Ansicht"
+#: ../../Zotlabs/Module/Item.php:871
+msgid "Duplicate post suppressed."
+msgstr "Doppelter Beitrag unterdrückt."
-#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Module/Events.php:473
-#: ../../Zotlabs/Module/Photos.php:1099 ../../Zotlabs/Lib/ThreadItem.php:721
-#: ../../include/page_widgets.php:43 ../../include/conversation.php:1200
-msgid "Preview"
-msgstr "Vorschau"
+#: ../../Zotlabs/Module/Item.php:1013
+msgid "System error. Post not saved."
+msgstr "Systemfehler. Beitrag nicht gespeichert."
-#: ../../Zotlabs/Module/Webpages.php:248 ../../include/page_widgets.php:44
-msgid "Actions"
-msgstr "Aktionen"
+#: ../../Zotlabs/Module/Item.php:1137
+msgid "Unable to obtain post information from database."
+msgstr "Beitragsinformationen können nicht aus der Datenbank abgerufen werden."
-#: ../../Zotlabs/Module/Webpages.php:249 ../../include/page_widgets.php:45
-msgid "Page Link"
-msgstr "Seiten-Link"
+#: ../../Zotlabs/Module/Item.php:1144
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht."
-#: ../../Zotlabs/Module/Webpages.php:250
-msgid "Page Title"
-msgstr "Seitentitel"
+#: ../../Zotlabs/Module/Item.php:1151
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht."
-#: ../../Zotlabs/Module/Webpages.php:280
-msgid "Invalid file type."
-msgstr "Ungültiger Dateityp."
+#: ../../Zotlabs/Module/Chanview.php:134
+msgid "toggle full screen mode"
+msgstr "auf Vollbildmodus umschalten"
-#: ../../Zotlabs/Module/Webpages.php:292
-msgid "Error opening zip file"
-msgstr "Fehler beim Öffnen der ZIP-Datei"
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
+msgstr "Kanal hinzugefügt."
-#: ../../Zotlabs/Module/Webpages.php:303
-msgid "Invalid folder path."
-msgstr "Ungültiger Ordnerpfad."
+#: ../../Zotlabs/Module/Mail.php:38
+msgid "Unable to lookup recipient."
+msgstr "Konnte den Empfänger nicht finden."
-#: ../../Zotlabs/Module/Webpages.php:330
-msgid "No webpage elements detected."
-msgstr "Keine Webseitenelemente erkannt."
+#: ../../Zotlabs/Module/Mail.php:45
+msgid "Unable to communicate with requested channel."
+msgstr "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen."
-#: ../../Zotlabs/Module/Webpages.php:405
-msgid "Import complete."
-msgstr "Import abgeschlossen."
+#: ../../Zotlabs/Module/Mail.php:52
+msgid "Cannot verify requested channel."
+msgstr "Verifizierung des angeforderten Kanals fehlgeschlagen."
+
+#: ../../Zotlabs/Module/Mail.php:70
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen."
+
+#: ../../Zotlabs/Module/Mail.php:149
+msgid "Messages"
+msgstr "Nachrichten"
+
+#: ../../Zotlabs/Module/Mail.php:184
+msgid "Message recalled."
+msgstr "Nachricht widerrufen."
+
+#: ../../Zotlabs/Module/Mail.php:197
+msgid "Conversation removed."
+msgstr "Unterhaltung gelöscht."
+
+#: ../../Zotlabs/Module/Mail.php:211 ../../Zotlabs/Module/Mail.php:320
+#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1200
+msgid "Please enter a link URL:"
+msgstr "Gib eine URL ein:"
+
+#: ../../Zotlabs/Module/Mail.php:212 ../../Zotlabs/Module/Mail.php:321
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Verfällt YYYY-MM-DD HH;MM"
+
+#: ../../Zotlabs/Module/Mail.php:240
+msgid "Requested channel is not in this network"
+msgstr "Angeforderter Kanal ist nicht in diesem Netzwerk."
+
+#: ../../Zotlabs/Module/Mail.php:248
+msgid "Send Private Message"
+msgstr "Private Nachricht senden"
+
+#: ../../Zotlabs/Module/Mail.php:249 ../../Zotlabs/Module/Mail.php:374
+msgid "To:"
+msgstr "An:"
+
+#: ../../Zotlabs/Module/Mail.php:252 ../../Zotlabs/Module/Mail.php:376
+msgid "Subject:"
+msgstr "Betreff:"
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:192
+#: ../../Zotlabs/Module/Mail.php:255 ../../Zotlabs/Module/Invite.php:138
+msgid "Your message:"
+msgstr "Deine Nachricht:"
+
+#: ../../Zotlabs/Module/Mail.php:257 ../../Zotlabs/Module/Mail.php:382
+#: ../../include/conversation.php:1260
+msgid "Attach file"
+msgstr "Datei anhängen"
+
+#: ../../Zotlabs/Module/Mail.php:259
+msgid "Send"
+msgstr "Absenden"
+
+#: ../../Zotlabs/Module/Mail.php:262 ../../Zotlabs/Module/Mail.php:387
+#: ../../include/conversation.php:1305
+msgid "Set expiration date"
+msgstr "Verfallsdatum"
+
+#: ../../Zotlabs/Module/Mail.php:264 ../../Zotlabs/Module/Mail.php:389
+#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:741
+#: ../../include/conversation.php:1310
+msgid "Encrypt text"
+msgstr "Text verschlüsseln"
+
+#: ../../Zotlabs/Module/Mail.php:346
+msgid "Delete message"
+msgstr "Nachricht löschen"
+
+#: ../../Zotlabs/Module/Mail.php:347
+msgid "Delivery report"
+msgstr "Zustellungsbericht"
+
+#: ../../Zotlabs/Module/Mail.php:348
+msgid "Recall message"
+msgstr "Nachricht widerrufen"
+
+#: ../../Zotlabs/Module/Mail.php:350
+msgid "Message has been recalled."
+msgstr "Die Nachricht wurde widerrufen."
+
+#: ../../Zotlabs/Module/Mail.php:367
+msgid "Delete Conversation"
+msgstr "Unterhaltung löschen"
+
+#: ../../Zotlabs/Module/Mail.php:369
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Keine sichere Kommunikation verfügbar. <strong>Eventuell</strong> kannst Du auf der Profilseite des Absenders antworten."
+
+#: ../../Zotlabs/Module/Mail.php:373
+msgid "Send Reply"
+msgstr "Antwort senden"
+
+#: ../../Zotlabs/Module/Mail.php:378
+#, php-format
+msgid "Your message for %s (%s):"
+msgstr "Deine Nachricht für %s (%s):"
+
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
msgid "webpage"
msgstr "Webseite"
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:198
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
msgid "block"
msgstr "Block"
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:195
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
msgid "layout"
msgstr "Layout"
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:201
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
msgid "menu"
msgstr "Menü"
@@ -2964,6 +3490,26 @@ msgstr "Element für %s installiert"
msgid "%s element installation failed"
msgstr "Installation des Elements %s fehlgeschlagen"
+#: ../../Zotlabs/Module/Import_items.php:42 ../../Zotlabs/Module/Import.php:71
+msgid "Nothing to import."
+msgstr "Nichts zu importieren."
+
+#: ../../Zotlabs/Module/Import_items.php:66 ../../Zotlabs/Module/Import.php:83
+#: ../../Zotlabs/Module/Import.php:98
+msgid "Unable to download data from old server"
+msgstr "Daten können vom alten Server nicht heruntergeladen werden"
+
+#: ../../Zotlabs/Module/Import_items.php:72
+#: ../../Zotlabs/Module/Import.php:105
+msgid "Imported file is empty."
+msgstr "Die importierte Datei ist leer."
+
+#: ../../Zotlabs/Module/Import_items.php:88
+#: ../../Zotlabs/Module/Import.php:127
+#, php-format
+msgid "Warning: Database versions differ by %1$d updates."
+msgstr "Achtung: Datenbankversionen unterscheiden sich um %1$d Aktualisierungen."
+
#: ../../Zotlabs/Module/Import_items.php:104
msgid "Import completed"
msgstr "Import abgeschlossen"
@@ -2977,6 +3523,11 @@ msgid ""
"Use this form to import existing posts and content from an export file."
msgstr "Mit diesem Formular kannst Du existierende Beiträge und Inhalte aus einer Sicherungsdatei importieren."
+#: ../../Zotlabs/Module/Import_items.php:121
+#: ../../Zotlabs/Module/Import.php:532
+msgid "File to Upload"
+msgstr "Hochzuladende Datei:"
+
#: ../../Zotlabs/Module/Invite.php:29
msgid "Total invitation limit exceeded."
msgstr "Einladungslimit überschritten."
@@ -2986,294 +3537,152 @@ msgstr "Einladungslimit überschritten."
msgid "%s : Not a valid email address."
msgstr "%s : Keine gültige Email Adresse."
-#: ../../Zotlabs/Module/Invite.php:63
+#: ../../Zotlabs/Module/Invite.php:67
msgid "Please join us on $Projectname"
msgstr "Schließe Dich uns auf $Projectname an!"
-#: ../../Zotlabs/Module/Invite.php:74
+#: ../../Zotlabs/Module/Invite.php:77
msgid "Invitation limit exceeded. Please contact your site administrator."
msgstr "Einladungslimit überschritten. Bitte kontaktiere den Administrator Deines $Projectname-Servers."
-#: ../../Zotlabs/Module/Invite.php:79
+#: ../../Zotlabs/Module/Invite.php:82
#, php-format
msgid "%s : Message delivery failed."
msgstr "%s : Nachricht konnte nicht zugestellt werden."
-#: ../../Zotlabs/Module/Invite.php:83
+#: ../../Zotlabs/Module/Invite.php:86
#, php-format
msgid "%d message sent."
msgid_plural "%d messages sent."
msgstr[0] "%d Nachricht gesendet."
msgstr[1] "%d Nachrichten gesendet."
-#: ../../Zotlabs/Module/Invite.php:102
+#: ../../Zotlabs/Module/Invite.php:105
msgid "You have no more invitations available"
msgstr "Du hast keine weiteren verfügbare Einladungen"
-#: ../../Zotlabs/Module/Invite.php:133
+#: ../../Zotlabs/Module/Invite.php:136
msgid "Send invitations"
msgstr "Einladungen senden"
-#: ../../Zotlabs/Module/Invite.php:134
+#: ../../Zotlabs/Module/Invite.php:137
msgid "Enter email addresses, one per line:"
msgstr "Email-Adressen eintragen, eine pro Zeile:"
-#: ../../Zotlabs/Module/Invite.php:136
+#: ../../Zotlabs/Module/Invite.php:139
msgid "Please join my community on $Projectname."
msgstr "Schließe Dich uns auf $Projectname an!"
-#: ../../Zotlabs/Module/Invite.php:138
+#: ../../Zotlabs/Module/Invite.php:141
msgid "You will need to supply this invitation code:"
msgstr "Bitte verwende bei der Registrierung den folgenden Einladungscode:"
-#: ../../Zotlabs/Module/Invite.php:139
+#: ../../Zotlabs/Module/Invite.php:142
msgid ""
"1. Register at any $Projectname location (they are all inter-connected)"
msgstr "1. Registriere Dich auf einem beliebigen $Projectname-Hub (sie sind alle miteinander verbunden)"
-#: ../../Zotlabs/Module/Invite.php:141
+#: ../../Zotlabs/Module/Invite.php:144
msgid "2. Enter my $Projectname network address into the site searchbar."
msgstr "2. Gib meine $Projectname-Adresse im Suchfeld ein."
-#: ../../Zotlabs/Module/Invite.php:142
+#: ../../Zotlabs/Module/Invite.php:145
msgid "or visit"
msgstr "oder besuche"
-#: ../../Zotlabs/Module/Invite.php:144
+#: ../../Zotlabs/Module/Invite.php:147
msgid "3. Click [Connect]"
msgstr "3. Klicke auf [Verbinden]"
-#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
-msgid "Location not found."
-msgstr "Klon nicht gefunden."
-
-#: ../../Zotlabs/Module/Locs.php:62
-msgid "Location lookup failed."
-msgstr "Nachschlagen des Kanal-Ortes fehlgeschlagen"
-
-#: ../../Zotlabs/Module/Locs.php:66
-msgid ""
-"Please select another location to become primary before removing the primary"
-" location."
-msgstr "Bitte mache einen anderen Kanal-Ort zum primären Ort, bevor Du den primären Ort löschst."
-
-#: ../../Zotlabs/Module/Locs.php:95
-msgid "Syncing locations"
-msgstr "Synchronisiere Klone"
-
-#: ../../Zotlabs/Module/Locs.php:105
-msgid "No locations found."
-msgstr "Keine Klon-Adressen gefunden."
-
-#: ../../Zotlabs/Module/Locs.php:116
-msgid "Manage Channel Locations"
-msgstr "Klon-Adressen verwalten"
-
-#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Profiles.php:477
-#: ../../Zotlabs/Module/Profiles.php:698 ../../Zotlabs/Module/Events.php:467
-#: ../../Zotlabs/Module/Pubsites.php:51 ../../include/js_strings.php:25
-msgid "Location"
-msgstr "Ort"
-
-#: ../../Zotlabs/Module/Locs.php:119
-msgid "Primary"
-msgstr "Primär"
-
-#: ../../Zotlabs/Module/Locs.php:122
-msgid "Sync Now"
-msgstr "Jetzt synchronisieren"
-
-#: ../../Zotlabs/Module/Locs.php:123
-msgid "Please wait several minutes between consecutive operations."
-msgstr "Bitte warte mehrere Minuten zwischen dem Ausführen zweier Operationen!"
-
-#: ../../Zotlabs/Module/Locs.php:124
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing"
-" your channel."
-msgstr "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub einloggst und den Kanal dort löschst."
-
-#: ../../Zotlabs/Module/Locs.php:125
-msgid "Use this form to drop the location if the hub is no longer operating."
-msgstr "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt."
-
-#: ../../Zotlabs/Module/Network.php:95
-msgid "No such group"
-msgstr "Gruppe nicht gefunden"
-
-#: ../../Zotlabs/Module/Network.php:135
-msgid "No such channel"
-msgstr "Kanal nicht gefunden"
-
-#: ../../Zotlabs/Module/Network.php:140
-msgid "forum"
-msgstr "Forum"
-
-#: ../../Zotlabs/Module/Network.php:152
-msgid "Search Results For:"
-msgstr "Suchergebnisse für:"
-
-#: ../../Zotlabs/Module/Network.php:218
-msgid "Privacy group is empty"
-msgstr "Gruppe ist leer"
-
-#: ../../Zotlabs/Module/Network.php:227
-msgid "Privacy group: "
-msgstr "Gruppe:"
-
-#: ../../Zotlabs/Module/Network.php:253
-msgid "Invalid connection."
-msgstr "Ungültige Verbindung."
-
-#: ../../Zotlabs/Module/Like.php:19
-msgid "Like/Dislike"
-msgstr "Mögen/Nicht mögen"
-
-#: ../../Zotlabs/Module/Like.php:24
-msgid "This action is restricted to members."
-msgstr "Diese Aktion kann nur von Mitgliedern ausgeführt werden."
-
-#: ../../Zotlabs/Module/Like.php:25
-msgid ""
-"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
-"href=\"register\">register as a new $Projectname member</a> to continue."
-msgstr "Um fortzufahren <a href=\"rmagic\">melde Dich bitte mit Deiner $Projectname-ID an</a> oder <a href=\"register\">registriere Dich als neues $Projectname-Mitglied</a>."
-
-#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
-#: ../../Zotlabs/Module/Like.php:169
-msgid "Invalid request."
-msgstr "Ungültige Anfrage."
-
-#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
-msgid "channel"
-msgstr "Kanal"
-
-#: ../../Zotlabs/Module/Like.php:146
-msgid "thing"
-msgstr "Sache"
-
-#: ../../Zotlabs/Module/Like.php:192
-msgid "Channel unavailable."
-msgstr "Kanal nicht vorhanden."
-
-#: ../../Zotlabs/Module/Like.php:240
-msgid "Previous action reversed."
-msgstr "Die vorherige Aktion wurde rückgängig gemacht."
-
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../Zotlabs/Module/Tagger.php:47 ../../include/conversation.php:120
-#: ../../include/text.php:1991
-msgid "photo"
-msgstr "Foto"
-
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../include/conversation.php:148 ../../include/text.php:1997
-msgid "status"
-msgstr "Status"
-
-#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Events.php:253
-#: ../../Zotlabs/Module/Tagger.php:51 ../../include/event.php:958
-#: ../../include/conversation.php:123 ../../include/text.php:1994
-msgid "event"
-msgstr "Termin"
+#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
+#: ../../Zotlabs/Module/Blocks.php:155
+msgid "Block Name"
+msgstr "Block-Name"
-#: ../../Zotlabs/Module/Like.php:419 ../../include/conversation.php:164
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s gefällt %2$ss %3$s"
+#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1276
+msgid "Title (optional)"
+msgstr "Titel (optional)"
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s gefällt %2$ss %3$s nicht"
+#: ../../Zotlabs/Module/Editblock.php:133
+msgid "Edit Block"
+msgstr "Block bearbeiten"
-#: ../../Zotlabs/Module/Like.php:423
-#, php-format
-msgid "%1$s agrees with %2$s's %3$s"
-msgstr "%1$s stimmt %2$ss %3$s zu"
+#: ../../Zotlabs/Module/Group.php:24
+msgid "Privacy group created."
+msgstr "Gruppe wurde erstellt."
-#: ../../Zotlabs/Module/Like.php:425
-#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
-msgstr "%1$s lehnt %2$ss %3$s ab"
+#: ../../Zotlabs/Module/Group.php:30
+msgid "Could not create privacy group."
+msgstr "Gruppe konnte nicht erstellt werden."
-#: ../../Zotlabs/Module/Like.php:427
-#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
-msgstr "%1$s enthält sich zu %2$ss %3$s"
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
+#: ../../include/items.php:3876
+msgid "Privacy group not found."
+msgstr "Gruppe nicht gefunden."
-#: ../../Zotlabs/Module/Like.php:429
-#, php-format
-msgid "%1$s is attending %2$s's %3$s"
-msgstr "%1$s nimmt an %2$ss %3$s teil"
+#: ../../Zotlabs/Module/Group.php:58
+msgid "Privacy group updated."
+msgstr "Gruppe wurde aktualisiert."
-#: ../../Zotlabs/Module/Like.php:431
-#, php-format
-msgid "%1$s is not attending %2$s's %3$s"
-msgstr "%1$s nimmt an %2$ss %3$s nicht teil"
+#: ../../Zotlabs/Module/Group.php:90
+msgid "Create a group of channels."
+msgstr "Erstelle eine Gruppe für Kanäle."
-#: ../../Zotlabs/Module/Like.php:433
-#, php-format
-msgid "%1$s may attend %2$s's %3$s"
-msgstr "%1$s nimmt vielleicht an %2$ss %3$s teil"
+#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+msgid "Privacy group name: "
+msgstr "Gruppenname:"
-#: ../../Zotlabs/Module/Like.php:538
-msgid "Action completed."
-msgstr "Aktion durchgeführt."
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+msgid "Members are visible to other channels"
+msgstr "Mitglieder sind sichtbar für andere Kanäle"
-#: ../../Zotlabs/Module/Like.php:539
-msgid "Thank you."
-msgstr "Vielen Dank."
+#: ../../Zotlabs/Module/Group.php:111
+msgid "Privacy group removed."
+msgstr "Gruppe wurde entfernt."
-#: ../../Zotlabs/Module/Manage.php:136
-#: ../../Zotlabs/Module/New_channel.php:121
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
-msgstr "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet."
+#: ../../Zotlabs/Module/Group.php:113
+msgid "Unable to remove privacy group."
+msgstr "Gruppe konnte nicht entfernt werden."
-#: ../../Zotlabs/Module/Manage.php:143
-msgid "Create a new channel"
-msgstr "Neuen Kanal anlegen"
+#: ../../Zotlabs/Module/Group.php:183
+msgid "Privacy group editor"
+msgstr "Gruppeneditor"
-#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:778
-#: ../../Zotlabs/Module/Chat.php:255
-msgid "Create New"
-msgstr "Neu anlegen"
+#: ../../Zotlabs/Module/Group.php:197
+msgid "Members"
+msgstr "Mitglieder"
-#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:214
-#: ../../include/nav.php:211
-msgid "Channel Manager"
-msgstr "Kanal-Manager"
+#: ../../Zotlabs/Module/Group.php:199
+msgid "All Connected Channels"
+msgstr "Alle verbundenen Kanäle"
-#: ../../Zotlabs/Module/Manage.php:165
-msgid "Current Channel"
-msgstr "Aktueller Kanal"
+#: ../../Zotlabs/Module/Group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Wähle einen Kanal zum hinzufügen oder entfernen aus."
-#: ../../Zotlabs/Module/Manage.php:167
-msgid "Switch to one of your channels by selecting it."
-msgstr "Wechsle zu einem Deiner Kanäle, indem Du auf ihn klickst."
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
+msgstr "Ungültiger Profil-Identifikator"
-#: ../../Zotlabs/Module/Manage.php:168
-msgid "Default Channel"
-msgstr "Standard Kanal"
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Profile Visibility Editor"
+msgstr "Profil-Sichtbarkeits-Editor"
-#: ../../Zotlabs/Module/Manage.php:169
-msgid "Make Default"
-msgstr "Zum Standard machen"
+#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1282
+msgid "Profile"
+msgstr "Profil"
-#: ../../Zotlabs/Module/Manage.php:172
-#, php-format
-msgid "%d new messages"
-msgstr "%d neue Nachrichten"
+#: ../../Zotlabs/Module/Profperm.php:119
+msgid "Click on a contact to add or remove."
+msgstr "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen."
-#: ../../Zotlabs/Module/Manage.php:173
-#, php-format
-msgid "%d new introductions"
-msgstr "%d neue Vorstellungen"
+#: ../../Zotlabs/Module/Profperm.php:128
+msgid "Visible To"
+msgstr "Sichtbar für"
-#: ../../Zotlabs/Module/Manage.php:175
-msgid "Delegated Channel"
-msgstr "Delegierte Kanäle"
+#: ../../Zotlabs/Module/Magic.php:71
+msgid "Hub not found."
+msgstr "Server nicht gefunden."
#: ../../Zotlabs/Module/Mitem.php:52
msgid "Unable to create element."
@@ -3292,7 +3701,7 @@ msgid "Menu Item Permissions"
msgstr "Zugriffsrechte des Menü-Elements"
#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:489
msgid "(click to open/close)"
msgstr "(zum öffnen/schließen anklicken)"
@@ -3392,100 +3801,25 @@ msgstr "Bearbeite Menü-Bestandteil"
msgid "Link text"
msgstr "Link Text"
-#: ../../Zotlabs/Module/Rate.php:155 ../../Zotlabs/Module/Connedit.php:762
-#: ../../include/js_strings.php:20
-msgid "Rating"
-msgstr "Bewertung"
-
-#: ../../Zotlabs/Module/Rate.php:156
-msgid "Website:"
-msgstr "Webseite:"
-
-#: ../../Zotlabs/Module/Rate.php:159
-#, php-format
-msgid "Remote Channel [%s] (not yet known on this site)"
-msgstr "Kanal [%s] (auf diesem Server noch unbekannt)"
-
-#: ../../Zotlabs/Module/Rate.php:160
-msgid "Rating (this information is public)"
-msgstr "Bewertung (öffentlich sichtbar)"
-
-#: ../../Zotlabs/Module/Rate.php:161
-msgid "Optionally explain your rating (this information is public)"
-msgstr "Optional kannst du deine Bewertung erklären (öffentlich sichtbar)"
-
-#: ../../Zotlabs/Module/Lostpass.php:19
-msgid "No valid account found."
-msgstr "Kein gültiges Konto gefunden."
-
-#: ../../Zotlabs/Module/Lostpass.php:33
-msgid "Password reset request issued. Check your email."
-msgstr "Zurücksetzen des Passworts eingeleitet. Schau in Deine E-Mails."
-
-#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:107
-#, php-format
-msgid "Site Member (%s)"
-msgstr "Nutzer (%s)"
-
-#: ../../Zotlabs/Module/Lostpass.php:44
-#, php-format
-msgid "Password reset requested at %s"
-msgstr "Passwort-Rücksetzung auf %s angefordert"
-
-#: ../../Zotlabs/Module/Lostpass.php:67
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "Die Anfrage konnte nicht verifiziert werden. (Vielleicht hast Du schon einmal auf den Link in der E-Mail geklickt?) Passwort-Rücksetzung fehlgeschlagen."
-
-#: ../../Zotlabs/Module/Lostpass.php:90 ../../boot.php:1747
-msgid "Password Reset"
-msgstr "Zurücksetzen des Kennworts"
-
-#: ../../Zotlabs/Module/Lostpass.php:91
-msgid "Your password has been reset as requested."
-msgstr "Dein Passwort wurde wie angefordert neu erstellt."
-
-#: ../../Zotlabs/Module/Lostpass.php:92
-msgid "Your new password is"
-msgstr "Dein neues Passwort lautet"
-
-#: ../../Zotlabs/Module/Lostpass.php:93
-msgid "Save or copy your new password - and then"
-msgstr "Speichere oder kopiere Dein neues Passwort – und dann"
-
-#: ../../Zotlabs/Module/Lostpass.php:94
-msgid "click here to login"
-msgstr "Klicke hier, um dich anzumelden"
-
-#: ../../Zotlabs/Module/Lostpass.php:95
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Dein Passwort kann unter <em>Einstellungen</em> nach einer erfolgreichen Anmeldung geändert werden."
-
-#: ../../Zotlabs/Module/Lostpass.php:112
-#, php-format
-msgid "Your password has changed at %s"
-msgstr "Auf %s wurde Dein Passwort geändert"
+#: ../../Zotlabs/Module/Ratings.php:70
+msgid "No ratings"
+msgstr "Keine Bewertungen"
-#: ../../Zotlabs/Module/Lostpass.php:127
-msgid "Forgot your Password?"
-msgstr "Kennwort vergessen?"
+#: ../../Zotlabs/Module/Ratings.php:98
+msgid "Rating: "
+msgstr "Bewertung: "
-#: ../../Zotlabs/Module/Lostpass.php:128
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Gib Deine E-Mail-Adresse ein, um Dein Passwort zurücksetzen zu lassen. Du erhältst dann weitere Anweisungen per E-Mail."
+#: ../../Zotlabs/Module/Ratings.php:99
+msgid "Website: "
+msgstr "Webseite: "
-#: ../../Zotlabs/Module/Lostpass.php:129
-msgid "Email Address"
-msgstr "E-Mail Adresse"
+#: ../../Zotlabs/Module/Ratings.php:101
+msgid "Description: "
+msgstr "Beschreibung: "
-#: ../../Zotlabs/Module/Lostpass.php:130
-msgid "Reset"
-msgstr "Zurücksetzen"
+#: ../../Zotlabs/Module/Attach.php:13
+msgid "Item not available."
+msgstr "Element nicht verfügbar."
#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
#, php-format
@@ -3501,186 +3835,169 @@ msgstr "Laune"
msgid "Set your current mood and tell your friends"
msgstr "Wähle Deine aktuelle Stimmung und teile sie mit Deinen Freunden"
-#: ../../Zotlabs/Module/Manage.php:173
-#, php-format
-msgid "%d new introductions"
-msgstr "%d neue Vorstellungen"
-
-#: ../../Zotlabs/Module/Manage.php:175
-msgid "Delegated Channel"
-msgstr "Delegierte Kanäle"
-
#: ../../Zotlabs/Module/Notify.php:57
-#: ../../Zotlabs/Module/Notifications.php:98
+#: ../../Zotlabs/Module/Notifications.php:35
msgid "No more system notifications."
msgstr "Keine System-Benachrichtigungen mehr."
#: ../../Zotlabs/Module/Notify.php:61
-#: ../../Zotlabs/Module/Notifications.php:102
+#: ../../Zotlabs/Module/Notifications.php:39
msgid "System Notifications"
msgstr "System-Benachrichtigungen"
-#: ../../Zotlabs/Module/Match.php:26
-msgid "Profile Match"
-msgstr "Profil-Übereinstimmungen"
-
-#: ../../Zotlabs/Module/Match.php:35
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Keine Schlüsselwörter für den Abgleich gefunden. Bitte füge Schlüsselwörter zu Deinem Standardprofil hinzu."
-
-#: ../../Zotlabs/Module/Match.php:67
-msgid "is interested in:"
-msgstr "interessiert sich für:"
-
-#: ../../Zotlabs/Module/Match.php:74
-msgid "No matches"
-msgstr "Keine Übereinstimmungen"
-
#: ../../Zotlabs/Module/Photos.php:82
msgid "Page owner information could not be retrieved."
msgstr "Informationen über den Besitzer der Seite konnten nicht gefunden werden."
-#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:745
+#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:734
#: ../../Zotlabs/Module/Profile_photo.php:115
-#: ../../Zotlabs/Module/Profile_photo.php:212
-#: ../../Zotlabs/Module/Profile_photo.php:311
-#: ../../include/photo/photo_driver.php:718
+#: ../../Zotlabs/Module/Profile_photo.php:219
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:225
+#: ../../include/photo/photo_driver.php:728
msgid "Profile Photos"
msgstr "Profilfotos"
-#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:147
+#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
msgid "Album not found."
msgstr "Album nicht gefunden."
-#: ../../Zotlabs/Module/Photos.php:130
+#: ../../Zotlabs/Module/Photos.php:112
msgid "Delete Album"
msgstr "Album löschen"
-#: ../../Zotlabs/Module/Photos.php:151
+#: ../../Zotlabs/Module/Photos.php:133
msgid ""
"Multiple storage folders exist with this album name, but within different "
"directories. Please remove the desired folder or folders using the Files "
"manager"
msgstr "Mehrere Speicherordner mit diesem Albumnamen sind bereits vorhanden, aber in verschiedenen Verzeichnissen. Bitte entfernen Sie den oder die gewünschten Ordner mit dem Dateimanager"
-#: ../../Zotlabs/Module/Profiles.php:454
-msgid "Gender"
-msgstr "Geschlecht"
-
-#: ../../Zotlabs/Module/Profiles.php:458
-msgid "Sexual Preference"
-msgstr "Sexuelle Orientierung"
+#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1059
+msgid "Delete Photo"
+msgstr "Foto löschen"
-#: ../../Zotlabs/Module/Photos.php:531
+#: ../../Zotlabs/Module/Photos.php:520
msgid "No photos selected"
msgstr "Keine Fotos ausgewählt"
-#: ../../Zotlabs/Module/Photos.php:580
+#: ../../Zotlabs/Module/Photos.php:569
msgid "Access to this item is restricted."
msgstr "Der Zugriff auf dieses Foto ist eingeschränkt."
-#: ../../Zotlabs/Module/Photos.php:619
+#: ../../Zotlabs/Module/Photos.php:608
#, php-format
msgid "%1$.2f MB of %2$.2f MB photo storage used."
msgstr "%1$.2f MB von %2$.2f MB Foto-Speicher belegt."
-#: ../../Zotlabs/Module/Photos.php:622
+#: ../../Zotlabs/Module/Photos.php:611
#, php-format
msgid "%1$.2f MB photo storage used."
msgstr "%1$.2f MB Foto-Speicher belegt."
-#: ../../Zotlabs/Module/Photos.php:658
+#: ../../Zotlabs/Module/Photos.php:647
msgid "Upload Photos"
msgstr "Fotos hochladen"
-#: ../../Zotlabs/Module/Photos.php:662
+#: ../../Zotlabs/Module/Photos.php:651
msgid "Enter an album name"
msgstr "Namen für ein neues Album eingeben"
-#: ../../Zotlabs/Module/Profiles.php:689 ../../Zotlabs/Module/Profiles.php:771
-#: ../../include/channel.php:981
-msgid "Edit visibility"
-msgstr "Sichtbarkeit bearbeiten"
+#: ../../Zotlabs/Module/Photos.php:652
+msgid "or select an existing album (doubleclick)"
+msgstr "oder ein bereits vorhandenes auswählen (Doppelklick)"
-#: ../../Zotlabs/Module/Photos.php:664
+#: ../../Zotlabs/Module/Photos.php:653
msgid "Create a status post for this upload"
msgstr "Einen Statusbeitrag für diesen Upload erzeugen"
-#: ../../Zotlabs/Module/Photos.php:665
+#: ../../Zotlabs/Module/Photos.php:654
msgid "Caption (optional):"
msgstr "Beschriftung (optional):"
-#: ../../Zotlabs/Module/Profiles.php:692 ../../include/channel.php:952
-msgid "Change profile photo"
-msgstr "Profilfoto ändern"
+#: ../../Zotlabs/Module/Photos.php:655
+msgid "Description (optional):"
+msgstr "Beschreibung (optional):"
-#: ../../Zotlabs/Module/Photos.php:697
+#: ../../Zotlabs/Module/Photos.php:686
msgid "Album name could not be decoded"
msgstr "Albumname konnte nicht dekodiert werden"
-#: ../../Zotlabs/Module/Photos.php:745
+#: ../../Zotlabs/Module/Photos.php:734
msgid "Contact Photos"
msgstr "Kontakt-Bilder"
-#: ../../Zotlabs/Module/Photos.php:768
+#: ../../Zotlabs/Module/Photos.php:757
msgid "Show Newest First"
msgstr "Neueste zuerst anzeigen"
-#: ../../Zotlabs/Module/Photos.php:770
+#: ../../Zotlabs/Module/Photos.php:759
msgid "Show Oldest First"
msgstr "Älteste zuerst anzeigen"
-#: ../../Zotlabs/Module/Profiles.php:697 ../../include/conversation.php:1563
-#: ../../include/widgets.php:105
-msgid "Personal"
-msgstr "Persönlich"
+#: ../../Zotlabs/Module/Photos.php:783 ../../Zotlabs/Module/Photos.php:1337
+#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1748
+msgid "View Photo"
+msgstr "Foto ansehen"
-#: ../../Zotlabs/Module/Photos.php:825
-#: ../../Zotlabs/Module/Embedphotos.php:157 ../../include/widgets.php:1624
+#: ../../Zotlabs/Module/Photos.php:814
+#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1765
msgid "Edit Album"
msgstr "Album bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:872
+#: ../../Zotlabs/Module/Photos.php:861
msgid "Permission denied. Access to this item may be restricted."
msgstr "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden."
-#: ../../Zotlabs/Module/Photos.php:874
+#: ../../Zotlabs/Module/Photos.php:863
msgid "Photo not available"
msgstr "Foto nicht verfügbar"
-#: ../../Zotlabs/Module/Photos.php:932
+#: ../../Zotlabs/Module/Photos.php:921
msgid "Use as profile photo"
msgstr "Als Profilfoto verwenden"
-#: ../../Zotlabs/Module/Photos.php:933
+#: ../../Zotlabs/Module/Photos.php:922
msgid "Use as cover photo"
msgstr "Als Titelbild verwenden"
-#: ../../Zotlabs/Module/Photos.php:940
+#: ../../Zotlabs/Module/Photos.php:929
msgid "Private Photo"
msgstr "Privates Foto"
-#: ../../Zotlabs/Module/Photos.php:955
+#: ../../Zotlabs/Module/Photos.php:940 ../../Zotlabs/Module/Cal.php:336
+#: ../../Zotlabs/Module/Cal.php:343 ../../Zotlabs/Module/Events.php:680
+#: ../../Zotlabs/Module/Events.php:689
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846
+msgid "Previous"
+msgstr "Voriges"
+
+#: ../../Zotlabs/Module/Photos.php:944
msgid "View Full Size"
msgstr "In voller Größe anzeigen"
-#: ../../Zotlabs/Module/Photos.php:1000 ../../Zotlabs/Module/Admin.php:1437
-#: ../../Zotlabs/Module/Tagrm.php:137
-msgid "Remove"
-msgstr "Entfernen"
+#: ../../Zotlabs/Module/Photos.php:949 ../../Zotlabs/Module/Setup.php:264
+#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
+#: ../../Zotlabs/Module/Events.php:681 ../../Zotlabs/Module/Events.php:690
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847
+msgid "Next"
+msgstr "Nächste"
-#: ../../Zotlabs/Module/Photos.php:1034
+#: ../../Zotlabs/Module/Photos.php:1033
msgid "Edit photo"
msgstr "Foto bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:1036
+#: ../../Zotlabs/Module/Photos.php:1035
msgid "Rotate CW (right)"
msgstr "Drehen im UZS (rechts)"
-#: ../../Zotlabs/Module/Photos.php:1037
+#: ../../Zotlabs/Module/Photos.php:1036
msgid "Rotate CCW (left)"
msgstr "Drehen gegen UZS (links)"
+#: ../../Zotlabs/Module/Photos.php:1039
+msgid "Move photo to album"
+msgstr "Foto in Album verschieben"
+
#: ../../Zotlabs/Module/Photos.php:1040
msgid "Enter a new album name"
msgstr "Gib einen Namen für ein neues Album ein"
@@ -3705,89 +4022,99 @@ msgstr "Beispiele: @ben, @Karl_Prester, @lieschen@example.com"
msgid "Flag as adult in album view"
msgstr "In der Albumansicht als nicht jugendfrei markieren"
-#: ../../Zotlabs/Module/Photos.php:1076 ../../Zotlabs/Lib/ThreadItem.php:262
+#: ../../Zotlabs/Module/Photos.php:1076 ../../Zotlabs/Lib/ThreadItem.php:268
msgid "I like this (toggle)"
msgstr "Mir gefällt das (Umschalter)"
-#: ../../Zotlabs/Module/Photos.php:1077 ../../Zotlabs/Lib/ThreadItem.php:263
+#: ../../Zotlabs/Module/Photos.php:1077 ../../Zotlabs/Lib/ThreadItem.php:269
msgid "I don't like this (toggle)"
msgstr "Mir gefällt das nicht (Umschalter)"
-#: ../../Zotlabs/Module/Photos.php:1079 ../../Zotlabs/Lib/ThreadItem.php:398
-#: ../../include/conversation.php:743
+#: ../../Zotlabs/Module/Photos.php:1078 ../../Zotlabs/Module/Blocks.php:161
+#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Webpages.php:241
+#: ../../extend/addon/addon/cdav/include/widgets.php:123
+#: ../../include/conversation.php:1248
+msgid "Share"
+msgstr "Teilen"
+
+#: ../../Zotlabs/Module/Photos.php:1079 ../../Zotlabs/Lib/ThreadItem.php:409
+#: ../../include/conversation.php:757
msgid "Please wait"
msgstr "Bitte warten"
-#: ../../Zotlabs/Module/Profiles.php:731
-msgid "Homepage URL"
-msgstr "Homepage-URL"
-
-#: ../../Zotlabs/Module/Profiles.php:732
-msgid "Hometown"
-msgstr "Heimatort"
+#: ../../Zotlabs/Module/Photos.php:1095 ../../Zotlabs/Module/Photos.php:1213
+#: ../../Zotlabs/Lib/ThreadItem.php:726
+msgid "This is you"
+msgstr "Das bist Du"
#: ../../Zotlabs/Module/Photos.php:1097 ../../Zotlabs/Module/Photos.php:1215
-#: ../../Zotlabs/Lib/ThreadItem.php:710 ../../include/js_strings.php:6
+#: ../../Zotlabs/Lib/ThreadItem.php:728 ../../include/js_strings.php:6
msgid "Comment"
msgstr "Kommentar"
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
+#: ../../Zotlabs/Module/Photos.php:1099 ../../Zotlabs/Module/Webpages.php:247
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Lib/ThreadItem.php:738
+#: ../../include/page_widgets.php:43 ../../include/conversation.php:1217
+msgid "Preview"
+msgstr "Vorschau"
+
+#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:593
msgctxt "title"
msgid "Likes"
msgstr "Gefällt mir"
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
+#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:593
msgctxt "title"
msgid "Dislikes"
msgstr "Gefällt mir nicht"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
+#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:594
msgctxt "title"
msgid "Agree"
msgstr "Zustimmungen"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
+#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:594
msgctxt "title"
msgid "Disagree"
msgstr "Ablehnungen"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
+#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:594
msgctxt "title"
msgid "Abstain"
msgstr "Enthaltungen"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
+#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:595
msgctxt "title"
msgid "Attending"
msgstr "Zusagen"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
+#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:595
msgctxt "title"
msgid "Not attending"
msgstr "Absagen"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
+#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:595
msgctxt "title"
msgid "Might attend"
msgstr "Vielleicht"
#: ../../Zotlabs/Module/Photos.php:1132 ../../Zotlabs/Module/Photos.php:1144
-#: ../../Zotlabs/Lib/ThreadItem.php:181 ../../Zotlabs/Lib/ThreadItem.php:193
-#: ../../include/conversation.php:1743
+#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
+#: ../../include/conversation.php:1783
msgid "View all"
msgstr "Alles anzeigen"
-#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:185
-#: ../../include/channel.php:1182 ../../include/conversation.php:1767
-#: ../../include/taxonomy.php:403
+#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:190
+#: ../../include/channel.php:1190 ../../include/taxonomy.php:403
+#: ../../include/conversation.php:1807
msgctxt "noun"
msgid "Like"
msgid_plural "Likes"
msgstr[0] "Gefällt mir"
msgstr[1] "Gefällt mir"
-#: ../../Zotlabs/Module/Photos.php:1141 ../../Zotlabs/Lib/ThreadItem.php:190
-#: ../../include/conversation.php:1770
+#: ../../Zotlabs/Module/Photos.php:1141 ../../Zotlabs/Lib/ThreadItem.php:195
+#: ../../include/conversation.php:1810
msgctxt "noun"
msgid "Dislike"
msgid_plural "Dislikes"
@@ -3798,710 +4125,429 @@ msgstr[1] "Gefällt nicht"
msgid "Photo Tools"
msgstr "Fotowerkzeuge"
-#: ../../Zotlabs/Module/Profiles.php:767 ../../include/channel.php:977
-msgid "Profile Image"
-msgstr "Profilfoto:"
-
-#: ../../Zotlabs/Module/Profiles.php:777 ../../include/nav.php:91
-#: ../../include/channel.php:959
-msgid "Edit Profiles"
-msgstr "Profile bearbeiten"
-
-#: ../../Zotlabs/Module/Notify.php:57
-#: ../../Zotlabs/Module/Notifications.php:98
-msgid "No more system notifications."
-msgstr "Keine System-Benachrichtigungen mehr."
-
-#: ../../Zotlabs/Module/Notify.php:61
-#: ../../Zotlabs/Module/Notifications.php:102
-msgid "System Notifications"
-msgstr "System-Benachrichtigungen"
-
-#: ../../Zotlabs/Module/Match.php:26
-msgid "Profile Match"
-msgstr "Profil-Übereinstimmungen"
-
-#: ../../Zotlabs/Module/Match.php:35
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Keine Schlüsselwörter für den Abgleich gefunden. Bitte füge Schlüsselwörter zu Deinem Standardprofil hinzu."
-
-#: ../../Zotlabs/Module/Match.php:67
-msgid "is interested in:"
-msgstr "interessiert sich für:"
-
-#: ../../Zotlabs/Module/Match.php:74
-msgid "No matches"
-msgstr "Keine Übereinstimmungen"
-
-#: ../../Zotlabs/Module/Api.php:60 ../../Zotlabs/Module/Api.php:81
-msgid "Authorize application connection"
-msgstr "Zugriff für die Anwendung autorisieren"
-
-#: ../../Zotlabs/Module/Api.php:61
-msgid "Return to your app and insert this Security Code:"
-msgstr "Gehen Sie zu Ihrer App zurück und tragen Sie diesen Sicherheitscode ein:"
-
-#: ../../Zotlabs/Module/Api.php:71
-msgid "Please login to continue."
-msgstr "Zum Weitermachen, bitte einloggen."
-
-#: ../../Zotlabs/Module/Api.php:83
-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 erlauben, Deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für Dich zu erstellen?"
-
-#: ../../Zotlabs/Module/Events.php:25
-msgid "Calendar entries imported."
-msgstr "Kalendereinträge wurden importiert."
-
-#: ../../Zotlabs/Module/Events.php:27
-msgid "No calendar entries found."
-msgstr "Keine Kalendereinträge gefunden."
-
-#: ../../Zotlabs/Module/Events.php:104
-msgid "Event can not end before it has started."
-msgstr "Termin-Ende liegt vor dem Beginn."
-
-#: ../../Zotlabs/Module/Events.php:106 ../../Zotlabs/Module/Events.php:115
-#: ../../Zotlabs/Module/Events.php:135
-msgid "Unable to generate preview."
-msgstr "Vorschau konnte nicht erzeugt werden."
-
-#: ../../Zotlabs/Module/Events.php:113
-msgid "Event title and start time are required."
-msgstr "Titel und Startzeit des Termins sind erforderlich."
-
-#: ../../Zotlabs/Module/Events.php:133 ../../Zotlabs/Module/Events.php:258
-msgid "Event not found."
-msgstr "Termin nicht gefunden."
-
-#: ../../Zotlabs/Module/Events.php:452
-msgid "Edit event title"
-msgstr "Termintitel bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:452
-msgid "Event title"
-msgstr "Termintitel"
-
-#: ../../Zotlabs/Module/Events.php:454
-msgid "Categories (comma-separated list)"
-msgstr "Kategorien (Kommagetrennte Liste)"
-
-#: ../../Zotlabs/Module/Events.php:455
-msgid "Edit Category"
-msgstr "Kategorie bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:455
-msgid "Category"
-msgstr "Kategorie"
-
-#: ../../Zotlabs/Module/Events.php:458
-msgid "Edit start date and time"
-msgstr "Startdatum und -zeit bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:458
-msgid "Start date and time"
-msgstr "Startdatum und -zeit"
-
-#: ../../Zotlabs/Module/Events.php:459 ../../Zotlabs/Module/Events.php:462
-msgid "Finish date and time are not known or not relevant"
-msgstr "Enddatum und -zeit sind unbekannt oder irrelevant"
-
-#: ../../Zotlabs/Module/Events.php:461
-msgid "Edit finish date and time"
-msgstr "Enddatum und -zeit bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:461
-msgid "Finish date and time"
-msgstr "Enddatum und -zeit"
-
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
-msgid "Adjust for viewer timezone"
-msgstr "An die Zeitzone des Betrachters anpassen"
-
-#: ../../Zotlabs/Module/Events.php:463
-msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
-msgstr "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht sinnvoll für globale Feiertage / Ferien."
-
-#: ../../Zotlabs/Module/Events.php:465
-msgid "Edit Description"
-msgstr "Beschreibung bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:467
-msgid "Edit Location"
-msgstr "Ort bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:472
-msgid "Share this event"
-msgstr "Den Termin teilen"
-
-#: ../../Zotlabs/Module/Events.php:474 ../../include/conversation.php:1263
-msgid "Permission settings"
-msgstr "Berechtigungs-Einstellungen"
-
-#: ../../Zotlabs/Module/Events.php:485
-msgid "Advanced Options"
-msgstr "Weitere Optionen"
-
-#: ../../Zotlabs/Module/Events.php:597 ../../Zotlabs/Module/Cal.php:259
-msgid "l, F j"
-msgstr "l, j. F"
-
-#: ../../Zotlabs/Module/Events.php:619
-msgid "Edit event"
-msgstr "Termin bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:621
-msgid "Delete event"
-msgstr "Termin löschen"
-
-#: ../../Zotlabs/Module/Events.php:646 ../../Zotlabs/Module/Cal.php:308
-#: ../../include/text.php:1762
-msgid "Link to Source"
-msgstr "Link zur Quelle"
-
-#: ../../Zotlabs/Module/Events.php:655
-msgid "calendar"
-msgstr "Kalender"
-
-#: ../../Zotlabs/Module/Events.php:674 ../../Zotlabs/Module/Cal.php:331
-msgid "Edit Event"
-msgstr "Termin bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:674 ../../Zotlabs/Module/Cal.php:331
-msgid "Create Event"
-msgstr "Termin anlegen"
-
-#: ../../Zotlabs/Module/Events.php:675 ../../Zotlabs/Module/Events.php:684
-#: ../../Zotlabs/Module/Cal.php:332 ../../Zotlabs/Module/Cal.php:339
-#: ../../Zotlabs/Module/Photos.php:940
-msgid "Previous"
-msgstr "Voriges"
-
-#: ../../Zotlabs/Module/Events.php:676 ../../Zotlabs/Module/Events.php:685
-#: ../../Zotlabs/Module/Setup.php:272 ../../Zotlabs/Module/Cal.php:333
-#: ../../Zotlabs/Module/Cal.php:340 ../../Zotlabs/Module/Photos.php:949
-msgid "Next"
-msgstr "Nächste"
-
-#: ../../Zotlabs/Module/Events.php:677 ../../Zotlabs/Module/Cal.php:334
-msgid "Export"
-msgstr "Exportieren"
-
-#: ../../Zotlabs/Module/Events.php:681
-msgid "Month"
-msgstr "Monat"
-
-#: ../../Zotlabs/Module/Events.php:682
-msgid "Week"
-msgstr "Woche"
-
-#: ../../Zotlabs/Module/Events.php:683
-msgid "Day"
-msgstr "Tag"
-
-#: ../../Zotlabs/Module/Events.php:686 ../../Zotlabs/Module/Cal.php:341
-msgid "Today"
-msgstr "Heute"
-
-#: ../../Zotlabs/Module/Events.php:717
-msgid "Event removed"
-msgstr "Termin gelöscht"
-
-#: ../../Zotlabs/Module/Events.php:720
-msgid "Failed to remove event"
-msgstr "Termin konnte nicht gelöscht werden"
-
-#: ../../Zotlabs/Module/Item.php:180
-msgid "Unable to locate original post."
-msgstr "Originalbeitrag nicht gefunden."
-
-#: ../../Zotlabs/Module/Item.php:433
-msgid "Empty post discarded."
-msgstr "Leeren Beitrag verworfen."
-
-#: ../../Zotlabs/Module/Item.php:473
-msgid "Executable content type not permitted to this channel."
-msgstr "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben."
-
-#: ../../Zotlabs/Module/Item.php:858
-msgid "Duplicate post suppressed."
-msgstr "Doppelter Beitrag unterdrückt."
-
-#: ../../Zotlabs/Module/Item.php:991
-msgid "System error. Post not saved."
-msgstr "Systemfehler. Beitrag nicht gespeichert."
-
-#: ../../Zotlabs/Module/Item.php:1112
-msgid "Unable to obtain post information from database."
-msgstr "Beitragsinformationen können nicht aus der Datenbank abgerufen werden."
-
-#: ../../Zotlabs/Module/Item.php:1119
-#, php-format
-msgid "You have reached your limit of %1$.0f top level posts."
-msgstr "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht."
-
-#: ../../Zotlabs/Module/Item.php:1126
-#, php-format
-msgid "You have reached your limit of %1$.0f webpages."
-msgstr "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht."
-
-#: ../../Zotlabs/Module/New_channel.php:140
-msgid "Create Channel"
-msgstr "Einen neuen Kanal anlegen"
-
-#: ../../Zotlabs/Module/New_channel.php:141
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
-msgstr "Ein Kanal ist Deine Identität in diesem Netzwerk. Er kann eine Person, ein Blog oder ein Forum repräsentieren, nur um ein paar Beispiele zu nennen. Kanäle können Verbindungen miteinander eingehen, um Informationen zu teilen, jeweils basierend auf sehr detaillierten Berechtigungseinstellungen."
-
-#: ../../Zotlabs/Module/New_channel.php:142
-msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
-msgstr "oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Server."
-
-#: ../../Zotlabs/Module/Ping.php:265
-msgid "sent you a private message"
-msgstr "hat Dir eine private Nachricht geschickt"
-
-#: ../../Zotlabs/Module/Ping.php:313
-msgid "added your channel"
-msgstr "hat deinen Kanal hinzugefügt"
-
-#: ../../Zotlabs/Module/Ping.php:323
-msgid "g A l F d"
-msgstr "l, d. F, G:i \\U\\h\\r"
-
-#: ../../Zotlabs/Module/Ping.php:346
-msgid "[today]"
-msgstr "[Heute]"
-
-#: ../../Zotlabs/Module/Ping.php:355
-msgid "posted an event"
-msgstr "hat einen Termin veröffentlicht"
-
-#: ../../Zotlabs/Module/Notifications.php:30
-msgid "Invalid request identifier."
-msgstr "Ungültiger Anfrage-Identifikator."
-
-#: ../../Zotlabs/Module/Notifications.php:39
-msgid "Discard"
-msgstr "Verwerfen"
-
-#: ../../Zotlabs/Module/Notifications.php:103 ../../include/nav.php:196
-msgid "Mark all system notifications seen"
-msgstr "Markiere alle System-Benachrichtigungen als gesehen"
-
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:228
-#: ../../include/conversation.php:961
-msgid "Poke"
-msgstr "Anstupsen"
+#: ../../Zotlabs/Module/Photos.php:1250
+msgid "In This Photo:"
+msgstr "Auf diesem Foto:"
-#: ../../Zotlabs/Module/Poke.php:169
-msgid "Poke somebody"
-msgstr "Jemanden anstupsen"
+#: ../../Zotlabs/Module/Photos.php:1255
+msgid "Map"
+msgstr "Karte"
-#: ../../Zotlabs/Module/Poke.php:172
-msgid "Poke/Prod"
-msgstr "Anstupsen/Knuffen"
+#: ../../Zotlabs/Module/Photos.php:1263 ../../Zotlabs/Lib/ThreadItem.php:398
+msgctxt "noun"
+msgid "Likes"
+msgstr "Gefällt mir"
-#: ../../Zotlabs/Module/Poke.php:173
-msgid "Poke, prod or do other things to somebody"
-msgstr "Jemanden anstupsen, knuffen oder sonstiges"
+#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:399
+msgctxt "noun"
+msgid "Dislikes"
+msgstr "Gefällt nicht"
-#: ../../Zotlabs/Module/Poke.php:180
-msgid "Recipient"
-msgstr "Empfänger"
+#: ../../Zotlabs/Module/Photos.php:1269 ../../Zotlabs/Lib/ThreadItem.php:404
+#: ../../include/acl_selectors.php:210
+msgid "Close"
+msgstr "Schließen"
-#: ../../Zotlabs/Module/Poke.php:181
-msgid "Choose what you wish to do to recipient"
-msgstr "Wähle, was Du mit dem/r Empfänger/in tun willst"
+#: ../../Zotlabs/Module/Photos.php:1343
+msgid "View Album"
+msgstr "Album ansehen"
-#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
-msgid "Make this post private"
-msgstr "Diesen Beitrag privat machen"
+#: ../../Zotlabs/Module/Photos.php:1354 ../../Zotlabs/Module/Photos.php:1367
+#: ../../Zotlabs/Module/Photos.php:1368
+msgid "Recent Photos"
+msgstr "Neueste Fotos"
-#: ../../Zotlabs/Module/Setup.php:184
+#: ../../Zotlabs/Module/Setup.php:176
msgid "$Projectname Server - Setup"
msgstr "$Projectname Server-Einrichtung"
-#: ../../Zotlabs/Module/Setup.php:188
+#: ../../Zotlabs/Module/Setup.php:180
msgid "Could not connect to database."
msgstr "Kann nicht mit der Datenbank verbinden."
-#: ../../Zotlabs/Module/Setup.php:192
+#: ../../Zotlabs/Module/Setup.php:184
msgid ""
"Could not connect to specified site URL. Possible SSL certificate or DNS "
"issue."
msgstr "Konnte die angegebene Webseiten-URL nicht erreichen. Möglicherweise ein Problem mit dem SSL-Zertifikat oder dem DNS."
-#: ../../Zotlabs/Module/Setup.php:199
+#: ../../Zotlabs/Module/Setup.php:191
msgid "Could not create table."
msgstr "Konnte Tabelle nicht erstellen."
-#: ../../Zotlabs/Module/Setup.php:204
+#: ../../Zotlabs/Module/Setup.php:196
msgid "Your site database has been installed."
msgstr "Die Datenbank Deines Hubs wurde installiert."
-#: ../../Zotlabs/Module/Setup.php:208
+#: ../../Zotlabs/Module/Setup.php:200
msgid ""
"You may need to import the file \"install/schema_xxx.sql\" manually using a "
"database client."
msgstr "Möglicherweise musst Du die Datei install/schema_xxx.sql manuell mit Hilfe eines Datenkbank-Clients importieren."
-#: ../../Zotlabs/Module/Setup.php:209 ../../Zotlabs/Module/Setup.php:271
-#: ../../Zotlabs/Module/Setup.php:734
+#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Setup.php:745
msgid "Please see the file \"install/INSTALL.txt\"."
msgstr "Lies die Datei \"install/INSTALL.txt\"."
-#: ../../Zotlabs/Module/Setup.php:268
+#: ../../Zotlabs/Module/Setup.php:260
msgid "System check"
msgstr "Systemprüfung"
-#: ../../Zotlabs/Module/Setup.php:273
+#: ../../Zotlabs/Module/Setup.php:265
msgid "Check again"
msgstr "Nochmal prüfen"
-#: ../../Zotlabs/Module/Setup.php:295
+#: ../../Zotlabs/Module/Setup.php:287
msgid "Database connection"
msgstr "Datenbankverbindung"
-#: ../../Zotlabs/Module/Setup.php:296
+#: ../../Zotlabs/Module/Setup.php:288
msgid ""
"In order to install $Projectname we need to know how to connect to your "
"database."
msgstr "Um $Projectname zu installieren, müssen wir wissen, wie wir eine Verbindung zu Deiner Datenbank aufbauen können."
-#: ../../Zotlabs/Module/Setup.php:297
+#: ../../Zotlabs/Module/Setup.php:289
msgid ""
"Please contact your hosting provider or site administrator if you have "
"questions about these settings."
msgstr "Bitte kontaktiere Deinen Hosting-Provider oder Administrator, falls Du Fragen zu diesen Einstellungen hast."
-#: ../../Zotlabs/Module/Setup.php:298
+#: ../../Zotlabs/Module/Setup.php:290
msgid ""
"The database you specify below should already exist. If it does not, please "
"create it before continuing."
msgstr "Die Datenbank, die Du weiter unten angibst, sollte bereits existieren. Sollte das noch nicht der Fall sein, erzeuge sie bitte bevor Du fortfährst."
-#: ../../Zotlabs/Module/Setup.php:302
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Database Server Name"
msgstr "Datenbankservername"
-#: ../../Zotlabs/Module/Setup.php:302
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Default is 127.0.0.1"
msgstr "Standard ist 127.0.0.1"
-#: ../../Zotlabs/Module/Setup.php:303
+#: ../../Zotlabs/Module/Setup.php:295
msgid "Database Port"
msgstr "Datenbankport"
-#: ../../Zotlabs/Module/Setup.php:303
+#: ../../Zotlabs/Module/Setup.php:295
msgid "Communication port number - use 0 for default"
msgstr "Port-Nummer für die Kommunikation – verwende 0 für die Standardeinstellung"
-#: ../../Zotlabs/Module/Setup.php:304
+#: ../../Zotlabs/Module/Setup.php:296
msgid "Database Login Name"
msgstr "Datenbank-Benutzername"
-#: ../../Zotlabs/Module/Setup.php:305
+#: ../../Zotlabs/Module/Setup.php:297
msgid "Database Login Password"
msgstr "Datenbank-Passwort"
-#: ../../Zotlabs/Module/Setup.php:306
+#: ../../Zotlabs/Module/Setup.php:298
msgid "Database Name"
msgstr "Datenbankname"
-#: ../../Zotlabs/Module/Setup.php:307
+#: ../../Zotlabs/Module/Setup.php:299
msgid "Database Type"
msgstr "Datenbanktyp"
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:355
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
msgid "Site administrator email address"
msgstr "E-Mail Adresse des Seiten-Administrators"
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:355
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
msgid ""
"Your account email address must match this in order to use the web admin "
"panel."
msgstr "Die E-Mail-Adresse Deines Accounts muss dieser Adresse entsprechen, damit Du Zugriff zur Administrations-Seite erhältst."
-#: ../../Zotlabs/Module/Setup.php:310 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
msgid "Website URL"
msgstr "Webseiten-URL"
-#: ../../Zotlabs/Module/Setup.php:310 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
msgid "Please use SSL (https) URL if available."
msgstr "Nutze wenn möglich eine SSL-URL (https)."
-#: ../../Zotlabs/Module/Setup.php:311 ../../Zotlabs/Module/Setup.php:361
+#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
msgid "Please select a default timezone for your website"
msgstr "Standard-Zeitzone für Deinen Server"
-#: ../../Zotlabs/Module/Setup.php:344
+#: ../../Zotlabs/Module/Setup.php:336
msgid "Site settings"
msgstr "Seiteneinstellungen"
-#: ../../Zotlabs/Module/Setup.php:400
+#: ../../Zotlabs/Module/Setup.php:392
msgid "PHP version 5.5 or greater is required."
msgstr "PHP-Version 5.5 oder höher ist erforderlich."
-#: ../../Zotlabs/Module/Setup.php:401
+#: ../../Zotlabs/Module/Setup.php:393
msgid "PHP version"
msgstr "PHP-Version"
-#: ../../Zotlabs/Module/Setup.php:416
+#: ../../Zotlabs/Module/Setup.php:409
msgid "Could not find a command line version of PHP in the web server PATH."
msgstr "Konnte die Kommandozeilen-Version von PHP nicht im PATH des Web-Servers finden."
-#: ../../Zotlabs/Module/Setup.php:417
+#: ../../Zotlabs/Module/Setup.php:410
msgid ""
"If you don't have a command line version of PHP installed on server, you "
"will not be able to run background polling via cron."
msgstr "Ohne Kommandozeilen-Version von PHP auf dem Server wirst Du nicht in der Lage sein, Hintergrundprozesse via cron auszuführen."
-#: ../../Zotlabs/Module/Setup.php:421
+#: ../../Zotlabs/Module/Setup.php:414
msgid "PHP executable path"
msgstr "PHP-Pfad zu ausführbarer Datei"
-#: ../../Zotlabs/Module/Setup.php:421
+#: ../../Zotlabs/Module/Setup.php:414
msgid ""
"Enter full path to php executable. You can leave this blank to continue the "
"installation."
msgstr "Gib den vollen Pfad zum PHP-Interpreter an. Du kannst dieses Feld frei lassen und mit der Installation fortfahren."
-#: ../../Zotlabs/Module/Setup.php:426
+#: ../../Zotlabs/Module/Setup.php:419
msgid "Command line PHP"
msgstr "PHP-Befehlszeile"
-#: ../../Zotlabs/Module/Setup.php:435
+#: ../../Zotlabs/Module/Setup.php:429
+msgid ""
+"Unable to check command line PHP, as shell_exec() is disabled. This is "
+"required."
+msgstr "Prüfung auf Kommandozeilen-PHP fehlgeschlagen, da shell_exec() deaktiviert ist. Dies wird aber benötigt."
+
+#: ../../Zotlabs/Module/Setup.php:432
msgid ""
"The command line version of PHP on your system does not have "
"\"register_argc_argv\" enabled."
msgstr "Bei der Kommandozeilen-Version von PHP auf Deinem System ist \"register_argc_argv\" nicht aktiviert."
-#: ../../Zotlabs/Module/Setup.php:436
+#: ../../Zotlabs/Module/Setup.php:433
msgid "This is required for message delivery to work."
msgstr "Das wird benötigt, damit die Auslieferung von Nachrichten funktioniert."
-#: ../../Zotlabs/Module/Setup.php:439
+#: ../../Zotlabs/Module/Setup.php:436
msgid "PHP register_argc_argv"
msgstr "PHP register_argc_argv"
-#: ../../Zotlabs/Module/Setup.php:457
+#: ../../Zotlabs/Module/Setup.php:454
#, php-format
msgid ""
"Your max allowed total upload size is set to %s. Maximum size of one file to"
" upload is set to %s. You are allowed to upload up to %d files at once."
msgstr "Die Maximalgröße für Uploads insgesamt liegt bei %s. Die Maximalgröße für eine Datei liegt bei %s. Es können maximal %d Dateien gleichzeitig hochgeladen werden."
-#: ../../Zotlabs/Module/Setup.php:462
-msgid "You can adjust these settings in the servers php.ini."
-msgstr "Du kannst diese Einstellungen in der php.ini des Servers ändern."
+#: ../../Zotlabs/Module/Setup.php:459
+msgid "You can adjust these settings in the server php.ini file."
+msgstr "Du kannst diese Einstellungen in der php.ini - Datei des Servers anpassen."
-#: ../../Zotlabs/Module/Setup.php:464
+#: ../../Zotlabs/Module/Setup.php:461
msgid "PHP upload limits"
msgstr "PHP-Hochladebeschränkungen"
-#: ../../Zotlabs/Module/Setup.php:487
+#: ../../Zotlabs/Module/Setup.php:484
msgid ""
"Error: the \"openssl_pkey_new\" function on this system is not able to "
"generate encryption keys"
msgstr "Fehler: Die „openssl_pkey_new“-Funktion auf diesem System ist nicht in der Lage, Schlüssel für die Verschlüsselung zu erzeugen."
-#: ../../Zotlabs/Module/Setup.php:488
+#: ../../Zotlabs/Module/Setup.php:485
msgid ""
"If running under Windows, please see "
"\"http://www.php.net/manual/en/openssl.installation.php\"."
msgstr "Wenn Du Windows verwendest, findest Du unter http://www.php.net/manual/en/openssl.installation.php eine Installationsanleitung."
-#: ../../Zotlabs/Module/Setup.php:491
+#: ../../Zotlabs/Module/Setup.php:488
msgid "Generate encryption keys"
msgstr "Verschlüsselungsschlüssel erzeugen"
-#: ../../Zotlabs/Module/Setup.php:503
+#: ../../Zotlabs/Module/Setup.php:500
msgid "libCurl PHP module"
msgstr "libCurl-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:504
+#: ../../Zotlabs/Module/Setup.php:501
msgid "GD graphics PHP module"
msgstr "GD-Grafik-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:505
+#: ../../Zotlabs/Module/Setup.php:502
msgid "OpenSSL PHP module"
msgstr "OpenSSL-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:506
-msgid "mysqli or postgres PHP module"
-msgstr "mysqli oder postgres PHP-Modul"
+#: ../../Zotlabs/Module/Setup.php:503
+msgid "PDO database PHP module"
+msgstr "PDO-Datenbank-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:507
+#: ../../Zotlabs/Module/Setup.php:504
msgid "mb_string PHP module"
msgstr "mb_string-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:508
+#: ../../Zotlabs/Module/Setup.php:505
msgid "xml PHP module"
msgstr "xml-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:512 ../../Zotlabs/Module/Setup.php:514
+#: ../../Zotlabs/Module/Setup.php:509 ../../Zotlabs/Module/Setup.php:511
msgid "Apache mod_rewrite module"
msgstr "Apache-mod_rewrite-Modul"
-#: ../../Zotlabs/Module/Setup.php:512
+#: ../../Zotlabs/Module/Setup.php:509
msgid ""
"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr "Fehler: Das Apache-Modul mod-rewrite wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:518 ../../Zotlabs/Module/Setup.php:521
-msgid "proc_open"
-msgstr "proc_open"
+#: ../../Zotlabs/Module/Setup.php:515 ../../Zotlabs/Module/Setup.php:518
+msgid "exec"
+msgstr "exec"
-#: ../../Zotlabs/Module/Setup.php:518
+#: ../../Zotlabs/Module/Setup.php:515
msgid ""
-"Error: proc_open is required but is either not installed or has been "
+"Error: exec is required but is either not installed or has been disabled in "
+"php.ini"
+msgstr "Fehler: exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert"
+
+#: ../../Zotlabs/Module/Setup.php:521 ../../Zotlabs/Module/Setup.php:524
+msgid "shell_exec"
+msgstr "shell_exec"
+
+#: ../../Zotlabs/Module/Setup.php:521
+msgid ""
+"Error: shell_exec is required but is either not installed or has been "
"disabled in php.ini"
-msgstr "Fehler: proc_open wird benötigt, ist aber entweder nicht installiert oder wurde in der php.ini deaktiviert"
+msgstr "Fehler: shell_exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert"
-#: ../../Zotlabs/Module/Setup.php:526
+#: ../../Zotlabs/Module/Setup.php:529
msgid "Error: libCURL PHP module required but not installed."
msgstr "Fehler: Das PHP-Modul libCURL wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:530
+#: ../../Zotlabs/Module/Setup.php:533
msgid ""
"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr "Fehler: Das PHP-Modul GD-Grafik mit JPEG-Unterstützung wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:534
+#: ../../Zotlabs/Module/Setup.php:537
msgid "Error: openssl PHP module required but not installed."
msgstr "Fehler: Das PHP-Modul openssl wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:538
-msgid ""
-"Error: mysqli or postgres PHP module required but neither are installed."
-msgstr "Fehler: Das mysqli oder postgres PHP-Modul ist erforderlich, aber keines von beiden ist installiert."
+#: ../../Zotlabs/Module/Setup.php:541
+msgid "Error: PDO database PHP module required but not installed."
+msgstr "Fehler: PDO-Datenbank-PHP-Modul ist erforderlich, aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:542
+#: ../../Zotlabs/Module/Setup.php:545
msgid "Error: mb_string PHP module required but not installed."
msgstr "Fehler: Das PHP-Modul mb_string wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:546
+#: ../../Zotlabs/Module/Setup.php:549
msgid "Error: xml PHP module required for DAV but not installed."
msgstr "Fehler: Das xml-PHP-Modul wird für DAV benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:564
+#: ../../Zotlabs/Module/Setup.php:567
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 Installations-Assistent muss in der Lage sein, die Datei \".htconfig.php\" im Stammverzeichnis des Web-Servers anzulegen, ist er aber nicht."
-#: ../../Zotlabs/Module/Setup.php:565
+#: ../../Zotlabs/Module/Setup.php:568
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 "Meist liegt das daran, dass der Nutzer, unter dem der Web-Server läuft, keine Schreibrechte in dem Verzeichnis hat – selbst wenn Du selbst das darfst."
-#: ../../Zotlabs/Module/Setup.php:566
+#: ../../Zotlabs/Module/Setup.php:569
msgid ""
"At the end of this procedure, we will give you a text to save in a file "
"named .htconfig.php in your Red top folder."
msgstr "Am Schluss dieses Vorgangs wird ein Text generiert, den Du unter dem Dateinamen .htconfig.php im Stammverzeichnis Deiner Hubzilla-Installation speichern musst."
-#: ../../Zotlabs/Module/Setup.php:567
+#: ../../Zotlabs/Module/Setup.php:570
msgid ""
"You can alternatively skip this procedure and perform a manual installation."
" Please see the file \"install/INSTALL.txt\" for instructions."
msgstr "Alternativ kannst Du diesen Schritt überspringen und die Installation manuell vornehmen. Lies dazu die Datei install/INSTALL.txt."
-#: ../../Zotlabs/Module/Setup.php:570
+#: ../../Zotlabs/Module/Setup.php:573
msgid ".htconfig.php is writable"
msgstr ".htconfig.php ist beschreibbar"
-#: ../../Zotlabs/Module/Setup.php:584
+#: ../../Zotlabs/Module/Setup.php:587
msgid ""
-"Red uses the Smarty3 template engine to render its web views. Smarty3 "
-"compiles templates to PHP to speed up rendering."
-msgstr "$Projectname verwendet Smarty3 um Vorlagen für die Webdarstellung zu übersetzen. Smarty3 übersetzt diese Vorlagen nach PHP, um die Darstellung zu beschleunigen."
+"This software uses the Smarty3 template engine to render its web views. "
+"Smarty3 compiles templates to PHP to speed up rendering."
+msgstr "Diese Software verwendet die Smarty3 Template Engine, um Vorlagen für die Webdarstellung zu verarbeiten. Smarty3 übersetzt diese Vorlagen nach PHP, um die Darstellung zu beschleunigen."
-#: ../../Zotlabs/Module/Setup.php:585
+#: ../../Zotlabs/Module/Setup.php:588
#, php-format
msgid ""
"In order to store these compiled templates, the web server needs to have "
"write access to the directory %s under the top level web folder."
msgstr "Um diese kompilierten Vorlagen speichern zu können, braucht der Web-Server Schreibzugriff auf das Verzeichnis %s unterhalb des Hubzilla-Stammverzeichnisses."
-#: ../../Zotlabs/Module/Setup.php:586 ../../Zotlabs/Module/Setup.php:607
+#: ../../Zotlabs/Module/Setup.php:589 ../../Zotlabs/Module/Setup.php:610
msgid ""
"Please ensure that the user that your web server runs as (e.g. www-data) has"
" write access to this folder."
msgstr "Bitte stelle sicher, dass der Nutzer, unter dem der Web-Server läuft (z.B. www-data), Schreibzugriff auf dieses Verzeichnis hat."
-#: ../../Zotlabs/Module/Setup.php:587
+#: ../../Zotlabs/Module/Setup.php:590
#, php-format
msgid ""
"Note: as a security measure, you should give the web server write access to "
"%s only--not the template files (.tpl) that it contains."
msgstr "Hinweis: Aus Sicherheitsgründen sollte der Web-Server nur auf %s Schreibrechte haben, nicht auf die Template-Dateien (.tpl), die das Verzeichnis enthält."
-#: ../../Zotlabs/Module/Setup.php:590
+#: ../../Zotlabs/Module/Setup.php:593
#, php-format
msgid "%s is writable"
msgstr "%s ist beschreibbar"
-#: ../../Zotlabs/Module/Setup.php:606
+#: ../../Zotlabs/Module/Setup.php:609
msgid ""
"This software uses the store directory to save uploaded files. The web "
-"server needs to have write access to the store directory under the Red top "
-"level folder"
-msgstr "Diese Software benutzt das Verzeichnis store, um hochgeladene Dateien zu speichern. Der Web-Server benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Hubzilla-Stammverzeichnisses"
+"server needs to have write access to the store directory under the top level"
+" web folder"
+msgstr "Diese Software benutzt das Verzeichnis store, um hochgeladene Dateien zu speichern. Der Webserver benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Web-Stammverzeichnisses."
-#: ../../Zotlabs/Module/Setup.php:610
+#: ../../Zotlabs/Module/Setup.php:613
msgid "store is writable"
msgstr "store ist schreibbar"
-#: ../../Zotlabs/Module/Setup.php:643
+#: ../../Zotlabs/Module/Setup.php:646
msgid ""
"SSL certificate cannot be validated. Fix certificate or disable https access"
" to this site."
msgstr "Das SSL-Zertifikat konnte nicht validiert werden. Korrigiere das Zertifikat oder deaktiviere den HTTPS-Zugriff auf diesen Server."
-#: ../../Zotlabs/Module/Setup.php:644
+#: ../../Zotlabs/Module/Setup.php:647
msgid ""
"If you have https access to your website or allow connections to TCP port "
"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
"NOT use self-signed certificates!"
msgstr "Wenn Du via HTTPS auf Deinen Server zugreifen möchtest, also Verbindungen über den Port 443 möglich sein sollen, ist ein SSL-Zertifikat einer Zertifizierungsstelle (CA) notwendig, das von den Browsern ohne Sicherheitsabfrage akzeptiert wird. Die Verwendung eines selbst signierten Zertifikates ist nicht möglich."
-#: ../../Zotlabs/Module/Setup.php:645
+#: ../../Zotlabs/Module/Setup.php:648
msgid ""
"This restriction is incorporated because public posts from you may for "
"example contain references to images on your own hub."
msgstr "Diese Einschränkung wurde eingebaut, weil Deine öffentlichen Beiträge zum Beispiel Verweise auf Bilder auf Deinem eigenen Hub enthalten können."
-#: ../../Zotlabs/Module/Setup.php:646
+#: ../../Zotlabs/Module/Setup.php:649
msgid ""
"If your certificate is not recognized, members of other sites (who may "
"themselves have valid certificates) will get a warning message on their own "
"site complaining about security issues."
msgstr "Wenn Dein Zertifikat nicht von jedem Browser akzeptiert wird, erhalten die Mitglieder anderer $Projectname-Hubs (die mit korrekten Zertifikaten ausgestattet sind) Sicherheits-Warnmeldungen, obwohl sie gar nicht direkt auf Deinem Server unterwegs sind (zum Beispiel, wenn ein Bild aus einem Deiner Beiträge angezeigt wird)."
-#: ../../Zotlabs/Module/Setup.php:647
+#: ../../Zotlabs/Module/Setup.php:650
msgid ""
"This can cause usability issues elsewhere (not just on your own site) so we "
"must insist on this requirement."
msgstr "Dies kann Probleme für andere Nutzer (nicht nur auf Deinem eigenen Server) verursachen, so dass wir auf dieser Forderung bestehen müssen."
-#: ../../Zotlabs/Module/Setup.php:648
+#: ../../Zotlabs/Module/Setup.php:651
msgid ""
"Providers are available that issue free certificates which are browser-"
"valid."
msgstr "Es gibt einige Zertifizierungsstellen (CAs), bei denen solche Zertifikate kostenlos zu haben sind."
-#: ../../Zotlabs/Module/Setup.php:650
+#: ../../Zotlabs/Module/Setup.php:653
msgid ""
"If you are confident that the certificate is valid and signed by a trusted "
"authority, check to see if you have failed to install an intermediate cert. "
@@ -4509,574 +4555,746 @@ msgid ""
"server communications."
msgstr "Wenn Du sicher bist, dass das Zertifikat gültig und von einer vertrauenswürdigen Zertifizierungsstelle signiert ist, prüfe auf ggf. noch zu installierende Zwischenzertifikate (intermediate). Diese werden nicht unbedingt von Browsern benötigt, aber sehr wohl für die Kommunikation zwischen Servern."
-#: ../../Zotlabs/Module/Setup.php:653
+#: ../../Zotlabs/Module/Setup.php:655
msgid "SSL certificate validation"
msgstr "SSL Zertifikatverifizierung"
-#: ../../Zotlabs/Module/Setup.php:659
+#: ../../Zotlabs/Module/Setup.php:661
msgid ""
"Url rewrite in .htaccess is not working. Check your server "
"configuration.Test: "
msgstr "Das Umschreiben von URLs (rewrite) per .htaccess funktioniert nicht. Bitte prüfe die Server-Konfiguration. Test:"
-#: ../../Zotlabs/Module/Setup.php:662
+#: ../../Zotlabs/Module/Setup.php:664
msgid "Url rewrite is working"
msgstr "Url rewrite funktioniert"
-#: ../../Zotlabs/Module/Setup.php:671
+#: ../../Zotlabs/Module/Setup.php:678
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 Datenbank-Konfigurationsdatei „.htconfig.php“ konnte nicht geschrieben werden. Bitte verwende den unten angegebenen Text, um die Konfigurationsdatei im Stammverzeichnis des Webservers anzulegen."
-#: ../../Zotlabs/Module/Setup.php:695
+#: ../../Zotlabs/Module/Setup.php:702
+#: ../../extend/addon/addon/cdav/cdav.php:41
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:352
msgid "Errors encountered creating database tables."
msgstr "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten."
-#: ../../Zotlabs/Module/Setup.php:732
+#: ../../Zotlabs/Module/Setup.php:743
msgid "<h1>What next</h1>"
msgstr "<h1>Was als Nächstes</h1>"
-#: ../../Zotlabs/Module/Setup.php:733
+#: ../../Zotlabs/Module/Setup.php:744
msgid ""
"IMPORTANT: You will need to [manually] setup a scheduled task for the "
"poller."
msgstr "WICHTIG: Du musst [manuell] einen Cronjob für den Poller einrichten."
-#: ../../Zotlabs/Module/Oexchange.php:27
-msgid "Unable to find your hub."
-msgstr "Konnte Deinen Server nicht finden."
+#: ../../Zotlabs/Module/Editpost.php:35
+msgid "Item is not editable"
+msgstr "Element kann nicht bearbeitet werden."
-#: ../../Zotlabs/Module/Oexchange.php:41
-msgid "Post successful."
-msgstr "Veröffentlichung erfolgreich."
+#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
+msgid "This site is not a directory server"
+msgstr "Diese Webseite ist kein Verzeichnisserver"
-#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
-msgid "Invalid profile identifier."
-msgstr "Ungültiger Profil-Identifikator"
+#: ../../Zotlabs/Module/New_channel.php:140
+msgid "Create Channel"
+msgstr "Einen neuen Kanal anlegen"
-#: ../../Zotlabs/Module/Profperm.php:115
-msgid "Profile Visibility Editor"
-msgstr "Profil-Sichtbarkeits-Editor"
+#: ../../Zotlabs/Module/New_channel.php:141
+msgid ""
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
+msgstr "Ein Kanal ist Deine Identität in diesem Netzwerk. Er kann eine Person, ein Blog oder ein Forum repräsentieren, nur um ein paar Beispiele zu nennen. Kanäle können Verbindungen miteinander eingehen, um Informationen zu teilen, jeweils basierend auf sehr detaillierten Berechtigungseinstellungen."
-#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1274
-msgid "Profile"
-msgstr "Profil"
+#: ../../Zotlabs/Module/New_channel.php:142
+msgid ""
+"or <a href=\"import\">import an existing channel</a> from another location."
+msgstr "oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Server."
-#: ../../Zotlabs/Module/Profperm.php:119
-msgid "Click on a contact to add or remove."
-msgstr "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen."
+#: ../../Zotlabs/Module/Notifications.php:40 ../../include/nav.php:194
+msgid "Mark all system notifications seen"
+msgstr "Markiere alle System-Benachrichtigungen als gesehen"
-#: ../../Zotlabs/Module/Profperm.php:128
-msgid "Visible To"
-msgstr "Sichtbar für"
+#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:228
+#: ../../include/conversation.php:975
+msgid "Poke"
+msgstr "Anstupsen"
-#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
-msgid "This setting requires special processing and editing has been blocked."
-msgstr "Diese Einstellung erfordert eine besondere Verarbeitung und ist blockiert."
+#: ../../Zotlabs/Module/Poke.php:169
+msgid "Poke somebody"
+msgstr "Jemanden anstupsen"
-#: ../../Zotlabs/Module/Pconfig.php:48
-msgid "Configuration Editor"
-msgstr "Konfigurationseditor"
+#: ../../Zotlabs/Module/Poke.php:172
+msgid "Poke/Prod"
+msgstr "Anstupsen/Knuffen"
-#: ../../Zotlabs/Module/Pconfig.php:49
-msgid ""
-"Warning: Changing some settings could render your channel inoperable. Please"
-" leave this page unless you are comfortable with and knowledgeable about how"
-" to correctly use this feature."
-msgstr "Warnung: Einige Einstellungen können Deinen Kanal funktionsunfähig machen. Bitte verlasse diese Seite, es sei denn Du bist vertraut damit, wie dieses Feature korrekt verwendet wird."
+#: ../../Zotlabs/Module/Poke.php:173
+msgid "Poke, prod or do other things to somebody"
+msgstr "Jemanden anstupsen, knuffen oder sonstiges"
-#: ../../Zotlabs/Module/Apps.php:46 ../../include/nav.php:168
-#: ../../include/widgets.php:102
-msgid "Apps"
-msgstr "Apps"
+#: ../../Zotlabs/Module/Poke.php:180
+msgid "Recipient"
+msgstr "Empfänger"
-#: ../../Zotlabs/Module/Siteinfo.php:19
-#, php-format
-msgid "Version %s"
-msgstr "Version %s"
+#: ../../Zotlabs/Module/Poke.php:181
+msgid "Choose what you wish to do to recipient"
+msgstr "Wähle, was Du mit dem/r Empfänger/in tun willst"
-#: ../../Zotlabs/Module/Siteinfo.php:34
-msgid "Installed plugins/addons/apps:"
-msgstr "Installierte Plugins/Addons/Apps"
+#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+msgid "Make this post private"
+msgstr "Diesen Beitrag privat machen"
-#: ../../Zotlabs/Module/Siteinfo.php:36
-msgid "No installed plugins/addons/apps"
-msgstr "Keine installierten Plugins/Addons/Apps"
+#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:183
+#: ../../Zotlabs/Module/Profiles.php:240 ../../Zotlabs/Module/Profiles.php:619
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62
+msgid "Profile not found."
+msgstr "Profil nicht gefunden."
-#: ../../Zotlabs/Module/Siteinfo.php:49
-msgid ""
-"This is a hub of $Projectname - a global cooperative network of "
-"decentralized privacy enhanced websites."
-msgstr "Dieser Hub ist Teil von $Projectname – ein globales, kooperatives Netzwerk aus dezentralen Websites, die Rücksicht auf Deine Privatsphäre nehmen."
+#: ../../Zotlabs/Module/Profiles.php:44
+msgid "Profile deleted."
+msgstr "Profil gelöscht."
-#: ../../Zotlabs/Module/Siteinfo.php:51
-msgid "Tag: "
-msgstr "Schlagwort: "
+#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:104
+msgid "Profile-"
+msgstr "Profil-"
-#: ../../Zotlabs/Module/Siteinfo.php:53
-msgid "Last background fetch: "
-msgstr "Letzter Hintergrundabruf:"
+#: ../../Zotlabs/Module/Profiles.php:89 ../../Zotlabs/Module/Profiles.php:126
+msgid "New profile created."
+msgstr "Neues Profil erstellt."
-#: ../../Zotlabs/Module/Siteinfo.php:55
-msgid "Current load average: "
-msgstr "Aktuelles Load Average:"
+#: ../../Zotlabs/Module/Profiles.php:110
+msgid "Profile unavailable to clone."
+msgstr "Profil kann nicht geklont werden."
-#: ../../Zotlabs/Module/Siteinfo.php:58
-msgid "Running at web location"
-msgstr "Erreichbar unter der Web-Adresse"
+#: ../../Zotlabs/Module/Profiles.php:145
+msgid "Profile unavailable to export."
+msgstr "Dieses Profil kann nicht exportiert werden."
-#: ../../Zotlabs/Module/Siteinfo.php:59
-msgid ""
-"Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more "
-"about $Projectname."
-msgstr "Bitte besuchen Sie <a href=\"http://hubzilla.org\">hubzilla.org</a>, um mehr über $Projectname zu erfahren."
+#: ../../Zotlabs/Module/Profiles.php:250
+msgid "Profile Name is required."
+msgstr "Profil-Name erforderlich."
-#: ../../Zotlabs/Module/Siteinfo.php:60
-msgid "Bug reports and issues: please visit"
-msgstr "Probleme oder Fehler gefunden? Bitte besuche"
+#: ../../Zotlabs/Module/Profiles.php:421
+msgid "Marital Status"
+msgstr "Familienstand"
-#: ../../Zotlabs/Module/Siteinfo.php:62
-msgid "$projectname issues"
-msgstr "$projectname-Bugtracker"
+#: ../../Zotlabs/Module/Profiles.php:425
+msgid "Romantic Partner"
+msgstr "Romantische Partner"
-#: ../../Zotlabs/Module/Siteinfo.php:63
-msgid ""
-"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
-"com"
-msgstr "Vorschläge, Lob, usw.: E-Mail an 'redmatrix' at librelist - dot - com"
+#: ../../Zotlabs/Module/Profiles.php:429 ../../Zotlabs/Module/Profiles.php:730
+msgid "Likes"
+msgstr "Gefällt"
-#: ../../Zotlabs/Module/Siteinfo.php:65
-msgid "Site Administrators"
-msgstr "Administratoren"
+#: ../../Zotlabs/Module/Profiles.php:433 ../../Zotlabs/Module/Profiles.php:731
+msgid "Dislikes"
+msgstr "Gefällt nicht"
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2308
-msgid "Blocks"
-msgstr "Blöcke"
+#: ../../Zotlabs/Module/Profiles.php:437 ../../Zotlabs/Module/Profiles.php:738
+msgid "Work/Employment"
+msgstr "Arbeit/Anstellung"
-#: ../../Zotlabs/Module/Blocks.php:156
-msgid "Block Title"
-msgstr "Titel des Blocks"
+#: ../../Zotlabs/Module/Profiles.php:440
+msgid "Religion"
+msgstr "Religion"
-#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2310
-msgid "Layouts"
-msgstr "Layouts"
+#: ../../Zotlabs/Module/Profiles.php:444
+msgid "Political Views"
+msgstr "Politische Ansichten"
-#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:225
-#: ../../include/nav.php:164 ../../include/help.php:44
-#: ../../include/help.php:49
-msgid "Help"
-msgstr "Hilfe"
+#: ../../Zotlabs/Module/Profiles.php:448
+#: ../../extend/addon/addon/openid/MysqlProvider.php:74
+msgid "Gender"
+msgstr "Geschlecht"
-#: ../../Zotlabs/Module/Layouts.php:185
-msgid "Comanche page description language help"
-msgstr "Hilfe zur Comanche-Seitenbeschreibungssprache"
+#: ../../Zotlabs/Module/Profiles.php:452
+msgid "Sexual Preference"
+msgstr "Sexuelle Orientierung"
-#: ../../Zotlabs/Module/Layouts.php:189
-msgid "Layout Description"
-msgstr "Layout-Beschreibung"
+#: ../../Zotlabs/Module/Profiles.php:456
+msgid "Homepage"
+msgstr "Webseite"
-#: ../../Zotlabs/Module/Layouts.php:194
-msgid "Download PDL file"
-msgstr "PDL-Datei herunterladen"
+#: ../../Zotlabs/Module/Profiles.php:460
+msgid "Interests"
+msgstr "Hobbys/Interessen"
-#: ../../Zotlabs/Module/Profile_photo.php:115
-#: ../../Zotlabs/Module/Profile_photo.php:212
-#: ../../Zotlabs/Module/Profile_photo.php:311
-#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:734
-#: ../../include/photo/photo_driver.php:718
-msgid "Profile Photos"
-msgstr "Profilfotos"
+#: ../../Zotlabs/Module/Profiles.php:554
+msgid "Profile updated."
+msgstr "Profil aktualisiert."
-#: ../../Zotlabs/Module/Profile_photo.php:186
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Leere den Browser Cache oder nutze Umschalten-Neu Laden, falls das neue Foto nicht sofort angezeigt wird."
+#: ../../Zotlabs/Module/Profiles.php:638
+msgid "Hide your connections list from viewers of this profile"
+msgstr "Deine Verbindungen vor Betrachtern dieses Profils verbergen"
-#: ../../Zotlabs/Module/Profile_photo.php:389
-msgid "Upload Profile Photo"
-msgstr "Lade neues Profilfoto hoch"
+#: ../../Zotlabs/Module/Profiles.php:680
+msgid "Edit Profile Details"
+msgstr "Bearbeite Profil-Details"
-#: ../../Zotlabs/Module/Cal.php:69
-msgid "Permissions denied."
-msgstr "Berechtigung verweigert."
+#: ../../Zotlabs/Module/Profiles.php:682
+msgid "View this profile"
+msgstr "Dieses Profil ansehen"
-#: ../../Zotlabs/Module/Cal.php:337 ../../include/text.php:2332
-msgid "Import"
-msgstr "Import"
+#: ../../Zotlabs/Module/Profiles.php:683 ../../Zotlabs/Module/Profiles.php:765
+#: ../../include/channel.php:983
+msgid "Edit visibility"
+msgstr "Sichtbarkeit bearbeiten"
-#: ../../Zotlabs/Module/Common.php:14
-msgid "No channel."
-msgstr "Kein Kanal."
+#: ../../Zotlabs/Module/Profiles.php:684
+msgid "Profile Tools"
+msgstr "Profilwerkzeuge"
-#: ../../Zotlabs/Module/Common.php:43
-msgid "Common connections"
-msgstr "Gemeinsame Verbindungen"
+#: ../../Zotlabs/Module/Profiles.php:685
+msgid "Change cover photo"
+msgstr "Titelbild ändern"
-#: ../../Zotlabs/Module/Common.php:48
-msgid "No connections in common."
-msgstr "Keine gemeinsamen Verbindungen."
+#: ../../Zotlabs/Module/Profiles.php:686 ../../include/channel.php:954
+msgid "Change profile photo"
+msgstr "Profilfoto ändern"
-#: ../../Zotlabs/Module/Acl.php:313
-msgid "network"
-msgstr "Netzwerk"
+#: ../../Zotlabs/Module/Profiles.php:687
+msgid "Create a new profile using these settings"
+msgstr "Neues Profil anlegen und diese Einstellungen übernehmen"
-#: ../../Zotlabs/Module/Acl.php:323
-msgid "RSS"
-msgstr "RSS"
+#: ../../Zotlabs/Module/Profiles.php:688
+msgid "Clone this profile"
+msgstr "Dieses Profil klonen"
-#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1392
-msgid "Public Hubs"
-msgstr "Öffentliche Hubs"
+#: ../../Zotlabs/Module/Profiles.php:689
+msgid "Delete this profile"
+msgstr "Dieses Profil löschen"
-#: ../../Zotlabs/Module/Pubsites.php:27
-msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
-msgstr "Die hier aufgeführten Hubs sind öffentlich und erlauben die Registrierung im $Projectname Netzwerk. Alle Hubs dieses Netzwerks sind miteinander verbunden, so dass die Mitgliedschaft auf einem Hub die Verbindung zu beliebigen Seiten und Kanälen auf anderen Hubs ermöglicht. Es könnte sein, dass einige dieser Hubs kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den Seiten der einzelnen Hubs <strong>könnten</strong> jeweils nähere Informationen dazu stehen."
+#: ../../Zotlabs/Module/Profiles.php:690
+msgid "Add profile things"
+msgstr "Sachen zum Profil hinzufügen"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Hub URL"
-msgstr "Hub-URL"
+#: ../../Zotlabs/Module/Profiles.php:691 ../../include/widgets.php:105
+#: ../../include/conversation.php:1585
+msgid "Personal"
+msgstr "Persönlich"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Access Type"
-msgstr "Zugriffstyp"
+#: ../../Zotlabs/Module/Profiles.php:693
+msgid "Relation"
+msgstr "Beziehung"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Registration Policy"
-msgstr "Registrierungsrichtlinien"
+#: ../../Zotlabs/Module/Profiles.php:694 ../../include/datetime.php:55
+msgid "Miscellaneous"
+msgstr "Verschiedenes"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Stats"
-msgstr "Statistiken"
+#: ../../Zotlabs/Module/Profiles.php:696
+msgid "Import profile from file"
+msgstr "Profil aus einer Datei importieren"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Software"
-msgstr "Software"
+#: ../../Zotlabs/Module/Profiles.php:697
+msgid "Export profile to file"
+msgstr "Profil in eine Datei exportieren"
-#: ../../Zotlabs/Module/Pubsites.php:48
-msgid "Rate"
-msgstr "Bewerten"
+#: ../../Zotlabs/Module/Profiles.php:698
+msgid "Your gender"
+msgstr "Dein Geschlecht"
-#: ../../Zotlabs/Module/Pdledit.php:21
-msgid "Layout updated."
-msgstr "Layout aktualisiert."
+#: ../../Zotlabs/Module/Profiles.php:699
+msgid "Marital status"
+msgstr "Familienstand"
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:218
-msgid "Feature disabled."
-msgstr "Funktion deaktiviert."
+#: ../../Zotlabs/Module/Profiles.php:700
+msgid "Sexual preference"
+msgstr "Sexuelle Orientierung"
-#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
-msgid "Edit System Page Description"
-msgstr "Systemseitenbeschreibung bearbeiten"
+#: ../../Zotlabs/Module/Profiles.php:703
+msgid "Profile name"
+msgstr "Profilname"
-#: ../../Zotlabs/Module/Pdledit.php:64
-msgid "Layout not found."
-msgstr "Layout nicht gefunden."
+#: ../../Zotlabs/Module/Profiles.php:705
+msgid "This is your default profile."
+msgstr "Das ist Dein Standardprofil."
-#: ../../Zotlabs/Module/Pdledit.php:70
-msgid "Module Name:"
-msgstr "Modulname:"
+#: ../../Zotlabs/Module/Profiles.php:707
+msgid "Your full name"
+msgstr "Dein voller Name"
-#: ../../Zotlabs/Module/Pdledit.php:71
-msgid "Layout Help"
-msgstr "Layout-Hilfe"
+#: ../../Zotlabs/Module/Profiles.php:708
+msgid "Title/Description"
+msgstr "Titel/Beschreibung"
-#: ../../Zotlabs/Module/Connedit.php:80
-msgid "Could not access contact record."
-msgstr "Konnte nicht auf den Kontakteintrag zugreifen."
+#: ../../Zotlabs/Module/Profiles.php:711
+msgid "Street address"
+msgstr "Straße und Hausnummer"
-#: ../../Zotlabs/Module/Connedit.php:104
-msgid "Could not locate selected profile."
-msgstr "Gewähltes Profil nicht gefunden."
+#: ../../Zotlabs/Module/Profiles.php:712
+msgid "Locality/City"
+msgstr "Wohnort"
-#: ../../Zotlabs/Module/Connedit.php:256
-msgid "Connection updated."
-msgstr "Verbindung aktualisiert."
+#: ../../Zotlabs/Module/Profiles.php:713
+msgid "Region/State"
+msgstr "Region/Bundesstaat"
-#: ../../Zotlabs/Module/Connedit.php:258
-msgid "Failed to update connection record."
-msgstr "Konnte den Verbindungseintrag nicht aktualisieren."
+#: ../../Zotlabs/Module/Profiles.php:714
+msgid "Postal/Zip code"
+msgstr "Postleitzahl"
-#: ../../Zotlabs/Module/Connedit.php:308
-msgid "is now connected to"
-msgstr "ist jetzt verbunden mit"
+#: ../../Zotlabs/Module/Profiles.php:715
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161
+msgid "Country"
+msgstr "Land"
-#: ../../Zotlabs/Module/Connedit.php:440
-msgid "Could not access address book record."
-msgstr "Konnte nicht auf den Adressbuch-Eintrag zugreifen."
+#: ../../Zotlabs/Module/Profiles.php:720
+msgid "Who (if applicable)"
+msgstr "Wer (falls anwendbar)"
-#: ../../Zotlabs/Module/Connedit.php:460
-msgid "Refresh failed - channel is currently unavailable."
-msgstr "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar."
+#: ../../Zotlabs/Module/Profiles.php:720
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
-#: ../../Zotlabs/Module/Connedit.php:475 ../../Zotlabs/Module/Connedit.php:484
-#: ../../Zotlabs/Module/Connedit.php:493 ../../Zotlabs/Module/Connedit.php:502
-#: ../../Zotlabs/Module/Connedit.php:515
-msgid "Unable to set address book parameters."
-msgstr "Konnte die Adressbuch-Parameter nicht setzen."
+#: ../../Zotlabs/Module/Profiles.php:721
+msgid "Since (date)"
+msgstr "Seit (Datum)"
-#: ../../Zotlabs/Module/Connedit.php:538
-msgid "Connection has been removed."
-msgstr "Verbindung wurde gelöscht."
+#: ../../Zotlabs/Module/Profiles.php:724
+msgid "Tell us about yourself"
+msgstr "Erzähle uns ein wenig von Dir"
-#: ../../Zotlabs/Module/Connedit.php:554 ../../Zotlabs/Lib/Apps.php:221
-#: ../../include/nav.php:89 ../../include/conversation.php:955
-msgid "View Profile"
-msgstr "Profil ansehen"
+#: ../../Zotlabs/Module/Profiles.php:725
+#: ../../extend/addon/addon/openid/MysqlProvider.php:68
+msgid "Homepage URL"
+msgstr "Homepage-URL"
-#: ../../Zotlabs/Module/Connedit.php:557
-#, php-format
-msgid "View %s's profile"
-msgstr "%ss Profil ansehen"
+#: ../../Zotlabs/Module/Profiles.php:726
+msgid "Hometown"
+msgstr "Heimatort"
-#: ../../Zotlabs/Module/Connedit.php:561
-msgid "Refresh Permissions"
-msgstr "Zugriffsrechte neu laden"
+#: ../../Zotlabs/Module/Profiles.php:727
+msgid "Political views"
+msgstr "Politische Ansichten"
-#: ../../Zotlabs/Module/Connedit.php:564
-msgid "Fetch updated permissions"
-msgstr "Aktualisierte Zugriffsrechte abfragen"
+#: ../../Zotlabs/Module/Profiles.php:728
+msgid "Religious views"
+msgstr "Religiöse Ansichten"
-#: ../../Zotlabs/Module/Connedit.php:568
-msgid "Recent Activity"
-msgstr "Kürzliche Aktivitäten"
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Keywords used in directory listings"
+msgstr "Schlüsselwörter, die in Verzeichnis-Auflistungen verwendet werden"
-#: ../../Zotlabs/Module/Connedit.php:571
-msgid "View recent posts and comments"
-msgstr "Betrachte die neuesten Beiträge und Kommentare"
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Example: fishing photography software"
+msgstr "Beispiel: Angeln Fotografie Software"
-#: ../../Zotlabs/Module/Connedit.php:578
-msgid "Block (or Unblock) all communications with this connection"
-msgstr "Jegliche Kommunikation mit dieser Verbindung blockieren/zulassen"
+#: ../../Zotlabs/Module/Profiles.php:732
+msgid "Musical interests"
+msgstr "Musikalische Interessen"
-#: ../../Zotlabs/Module/Connedit.php:579
-msgid "This connection is blocked!"
-msgstr "Die Verbindung ist geblockt!"
+#: ../../Zotlabs/Module/Profiles.php:733
+msgid "Books, literature"
+msgstr "Bücher, Literatur"
-#: ../../Zotlabs/Module/Connedit.php:583
-msgid "Unignore"
-msgstr "Nicht ignorieren"
+#: ../../Zotlabs/Module/Profiles.php:734
+msgid "Television"
+msgstr "Fernsehen"
-#: ../../Zotlabs/Module/Connedit.php:586
-msgid "Ignore (or Unignore) all inbound communications from this connection"
-msgstr "Jegliche eingehende Kommunikation von dieser Verbindung ignorieren/zulassen"
+#: ../../Zotlabs/Module/Profiles.php:735
+msgid "Film/Dance/Culture/Entertainment"
+msgstr "Film/Tanz/Kultur/Unterhaltung"
-#: ../../Zotlabs/Module/Connedit.php:587
-msgid "This connection is ignored!"
-msgstr "Die Verbindung wird ignoriert!"
+#: ../../Zotlabs/Module/Profiles.php:736
+msgid "Hobbies/Interests"
+msgstr "Hobbys/Interessen"
-#: ../../Zotlabs/Module/Connedit.php:591
-msgid "Unarchive"
-msgstr "Aus Archiv zurückholen"
+#: ../../Zotlabs/Module/Profiles.php:737
+msgid "Love/Romance"
+msgstr "Liebe/Romantik"
-#: ../../Zotlabs/Module/Connedit.php:591
-msgid "Archive"
-msgstr "Archivieren"
+#: ../../Zotlabs/Module/Profiles.php:739
+msgid "School/Education"
+msgstr "Schule/Ausbildung"
+
+#: ../../Zotlabs/Module/Profiles.php:740
+msgid "Contact information and social networks"
+msgstr "Kontaktinformation und soziale Netzwerke"
+
+#: ../../Zotlabs/Module/Profiles.php:741
+msgid "My other channels"
+msgstr "Meine anderen Kanäle"
+
+#: ../../Zotlabs/Module/Profiles.php:761 ../../include/channel.php:979
+msgid "Profile Image"
+msgstr "Profilfoto:"
+
+#: ../../Zotlabs/Module/Profiles.php:771 ../../include/channel.php:961
+#: ../../include/nav.php:91
+msgid "Edit Profiles"
+msgstr "Profile bearbeiten"
+
+#: ../../Zotlabs/Module/Oexchange.php:27
+msgid "Unable to find your hub."
+msgstr "Konnte Deinen Server nicht finden."
+
+#: ../../Zotlabs/Module/Oexchange.php:41
+msgid "Post successful."
+msgstr "Veröffentlichung erfolgreich."
+
+#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
+msgid "This setting requires special processing and editing has been blocked."
+msgstr "Diese Einstellung erfordert eine besondere Verarbeitung und ist blockiert."
-#: ../../Zotlabs/Module/Connedit.php:594
+#: ../../Zotlabs/Module/Pconfig.php:48
+msgid "Configuration Editor"
+msgstr "Konfigurationseditor"
+
+#: ../../Zotlabs/Module/Pconfig.php:49
msgid ""
-"Archive (or Unarchive) this connection - mark channel dead but keep content"
-msgstr "Verbindung archivieren/aus dem Archiv zurückholen (Archiv = Kanal als erloschen markieren, aber die Beiträge behalten)"
+"Warning: Changing some settings could render your channel inoperable. Please"
+" leave this page unless you are comfortable with and knowledgeable about how"
+" to correctly use this feature."
+msgstr "Warnung: Einige Einstellungen können Deinen Kanal funktionsunfähig machen. Bitte verlasse diese Seite, es sei denn Du bist vertraut damit, wie dieses Feature korrekt verwendet wird."
-#: ../../Zotlabs/Module/Connedit.php:595
-msgid "This connection is archived!"
-msgstr "Die Verbindung ist archiviert!"
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2270
+msgid "Blocks"
+msgstr "Blöcke"
-#: ../../Zotlabs/Module/Connedit.php:599
-msgid "Unhide"
-msgstr "Wieder sichtbar machen"
+#: ../../Zotlabs/Module/Blocks.php:156
+msgid "Block Title"
+msgstr "Titel des Blocks"
-#: ../../Zotlabs/Module/Connedit.php:599
-msgid "Hide"
-msgstr "Verstecken"
+#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2272
+msgid "Layouts"
+msgstr "Layouts"
-#: ../../Zotlabs/Module/Connedit.php:602
-msgid "Hide or Unhide this connection from your other connections"
-msgstr "Diese Verbindung vor anderen Verbindungen verstecken/zeigen"
+#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:225
+#: ../../include/nav.php:162 ../../include/help.php:53
+#: ../../include/help.php:59
+msgid "Help"
+msgstr "Hilfe"
-#: ../../Zotlabs/Module/Connedit.php:603
-msgid "This connection is hidden!"
-msgstr "Die Verbindung ist versteckt!"
+#: ../../Zotlabs/Module/Layouts.php:185
+msgid "Comanche page description language help"
+msgstr "Hilfe zur Comanche-Seitenbeschreibungssprache"
-#: ../../Zotlabs/Module/Connedit.php:610
-msgid "Delete this connection"
-msgstr "Verbindung löschen"
+#: ../../Zotlabs/Module/Layouts.php:189
+msgid "Layout Description"
+msgstr "Layout-Beschreibung"
-#: ../../Zotlabs/Module/Connedit.php:625 ../../include/widgets.php:529
-msgid "Me"
-msgstr "Ich"
+#: ../../Zotlabs/Module/Layouts.php:194
+msgid "Download PDL file"
+msgstr "PDL-Datei herunterladen"
-#: ../../Zotlabs/Module/Connedit.php:626 ../../include/widgets.php:530
-msgid "Family"
-msgstr "Familie"
+#: ../../Zotlabs/Module/Rate.php:156
+msgid "Website:"
+msgstr "Webseite:"
-#: ../../Zotlabs/Module/Connedit.php:627
-#: ../../Zotlabs/Module/Settings/Channel.php:61
-#: ../../Zotlabs/Module/Settings/Channel.php:65
-#: ../../Zotlabs/Module/Settings/Channel.php:66
-#: ../../Zotlabs/Module/Settings/Channel.php:69
-#: ../../Zotlabs/Module/Settings/Channel.php:80
-#: ../../include/selectors.php:123 ../../include/channel.php:402
-#: ../../include/channel.php:403 ../../include/channel.php:410
-#: ../../include/widgets.php:531
-msgid "Friends"
-msgstr "Freunde"
+#: ../../Zotlabs/Module/Rate.php:159
+#, php-format
+msgid "Remote Channel [%s] (not yet known on this site)"
+msgstr "Kanal [%s] (auf diesem Server noch unbekannt)"
-#: ../../Zotlabs/Module/Connedit.php:628 ../../include/widgets.php:532
-msgid "Acquaintances"
-msgstr "Bekannte"
+#: ../../Zotlabs/Module/Rate.php:160
+msgid "Rating (this information is public)"
+msgstr "Bewertung (öffentlich sichtbar)"
-#: ../../Zotlabs/Module/Connedit.php:686
-msgid "Approve this connection"
-msgstr "Verbindung genehmigen"
+#: ../../Zotlabs/Module/Rate.php:161
+msgid "Optionally explain your rating (this information is public)"
+msgstr "Optional kannst du deine Bewertung erklären (öffentlich sichtbar)"
-#: ../../Zotlabs/Module/Connedit.php:686
-msgid "Accept connection to allow communication"
-msgstr "Akzeptiere die Verbindung, um Kommunikation zu ermöglichen"
+#: ../../Zotlabs/Module/Like.php:19
+msgid "Like/Dislike"
+msgstr "Mögen/Nicht mögen"
-#: ../../Zotlabs/Module/Connedit.php:691
-msgid "Set Affinity"
-msgstr "Beziehung festlegen"
+#: ../../Zotlabs/Module/Like.php:24
+msgid "This action is restricted to members."
+msgstr "Diese Aktion kann nur von Mitgliedern ausgeführt werden."
-#: ../../Zotlabs/Module/Connedit.php:694
-msgid "Set Profile"
-msgstr "Profil festlegen"
+#: ../../Zotlabs/Module/Like.php:25
+msgid ""
+"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
+"href=\"register\">register as a new $Projectname member</a> to continue."
+msgstr "Um fortzufahren <a href=\"rmagic\">melde Dich bitte mit Deiner $Projectname-ID an</a> oder <a href=\"register\">registriere Dich als neues $Projectname-Mitglied</a>."
-#: ../../Zotlabs/Module/Connedit.php:697
-msgid "Set Affinity & Profile"
-msgstr "Beziehung und Profile festlegen"
+#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
+#: ../../Zotlabs/Module/Like.php:169
+msgid "Invalid request."
+msgstr "Ungültige Anfrage."
-#: ../../Zotlabs/Module/Connedit.php:746
-msgid "none"
-msgstr "Keine"
+#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
+msgid "channel"
+msgstr "Kanal"
-#: ../../Zotlabs/Module/Connedit.php:750 ../../include/widgets.php:656
-msgid "Connection Default Permissions"
-msgstr "Standardzugriffsrechte für neue Verbindungen:"
+#: ../../Zotlabs/Module/Like.php:146
+msgid "thing"
+msgstr "Sache"
+
+#: ../../Zotlabs/Module/Like.php:192
+msgid "Channel unavailable."
+msgstr "Kanal nicht vorhanden."
+
+#: ../../Zotlabs/Module/Like.php:240
+msgid "Previous action reversed."
+msgstr "Die vorherige Aktion wurde rückgängig gemacht."
+
+#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
+#: ../../Zotlabs/Module/Tagger.php:47
+#: ../../extend/addon/addon/diaspora/inbound.php:1792
+#: ../../extend/addon/addon/redphotos/redphotohelper.php:74
+#: ../../include/text.php:1940 ../../include/conversation.php:120
+msgid "photo"
+msgstr "Foto"
+
+#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
+#: ../../extend/addon/addon/diaspora/inbound.php:1792
+#: ../../include/text.php:1946 ../../include/conversation.php:148
+msgid "status"
+msgstr "Status"
-#: ../../Zotlabs/Module/Connedit.php:750 ../../include/items.php:3983
+#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Tagger.php:51
+#: ../../Zotlabs/Module/Events.php:256 ../../include/text.php:1943
+#: ../../include/event.php:961 ../../include/conversation.php:123
+msgid "event"
+msgstr "Termin"
+
+#: ../../Zotlabs/Module/Like.php:419
+#: ../../extend/addon/addon/diaspora/inbound.php:1821
+#: ../../include/conversation.php:164
#, php-format
-msgid "Connection: %s"
-msgstr "Verbindung: %s"
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s gefällt %2$ss %3$s"
-#: ../../Zotlabs/Module/Connedit.php:751
-msgid "Apply these permissions automatically"
-msgstr "Diese Berechtigungen automatisch anwenden"
+#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s gefällt %2$ss %3$s nicht"
-#: ../../Zotlabs/Module/Connedit.php:751
-msgid "Connection requests will be approved without your interaction"
-msgstr "Verbindungsanfragen werden sofort bestätigt, ohne dass Deine aktive Zustimmung erforderlich ist."
+#: ../../Zotlabs/Module/Like.php:423
+#, php-format
+msgid "%1$s agrees with %2$s's %3$s"
+msgstr "%1$s stimmt %2$ss %3$s zu"
-#: ../../Zotlabs/Module/Connedit.php:753
-msgid "This connection's primary address is"
-msgstr "Die Hauptadresse der Verbindung ist"
+#: ../../Zotlabs/Module/Like.php:425
+#, php-format
+msgid "%1$s doesn't agree with %2$s's %3$s"
+msgstr "%1$s lehnt %2$ss %3$s ab"
-#: ../../Zotlabs/Module/Connedit.php:754
-msgid "Available locations:"
-msgstr "Verfügbare Klone:"
+#: ../../Zotlabs/Module/Like.php:427
+#, php-format
+msgid "%1$s abstains from a decision on %2$s's %3$s"
+msgstr "%1$s enthält sich zu %2$ss %3$s"
+
+#: ../../Zotlabs/Module/Like.php:429
+#, php-format
+msgid "%1$s is attending %2$s's %3$s"
+msgstr "%1$s nimmt an %2$ss %3$s teil"
+
+#: ../../Zotlabs/Module/Like.php:431
+#, php-format
+msgid "%1$s is not attending %2$s's %3$s"
+msgstr "%1$s nimmt an %2$ss %3$s nicht teil"
-#: ../../Zotlabs/Module/Connedit.php:758
+#: ../../Zotlabs/Module/Like.php:433
+#, php-format
+msgid "%1$s may attend %2$s's %3$s"
+msgstr "%1$s nimmt vielleicht an %2$ss %3$s teil"
+
+#: ../../Zotlabs/Module/Like.php:538
+msgid "Action completed."
+msgstr "Aktion durchgeführt."
+
+#: ../../Zotlabs/Module/Like.php:539
+msgid "Thank you."
+msgstr "Vielen Dank."
+
+#: ../../Zotlabs/Module/Profile_photo.php:186
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:293
msgid ""
-"The permissions indicated on this page will be applied to all new "
-"connections."
-msgstr "Die auf dieser Seite angegebenen Berechtigungen werden auf alle neuen Verbindungen angewendet."
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Leere den Browser Cache oder nutze Umschalten-Neu Laden, falls das neue Foto nicht sofort angezeigt wird."
-#: ../../Zotlabs/Module/Connedit.php:759
-msgid "Connection Tools"
-msgstr "Verbindungswerkzeuge"
+#: ../../Zotlabs/Module/Profile_photo.php:409
+msgid "Use Photo for Profile"
+msgstr "Foto für Profil verwenden"
-#: ../../Zotlabs/Module/Connedit.php:761
-msgid "Slide to adjust your degree of friendship"
-msgstr "Verschieben, um den Grad der Freundschaft zu einzustellen"
+#: ../../Zotlabs/Module/Profile_photo.php:409
+msgid "Upload Profile Photo"
+msgstr "Lade neues Profilfoto hoch"
-#: ../../Zotlabs/Module/Connedit.php:763
-msgid "Slide to adjust your rating"
-msgstr "Verschieben, um Deine Bewertung einzustellen"
+#: ../../Zotlabs/Module/Profile_photo.php:410
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:181
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:193
+msgid "Use"
+msgstr "Verwenden"
-#: ../../Zotlabs/Module/Connedit.php:764 ../../Zotlabs/Module/Connedit.php:769
-msgid "Optionally explain your rating"
-msgstr "Optional kannst Du Deine Bewertung begründen"
+#: ../../Zotlabs/Module/Search.php:223
+#, php-format
+msgid "Items tagged with: %s"
+msgstr "Beiträge mit Schlagwort: %s"
-#: ../../Zotlabs/Module/Connedit.php:766
-msgid "Custom Filter"
-msgstr "Benutzerdefinierter Filter"
+#: ../../Zotlabs/Module/Search.php:225
+#, php-format
+msgid "Search results for: %s"
+msgstr "Suchergebnisse für: %s"
-#: ../../Zotlabs/Module/Connedit.php:767
-msgid "Only import posts with this text"
-msgstr "Nur Beiträge mit diesem Text importieren"
+#: ../../Zotlabs/Module/Common.php:14
+msgid "No channel."
+msgstr "Kein Kanal."
+
+#: ../../Zotlabs/Module/Common.php:43
+msgid "Common connections"
+msgstr "Gemeinsame Verbindungen"
+
+#: ../../Zotlabs/Module/Common.php:48
+msgid "No connections in common."
+msgstr "Keine gemeinsamen Verbindungen."
+
+#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
+msgid "Authorize application connection"
+msgstr "Zugriff für die Anwendung autorisieren"
+
+#: ../../Zotlabs/Module/Api.php:73
+msgid "Return to your app and insert this Security Code:"
+msgstr "Gehen Sie zu Ihrer App zurück und tragen Sie diesen Sicherheitscode ein:"
-#: ../../Zotlabs/Module/Connedit.php:767 ../../Zotlabs/Module/Connedit.php:768
+#: ../../Zotlabs/Module/Api.php:83
+msgid "Please login to continue."
+msgstr "Zum Weitermachen, bitte einloggen."
+
+#: ../../Zotlabs/Module/Api.php:95
msgid ""
-"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
-"all posts"
-msgstr "Einzelne Wörter pro Zeile, #Tags oder /Reguläre Ausdrücke/. lang=xx (z.B. lang=de) ermöglicht Filterung nach Sprache. Leer lassen, um alle Beiträge zu importieren."
+"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 erlauben, Deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für Dich zu erstellen?"
-#: ../../Zotlabs/Module/Connedit.php:768
-msgid "Do not import posts with this text"
-msgstr "Beiträge mit diesem Text nicht importieren"
+#: ../../Zotlabs/Module/Ping.php:254
+msgid "sent you a private message"
+msgstr "hat Dir eine private Nachricht geschickt"
-#: ../../Zotlabs/Module/Connedit.php:770
-msgid "This information is public!"
-msgstr "Diese Information ist öffentlich!"
+#: ../../Zotlabs/Module/Ping.php:302
+msgid "added your channel"
+msgstr "hat deinen Kanal hinzugefügt"
-#: ../../Zotlabs/Module/Connedit.php:775
-msgid "Connection Pending Approval"
-msgstr "Verbindung wartet auf Bestätigung"
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "g A l F d"
+msgstr "l, d. F, G:i \\U\\h\\r"
-#: ../../Zotlabs/Module/Connedit.php:778
-#: ../../Zotlabs/Module/Settings/Tokens.php:163
-msgid "inherited"
-msgstr "geerbt"
+#: ../../Zotlabs/Module/Ping.php:330
+msgid "[today]"
+msgstr "[Heute]"
+
+#: ../../Zotlabs/Module/Ping.php:339
+msgid "posted an event"
+msgstr "hat einen Termin veröffentlicht"
+
+#: ../../Zotlabs/Module/Siteinfo.php:20
+msgid "About this site"
+msgstr "Über diese Seite"
+
+#: ../../Zotlabs/Module/Siteinfo.php:21
+msgid "Site Name"
+msgstr "Seitenname"
+
+#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1962
+msgid "Administrator"
+msgstr "Administrator"
+
+#: ../../Zotlabs/Module/Siteinfo.php:28
+msgid "Software and Project information"
+msgstr "Software und Projektinformationen"
-#: ../../Zotlabs/Module/Connedit.php:780
+#: ../../Zotlabs/Module/Siteinfo.php:29
+msgid "This site is powered by $Projectname"
+msgstr "Diese Website wird bereitgestellt durch $Projectname"
+
+#: ../../Zotlabs/Module/Siteinfo.php:30
+msgid ""
+"Federated and decentralised networking and identity services provided by Zot"
+msgstr "Verbundene, dezentrale Netzwerk- und Identitätsdienste, ermöglicht mittels Zot"
+
+#: ../../Zotlabs/Module/Siteinfo.php:32
#, php-format
+msgid "Version %s"
+msgstr "Version %s"
+
+#: ../../Zotlabs/Module/Siteinfo.php:33
+msgid "Project homepage"
+msgstr "Projekt-Website"
+
+#: ../../Zotlabs/Module/Siteinfo.php:34
+msgid "Developer homepage"
+msgstr "Entwickler-Website"
+
+#: ../../Zotlabs/Module/Lostpass.php:19
+msgid "No valid account found."
+msgstr "Kein gültiges Konto gefunden."
+
+#: ../../Zotlabs/Module/Lostpass.php:33
+msgid "Password reset request issued. Check your email."
+msgstr "Zurücksetzen des Passworts eingeleitet. Schau in Deine E-Mails."
+
+#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
+#, php-format
+msgid "Site Member (%s)"
+msgstr "Nutzer (%s)"
+
+#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Passwort-Rücksetzung auf %s angefordert"
+
+#: ../../Zotlabs/Module/Lostpass.php:68
msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Bitte wähle ein Profil, das wir %s zeigen sollen, wenn Deine Profilseite über eine verifizierte Verbindung aufgerufen wird."
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "Die Anfrage konnte nicht verifiziert werden. (Vielleicht hast Du schon einmal auf den Link in der E-Mail geklickt?) Passwort-Rücksetzung fehlgeschlagen."
-#: ../../Zotlabs/Module/Connedit.php:782
-#: ../../Zotlabs/Module/Settings/Tokens.php:160
-msgid "Their Settings"
-msgstr "Deren Einstellungen"
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1727
+msgid "Password Reset"
+msgstr "Zurücksetzen des Kennworts"
-#: ../../Zotlabs/Module/Connedit.php:783
-#: ../../Zotlabs/Module/Settings/Tokens.php:161
-msgid "My Settings"
-msgstr "Meine Einstellungen"
+#: ../../Zotlabs/Module/Lostpass.php:92
+msgid "Your password has been reset as requested."
+msgstr "Dein Passwort wurde wie angefordert neu erstellt."
-#: ../../Zotlabs/Module/Connedit.php:785
-#: ../../Zotlabs/Module/Settings/Tokens.php:165
-msgid "Individual Permissions"
-msgstr "Individuelle Zugriffsrechte"
+#: ../../Zotlabs/Module/Lostpass.php:93
+msgid "Your new password is"
+msgstr "Dein neues Passwort lautet"
-#: ../../Zotlabs/Module/Connedit.php:786
-#: ../../Zotlabs/Module/Settings/Tokens.php:166
+#: ../../Zotlabs/Module/Lostpass.php:94
+msgid "Save or copy your new password - and then"
+msgstr "Speichere oder kopiere Dein neues Passwort – und dann"
+
+#: ../../Zotlabs/Module/Lostpass.php:95
+msgid "click here to login"
+msgstr "Klicke hier, um dich anzumelden"
+
+#: ../../Zotlabs/Module/Lostpass.php:96
msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can <strong>not</strong> change those"
-" settings here."
-msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals vererbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung und können hier nicht verändert werden."
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Dein Passwort kann unter <em>Einstellungen</em> nach einer erfolgreichen Anmeldung geändert werden."
-#: ../../Zotlabs/Module/Connedit.php:787
+#: ../../Zotlabs/Module/Lostpass.php:117
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Auf %s wurde Dein Passwort geändert"
+
+#: ../../Zotlabs/Module/Lostpass.php:130
+msgid "Forgot your Password?"
+msgstr "Kennwort vergessen?"
+
+#: ../../Zotlabs/Module/Lostpass.php:131
msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can change those settings here but "
-"they wont have any impact unless the inherited setting changes."
-msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen."
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Gib Deine E-Mail-Adresse ein, um Dein Passwort zurücksetzen zu lassen. Du erhältst dann weitere Anweisungen per E-Mail."
-#: ../../Zotlabs/Module/Connedit.php:788
-msgid "Last update:"
-msgstr "Letzte Aktualisierung:"
+#: ../../Zotlabs/Module/Lostpass.php:132
+msgid "Email Address"
+msgstr "E-Mail Adresse"
+
+#: ../../Zotlabs/Module/Lostpass.php:133
+msgid "Reset"
+msgstr "Zurücksetzen"
#: ../../Zotlabs/Module/Rbmark.php:94
msgid "Select a bookmark folder"
@@ -5094,9 +5312,9 @@ msgstr "URL des Lesezeichens"
msgid "Or enter new bookmark folder name"
msgstr "Oder gib einen neuen Namen für den Lesezeichenordner ein"
-#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
-msgid "This site is not a directory server"
-msgstr "Diese Webseite ist kein Verzeichnisserver"
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
+msgstr "Dieser Verzeichnisserver benötigt einen Zugriffstoken"
#: ../../Zotlabs/Module/Rmagic.php:35
msgid "Authentication failed."
@@ -5114,9 +5332,9 @@ msgstr "Deine Kanal-Adresse (z. B. channel@example.com)"
msgid "Authenticate"
msgstr "Authentifizieren"
-#: ../../Zotlabs/Module/Admin.php:1215
-msgid "Uncensor"
-msgstr "Freigeben"
+#: ../../Zotlabs/Module/Regmod.php:15
+msgid "Please login."
+msgstr "Bitte melde dich an."
#: ../../Zotlabs/Module/Removeaccount.php:35
msgid ""
@@ -5135,9 +5353,9 @@ msgstr "WARNUNG: "
#: ../../Zotlabs/Module/Removeaccount.php:58
msgid ""
-"Selected channels will be deleted!\\n\\nEverything that was posted in these "
-"channels on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Alle ausgewählten Kanäle werden gelöscht!\\n\\nAlles was von diesen Kanälen auf diesem Server geschrieben wurde, wird dauerhaft gelöscht!\\n\\nBist Du sicher?"
+"This account and all its channels will be completely removed from the "
+"network. "
+msgstr "Dieses Konto mit all seinen Kanälen wird vollständig aus dem Netzwerk gelöscht."
#: ../../Zotlabs/Module/Removeaccount.php:58
#: ../../Zotlabs/Module/Removeme.php:61
@@ -5162,38 +5380,33 @@ msgid ""
msgstr "Standardmäßig werden nur die Kanalklone auf diesem $Projectname-Hub aus dem Netzwerk entfernt"
#: ../../Zotlabs/Module/Removeaccount.php:61
-#: ../../Zotlabs/Module/Settings/Account.php:128
+#: ../../Zotlabs/Module/Settings/Account.php:120
msgid "Remove Account"
msgstr "Konto entfernen"
-#: ../../Zotlabs/Module/Removeme.php:35
-msgid ""
-"Channel removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "Innerhalb von 48 Stunden nach einer Änderung des Passworts können keine Kanäle gelöscht werden."
+#: ../../Zotlabs/Module/Pdledit.php:21
+msgid "Layout updated."
+msgstr "Layout aktualisiert."
-#: ../../Zotlabs/Module/Removeme.php:60
-msgid "Remove This Channel"
-msgstr "Diesen Kanal löschen"
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:218
+msgid "Feature disabled."
+msgstr "Funktion deaktiviert."
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This channel will be completely removed from the network. "
-msgstr "Dieser Kanal wird vollständig aus dem Netzwerk gelöscht."
+#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
+msgid "Edit System Page Description"
+msgstr "Systemseitenbeschreibung bearbeiten"
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid "Remove this channel and all its clones from the network"
-msgstr "Lösche diesen Kanal und all seine Klone aus dem Netzwerk"
+#: ../../Zotlabs/Module/Pdledit.php:64
+msgid "Layout not found."
+msgstr "Layout nicht gefunden."
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid ""
-"By default only the instance of the channel located on this hub will be "
-"removed from the network"
-msgstr "Standardmäßig wird der Kanal nur auf diesem Server gelöscht, seine Klone verbleiben im Netzwerk"
+#: ../../Zotlabs/Module/Pdledit.php:70
+msgid "Module Name:"
+msgstr "Modulname:"
-#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:544
-msgid "Remove Channel"
-msgstr "Kanal löschen"
+#: ../../Zotlabs/Module/Pdledit.php:71
+msgid "Layout Help"
+msgstr "Layout-Hilfe"
#: ../../Zotlabs/Module/Uexport.php:55 ../../Zotlabs/Module/Uexport.php:56
msgid "Export Channel"
@@ -5253,99 +5466,201 @@ msgid ""
" please import or restore these in date order (oldest first)."
msgstr "Diese Inhalts-Sicherungen können wiederhergestellt werden, indem Du <a href=\"%1$s\">%2$s</a> auf jeglichem Hub besuchst, der diesen Kanal enthält. Das funktioniert am besten, wenn Du dabei die zeitliche Reihenfolge einhältst, also die Sicherungen für den ältesten Zeitraum zuerst importierst."
-#: ../../Zotlabs/Module/Editpost.php:35
-msgid "Item is not editable"
-msgstr "Element kann nicht bearbeitet werden."
+#: ../../Zotlabs/Module/Cal.php:69
+msgid "Permissions denied."
+msgstr "Berechtigung verweigert."
-#: ../../Zotlabs/Module/Admin.php:1396
-msgid "Custom repo name"
-msgstr "Benutzerdefinierter Repository-Name"
+#: ../../Zotlabs/Module/Cal.php:263 ../../Zotlabs/Module/Events.php:596
+msgid "l, F j"
+msgstr "l, j. F"
-#: ../../Zotlabs/Module/Admin.php:1396
-msgid "(optional)"
-msgstr "(optional)"
+#: ../../Zotlabs/Module/Cal.php:312 ../../Zotlabs/Module/Events.php:651
+#: ../../include/text.php:1748
+msgid "Link to Source"
+msgstr "Link zur Quelle"
-#: ../../Zotlabs/Module/Channel.php:28 ../../Zotlabs/Module/Wiki.php:20
-#: ../../Zotlabs/Module/Chat.php:25
-msgid "You must be logged in to see this page."
-msgstr "Du musst angemeldet sein, um diese Seite betrachten zu können."
+#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679
+msgid "Edit Event"
+msgstr "Termin bearbeiten"
-#: ../../Zotlabs/Module/Channel.php:40
-msgid "Posts and comments"
-msgstr "Beiträge und Kommentare"
+#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679
+msgid "Create Event"
+msgstr "Termin anlegen"
-#: ../../Zotlabs/Module/Channel.php:41
-msgid "Only posts"
-msgstr "Nur Beiträge"
+#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:682
+msgid "Export"
+msgstr "Exportieren"
-#: ../../Zotlabs/Module/Channel.php:101
-msgid "Insufficient permissions. Request redirected to profile page."
-msgstr "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet."
+#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2294
+msgid "Import"
+msgstr "Import"
+
+#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Events.php:691
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848
+msgid "Today"
+msgstr "Heute"
+
+#: ../../Zotlabs/Module/Admin.php:94
+msgid "# Accounts"
+msgstr "Anzahl der Konten"
+
+#: ../../Zotlabs/Module/Admin.php:95
+msgid "# blocked accounts"
+msgstr "Anzahl der blockierten Konten"
+
+#: ../../Zotlabs/Module/Admin.php:96
+msgid "# expired accounts"
+msgstr "Anzahl der abgelaufenen Konten"
+
+#: ../../Zotlabs/Module/Admin.php:97
+msgid "# expiring accounts"
+msgstr "Anzahl der ablaufenden Konten"
+
+#: ../../Zotlabs/Module/Admin.php:108
+msgid "# Channels"
+msgstr "Anzahl der Kanäle"
+
+#: ../../Zotlabs/Module/Admin.php:109
+msgid "# primary"
+msgstr "Anzahl der primären Kanäle"
+
+#: ../../Zotlabs/Module/Admin.php:110
+msgid "# clones"
+msgstr "Anzahl der Klone"
+
+#: ../../Zotlabs/Module/Admin.php:116
+msgid "Message queues"
+msgstr "Nachrichten-Warteschlangen"
+
+#: ../../Zotlabs/Module/Admin.php:133
+msgid "Your software should be updated"
+msgstr "Die installierte Software sollte aktualisiert werden"
+
+#: ../../Zotlabs/Module/Admin.php:138
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+#: ../../Zotlabs/Module/Admin.php:141
+msgid "Registered accounts"
+msgstr "Registrierte Konten"
+
+#: ../../Zotlabs/Module/Admin.php:142
+msgid "Pending registrations"
+msgstr "Ausstehende Registrierungen"
+
+#: ../../Zotlabs/Module/Admin.php:143
+msgid "Registered channels"
+msgstr "Registrierte Kanäle"
+
+#: ../../Zotlabs/Module/Admin.php:144
+msgid "Active plugins"
+msgstr "Aktive Plug-Ins"
+
+#: ../../Zotlabs/Module/Admin.php:145
+msgid "Version"
+msgstr "Version"
+
+#: ../../Zotlabs/Module/Admin.php:146
+msgid "Repository version (master)"
+msgstr "Repository-Version (master)"
+
+#: ../../Zotlabs/Module/Admin.php:147
+msgid "Repository version (dev)"
+msgstr "Repository-Version (dev)"
+
+#: ../../Zotlabs/Module/Lockview.php:75
+msgid "Remote privacy information not available."
+msgstr "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar."
+
+#: ../../Zotlabs/Module/Lockview.php:96
+msgid "Visible to:"
+msgstr "Sichtbar für:"
#: ../../Zotlabs/Module/Service_limits.php:23
msgid "No service class restrictions found."
msgstr "Keine Dienstklassenbeschränkungen gefunden."
-#: ../../Zotlabs/Module/Thing.php:114
-msgid "Thing updated"
-msgstr "Sache aktualisiert"
+#: ../../Zotlabs/Module/Webpages.php:52
+msgid "Import Webpage Elements"
+msgstr "Webseitenelemente importieren"
-#: ../../Zotlabs/Module/Thing.php:166
-msgid "Object store: failed"
-msgstr "Speichern des Objekts fehlgeschlagen"
+#: ../../Zotlabs/Module/Webpages.php:53
+msgid "Import selected"
+msgstr "Import ausgewählt"
-#: ../../Zotlabs/Module/Thing.php:170
-msgid "Thing added"
-msgstr "Sache hinzugefügt"
+#: ../../Zotlabs/Module/Webpages.php:76
+msgid "Export Webpage Elements"
+msgstr "Webseitenelemente exportieren"
-#: ../../Zotlabs/Module/Thing.php:196
-#, php-format
-msgid "OBJ: %1$s %2$s %3$s"
-msgstr "OBJ: %1$s %2$s %3$s"
+#: ../../Zotlabs/Module/Webpages.php:77
+msgid "Export selected"
+msgstr "Exportieren ausgewählt"
-#: ../../Zotlabs/Module/Thing.php:259
-msgid "Show Thing"
-msgstr "Sache anzeigen"
+#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:218
+#: ../../include/nav.php:109 ../../include/conversation.php:1745
+msgid "Webpages"
+msgstr "Webseiten"
-#: ../../Zotlabs/Module/Thing.php:266
-msgid "item not found."
-msgstr "Eintrag nicht gefunden"
+#: ../../Zotlabs/Module/Webpages.php:248 ../../include/page_widgets.php:44
+msgid "Actions"
+msgstr "Aktionen"
-#: ../../Zotlabs/Module/Thing.php:299
-msgid "Edit Thing"
-msgstr "Sache bearbeiten"
+#: ../../Zotlabs/Module/Webpages.php:249 ../../include/page_widgets.php:45
+msgid "Page Link"
+msgstr "Seiten-Link"
-#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
-msgid "Select a profile"
-msgstr "Wähle ein Profil"
+#: ../../Zotlabs/Module/Webpages.php:250
+msgid "Page Title"
+msgstr "Seitentitel"
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Post an activity"
-msgstr "Aktivitätsnachricht senden"
+#: ../../Zotlabs/Module/Webpages.php:280
+msgid "Invalid file type."
+msgstr "Ungültiger Dateityp."
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Only sends to viewers of the applicable profile"
-msgstr "Nur an Betrachter des ausgewählten Profils senden"
+#: ../../Zotlabs/Module/Webpages.php:292
+msgid "Error opening zip file"
+msgstr "Fehler beim Öffnen der ZIP-Datei"
-#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
-msgid "Name of thing e.g. something"
-msgstr "Name der Sache, z. B. irgendwas"
+#: ../../Zotlabs/Module/Webpages.php:303
+msgid "Invalid folder path."
+msgstr "Ungültiger Ordnerpfad."
-#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
-msgid "URL of thing (optional)"
-msgstr "URL der Sache (optional)"
+#: ../../Zotlabs/Module/Webpages.php:330
+msgid "No webpage elements detected."
+msgstr "Keine Webseitenelemente erkannt."
-#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
-msgid "URL for photo of thing (optional)"
-msgstr "URL eines Fotos der Sache (optional)"
+#: ../../Zotlabs/Module/Webpages.php:405
+msgid "Import complete."
+msgstr "Import abgeschlossen."
-#: ../../Zotlabs/Module/Thing.php:353
-msgid "Add Thing to your Profile"
-msgstr "Die Sache Deinem Profil hinzufügen"
+#: ../../Zotlabs/Module/Removeme.php:35
+msgid ""
+"Channel removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "Innerhalb von 48 Stunden nach einer Änderung des Passworts können keine Kanäle gelöscht werden."
-#: ../../Zotlabs/Module/Dirsearch.php:33
-msgid "This directory server requires an access token"
-msgstr "Dieser Verzeichnisserver benötigt einen Zugriffstoken"
+#: ../../Zotlabs/Module/Removeme.php:60
+msgid "Remove This Channel"
+msgstr "Diesen Kanal löschen"
+
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "This channel will be completely removed from the network. "
+msgstr "Dieser Kanal wird vollständig aus dem Netzwerk gelöscht."
+
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid "Remove this channel and all its clones from the network"
+msgstr "Lösche diesen Kanal und all seine Klone aus dem Netzwerk"
+
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Standardmäßig wird der Kanal nur auf diesem Server gelöscht, seine Klone verbleiben im Netzwerk"
+
+#: ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings/Channel.php:547
+msgid "Remove Channel"
+msgstr "Kanal löschen"
#: ../../Zotlabs/Module/Sharedwithme.php:98
msgid "Files: shared with me"
@@ -5367,79 +5682,128 @@ msgstr "Diese Datei löschen"
msgid "Not found"
msgstr "Nicht gefunden"
-#: ../../Zotlabs/Module/Wiki.php:97 ../../Zotlabs/Lib/Apps.php:219
-#: ../../include/nav.php:111 ../../include/conversation.php:1734
-#: ../../include/conversation.php:1737 ../../include/features.php:57
-msgid "Wiki"
-msgstr "Wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:98
-msgid "Sandbox"
-msgstr "Sandbox"
+#: ../../Zotlabs/Module/Wiki.php:55
+msgid "Invalid channel"
+msgstr "Ungültiger Kanal"
#: ../../Zotlabs/Module/Wiki.php:100
-msgid ""
-"\"# Wiki Sandbox\\n\\nContent you **edit** and **preview** here *will not be"
-" saved*.\""
-msgstr "\"# Wiki Sandkasten\\n\\nInhalte, die Du hier **veränderst** und **als Vorschau anzeigst**, *werden nicht gespeichert*.\""
+msgid "Error retrieving wiki"
+msgstr "Fehler beim Abrufen des Wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:107
+msgid "Error creating zip file export folder"
+msgstr "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses "
+
+#: ../../Zotlabs/Module/Wiki.php:125
+msgid "Error downloading wiki: "
+msgstr "Fehler beim Herunterladen des Wiki:"
+
+#: ../../Zotlabs/Module/Wiki.php:139 ../../include/nav.php:111
+#: ../../include/conversation.php:1755
+msgid "Wikis"
+msgstr "Wikis"
+
+#: ../../Zotlabs/Module/Wiki.php:145 ../../include/widgets.php:966
+msgid "Download"
+msgstr "Herunterladen"
+
+#: ../../Zotlabs/Module/Wiki.php:149 ../../include/widgets.php:970
+msgid "Wiki name"
+msgstr "Name des Wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:150
+msgid "Content type"
+msgstr "Inhaltstyp"
+
+#: ../../Zotlabs/Module/Wiki.php:159
+msgid "Create a status post for this wiki"
+msgstr "Erzeuge einen Statusbeitrag für dieses Wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:178
+msgid "Wiki not found"
+msgstr "Wiki nicht gefunden"
-#: ../../Zotlabs/Module/Wiki.php:169
+#: ../../Zotlabs/Module/Wiki.php:203
+msgid "Rename page"
+msgstr "Seite umbenennen"
+
+#: ../../Zotlabs/Module/Wiki.php:207
+msgid "Error retrieving page content"
+msgstr "Fehler beim Abrufen des Seiteninhalts"
+
+#: ../../Zotlabs/Module/Wiki.php:240
msgid "Revision Comparison"
msgstr "Revisionsvergleich"
-#: ../../Zotlabs/Module/Wiki.php:170
+#: ../../Zotlabs/Module/Wiki.php:241
msgid "Revert"
msgstr "Rückgängig machen"
-#: ../../Zotlabs/Module/Wiki.php:201
-msgid "Enter the name of your new wiki:"
-msgstr "Gib einen Namen für Dein neues Wiki ein:"
+#: ../../Zotlabs/Module/Wiki.php:250
+msgid "Choose an available wiki from the list on the left."
+msgstr "Wähle ein vorhandenes Wiki aus der Liste auf der linken Seite aus."
-#: ../../Zotlabs/Module/Wiki.php:202
-msgid "Enter the name of the new page:"
-msgstr "Geben Sie den Namen der neuen Seite ein:"
+#: ../../Zotlabs/Module/Wiki.php:252
+msgid "Source"
+msgstr "Quelle"
-#: ../../Zotlabs/Module/Wiki.php:203
-msgid "Enter the new name:"
-msgstr "Geben Sie den neuen Namen ein:"
+#: ../../Zotlabs/Module/Wiki.php:269
+msgid "New page name"
+msgstr "Neuer Seitenname"
-#: ../../Zotlabs/Module/Wiki.php:209 ../../include/conversation.php:1152
+#: ../../Zotlabs/Module/Wiki.php:275 ../../include/conversation.php:1169
msgid "Embed image from photo albums"
msgstr "Bild aus Fotoalben einbetten"
-#: ../../Zotlabs/Module/Wiki.php:210 ../../include/conversation.php:1246
+#: ../../Zotlabs/Module/Wiki.php:276 ../../include/conversation.php:1263
msgid "Embed an image from your albums"
msgstr "Betten Sie ein Bild aus Ihren Alben ein"
-#: ../../Zotlabs/Module/Wiki.php:212 ../../include/conversation.php:1248
-#: ../../include/conversation.php:1295
+#: ../../Zotlabs/Module/Wiki.php:278 ../../include/conversation.php:1265
+#: ../../include/conversation.php:1312
msgid "OK"
msgstr "Ok"
-#: ../../Zotlabs/Module/Wiki.php:213 ../../include/conversation.php:1188
+#: ../../Zotlabs/Module/Wiki.php:279 ../../include/conversation.php:1205
msgid "Choose images to embed"
msgstr "Wählen Sie Bilder zum Einbetten aus"
-#: ../../Zotlabs/Module/Wiki.php:214 ../../include/conversation.php:1189
+#: ../../Zotlabs/Module/Wiki.php:280 ../../include/conversation.php:1206
msgid "Choose an album"
msgstr "Wählen Sie ein Album aus"
-#: ../../Zotlabs/Module/Wiki.php:215 ../../include/conversation.php:1190
+#: ../../Zotlabs/Module/Wiki.php:281 ../../include/conversation.php:1207
msgid "Choose a different album..."
msgstr "Wählen Sie ein anderes Album aus..."
-#: ../../Zotlabs/Module/Wiki.php:216 ../../include/conversation.php:1191
+#: ../../Zotlabs/Module/Wiki.php:282 ../../include/conversation.php:1208
msgid "Error getting album list"
msgstr "Fehler beim Holen der Albenliste"
-#: ../../Zotlabs/Module/Wiki.php:217 ../../include/conversation.php:1192
+#: ../../Zotlabs/Module/Wiki.php:283 ../../include/conversation.php:1209
msgid "Error getting photo link"
msgstr "Fehler beim Holen des Fotolinks"
-#: ../../Zotlabs/Module/Wiki.php:218 ../../include/conversation.php:1193
+#: ../../Zotlabs/Module/Wiki.php:284 ../../include/conversation.php:1210
msgid "Error getting album"
msgstr "Fehler beim Holen des Albums"
+#: ../../Zotlabs/Module/Wiki.php:348
+msgid "Error creating wiki. Invalid name."
+msgstr "Fehler beim Erstellen des Wiki. Ungültiger Name."
+
+#: ../../Zotlabs/Module/Wiki.php:359
+msgid "Wiki created, but error creating Home page."
+msgstr "Das Wiki wurde erzeugt, aber es gab einen Fehler bei der Erstellung der Startseite"
+
+#: ../../Zotlabs/Module/Wiki.php:364
+msgid "Error creating wiki"
+msgstr "Fehler beim Erstellen des Wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:410
+msgid "New page created"
+msgstr "Neue Seite erstellt"
+
#: ../../Zotlabs/Module/Sources.php:37
msgid "Failed to create source. No channel selected."
msgstr "Konnte die Quelle nicht anlegen. Kein Kanal ausgewählt."
@@ -5456,8 +5820,8 @@ msgstr "Quelle aktualisiert."
msgid "*"
msgstr "*"
-#: ../../Zotlabs/Module/Sources.php:96 ../../include/widgets.php:672
-#: ../../include/features.php:70
+#: ../../Zotlabs/Module/Sources.php:96 ../../include/features.php:195
+#: ../../include/widgets.php:672
msgid "Channel Sources"
msgstr "Kanal-Quellen"
@@ -5538,12 +5902,12 @@ msgstr "Keine Vorschläge vorhanden. Wenn das ein neuer Server ist, versuche es
msgid "Ignore/Hide"
msgstr "Ignorieren/Verstecken"
-#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:263
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
msgid "post"
msgstr "Beitrag"
-#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:150
-#: ../../include/text.php:1999
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/text.php:1948
+#: ../../include/conversation.php:150
msgid "comment"
msgstr "Kommentar"
@@ -5552,444 +5916,125 @@ msgstr "Kommentar"
msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr "%1$s hat %2$ss %3$s mit %4$s verschlagwortet"
-#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
-msgid "Tag removed"
-msgstr "Schlagwort entfernt"
-
-#: ../../Zotlabs/Module/Tagrm.php:123
-msgid "Remove Item Tag"
-msgstr "Schlagwort entfernen"
-
-#: ../../Zotlabs/Module/Tagrm.php:125
-msgid "Select a tag to remove: "
-msgstr "Schlagwort zum Entfernen auswählen:"
-
-#: ../../Zotlabs/Module/Photos.php:82
-msgid "Page owner information could not be retrieved."
-msgstr "Informationen über den Besitzer der Seite konnten nicht gefunden werden."
-
-#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
-msgid "Album not found."
-msgstr "Album nicht gefunden."
-
-#: ../../Zotlabs/Module/Photos.php:112
-msgid "Delete Album"
-msgstr "Album löschen"
-
-#: ../../Zotlabs/Module/Photos.php:133
-msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
-msgstr "Mehrere Speicherordner mit diesem Albumnamen sind bereits vorhanden, aber in verschiedenen Verzeichnissen. Bitte entfernen Sie den oder die gewünschten Ordner mit dem Dateimanager"
-
-#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1059
-msgid "Delete Photo"
-msgstr "Foto löschen"
-
-#: ../../Zotlabs/Module/Photos.php:520
-msgid "No photos selected"
-msgstr "Keine Fotos ausgewählt"
-
-#: ../../Zotlabs/Module/Photos.php:569
-msgid "Access to this item is restricted."
-msgstr "Der Zugriff auf dieses Foto ist eingeschränkt."
-
-#: ../../Zotlabs/Module/Photos.php:608
-#, php-format
-msgid "%1$.2f MB of %2$.2f MB photo storage used."
-msgstr "%1$.2f MB von %2$.2f MB Foto-Speicher belegt."
-
-#: ../../Zotlabs/Module/Photos.php:611
-#, php-format
-msgid "%1$.2f MB photo storage used."
-msgstr "%1$.2f MB Foto-Speicher belegt."
-
-#: ../../Zotlabs/Module/Photos.php:647
-msgid "Upload Photos"
-msgstr "Fotos hochladen"
-
-#: ../../Zotlabs/Module/Photos.php:651
-msgid "Enter an album name"
-msgstr "Namen für ein neues Album eingeben"
-
-#: ../../Zotlabs/Module/Photos.php:652
-msgid "or select an existing album (doubleclick)"
-msgstr "oder ein bereits vorhandenes auswählen (Doppelklick)"
-
-#: ../../Zotlabs/Module/Photos.php:653
-msgid "Create a status post for this upload"
-msgstr "Einen Statusbeitrag für diesen Upload erzeugen"
-
-#: ../../Zotlabs/Module/Photos.php:654
-msgid "Caption (optional):"
-msgstr "Beschriftung (optional):"
-
-#: ../../Zotlabs/Module/Photos.php:655
-msgid "Description (optional):"
-msgstr "Beschreibung (optional):"
-
-#: ../../Zotlabs/Module/Photos.php:686
-msgid "Album name could not be decoded"
-msgstr "Albumname konnte nicht dekodiert werden"
-
-#: ../../Zotlabs/Module/Photos.php:734
-msgid "Contact Photos"
-msgstr "Kontakt-Bilder"
-
-#: ../../Zotlabs/Module/Photos.php:757
-msgid "Show Newest First"
-msgstr "Neueste zuerst anzeigen"
-
-#: ../../Zotlabs/Module/Photos.php:759
-msgid "Show Oldest First"
-msgstr "Älteste zuerst anzeigen"
-
-#: ../../Zotlabs/Module/Photos.php:783 ../../Zotlabs/Module/Photos.php:1337
-#: ../../Zotlabs/Module/Embedphotos.php:141 ../../include/widgets.php:1673
-msgid "View Photo"
-msgstr "Foto ansehen"
-
-#: ../../Zotlabs/Module/Photos.php:814
-#: ../../Zotlabs/Module/Embedphotos.php:157 ../../include/widgets.php:1690
-msgid "Edit Album"
-msgstr "Album bearbeiten"
-
-#: ../../Zotlabs/Module/Photos.php:861
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden."
-
-#: ../../Zotlabs/Module/Photos.php:863
-msgid "Photo not available"
-msgstr "Foto nicht verfügbar"
-
-#: ../../Zotlabs/Module/Photos.php:921
-msgid "Use as profile photo"
-msgstr "Als Profilfoto verwenden"
-
-#: ../../Zotlabs/Module/Photos.php:922
-msgid "Use as cover photo"
-msgstr "Als Titelbild verwenden"
-
-#: ../../Zotlabs/Module/Photos.php:929
-msgid "Private Photo"
-msgstr "Privates Foto"
-
-#: ../../Zotlabs/Module/Photos.php:944
-msgid "View Full Size"
-msgstr "In voller Größe anzeigen"
-
-#: ../../Zotlabs/Module/Photos.php:1033
-msgid "Edit photo"
-msgstr "Foto bearbeiten"
-
-#: ../../Zotlabs/Module/Photos.php:1035
-msgid "Rotate CW (right)"
-msgstr "Drehen im UZS (rechts)"
-
-#: ../../Zotlabs/Module/Photos.php:1036
-msgid "Rotate CCW (left)"
-msgstr "Drehen gegen UZS (links)"
-
-#: ../../Zotlabs/Module/Photos.php:1039
-msgid "Move photo to album"
-msgstr "Foto in Album verschieben"
-
-#: ../../Zotlabs/Module/Photos.php:1040
-msgid "Enter a new album name"
-msgstr "Gib einen Namen für ein neues Album ein"
-
-#: ../../Zotlabs/Module/Photos.php:1041
-msgid "or select an existing one (doubleclick)"
-msgstr "oder wähle ein bereits vorhandenes aus (Doppelklick)"
-
-#: ../../Zotlabs/Module/Photos.php:1044
-msgid "Caption"
-msgstr "Bildunterschrift"
-
-#: ../../Zotlabs/Module/Photos.php:1046
-msgid "Add a Tag"
-msgstr "Schlagwort hinzufügen"
-
-#: ../../Zotlabs/Module/Photos.php:1054
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
-msgstr "Beispiele: @ben, @Karl_Prester, @lieschen@example.com"
-
-#: ../../Zotlabs/Module/Photos.php:1057
-msgid "Flag as adult in album view"
-msgstr "In der Albumansicht als nicht jugendfrei markieren"
-
-#: ../../Zotlabs/Module/Photos.php:1076 ../../Zotlabs/Lib/ThreadItem.php:263
-msgid "I like this (toggle)"
-msgstr "Mir gefällt das (Umschalter)"
-
-#: ../../Zotlabs/Module/Photos.php:1077 ../../Zotlabs/Lib/ThreadItem.php:264
-msgid "I don't like this (toggle)"
-msgstr "Mir gefällt das nicht (Umschalter)"
-
-#: ../../Zotlabs/Module/Photos.php:1079 ../../Zotlabs/Lib/ThreadItem.php:399
-#: ../../include/conversation.php:743
-msgid "Please wait"
-msgstr "Bitte warten"
-
-#: ../../Zotlabs/Module/Photos.php:1095 ../../Zotlabs/Module/Photos.php:1213
-#: ../../Zotlabs/Lib/ThreadItem.php:709
-msgid "This is you"
-msgstr "Das bist Du"
-
-#: ../../Zotlabs/Module/Photos.php:1097 ../../Zotlabs/Module/Photos.php:1215
-#: ../../Zotlabs/Lib/ThreadItem.php:711 ../../include/js_strings.php:6
-msgid "Comment"
-msgstr "Kommentar"
-
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Likes"
-msgstr "Gefällt mir"
-
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Dislikes"
-msgstr "Gefällt mir nicht"
-
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Agree"
-msgstr "Zustimmungen"
-
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Disagree"
-msgstr "Ablehnungen"
-
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Abstain"
-msgstr "Enthaltungen"
-
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Attending"
-msgstr "Zusagen"
-
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Not attending"
-msgstr "Absagen"
-
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Might attend"
-msgstr "Vielleicht"
-
-#: ../../Zotlabs/Module/Photos.php:1132 ../../Zotlabs/Module/Photos.php:1144
-#: ../../Zotlabs/Lib/ThreadItem.php:181 ../../Zotlabs/Lib/ThreadItem.php:193
-#: ../../include/conversation.php:1762
-msgid "View all"
-msgstr "Alles anzeigen"
-
-#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:185
-#: ../../include/channel.php:1182 ../../include/conversation.php:1786
-#: ../../include/taxonomy.php:403
-msgctxt "noun"
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] "Gefällt mir"
-msgstr[1] "Gefällt mir"
-
-#: ../../Zotlabs/Module/Photos.php:1141 ../../Zotlabs/Lib/ThreadItem.php:190
-#: ../../include/conversation.php:1789
-msgctxt "noun"
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] "Gefällt nicht"
-msgstr[1] "Gefällt nicht"
-
-#: ../../Zotlabs/Module/Photos.php:1241
-msgid "Photo Tools"
-msgstr "Fotowerkzeuge"
-
-#: ../../Zotlabs/Module/Photos.php:1250
-msgid "In This Photo:"
-msgstr "Auf diesem Foto:"
-
-#: ../../Zotlabs/Module/Photos.php:1255
-msgid "Map"
-msgstr "Karte"
-
-#: ../../Zotlabs/Module/Photos.php:1263 ../../Zotlabs/Lib/ThreadItem.php:388
-msgctxt "noun"
-msgid "Likes"
-msgstr "Gefällt mir"
-
-#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:389
-msgctxt "noun"
-msgid "Dislikes"
-msgstr "Gefällt nicht"
-
-#: ../../Zotlabs/Module/Photos.php:1269 ../../Zotlabs/Lib/ThreadItem.php:394
-#: ../../include/acl_selectors.php:181
-msgid "Close"
-msgstr "Schließen"
-
-#: ../../Zotlabs/Module/Photos.php:1343
-msgid "View Album"
-msgstr "Album ansehen"
+#: ../../Zotlabs/Module/Settings/Features.php:45
+msgid "Additional Features"
+msgstr "Zusätzliche Funktionen"
-#: ../../Zotlabs/Module/Photos.php:1354 ../../Zotlabs/Module/Photos.php:1367
-#: ../../Zotlabs/Module/Photos.php:1368
-msgid "Recent Photos"
-msgstr "Neueste Fotos"
+#: ../../Zotlabs/Module/Settings/Oauth.php:34
+msgid "Name is required"
+msgstr "Name ist erforderlich"
-#: ../../Zotlabs/Module/Follow.php:34
-msgid "Channel added."
-msgstr "Kanal hinzugefügt."
+#: ../../Zotlabs/Module/Settings/Oauth.php:38
+msgid "Key and Secret are required"
+msgstr "Schlüssel und Geheimnis werden benötigt"
-#: ../../Zotlabs/Module/Viewconnections.php:65
-msgid "No connections."
-msgstr "Keine Verbindungen."
+#: ../../Zotlabs/Module/Settings/Oauth.php:86
+#: ../../Zotlabs/Module/Settings/Oauth.php:112
+#: ../../Zotlabs/Module/Settings/Oauth.php:148
+msgid "Add application"
+msgstr "Anwendung hinzufügen"
-#: ../../Zotlabs/Module/Viewconnections.php:78
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "%ss Profil [%s] besuchen"
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+msgid "Name of application"
+msgstr "Name der Anwendung"
-#: ../../Zotlabs/Module/Viewconnections.php:107
-msgid "View Connections"
-msgstr "Verbindungen anzeigen"
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:116
+#: ../../extend/addon/addon/statusnet/statusnet.php:893
+#: ../../extend/addon/addon/twitter/twitter.php:775
+msgid "Consumer Key"
+msgstr "Consumer Key"
-#: ../../Zotlabs/Module/Viewsrc.php:44
-msgid "Source of Item"
-msgstr "Quelle des Elements"
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Automatisch erzeugt – ändern, falls erwünscht. Maximale Länge 20"
-#: ../../Zotlabs/Module/Chat.php:181
-msgid "Room not found"
-msgstr "Chatraum nicht gefunden"
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+#: ../../Zotlabs/Module/Settings/Oauth.php:117
+#: ../../extend/addon/addon/statusnet/statusnet.php:892
+#: ../../extend/addon/addon/twitter/twitter.php:776
+msgid "Consumer Secret"
+msgstr "Consumer Secret"
-#: ../../Zotlabs/Module/Chat.php:197
-msgid "Leave Room"
-msgstr "Raum verlassen"
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+#: ../../Zotlabs/Module/Settings/Oauth.php:118
+msgid "Redirect"
+msgstr "Umleitung"
-#: ../../Zotlabs/Module/Chat.php:198
-msgid "Delete Room"
-msgstr "Raum löschen"
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "Umleitungs-URl – lasse das leer, solange Deine Anwendung es nicht explizit erfordert"
-#: ../../Zotlabs/Module/Chat.php:199
-msgid "I am away right now"
-msgstr "Ich bin gerade nicht da"
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Settings/Oauth.php:119
+msgid "Icon url"
+msgstr "Symbol-URL"
-#: ../../Zotlabs/Module/Chat.php:200
-msgid "I am online"
-msgstr "Ich bin online"
+#: ../../Zotlabs/Module/Settings/Oauth.php:104
+msgid "Application not found."
+msgstr "Die Anwendung wurde nicht gefunden."
-#: ../../Zotlabs/Module/Chat.php:202
-msgid "Bookmark this room"
-msgstr "Lesezeichen für diesen Raum setzen"
+#: ../../Zotlabs/Module/Settings/Oauth.php:147
+msgid "Connected Apps"
+msgstr "Verbundene Apps"
-#: ../../Zotlabs/Module/Chat.php:231
-msgid "New Chatroom"
-msgstr "Neuer Chatraum"
+#: ../../Zotlabs/Module/Settings/Oauth.php:151
+msgid "Client key starts with"
+msgstr "Client Key beginnt mit"
-#: ../../Zotlabs/Module/Chat.php:232
-msgid "Chatroom name"
-msgstr "Chatraumname"
+#: ../../Zotlabs/Module/Settings/Oauth.php:152
+msgid "No name"
+msgstr "Kein Name"
-#: ../../Zotlabs/Module/Chat.php:233
-msgid "Expiration of chats (minutes)"
-msgstr "Verfall von Chats (Minuten)"
+#: ../../Zotlabs/Module/Settings/Oauth.php:153
+msgid "Remove authorization"
+msgstr "Authorisierung aufheben"
-#: ../../Zotlabs/Module/Chat.php:249
+#: ../../Zotlabs/Module/Settings/Tokens.php:31
#, php-format
-msgid "%1$s's Chatrooms"
-msgstr "%1$ss Chaträume"
-
-#: ../../Zotlabs/Module/Chat.php:254
-msgid "No chatrooms available"
-msgstr "Keine Chaträume verfügbar"
-
-#: ../../Zotlabs/Module/Chat.php:258
-msgid "Expiration"
-msgstr "Verfall"
-
-#: ../../Zotlabs/Module/Chat.php:259
-msgid "min"
-msgstr "min"
-
-#: ../../Zotlabs/Module/Xchan.php:10
-msgid "Xchan Lookup"
-msgstr "Xchan-Suche"
-
-#: ../../Zotlabs/Module/Xchan.php:13
-msgid "Lookup xchan beginning with (or webbie): "
-msgstr "Nach xchans oder Webbies (Kanal-Adressen) suchen, die wie folgt beginnen:"
-
-#: ../../Zotlabs/Module/Admin.php:97
-msgid "# Accounts"
-msgstr "Anzahl der Konten"
-
-#: ../../Zotlabs/Module/Admin.php:98
-msgid "# blocked accounts"
-msgstr "Anzahl der blockierten Konten"
-
-#: ../../Zotlabs/Module/Admin.php:99
-msgid "# expired accounts"
-msgstr "Anzahl der abgelaufenen Konten"
-
-#: ../../Zotlabs/Module/Admin.php:100
-msgid "# expiring accounts"
-msgstr "Anzahl der ablaufenden Konten"
-
-#: ../../Zotlabs/Module/Admin.php:111
-msgid "# Channels"
-msgstr "Anzahl der Kanäle"
-
-#: ../../Zotlabs/Module/Admin.php:112
-msgid "# primary"
-msgstr "Anzahl der primären Kanäle"
-
-#: ../../Zotlabs/Module/Admin.php:113
-msgid "# clones"
-msgstr "Anzahl der Klone"
-
-#: ../../Zotlabs/Module/Admin.php:119
-msgid "Message queues"
-msgstr "Nachrichten-Warteschlangen"
-
-#: ../../Zotlabs/Module/Admin.php:136
-msgid "Your software should be updated"
-msgstr "Die installierte Software sollte aktualisiert werden"
+msgid "This channel is limited to %d tokens"
+msgstr "Dieser Kanal ist auf %d Token begrenzt"
-#: ../../Zotlabs/Module/Admin.php:142
-msgid "Summary"
-msgstr "Zusammenfassung"
+#: ../../Zotlabs/Module/Settings/Tokens.php:37
+msgid "Name and Password are required."
+msgstr "Name und Passwort sind erforderlich."
-#: ../../Zotlabs/Module/Admin.php:145
-msgid "Registered accounts"
-msgstr "Registrierte Konten"
+#: ../../Zotlabs/Module/Settings/Tokens.php:77
+msgid "Token saved."
+msgstr "Token gespeichert."
-#: ../../Zotlabs/Module/Admin.php:146
-msgid "Pending registrations"
-msgstr "Ausstehende Registrierungen"
+#: ../../Zotlabs/Module/Settings/Tokens.php:113
+msgid ""
+"Use this form to create temporary access identifiers to share things with "
+"non-members. These identities may be used in Access Control Lists and "
+"visitors may login using these credentials to access private content."
+msgstr "Mit diesem Formular kannst Du temporäre Zugangs-IDs anlegen, um Inhalte mit Nicht-Mitgliedern zu teilen. Die IDs können in Berechtigungslisten (ACLs) verwendet werden, und Besucher können sich damit einloggen, um auf private Inhalte zuzugreifen."
-#: ../../Zotlabs/Module/Admin.php:147
-msgid "Registered channels"
-msgstr "Registrierte Kanäle"
+#: ../../Zotlabs/Module/Settings/Tokens.php:115
+msgid ""
+"You may also provide <em>dropbox</em> style access links to friends and "
+"associates by adding the Login Password to any specific site URL as shown. "
+"Examples:"
+msgstr "Du kannst auch <em>Dropbox</em>-ähnliche Zugriffslinks an Andere weitergeben, indem du das Login-Passwort an eine entsprechende URL anhängst wie nachfolgend gezeigt. Beispiele:"
-#: ../../Zotlabs/Module/Admin.php:148
-msgid "Active plugins"
-msgstr "Aktive Plug-Ins"
+#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:647
+msgid "Guest Access Tokens"
+msgstr "Gastzugangstoken"
-#: ../../Zotlabs/Module/Admin.php:149
-msgid "Version"
-msgstr "Version"
+#: ../../Zotlabs/Module/Settings/Tokens.php:157
+msgid "Login Name"
+msgstr "Anmeldename"
-#: ../../Zotlabs/Module/Admin.php:150
-msgid "Repository version (master)"
-msgstr "Repository-Version (master)"
+#: ../../Zotlabs/Module/Settings/Tokens.php:158
+msgid "Login Password"
+msgstr "Anmeldepasswort"
-#: ../../Zotlabs/Module/Admin.php:151
-msgid "Repository version (dev)"
-msgstr "Repository-Version (dev)"
+#: ../../Zotlabs/Module/Settings/Tokens.php:159
+msgid "Expires (yyyy-mm-dd)"
+msgstr "Läuft ab (jjjj-mm-tt)"
#: ../../Zotlabs/Module/Settings/Account.php:20
msgid "Not valid email."
@@ -6027,44 +6072,51 @@ msgstr "Kennwort geändert."
msgid "Password update failed. Please try again."
msgstr "Kennwortänderung fehlgeschlagen. Bitte versuche es noch einmal."
-#: ../../Zotlabs/Module/Settings/Account.php:120
+#: ../../Zotlabs/Module/Settings/Account.php:112
msgid "Account Settings"
msgstr "Konto-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Account.php:121
+#: ../../Zotlabs/Module/Settings/Account.php:113
msgid "Current Password"
msgstr "Aktuelles Passwort"
-#: ../../Zotlabs/Module/Settings/Account.php:122
+#: ../../Zotlabs/Module/Settings/Account.php:114
msgid "Enter New Password"
msgstr "Gib ein neues Passwort ein"
-#: ../../Zotlabs/Module/Settings/Account.php:123
+#: ../../Zotlabs/Module/Settings/Account.php:115
msgid "Confirm New Password"
msgstr "Bestätige das neue Passwort"
-#: ../../Zotlabs/Module/Settings/Account.php:123
+#: ../../Zotlabs/Module/Settings/Account.php:115
msgid "Leave password fields blank unless changing"
msgstr "Lasse die Passwort-Felder leer, außer Du möchtest das Passwort ändern"
-#: ../../Zotlabs/Module/Settings/Account.php:124
+#: ../../Zotlabs/Module/Settings/Account.php:116
msgid "Your technical skill level"
msgstr "Deine technische Qualifikationsstufe"
-#: ../../Zotlabs/Module/Settings/Account.php:124
+#: ../../Zotlabs/Module/Settings/Account.php:116
msgid "Used to provide a member experience matched to your comfort level"
msgstr "Dies wird verwendet, um Dir eine Benutzererfahrung passend zu Deiner technischen Qualifikationsstufe zu bieten."
-#: ../../Zotlabs/Module/Settings/Account.php:127
-#: ../../Zotlabs/Module/Settings/Channel.php:459
+#: ../../Zotlabs/Module/Settings/Account.php:119
+#: ../../Zotlabs/Module/Settings/Channel.php:462
msgid "Email Address:"
msgstr "Email Adresse:"
-#: ../../Zotlabs/Module/Settings/Account.php:129
+#: ../../Zotlabs/Module/Settings/Account.php:121
msgid "Remove this account including all its channels"
msgstr "Dieses Konto inklusive all seiner Kanäle löschen"
#: ../../Zotlabs/Module/Settings/Channel.php:246
+#: ../../extend/addon/addon/logrot/logrot.php:54
+#: ../../extend/addon/addon/msgfooter/msgfooter.php:54
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:184
+#: ../../extend/addon/addon/piwik/piwik.php:116
+#: ../../extend/addon/addon/twitter/twitter.php:766
+#: ../../extend/addon/addon/xmpp/xmpp.php:102
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:82
msgid "Settings updated."
msgstr "Einstellungen aktualisiert."
@@ -6112,417 +6164,430 @@ msgstr "Dürfen wir Dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?
msgid "Your channel address is"
msgstr "Deine Kanal-Adresse lautet"
-#: ../../Zotlabs/Module/Settings/Channel.php:450
+#: ../../Zotlabs/Module/Settings/Channel.php:407
+msgid "Your files/photos are accessible via WebDAV at"
+msgstr "Deine Dateien/Fotos sind via WebDAV verfügbar auf"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:453
msgid "Channel Settings"
msgstr "Kanal-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:457
+#: ../../Zotlabs/Module/Settings/Channel.php:460
msgid "Basic Settings"
msgstr "Grundeinstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:458
-#: ../../include/channel.php:1164
+#: ../../Zotlabs/Module/Settings/Channel.php:461
+#: ../../include/channel.php:1172
msgid "Full Name:"
msgstr "Voller Name:"
-#: ../../Zotlabs/Module/Settings/Channel.php:460
+#: ../../Zotlabs/Module/Settings/Channel.php:463
msgid "Your Timezone:"
msgstr "Ihre Zeitzone:"
-#: ../../Zotlabs/Module/Settings/Channel.php:461
+#: ../../Zotlabs/Module/Settings/Channel.php:464
msgid "Default Post Location:"
msgstr "Standardstandort:"
-#: ../../Zotlabs/Module/Settings/Channel.php:461
+#: ../../Zotlabs/Module/Settings/Channel.php:464
msgid "Geographical location to display on your posts"
msgstr "Geografischer Ort, der bei Deinen Beiträgen angezeigt werden soll"
-#: ../../Zotlabs/Module/Settings/Channel.php:462
+#: ../../Zotlabs/Module/Settings/Channel.php:465
msgid "Use Browser Location:"
msgstr "Standort des Browsers verwenden:"
-#: ../../Zotlabs/Module/Settings/Channel.php:464
+#: ../../Zotlabs/Module/Settings/Channel.php:467
msgid "Adult Content"
msgstr "Nicht jugendfreie Inhalte"
-#: ../../Zotlabs/Module/Settings/Channel.php:464
+#: ../../Zotlabs/Module/Settings/Channel.php:467
msgid ""
"This channel frequently or regularly publishes adult content. (Please tag "
"any adult material and/or nudity with #NSFW)"
msgstr "Dieser Kanal veröffentlicht regelmäßig Inhalte, die für Minderjährige ungeeignet sind. (Bitte markiere solche Inhalte mit dem Schlagwort #NSFW)"
-#: ../../Zotlabs/Module/Settings/Channel.php:466
+#: ../../Zotlabs/Module/Settings/Channel.php:469
msgid "Security and Privacy Settings"
msgstr "Sicherheits- und Datenschutz-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:469
+#: ../../Zotlabs/Module/Settings/Channel.php:472
msgid "Your permissions are already configured. Click to view/adjust"
msgstr "Deine Zugriffsrechte sind schon konfiguriert. Klicke hier, um sie zu betrachten oder zu ändern"
-#: ../../Zotlabs/Module/Settings/Channel.php:471
+#: ../../Zotlabs/Module/Settings/Channel.php:474
msgid "Hide my online presence"
msgstr "Meine Online-Präsenz verbergen"
-#: ../../Zotlabs/Module/Settings/Channel.php:471
+#: ../../Zotlabs/Module/Settings/Channel.php:474
msgid "Prevents displaying in your profile that you are online"
msgstr "Verhindert die Anzeige Deines Online-Status in deinem Profil"
-#: ../../Zotlabs/Module/Settings/Channel.php:473
+#: ../../Zotlabs/Module/Settings/Channel.php:476
msgid "Simple Privacy Settings:"
msgstr "Einfache Privatsphäre-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:474
+#: ../../Zotlabs/Module/Settings/Channel.php:477
msgid ""
"Very Public - <em>extremely permissive (should be used with caution)</em>"
msgstr "Komplett offen – <em>extrem ungeschützt (mit großer Vorsicht verwenden!)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:475
+#: ../../Zotlabs/Module/Settings/Channel.php:478
msgid ""
"Typical - <em>default public, privacy when desired (similar to social "
"network permissions but with improved privacy)</em>"
msgstr "Typisch – <em>Standard öffentlich, Privatsphäre, wo sie erwünscht ist (ähnlich den Einstellungen in sozialen Netzwerken, aber mit besser geschützter Privatsphäre)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Channel.php:479
msgid "Private - <em>default private, never open or public</em>"
msgstr "Privat – <em>Standard privat, nie offen oder öffentlich</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:477
+#: ../../Zotlabs/Module/Settings/Channel.php:480
msgid "Blocked - <em>default blocked to/from everybody</em>"
msgstr "Blockiert – <em>Alle standardmäßig blockiert</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:479
+#: ../../Zotlabs/Module/Settings/Channel.php:482
msgid "Allow others to tag your posts"
msgstr "Erlaube anderen, Deine Beiträge zu verschlagworten"
-#: ../../Zotlabs/Module/Settings/Channel.php:479
+#: ../../Zotlabs/Module/Settings/Channel.php:482
msgid ""
"Often used by the community to retro-actively flag inappropriate content"
msgstr "Wird oft von der Community genutzt um rückwirkend anstößigen Inhalt zu markieren"
-#: ../../Zotlabs/Module/Settings/Channel.php:481
+#: ../../Zotlabs/Module/Settings/Channel.php:484
msgid "Channel Permission Limits"
msgstr "Kanal-Berechtigungslimits"
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "Expire other channel content after this many days"
msgstr "Den Inhalt anderer Kanäle nach dieser Anzahl Tage verfallen lassen"
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "0 or blank to use the website limit."
msgstr "0 oder leer lassen, um den voreingestellten Wert der Webseite zu verwenden."
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
#, php-format
msgid "This website expires after %d days."
msgstr "Diese Webseite läuft nach %d Tagen ab."
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "This website does not expire imported content."
msgstr "Diese Webseite lässt importierte Inhalte nicht verfallen."
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "The website limit takes precedence if lower than your limit."
msgstr "Das Verfallslimit der Webseite hat Vorrang, wenn es niedriger als Deines hier ist."
-#: ../../Zotlabs/Module/Settings/Channel.php:484
+#: ../../Zotlabs/Module/Settings/Channel.php:487
msgid "Maximum Friend Requests/Day:"
msgstr "Maximale Kontaktanfragen pro Tag:"
-#: ../../Zotlabs/Module/Settings/Channel.php:484
+#: ../../Zotlabs/Module/Settings/Channel.php:487
msgid "May reduce spam activity"
msgstr "Kann die Spam-Aktivität verringern"
-#: ../../Zotlabs/Module/Settings/Channel.php:485
+#: ../../Zotlabs/Module/Settings/Channel.php:488
msgid "Default Access Control List (ACL)"
msgstr "Standard-Zugriffsberechtigungsliste (ACL)"
-#: ../../Zotlabs/Module/Settings/Channel.php:487
+#: ../../Zotlabs/Module/Settings/Channel.php:490
msgid "Use my default audience setting for the type of object published"
msgstr "Verwende Deine eingestellte Standard-Zielgruppe des jeweiligen Inhaltstyps"
-#: ../../Zotlabs/Module/Settings/Channel.php:494
+#: ../../Zotlabs/Module/Settings/Channel.php:497
msgid "Channel permissions category:"
msgstr "Zugriffsrechte-Kategorie des Kanals:"
-#: ../../Zotlabs/Module/Settings/Channel.php:500
+#: ../../Zotlabs/Module/Settings/Channel.php:503
msgid "Maximum private messages per day from unknown people:"
msgstr "Maximale Anzahl privater Nachrichten pro Tag von unbekannten Leuten:"
-#: ../../Zotlabs/Module/Settings/Channel.php:500
+#: ../../Zotlabs/Module/Settings/Channel.php:503
msgid "Useful to reduce spamming"
msgstr "Nützlich, um Spam zu verringern"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Settings/Channel.php:506
msgid "Notification Settings"
msgstr "Benachrichtigungs-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:504
+#: ../../Zotlabs/Module/Settings/Channel.php:507
msgid "By default post a status message when:"
msgstr "Sende standardmäßig Status-Nachrichten, wenn:"
-#: ../../Zotlabs/Module/Settings/Channel.php:505
+#: ../../Zotlabs/Module/Settings/Channel.php:508
msgid "accepting a friend request"
msgstr "Du eine Verbindungsanfrage annimmst"
-#: ../../Zotlabs/Module/Settings/Channel.php:506
+#: ../../Zotlabs/Module/Settings/Channel.php:509
msgid "joining a forum/community"
msgstr "Du einem Forum beitrittst"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:510
msgid "making an <em>interesting</em> profile change"
msgstr "Du eine <em>interessante</em> Änderung an Deinem Profil vornimmst"
-#: ../../Zotlabs/Module/Settings/Channel.php:508
+#: ../../Zotlabs/Module/Settings/Channel.php:511
msgid "Send a notification email when:"
msgstr "Eine E-Mail-Benachrichtigung senden, wenn:"
-#: ../../Zotlabs/Module/Settings/Channel.php:509
+#: ../../Zotlabs/Module/Settings/Channel.php:512
msgid "You receive a connection request"
msgstr "Du eine Verbindungsanfrage erhältst"
-#: ../../Zotlabs/Module/Settings/Channel.php:510
+#: ../../Zotlabs/Module/Settings/Channel.php:513
msgid "Your connections are confirmed"
msgstr "Eine Verbindung bestätigt wurde"
-#: ../../Zotlabs/Module/Settings/Channel.php:511
+#: ../../Zotlabs/Module/Settings/Channel.php:514
msgid "Someone writes on your profile wall"
msgstr "Jemand auf Deine Pinnwand schreibt"
-#: ../../Zotlabs/Module/Settings/Channel.php:512
+#: ../../Zotlabs/Module/Settings/Channel.php:515
msgid "Someone writes a followup comment"
msgstr "Jemand einen Beitrag kommentiert"
-#: ../../Zotlabs/Module/Settings/Channel.php:513
+#: ../../Zotlabs/Module/Settings/Channel.php:516
msgid "You receive a private message"
msgstr "Du eine private Nachricht erhältst"
-#: ../../Zotlabs/Module/Settings/Channel.php:514
+#: ../../Zotlabs/Module/Settings/Channel.php:517
msgid "You receive a friend suggestion"
msgstr "Du einen Kontaktvorschlag erhältst"
-#: ../../Zotlabs/Module/Settings/Channel.php:515
+#: ../../Zotlabs/Module/Settings/Channel.php:518
msgid "You are tagged in a post"
msgstr "Du in einem Beitrag erwähnt wurdest"
-#: ../../Zotlabs/Module/Settings/Channel.php:516
+#: ../../Zotlabs/Module/Settings/Channel.php:519
msgid "You are poked/prodded/etc. in a post"
msgstr "Du in einem Beitrag angestupst/geknufft/o.ä. wurdest"
-#: ../../Zotlabs/Module/Settings/Channel.php:519
+#: ../../Zotlabs/Module/Settings/Channel.php:522
msgid "Show visual notifications including:"
msgstr "Visuelle Benachrichtigungen anzeigen für:"
-#: ../../Zotlabs/Module/Settings/Channel.php:521
+#: ../../Zotlabs/Module/Settings/Channel.php:524
msgid "Unseen grid activity"
msgstr "Ungesehene Netzwerk-Aktivität"
-#: ../../Zotlabs/Module/Settings/Channel.php:522
+#: ../../Zotlabs/Module/Settings/Channel.php:525
msgid "Unseen channel activity"
msgstr "Ungesehene Kanal-Aktivität"
-#: ../../Zotlabs/Module/Settings/Channel.php:523
+#: ../../Zotlabs/Module/Settings/Channel.php:526
msgid "Unseen private messages"
msgstr "Ungelesene persönliche Nachrichten"
-#: ../../Zotlabs/Module/Settings/Channel.php:523
-#: ../../Zotlabs/Module/Settings/Channel.php:528
-#: ../../Zotlabs/Module/Settings/Channel.php:529
-#: ../../Zotlabs/Module/Settings/Channel.php:530
+#: ../../Zotlabs/Module/Settings/Channel.php:526
+#: ../../Zotlabs/Module/Settings/Channel.php:531
+#: ../../Zotlabs/Module/Settings/Channel.php:532
+#: ../../Zotlabs/Module/Settings/Channel.php:533
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
msgid "Recommended"
msgstr "Empfohlen"
-#: ../../Zotlabs/Module/Settings/Channel.php:524
+#: ../../Zotlabs/Module/Settings/Channel.php:527
msgid "Upcoming events"
msgstr "Baldige Termine"
-#: ../../Zotlabs/Module/Settings/Channel.php:525
+#: ../../Zotlabs/Module/Settings/Channel.php:528
msgid "Events today"
msgstr "Heutige Termine"
-#: ../../Zotlabs/Module/Settings/Channel.php:526
+#: ../../Zotlabs/Module/Settings/Channel.php:529
msgid "Upcoming birthdays"
msgstr "Baldige Geburtstage"
-#: ../../Zotlabs/Module/Settings/Channel.php:526
+#: ../../Zotlabs/Module/Settings/Channel.php:529
msgid "Not available in all themes"
msgstr "Nicht in allen Themes verfügbar"
-#: ../../Zotlabs/Module/Settings/Channel.php:527
+#: ../../Zotlabs/Module/Settings/Channel.php:530
msgid "System (personal) notifications"
msgstr "System – (persönliche) Benachrichtigungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:528
+#: ../../Zotlabs/Module/Settings/Channel.php:531
msgid "System info messages"
msgstr "System – Info-Nachrichten"
-#: ../../Zotlabs/Module/Settings/Channel.php:529
+#: ../../Zotlabs/Module/Settings/Channel.php:532
msgid "System critical alerts"
msgstr "System – kritische Warnungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:530
+#: ../../Zotlabs/Module/Settings/Channel.php:533
msgid "New connections"
msgstr "Neue Verbindungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:531
+#: ../../Zotlabs/Module/Settings/Channel.php:534
msgid "System Registrations"
msgstr "System – Registrierungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:532
+#: ../../Zotlabs/Module/Settings/Channel.php:535
msgid ""
"Also show new wall posts, private messages and connections under Notices"
msgstr "Neue Pinnwand-Nachrichten, private Nachrichten und Verbindungen unter Benachrichtigungen anzeigen"
-#: ../../Zotlabs/Module/Settings/Channel.php:534
+#: ../../Zotlabs/Module/Settings/Channel.php:537
msgid "Notify me of events this many days in advance"
msgstr "Benachrichtige mich zu Terminen so viele Tage im Voraus"
-#: ../../Zotlabs/Module/Settings/Channel.php:534
+#: ../../Zotlabs/Module/Settings/Channel.php:537
msgid "Must be greater than 0"
msgstr "Muss größer als 0 sein"
-#: ../../Zotlabs/Module/Settings/Channel.php:536
+#: ../../Zotlabs/Module/Settings/Channel.php:539
msgid "Advanced Account/Page Type Settings"
msgstr "Erweiterte Account- und Seitenart-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:537
+#: ../../Zotlabs/Module/Settings/Channel.php:540
msgid "Change the behaviour of this account for special situations"
msgstr "Ändere das Verhalten dieses Accounts unter speziellen Umständen"
-#: ../../Zotlabs/Module/Settings/Channel.php:539
+#: ../../Zotlabs/Module/Settings/Channel.php:542
msgid "Miscellaneous Settings"
msgstr "Sonstige Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:540
+#: ../../Zotlabs/Module/Settings/Channel.php:543
msgid "Default photo upload folder"
msgstr "Voreingestellter Ordner für hochgeladene Fotos"
-#: ../../Zotlabs/Module/Settings/Channel.php:540
-#: ../../Zotlabs/Module/Settings/Channel.php:541
+#: ../../Zotlabs/Module/Settings/Channel.php:543
+#: ../../Zotlabs/Module/Settings/Channel.php:544
msgid "%Y - current year, %m - current month"
msgstr "%Y - aktuelles Jahr, %m - aktueller Monat"
-#: ../../Zotlabs/Module/Settings/Channel.php:541
+#: ../../Zotlabs/Module/Settings/Channel.php:544
msgid "Default file upload folder"
msgstr "Voreingestellter Ordner für hochgeladene Dateien"
-#: ../../Zotlabs/Module/Settings/Channel.php:543
+#: ../../Zotlabs/Module/Settings/Channel.php:546
msgid "Personal menu to display in your channel pages"
msgstr "Eigenes Menü zur Anzeige auf den Seiten deines Kanals"
-#: ../../Zotlabs/Module/Settings/Channel.php:545
+#: ../../Zotlabs/Module/Settings/Channel.php:548
msgid "Remove this channel."
msgstr "Diesen Kanal löschen"
-#: ../../Zotlabs/Module/Settings/Channel.php:546
+#: ../../Zotlabs/Module/Settings/Channel.php:549
msgid "Firefox Share $Projectname provider"
msgstr "$Projectname-Provider für Firefox Share"
-#: ../../Zotlabs/Module/Settings/Channel.php:547
+#: ../../Zotlabs/Module/Settings/Channel.php:550
msgid "Start calendar week on monday"
msgstr "Montag als erster Tag der Kalenderwoche"
-#: ../../Zotlabs/Module/Settings/Display.php:135
+#: ../../Zotlabs/Module/Settings/Display.php:137
msgid "No special theme for mobile devices"
msgstr "Keine spezielle Theme für mobile Geräte"
-#: ../../Zotlabs/Module/Settings/Display.php:138
+#: ../../Zotlabs/Module/Settings/Display.php:140
#, php-format
msgid "%s - (Experimental)"
msgstr "%s – (experimentell)"
-#: ../../Zotlabs/Module/Settings/Display.php:189
+#: ../../Zotlabs/Module/Settings/Display.php:191
msgid "Display Settings"
msgstr "Anzeige-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Display.php:190
+#: ../../Zotlabs/Module/Settings/Display.php:192
msgid "Theme Settings"
msgstr "Theme-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Display.php:191
+#: ../../Zotlabs/Module/Settings/Display.php:193
msgid "Custom Theme Settings"
msgstr "Benutzerdefinierte Theme-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Display.php:192
+#: ../../Zotlabs/Module/Settings/Display.php:194
msgid "Content Settings"
msgstr "Inhaltseinstellungen"
-#: ../../Zotlabs/Module/Settings/Display.php:198
+#: ../../Zotlabs/Module/Settings/Display.php:200
msgid "Display Theme:"
msgstr "Anzeige-Theme:"
-#: ../../Zotlabs/Module/Settings/Display.php:199
+#: ../../Zotlabs/Module/Settings/Display.php:201
msgid "Select scheme"
msgstr "Schema wählen"
-#: ../../Zotlabs/Module/Settings/Display.php:201
+#: ../../Zotlabs/Module/Settings/Display.php:203
msgid "Mobile Theme:"
msgstr "Mobile Theme:"
-#: ../../Zotlabs/Module/Settings/Display.php:202
+#: ../../Zotlabs/Module/Settings/Display.php:204
msgid "Preload images before rendering the page"
msgstr "Bilder im voraus laden, bevor die Seite angezeigt wird"
-#: ../../Zotlabs/Module/Settings/Display.php:202
+#: ../../Zotlabs/Module/Settings/Display.php:204
msgid ""
"The subjective page load time will be longer but the page will be ready when"
" displayed"
msgstr "Die empfundene Ladezeit wird sich erhöhen, aber dafür ist das Layout stabil, sobald eine Seite angezeigt wird"
-#: ../../Zotlabs/Module/Settings/Display.php:203
+#: ../../Zotlabs/Module/Settings/Display.php:205
msgid "Enable user zoom on mobile devices"
msgstr "Zoom auf Mobilgeräten aktivieren"
-#: ../../Zotlabs/Module/Settings/Display.php:204
+#: ../../Zotlabs/Module/Settings/Display.php:206
msgid "Update browser every xx seconds"
msgstr "Browser alle xx Sekunden aktualisieren"
-#: ../../Zotlabs/Module/Settings/Display.php:204
+#: ../../Zotlabs/Module/Settings/Display.php:206
msgid "Minimum of 10 seconds, no maximum"
msgstr "Minimum 10 Sekunden, kein Maximum"
-#: ../../Zotlabs/Module/Settings/Display.php:205
+#: ../../Zotlabs/Module/Settings/Display.php:207
msgid "Maximum number of conversations to load at any time:"
msgstr "Maximale Anzahl von Unterhaltungen, die auf einmal geladen werden sollen:"
-#: ../../Zotlabs/Module/Settings/Display.php:205
+#: ../../Zotlabs/Module/Settings/Display.php:207
msgid "Maximum of 100 items"
msgstr "Maximum: 100 Beiträge"
-#: ../../Zotlabs/Module/Settings/Display.php:206
+#: ../../Zotlabs/Module/Settings/Display.php:208
msgid "Show emoticons (smilies) as images"
msgstr "Emoticons (Smilies) als Bilder anzeigen"
-#: ../../Zotlabs/Module/Settings/Display.php:207
+#: ../../Zotlabs/Module/Settings/Display.php:209
+msgid "Manual conversation updates"
+msgstr "Manuelle Konversationsaktualisierung"
+
+#: ../../Zotlabs/Module/Settings/Display.php:209
+msgid "Default is automatic, which may increase screen jumping"
+msgstr "Voreinstellung ist Automatisch, was aber das Springen der Seitenanzeige erhöhen kann."
+
+#: ../../Zotlabs/Module/Settings/Display.php:210
msgid "Link post titles to source"
msgstr "Beitragstitel zum Originalbeitrag verlinken"
-#: ../../Zotlabs/Module/Settings/Display.php:208
+#: ../../Zotlabs/Module/Settings/Display.php:211
msgid "System Page Layout Editor - (advanced)"
msgstr "System-Seitenlayout-Editor (für Experten)"
-#: ../../Zotlabs/Module/Settings/Display.php:211
+#: ../../Zotlabs/Module/Settings/Display.php:214
msgid "Use blog/list mode on channel page"
msgstr "Blog-/Listenmodus auf der Kanalseite verwenden"
-#: ../../Zotlabs/Module/Settings/Display.php:211
-#: ../../Zotlabs/Module/Settings/Display.php:212
+#: ../../Zotlabs/Module/Settings/Display.php:214
+#: ../../Zotlabs/Module/Settings/Display.php:215
msgid "(comments displayed separately)"
msgstr "(Kommentare werden separat angezeigt)"
-#: ../../Zotlabs/Module/Settings/Display.php:212
+#: ../../Zotlabs/Module/Settings/Display.php:215
msgid "Use blog/list mode on grid page"
msgstr "Blog-/Listenmodus auf der Netzwerkseite verwenden"
-#: ../../Zotlabs/Module/Settings/Display.php:213
+#: ../../Zotlabs/Module/Settings/Display.php:216
msgid "Channel page max height of content (in pixels)"
msgstr "Maximale Höhe von Beitragsblöcken auf der Kanalseite (in Pixeln)"
-#: ../../Zotlabs/Module/Settings/Display.php:213
-#: ../../Zotlabs/Module/Settings/Display.php:214
+#: ../../Zotlabs/Module/Settings/Display.php:216
+#: ../../Zotlabs/Module/Settings/Display.php:217
msgid "click to expand content exceeding this height"
msgstr "Blöcke, deren Inhalt diese Höhe überschreitet, können per Klick vergrößert werden."
-#: ../../Zotlabs/Module/Settings/Display.php:214
+#: ../../Zotlabs/Module/Settings/Display.php:217
msgid "Grid page max height of content (in pixels)"
msgstr "Maximale Höhe (in Pixel) des Inhalts der Netzwerkseite"
@@ -6534,417 +6599,382 @@ msgstr "Keine Funktions-Einstellungen konfiguriert"
msgid "Feature/Addon Settings"
msgstr "Funktions-/Addon-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Features.php:45
-msgid "Additional Features"
-msgstr "Zusätzliche Funktionen"
+#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
+msgid "Tag removed"
+msgstr "Schlagwort entfernt"
-#: ../../Zotlabs/Module/Settings/Oauth.php:34
-msgid "Name is required"
-msgstr "Name ist erforderlich"
+#: ../../Zotlabs/Module/Tagrm.php:123
+msgid "Remove Item Tag"
+msgstr "Schlagwort entfernen"
-#: ../../Zotlabs/Module/Settings/Oauth.php:38
-msgid "Key and Secret are required"
-msgstr "Schlüssel und Geheimnis werden benötigt"
+#: ../../Zotlabs/Module/Tagrm.php:125
+msgid "Select a tag to remove: "
+msgstr "Schlagwort zum Entfernen auswählen:"
-#: ../../Zotlabs/Module/Settings/Oauth.php:86
-#: ../../Zotlabs/Module/Settings/Oauth.php:112
-#: ../../Zotlabs/Module/Settings/Oauth.php:148
-msgid "Add application"
-msgstr "Anwendung hinzufügen"
+#: ../../Zotlabs/Module/Thing.php:114
+msgid "Thing updated"
+msgstr "Sache aktualisiert"
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-msgid "Name of application"
-msgstr "Name der Anwendung"
+#: ../../Zotlabs/Module/Thing.php:166
+msgid "Object store: failed"
+msgstr "Speichern des Objekts fehlgeschlagen"
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:116
-msgid "Consumer Key"
-msgstr "Consumer Key"
+#: ../../Zotlabs/Module/Thing.php:170
+msgid "Thing added"
+msgstr "Sache hinzugefügt"
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-msgid "Automatically generated - change if desired. Max length 20"
-msgstr "Automatisch erzeugt – ändern, falls erwünscht. Maximale Länge 20"
+#: ../../Zotlabs/Module/Thing.php:196
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-#: ../../Zotlabs/Module/Settings/Oauth.php:117
-msgid "Consumer Secret"
-msgstr "Consumer Secret"
+#: ../../Zotlabs/Module/Thing.php:259
+msgid "Show Thing"
+msgstr "Sache anzeigen"
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-#: ../../Zotlabs/Module/Settings/Oauth.php:118
-msgid "Redirect"
-msgstr "Umleitung"
+#: ../../Zotlabs/Module/Thing.php:266
+msgid "item not found."
+msgstr "Eintrag nicht gefunden"
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-msgid ""
-"Redirect URI - leave blank unless your application specifically requires "
-"this"
-msgstr "Umleitungs-URl – lasse das leer, solange Deine Anwendung es nicht explizit erfordert"
+#: ../../Zotlabs/Module/Thing.php:299
+msgid "Edit Thing"
+msgstr "Sache bearbeiten"
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-#: ../../Zotlabs/Module/Settings/Oauth.php:119
-msgid "Icon url"
-msgstr "Symbol-URL"
+#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
+msgid "Select a profile"
+msgstr "Wähle ein Profil"
-#: ../../Zotlabs/Module/Settings/Oauth.php:104
-msgid "Application not found."
-msgstr "Die Anwendung wurde nicht gefunden."
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Post an activity"
+msgstr "Aktivitätsnachricht senden"
-#: ../../Zotlabs/Module/Settings/Oauth.php:147
-msgid "Connected Apps"
-msgstr "Verbundene Apps"
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Nur an Betrachter des ausgewählten Profils senden"
-#: ../../Zotlabs/Module/Settings/Oauth.php:151
-msgid "Client key starts with"
-msgstr "Client Key beginnt mit"
+#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
+msgid "Name of thing e.g. something"
+msgstr "Name der Sache, z. B. irgendwas"
-#: ../../Zotlabs/Module/Settings/Oauth.php:152
-msgid "No name"
-msgstr "Kein Name"
+#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
+msgid "URL of thing (optional)"
+msgstr "URL der Sache (optional)"
-#: ../../Zotlabs/Module/Settings/Oauth.php:153
-msgid "Remove authorization"
-msgstr "Authorisierung aufheben"
+#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
+msgid "URL for photo of thing (optional)"
+msgstr "URL eines Fotos der Sache (optional)"
-#: ../../Zotlabs/Module/Settings/Tokens.php:31
-#, php-format
-msgid "This channel is limited to %d tokens"
-msgstr "Dieser Kanal ist auf %d Token begrenzt"
+#: ../../Zotlabs/Module/Thing.php:353
+msgid "Add Thing to your Profile"
+msgstr "Die Sache Deinem Profil hinzufügen"
-#: ../../Zotlabs/Module/Settings/Tokens.php:37
-msgid "Name and Password are required."
-msgstr "Name und Passwort sind erforderlich."
+#: ../../Zotlabs/Module/Import.php:33
+#, php-format
+msgid "Your service plan only allows %d channels."
+msgstr "Dein Vertrag erlaubt nur %d Kanäle."
-#: ../../Zotlabs/Module/Settings/Tokens.php:77
-msgid "Token saved."
-msgstr "Token gespeichert."
+#: ../../Zotlabs/Module/Import.php:157 ../../include/import.php:100
+msgid "Cloned channel not found. Import failed."
+msgstr "Geklonter Kanal nicht gefunden. Import fehlgeschlagen."
-#: ../../Zotlabs/Module/Settings/Tokens.php:113
-msgid ""
-"Use this form to create temporary access identifiers to share things with "
-"non-members. These identities may be used in Access Control Lists and "
-"visitors may login using these credentials to access private content."
-msgstr "Mit diesem Formular kannst Du temporäre Zugangs-IDs anlegen, um Inhalte mit Nicht-Mitgliedern zu teilen. Die IDs können in Berechtigungslisten (ACLs) verwendet werden, und Besucher können sich damit einloggen, um auf private Inhalte zuzugreifen."
+#: ../../Zotlabs/Module/Import.php:167
+msgid "No channel. Import failed."
+msgstr "Kein Kanal. Import fehlgeschlagen."
-#: ../../Zotlabs/Module/Settings/Tokens.php:115
-msgid ""
-"You may also provide <em>dropbox</em> style access links to friends and "
-"associates by adding the Login Password to any specific site URL as shown. "
-"Examples:"
-msgstr "Du kannst auch <em>Dropbox</em>-ähnliche Zugriffslinks an Andere weitergeben, indem du das Login-Passwort an eine entsprechende URL anhängst wie nachfolgend gezeigt. Beispiele:"
+#: ../../Zotlabs/Module/Import.php:503
+#: ../../include/Import/import_diaspora.php:142
+msgid "Import completed."
+msgstr "Import abgeschlossen."
-#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:647
-msgid "Guest Access Tokens"
-msgstr "Gastzugangstoken"
+#: ../../Zotlabs/Module/Import.php:525
+msgid "You must be logged in to use this feature."
+msgstr "Du musst angemeldet sein um diese Funktion zu nutzen."
-#: ../../Zotlabs/Module/Settings/Tokens.php:157
-msgid "Login Name"
-msgstr "Anmeldename"
+#: ../../Zotlabs/Module/Import.php:530
+msgid "Import Channel"
+msgstr "Kanal importieren"
-#: ../../Zotlabs/Module/Settings/Tokens.php:158
-msgid "Login Password"
-msgstr "Anmeldepasswort"
+#: ../../Zotlabs/Module/Import.php:531
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You"
+" may retrieve the channel identity from the old server/hub via the network "
+"or provide an export file."
+msgstr "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren."
-#: ../../Zotlabs/Module/Settings/Tokens.php:159
-msgid "Expires (yyyy-mm-dd)"
-msgstr "Läuft ab (jjjj-mm-tt)"
+#: ../../Zotlabs/Module/Import.php:533
+msgid "Or provide the old server/hub details"
+msgstr "Oder gib die Details Deines bisherigen $Projectname-Hubs ein"
-#: ../../Zotlabs/Lib/Chatroom.php:27
-msgid "Missing room name"
-msgstr "Der Chatraum hat keinen Namen"
+#: ../../Zotlabs/Module/Import.php:534
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Bisherige Kanal-Adresse (xyz@example.com)"
-#: ../../Zotlabs/Lib/Chatroom.php:36
-msgid "Duplicate room name"
-msgstr "Name des Chatraums bereits vergeben"
+#: ../../Zotlabs/Module/Import.php:535
+msgid "Your old login email address"
+msgstr "Deine alte Login-E-Mail-Adresse"
-#: ../../Zotlabs/Lib/Chatroom.php:86 ../../Zotlabs/Lib/Chatroom.php:94
-msgid "Invalid room specifier."
-msgstr "Ungültiger Raumbezeichner."
+#: ../../Zotlabs/Module/Import.php:536
+msgid "Your old login password"
+msgstr "Dein altes Passwort"
-#: ../../Zotlabs/Lib/Chatroom.php:126
-msgid "Room not found."
-msgstr "Chatraum konnte nicht gefunden werden."
+#: ../../Zotlabs/Module/Import.php:537
+msgid ""
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be"
+" able to post from either location, but only one can be marked as the "
+"primary location for files, photos, and media."
+msgstr "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige $Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein."
-#: ../../Zotlabs/Lib/Chatroom.php:147
-msgid "Room is full"
-msgstr "Der Chatraum ist voll"
+#: ../../Zotlabs/Module/Import.php:538
+msgid "Make this hub my primary location"
+msgstr "Dieser $Pojectname-Hub ist mein primärer Hub."
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1887
-msgid "$Projectname Notification"
-msgstr "$Projectname-Benachrichtigung"
+#: ../../Zotlabs/Module/Import.php:539
+msgid ""
+"Import existing posts if possible (experimental - limited by available "
+"memory"
+msgstr "Importiere bestehende Beiträge falls möglich (experimentell - begrenzt durch zur Verfügung stehenden Speicher"
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../include/network.php:1888
-msgid "$projectname"
-msgstr "$projectname"
+#: ../../Zotlabs/Module/Import.php:540
+msgid ""
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
+msgstr "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur einmal ab und lasse diese Seite bis zur Fertigstellung offen."
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1890
-msgid "Thank You,"
-msgstr "Danke."
+#: ../../Zotlabs/Module/Viewconnections.php:65
+msgid "No connections."
+msgstr "Keine Verbindungen."
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1892
+#: ../../Zotlabs/Module/Viewconnections.php:78
#, php-format
-msgid "%s Administrator"
-msgstr "der Administrator von %s"
+msgid "Visit %s's profile [%s]"
+msgstr "%ss Profil [%s] besuchen"
-#: ../../Zotlabs/Lib/Enotify.php:100
-#, php-format
-msgid "%s <!item_type!>"
-msgstr "%s <!item_type!>"
+#: ../../Zotlabs/Module/Viewconnections.php:107
+msgid "View Connections"
+msgstr "Verbindungen anzeigen"
-#: ../../Zotlabs/Lib/Enotify.php:104
-#, php-format
-msgid "[Hubzilla:Notify] New mail received at %s"
-msgstr "[Hubzilla:Benachrichtigung] Neue Mail empfangen auf %s"
+#: ../../Zotlabs/Module/Viewsrc.php:44
+msgid "Source of Item"
+msgstr "Quelle des Elements"
-#: ../../Zotlabs/Lib/Enotify.php:106
-#, php-format
-msgid "%1$s, %2$s sent you a new private message at %3$s."
-msgstr "%1$s, %2$s hat Dir eine private Nachricht auf %3$s gesendet."
+#: ../../Zotlabs/Module/Chat.php:181
+msgid "Room not found"
+msgstr "Chatraum nicht gefunden"
-#: ../../Zotlabs/Lib/Enotify.php:107
-#, php-format
-msgid "%1$s sent you %2$s."
-msgstr "%1$s hat Dir %2$s geschickt."
+#: ../../Zotlabs/Module/Chat.php:197
+msgid "Leave Room"
+msgstr "Raum verlassen"
-#: ../../Zotlabs/Lib/Enotify.php:107
-msgid "a private message"
-msgstr "eine private Nachricht"
+#: ../../Zotlabs/Module/Chat.php:198
+msgid "Delete Room"
+msgstr "Raum löschen"
-#: ../../Zotlabs/Lib/Enotify.php:108
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr "Bitte besuche %s, um die private Nachricht anzusehen und/oder darauf zu antworten."
+#: ../../Zotlabs/Module/Chat.php:199
+msgid "I am away right now"
+msgstr "Ich bin gerade nicht da"
-#: ../../Zotlabs/Lib/Enotify.php:164
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
-msgstr "%1$s, %2$s hat [zrl=%3$s]einen %4$s[/zrl] kommentiert"
+#: ../../Zotlabs/Module/Chat.php:200
+msgid "I am online"
+msgstr "Ich bin online"
-#: ../../Zotlabs/Lib/Enotify.php:172
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
-msgstr "%1$s, %2$s hat [zrl=%3$s]%4$ss %5$s[/zrl] kommentiert"
+#: ../../Zotlabs/Module/Chat.php:202
+msgid "Bookmark this room"
+msgstr "Lesezeichen für diesen Raum setzen"
-#: ../../Zotlabs/Lib/Enotify.php:181
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
-msgstr "%1$s, %2$s hat [zrl=%3$s]Deinen %4$s[/zrl] kommentiert"
+#: ../../Zotlabs/Module/Chat.php:231
+msgid "New Chatroom"
+msgstr "Neuer Chatraum"
-#: ../../Zotlabs/Lib/Enotify.php:192
-#, php-format
-msgid "[Hubzilla:Notify] Comment to conversation #%1$d by %2$s"
-msgstr "[Hubzilla:Benachrichtigung] Kommentar in Unterhaltung #%1$d von %2$s"
+#: ../../Zotlabs/Module/Chat.php:232
+msgid "Chatroom name"
+msgstr "Chatraumname"
-#: ../../Zotlabs/Lib/Enotify.php:193
-#, php-format
-msgid "%1$s, %2$s commented on an item/conversation you have been following."
-msgstr "%1$s, %2$s hat eine Unterhaltung kommentiert, der Du folgst."
+#: ../../Zotlabs/Module/Chat.php:233
+msgid "Expiration of chats (minutes)"
+msgstr "Verfall von Chats (Minuten)"
-#: ../../Zotlabs/Lib/Enotify.php:196 ../../Zotlabs/Lib/Enotify.php:211
-#: ../../Zotlabs/Lib/Enotify.php:237 ../../Zotlabs/Lib/Enotify.php:255
-#: ../../Zotlabs/Lib/Enotify.php:269
+#: ../../Zotlabs/Module/Chat.php:249
#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren."
+msgid "%1$s's Chatrooms"
+msgstr "%1$ss Chaträume"
-#: ../../Zotlabs/Lib/Enotify.php:202
-#, php-format
-msgid "[Hubzilla:Notify] %s posted to your profile wall"
-msgstr "[Hubzilla:Benachrichtigung] %s schrieb auf Deine Pinnwand"
+#: ../../Zotlabs/Module/Chat.php:254
+msgid "No chatrooms available"
+msgstr "Keine Chaträume verfügbar"
-#: ../../Zotlabs/Lib/Enotify.php:204
-#, php-format
-msgid "%1$s, %2$s posted to your profile wall at %3$s"
-msgstr "%1$s, %2$s hat auf Deine Pinnwand auf %3$s geschrieben"
+#: ../../Zotlabs/Module/Chat.php:258
+msgid "Expiration"
+msgstr "Verfall"
-#: ../../Zotlabs/Lib/Enotify.php:206
-#, php-format
-msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
-msgstr "%1$s, %2$s hat auf [zrl=%3$s]Deine Pinnwand[/zrl] geschrieben"
+#: ../../Zotlabs/Module/Chat.php:259
+msgid "min"
+msgstr "min"
-#: ../../Zotlabs/Lib/Enotify.php:230
-#, php-format
-msgid "[Hubzilla:Notify] %s tagged you"
-msgstr "[Hubzilla:Benachrichtigung] %s hat Dich erwähnt"
+#: ../../Zotlabs/Module/Xchan.php:10
+msgid "Xchan Lookup"
+msgstr "Xchan-Suche"
-#: ../../Zotlabs/Lib/Enotify.php:231
-#, php-format
-msgid "%1$s, %2$s tagged you at %3$s"
-msgstr "%1$s, %2$s hat Dich auf %3$s erwähnt"
+#: ../../Zotlabs/Module/Xchan.php:13
+msgid "Lookup xchan beginning with (or webbie): "
+msgstr "Nach xchans oder Webbies (Kanal-Adressen) suchen, die wie folgt beginnen:"
-#: ../../Zotlabs/Lib/Enotify.php:232
-#, php-format
-msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
-msgstr "%1$s, %2$s [zrl=%3$s]hat Dich erwähnt[/zrl]."
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
+msgstr "Kalendereinträge wurden importiert."
-#: ../../Zotlabs/Lib/Enotify.php:244
-#, php-format
-msgid "[Hubzilla:Notify] %1$s poked you"
-msgstr "[Hubzilla:Benachrichtigung] %1$s hat Dich angestupst"
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
+msgstr "Keine Kalendereinträge gefunden."
-#: ../../Zotlabs/Lib/Enotify.php:245
-#, php-format
-msgid "%1$s, %2$s poked you at %3$s"
-msgstr "%1$s, %2$s hat Dich auf %3$s angestupst"
+#: ../../Zotlabs/Module/Events.php:106
+msgid "Event can not end before it has started."
+msgstr "Termin-Ende liegt vor dem Beginn."
-#: ../../Zotlabs/Lib/Enotify.php:246
-#, php-format
-msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
-msgstr "%1$s, %2$s [zrl=%2$s]hat Dich angestupst[/zrl]."
+#: ../../Zotlabs/Module/Events.php:108 ../../Zotlabs/Module/Events.php:117
+#: ../../Zotlabs/Module/Events.php:139
+msgid "Unable to generate preview."
+msgstr "Vorschau konnte nicht erzeugt werden."
-#: ../../Zotlabs/Lib/Enotify.php:262
-#, php-format
-msgid "[Hubzilla:Notify] %s tagged your post"
-msgstr "[Hubzilla:Benachrichtigung] %s hat Deinen Beitrag verschlagwortet"
+#: ../../Zotlabs/Module/Events.php:115
+msgid "Event title and start time are required."
+msgstr "Titel und Startzeit des Termins sind erforderlich."
-#: ../../Zotlabs/Lib/Enotify.php:263
-#, php-format
-msgid "%1$s, %2$s tagged your post at %3$s"
-msgstr "%1$s, %2$s hat Deinen Beitrag auf %3$s verschlagwortet"
+#: ../../Zotlabs/Module/Events.php:137 ../../Zotlabs/Module/Events.php:261
+msgid "Event not found."
+msgstr "Termin nicht gefunden."
-#: ../../Zotlabs/Lib/Enotify.php:264
-#, php-format
-msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
-msgstr "%1$s, %2$s hat [zrl=%3$s]Deinen Beitrag[/zrl] verschlagwortet"
+#: ../../Zotlabs/Module/Events.php:453
+msgid "Edit event title"
+msgstr "Termintitel bearbeiten"
-#: ../../Zotlabs/Lib/Enotify.php:276
-msgid "[Hubzilla:Notify] Introduction received"
-msgstr "[Hubzilla:Benachrichtigung] Vorstellung erhalten"
+#: ../../Zotlabs/Module/Events.php:453
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835
+msgid "Event title"
+msgstr "Termintitel"
-#: ../../Zotlabs/Lib/Enotify.php:277
-#, php-format
-msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
-msgstr "%1$s, Du hast eine neue Verbindungsanfrage von '%2$s' auf %3$s erhalten"
+#: ../../Zotlabs/Module/Events.php:455
+msgid "Categories (comma-separated list)"
+msgstr "Kategorien (Kommagetrennte Liste)"
-#: ../../Zotlabs/Lib/Enotify.php:278
-#, php-format
-msgid ""
-"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
-msgstr "%1$s, Du hast [zrl=%2$s]eine neue Verbindungsanfrage[/zrl] von %3$s erhalten."
+#: ../../Zotlabs/Module/Events.php:456
+msgid "Edit Category"
+msgstr "Kategorie bearbeiten"
-#: ../../Zotlabs/Lib/Enotify.php:282 ../../Zotlabs/Lib/Enotify.php:301
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Du kannst Dir das Profil unter %s ansehen"
+#: ../../Zotlabs/Module/Events.php:456
+msgid "Category"
+msgstr "Kategorie"
-#: ../../Zotlabs/Lib/Enotify.php:284
-#, php-format
-msgid "Please visit %s to approve or reject the connection request."
-msgstr "Bitte besuche %s , um die Verbindungsanfrage anzunehmen oder abzulehnen."
+#: ../../Zotlabs/Module/Events.php:459
+msgid "Edit start date and time"
+msgstr "Startdatum und -zeit bearbeiten"
-#: ../../Zotlabs/Lib/Enotify.php:291
-msgid "[Hubzilla:Notify] Friend suggestion received"
-msgstr "[Hubzilla:Benachrichtigung] Freundschaftsvorschlag erhalten"
+#: ../../Zotlabs/Module/Events.php:459
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
+msgid "Start date and time"
+msgstr "Startdatum und -zeit"
-#: ../../Zotlabs/Lib/Enotify.php:292
-#, php-format
-msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
-msgstr "%1$s, Du hast einen Kontaktvorschlag von „%2$s“ auf %3$s erhalten"
+#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:463
+msgid "Finish date and time are not known or not relevant"
+msgstr "Enddatum und -zeit sind unbekannt oder irrelevant"
-#: ../../Zotlabs/Lib/Enotify.php:293
-#, php-format
-msgid ""
-"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
-"%4$s."
-msgstr "%1$s, Du hast [zrl=%2$s]einen Kontaktvorschlag[/zrl] für %3$s von %4$s erhalten."
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Edit finish date and time"
+msgstr "Enddatum und -zeit bearbeiten"
-#: ../../Zotlabs/Lib/Enotify.php:299
-msgid "Name:"
-msgstr "Name:"
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Finish date and time"
+msgstr "Enddatum und -zeit"
-#: ../../Zotlabs/Lib/Enotify.php:300
-msgid "Photo:"
-msgstr "Foto:"
+#: ../../Zotlabs/Module/Events.php:464 ../../Zotlabs/Module/Events.php:465
+msgid "Adjust for viewer timezone"
+msgstr "An die Zeitzone des Betrachters anpassen"
-#: ../../Zotlabs/Lib/Enotify.php:303
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen."
+#: ../../Zotlabs/Module/Events.php:464
+msgid ""
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
+msgstr "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht sinnvoll für globale Feiertage / Ferien."
-#: ../../Zotlabs/Lib/Enotify.php:518
-msgid "[Hubzilla:Notify]"
-msgstr "[Hubzilla:Benachrichtigung]"
+#: ../../Zotlabs/Module/Events.php:466
+msgid "Edit Description"
+msgstr "Beschreibung bearbeiten"
-#: ../../Zotlabs/Lib/Enotify.php:667
-msgid "created a new post"
-msgstr "Neuer Beitrag wurde erzeugt"
+#: ../../Zotlabs/Module/Events.php:468
+msgid "Edit Location"
+msgstr "Ort bearbeiten"
-#: ../../Zotlabs/Lib/Enotify.php:668
-#, php-format
-msgid "commented on %s's post"
-msgstr "hat %s's Beitrag kommentiert"
+#: ../../Zotlabs/Module/Events.php:472 ../../include/conversation.php:1280
+msgid "Permission settings"
+msgstr "Berechtigungs-Einstellungen"
-#: ../../Zotlabs/Lib/PermissionDescription.php:31
-#: ../../include/acl_selectors.php:124
-msgid "Visible to your default audience"
-msgstr "Standard-Sichtbarkeit gemäß Kanaleinstellungen"
+#: ../../Zotlabs/Module/Events.php:485
+msgid "Advanced Options"
+msgstr "Weitere Optionen"
-#: ../../Zotlabs/Lib/PermissionDescription.php:106
-#: ../../include/acl_selectors.php:165
-msgid "Only me"
-msgstr "Nur ich"
+#: ../../Zotlabs/Module/Events.php:624
+msgid "Edit event"
+msgstr "Termin bearbeiten"
-#: ../../Zotlabs/Lib/PermissionDescription.php:107
-msgid "Public"
-msgstr "Öffentlich"
+#: ../../Zotlabs/Module/Events.php:626
+msgid "Delete event"
+msgstr "Termin löschen"
-#: ../../Zotlabs/Lib/PermissionDescription.php:108
-msgid "Anybody in the $Projectname network"
-msgstr "Jeder innerhalb des $Projectname Netzwerks"
+#: ../../Zotlabs/Module/Events.php:660
+msgid "calendar"
+msgstr "Kalender"
-#: ../../Zotlabs/Lib/PermissionDescription.php:109
-#, php-format
-msgid "Any account on %s"
-msgstr "Jedes Nutzerkonto auf %s"
+#: ../../Zotlabs/Module/Events.php:686
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849
+msgid "Month"
+msgstr "Monat"
-#: ../../Zotlabs/Lib/PermissionDescription.php:110
-msgid "Any of my connections"
-msgstr "Alle meine Verbindungen"
+#: ../../Zotlabs/Module/Events.php:687
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850
+msgid "Week"
+msgstr "Woche"
-#: ../../Zotlabs/Lib/PermissionDescription.php:111
-msgid "Only connections I specifically allow"
-msgstr "Nur Verbindungen, denen ich es explizit erlaube"
+#: ../../Zotlabs/Module/Events.php:688
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851
+msgid "Day"
+msgstr "Tag"
-#: ../../Zotlabs/Lib/PermissionDescription.php:112
-msgid "Anybody authenticated (could include visitors from other networks)"
-msgstr "Jeder, der angemeldet ist (kann Besucher anderer Netzwerke beinhalten)"
+#: ../../Zotlabs/Module/Events.php:722
+msgid "Event removed"
+msgstr "Termin gelöscht"
-#: ../../Zotlabs/Lib/PermissionDescription.php:113
-msgid "Any connections including those who haven't yet been approved"
-msgstr "Alle Verbindungen einschließlich der noch nicht bestätigten"
+#: ../../Zotlabs/Module/Events.php:725
+msgid "Failed to remove event"
+msgstr "Termin konnte nicht gelöscht werden"
-#: ../../Zotlabs/Lib/PermissionDescription.php:152
-msgid ""
-"This is your default setting for the audience of your normal stream, and "
-"posts."
-msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner normalen Beiträge (Stream)."
+#: ../../Zotlabs/Lib/Chatroom.php:27
+msgid "Missing room name"
+msgstr "Der Chatraum hat keinen Namen"
-#: ../../Zotlabs/Lib/PermissionDescription.php:153
-msgid ""
-"This is your default setting for who can view your default channel profile"
-msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deines Standard-Kanalprofils."
+#: ../../Zotlabs/Lib/Chatroom.php:36
+msgid "Duplicate room name"
+msgstr "Name des Chatraums bereits vergeben"
-#: ../../Zotlabs/Lib/PermissionDescription.php:154
-msgid "This is your default setting for who can view your connections"
-msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Verbindungen."
+#: ../../Zotlabs/Lib/Chatroom.php:86 ../../Zotlabs/Lib/Chatroom.php:94
+msgid "Invalid room specifier."
+msgstr "Ungültiger Raumbezeichner."
-#: ../../Zotlabs/Lib/PermissionDescription.php:155
-msgid ""
-"This is your default setting for who can view your file storage and photos"
-msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Dateien und Fotos."
+#: ../../Zotlabs/Lib/Chatroom.php:126
+msgid "Room not found."
+msgstr "Chatraum konnte nicht gefunden werden."
-#: ../../Zotlabs/Lib/PermissionDescription.php:156
-msgid "This is your default setting for the audience of your webpages"
-msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Webseiten."
+#: ../../Zotlabs/Lib/Chatroom.php:147
+msgid "Room is full"
+msgstr "Der Chatraum ist voll"
#: ../../Zotlabs/Lib/Apps.php:205
msgid "Site Admin"
msgstr "Hub-Administration"
#: ../../Zotlabs/Lib/Apps.php:206
-msgid "Bug Report"
-msgstr "Fehler-Rückmeldung"
+#: ../../extend/addon/addon/buglink/buglink.php:16
+msgid "Report Bug"
+msgstr "Fehler melden"
#: ../../Zotlabs/Lib/Apps.php:207
msgid "View Bookmarks"
@@ -6962,33 +6992,38 @@ msgstr "Teilen-Knopf für Firefox"
msgid "Remote Diagnostics"
msgstr "Ferndiagnose"
-#: ../../Zotlabs/Lib/Apps.php:212 ../../include/features.php:88
+#: ../../Zotlabs/Lib/Apps.php:212 ../../include/features.php:319
msgid "Suggest Channels"
msgstr "Kanäle vorschlagen"
#: ../../Zotlabs/Lib/Apps.php:213 ../../include/nav.php:115
-#: ../../boot.php:1739
+#: ../../boot.php:1719
msgid "Login"
msgstr "Anmelden"
-#: ../../Zotlabs/Lib/Apps.php:215 ../../include/nav.php:184
+#: ../../Zotlabs/Lib/Apps.php:215 ../../include/nav.php:182
msgid "Grid"
msgstr "Grid"
-#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:187
+#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:99
+#: ../../include/conversation.php:1758
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:185
msgid "Channel Home"
msgstr "Mein Kanal"
-#: ../../Zotlabs/Lib/Apps.php:223 ../../include/nav.php:206
-#: ../../include/conversation.php:1688 ../../include/conversation.php:1691
+#: ../../Zotlabs/Lib/Apps.php:223 ../../include/nav.php:204
+#: ../../include/conversation.php:1709 ../../include/conversation.php:1712
msgid "Events"
msgstr "Termine"
-#: ../../Zotlabs/Lib/Apps.php:224 ../../include/nav.php:172
+#: ../../Zotlabs/Lib/Apps.php:224 ../../include/nav.php:170
msgid "Directory"
msgstr "Verzeichnis"
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/nav.php:198
+#: ../../Zotlabs/Lib/Apps.php:226 ../../include/nav.php:196
msgid "Mail"
msgstr "Mail"
@@ -7012,11 +7047,12 @@ msgstr "Zufälliger Kanal"
msgid "Invite"
msgstr "Einladen"
-#: ../../Zotlabs/Lib/Apps.php:235 ../../include/widgets.php:1560
+#: ../../Zotlabs/Lib/Apps.php:235 ../../include/widgets.php:1635
msgid "Features"
msgstr "Funktionen"
#: ../../Zotlabs/Lib/Apps.php:236
+#: ../../extend/addon/addon/openid/MysqlProvider.php:69
msgid "Language"
msgstr "Sprache"
@@ -7025,6 +7061,9 @@ msgid "Post"
msgstr "Beitrag schreiben"
#: ../../Zotlabs/Lib/Apps.php:238
+#: ../../extend/addon/addon/openid/MysqlProvider.php:58
+#: ../../extend/addon/addon/openid/MysqlProvider.php:59
+#: ../../extend/addon/addon/openid/MysqlProvider.php:60
msgid "Profile Photo"
msgstr "Profilfoto"
@@ -7032,11 +7071,74 @@ msgstr "Profilfoto"
msgid "Purchase"
msgstr "Kaufen"
-#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:667
+#: ../../Zotlabs/Lib/PermissionDescription.php:34
+#: ../../include/acl_selectors.php:128
+msgid "Visible to your default audience"
+msgstr "Standard-Sichtbarkeit gemäß Kanaleinstellungen"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:107
+#: ../../include/acl_selectors.php:191
+msgid "Only me"
+msgstr "Nur ich"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:108
+msgid "Public"
+msgstr "Öffentlich"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:109
+msgid "Anybody in the $Projectname network"
+msgstr "Jeder innerhalb des $Projectname Netzwerks"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:110
+#, php-format
+msgid "Any account on %s"
+msgstr "Jedes Nutzerkonto auf %s"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:111
+msgid "Any of my connections"
+msgstr "Alle meine Verbindungen"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:112
+msgid "Only connections I specifically allow"
+msgstr "Nur Verbindungen, denen ich es explizit erlaube"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:113
+msgid "Anybody authenticated (could include visitors from other networks)"
+msgstr "Jeder, der angemeldet ist (kann Besucher anderer Netzwerke beinhalten)"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:114
+msgid "Any connections including those who haven't yet been approved"
+msgstr "Alle Verbindungen einschließlich der noch nicht bestätigten"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:150
+msgid ""
+"This is your default setting for the audience of your normal stream, and "
+"posts."
+msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner normalen Beiträge (Stream)."
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:151
+msgid ""
+"This is your default setting for who can view your default channel profile"
+msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deines Standard-Kanalprofils."
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:152
+msgid "This is your default setting for who can view your connections"
+msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Verbindungen."
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:153
+msgid ""
+"This is your default setting for who can view your file storage and photos"
+msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Dateien und Fotos."
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:154
+msgid "This is your default setting for the audience of your webpages"
+msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Webseiten."
+
+#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:683
msgid "Private Message"
msgstr "Private Nachricht"
-#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:659
+#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:675
msgid "Select"
msgstr "Auswählen"
@@ -7068,645 +7170,3326 @@ msgstr "Ich lehne ab"
msgid "I abstain"
msgstr "Ich enthalte mich"
-#: ../../Zotlabs/Lib/ThreadItem.php:218
+#: ../../Zotlabs/Lib/ThreadItem.php:223
msgid "Add Star"
msgstr "Stern hinzufügen"
-#: ../../Zotlabs/Lib/ThreadItem.php:219
+#: ../../Zotlabs/Lib/ThreadItem.php:224
msgid "Remove Star"
msgstr "Stern entfernen"
-#: ../../Zotlabs/Lib/ThreadItem.php:220
+#: ../../Zotlabs/Lib/ThreadItem.php:225
msgid "Toggle Star Status"
msgstr "Markierungsstatus (Stern) umschalten"
-#: ../../Zotlabs/Lib/ThreadItem.php:224
+#: ../../Zotlabs/Lib/ThreadItem.php:229
msgid "starred"
msgstr "markiert"
-#: ../../Zotlabs/Lib/ThreadItem.php:234 ../../include/conversation.php:674
+#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:690
msgid "Message signature validated"
msgstr "Signatur überprüft"
-#: ../../Zotlabs/Lib/ThreadItem.php:235 ../../include/conversation.php:675
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:691
msgid "Message signature incorrect"
msgstr "Signatur nicht korrekt"
-#: ../../Zotlabs/Lib/ThreadItem.php:243
+#: ../../Zotlabs/Lib/ThreadItem.php:248
msgid "Add Tag"
msgstr "Tag hinzufügen"
-#: ../../Zotlabs/Lib/ThreadItem.php:263 ../../include/taxonomy.php:316
+#: ../../Zotlabs/Lib/ThreadItem.php:268 ../../include/taxonomy.php:316
msgid "like"
msgstr "mag"
-#: ../../Zotlabs/Lib/ThreadItem.php:264 ../../include/taxonomy.php:317
+#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:317
msgid "dislike"
msgstr "verurteile"
-#: ../../Zotlabs/Lib/ThreadItem.php:268
+#: ../../Zotlabs/Lib/ThreadItem.php:273
msgid "Share This"
msgstr "Teilen"
-#: ../../Zotlabs/Lib/ThreadItem.php:268
+#: ../../Zotlabs/Lib/ThreadItem.php:273
msgid "share"
msgstr "Teilen"
-#: ../../Zotlabs/Lib/ThreadItem.php:277
+#: ../../Zotlabs/Lib/ThreadItem.php:282
msgid "Delivery Report"
msgstr "Zustellungsbericht"
-#: ../../Zotlabs/Lib/ThreadItem.php:295
+#: ../../Zotlabs/Lib/ThreadItem.php:300
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
msgstr[0] "%d Kommentar"
msgstr[1] "%d Kommentare"
-#: ../../Zotlabs/Lib/ThreadItem.php:324 ../../Zotlabs/Lib/ThreadItem.php:325
+#: ../../Zotlabs/Lib/ThreadItem.php:329 ../../Zotlabs/Lib/ThreadItem.php:330
#, php-format
msgid "View %s's profile - %s"
msgstr "Schaue Dir %ss Profil an – %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:328
+#: ../../Zotlabs/Lib/ThreadItem.php:333
msgid "to"
msgstr "an"
-#: ../../Zotlabs/Lib/ThreadItem.php:329
+#: ../../Zotlabs/Lib/ThreadItem.php:334
msgid "via"
msgstr "via"
-#: ../../Zotlabs/Lib/ThreadItem.php:330
+#: ../../Zotlabs/Lib/ThreadItem.php:335
msgid "Wall-to-Wall"
msgstr "Wall-to-Wall"
-#: ../../Zotlabs/Lib/ThreadItem.php:331
+#: ../../Zotlabs/Lib/ThreadItem.php:336
msgid "via Wall-To-Wall:"
msgstr "via Wall-To-Wall:"
-#: ../../Zotlabs/Lib/ThreadItem.php:343 ../../include/conversation.php:722
+#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:736
#, php-format
msgid "from %s"
msgstr "via %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:346 ../../include/conversation.php:725
+#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:739
#, php-format
msgid "last edited: %s"
msgstr "zuletzt bearbeitet: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:347 ../../include/conversation.php:726
+#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:740
#, php-format
msgid "Expires: %s"
msgstr "Verfällt: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:372
+#: ../../Zotlabs/Lib/ThreadItem.php:358
+msgid "Attend"
+msgstr "Zusagen"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:359
+msgid "Attendance Options"
+msgstr "Zusageoptionen"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:360
+msgid "Vote"
+msgstr "Abstimmen"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:361
+msgid "Voting Options"
+msgstr "Abstimmungsoptionen"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:381
+#: ../../extend/addon/addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr "Favoriten speichern"
-#: ../../Zotlabs/Lib/ThreadItem.php:373
+#: ../../Zotlabs/Lib/ThreadItem.php:382
msgid "Add to Calendar"
msgstr "Zum Kalender hinzufügen"
-#: ../../Zotlabs/Lib/ThreadItem.php:382
+#: ../../Zotlabs/Lib/ThreadItem.php:391
msgid "Mark all seen"
msgstr "Alle als gelesen markieren"
-#: ../../Zotlabs/Lib/ThreadItem.php:423 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:440 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr "%s mehr anzeigen"
-#: ../../Zotlabs/Lib/ThreadItem.php:713 ../../include/conversation.php:1238
+#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/conversation.php:1255
msgid "Bold"
msgstr "Fett"
-#: ../../Zotlabs/Lib/ThreadItem.php:714 ../../include/conversation.php:1239
+#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/conversation.php:1256
msgid "Italic"
msgstr "Kursiv"
-#: ../../Zotlabs/Lib/ThreadItem.php:715 ../../include/conversation.php:1240
+#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1257
msgid "Underline"
msgstr "Unterstrichen"
-#: ../../Zotlabs/Lib/ThreadItem.php:716 ../../include/conversation.php:1241
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1258
msgid "Quote"
msgstr "Zitat"
-#: ../../Zotlabs/Lib/ThreadItem.php:717 ../../include/conversation.php:1242
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1259
msgid "Code"
msgstr "Code"
-#: ../../Zotlabs/Lib/ThreadItem.php:718
+#: ../../Zotlabs/Lib/ThreadItem.php:735
msgid "Image"
msgstr "Bild"
-#: ../../Zotlabs/Lib/ThreadItem.php:719
+#: ../../Zotlabs/Lib/ThreadItem.php:736
msgid "Insert Link"
msgstr "Link einfügen"
-#: ../../Zotlabs/Lib/ThreadItem.php:720
+#: ../../Zotlabs/Lib/ThreadItem.php:737
msgid "Video"
msgstr "Video"
-#: ../../include/Import/import_diaspora.php:16
-msgid "No username found in import file."
-msgstr "Kein Benutzername in der Importdatei gefunden."
+#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1914
+msgid "$Projectname Notification"
+msgstr "$Projectname-Benachrichtigung"
-#: ../../include/Import/import_diaspora.php:41 ../../include/import.php:51
-msgid "Unable to create a unique channel address. Import failed."
-msgstr "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen."
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../extend/addon/addon/diaspora/p.php:46
+#: ../../extend/addon/addon/diaspora/util.php:218
+#: ../../extend/addon/addon/diaspora/util.php:231
+#: ../../include/network.php:1915
+msgid "$projectname"
+msgstr "$projectname"
-#: ../../include/dba/dba_driver.php:173
+#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1917
+msgid "Thank You,"
+msgstr "Danke."
+
+#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1919
#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden"
+msgid "%s Administrator"
+msgstr "der Administrator von %s"
-#: ../../include/network.php:704
-msgid "view full size"
-msgstr "In Vollbildansicht anschauen"
+#: ../../Zotlabs/Lib/Enotify.php:116
+#, php-format
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../include/network.php:1935 ../../include/account.php:326
-#: ../../include/account.php:353 ../../include/account.php:413
-msgid "Administrator"
-msgstr "Administrator"
+#: ../../Zotlabs/Lib/Enotify.php:120
+#, php-format
+msgid "[$Projectname:Notify] New mail received at %s"
+msgstr "[$Projectname:Benachrichtigung] Neue Mail empfangen auf %s"
-#: ../../include/network.php:1949
-msgid "No Subject"
-msgstr "Kein Betreff"
+#: ../../Zotlabs/Lib/Enotify.php:122
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, %2$s hat Dir eine private Nachricht auf %3$s gesendet."
-#: ../../include/network.php:2203 ../../include/network.php:2204
-msgid "Friendica"
-msgstr "Friendica"
+#: ../../Zotlabs/Lib/Enotify.php:123
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s hat Dir %2$s geschickt."
-#: ../../include/network.php:2205
-msgid "OStatus"
-msgstr "OStatus"
+#: ../../Zotlabs/Lib/Enotify.php:123
+msgid "a private message"
+msgstr "eine private Nachricht"
-#: ../../include/network.php:2206
-msgid "GNU-Social"
-msgstr "GNU-Social"
+#: ../../Zotlabs/Lib/Enotify.php:124
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Bitte besuche %s, um die private Nachricht anzusehen und/oder darauf zu antworten."
-#: ../../include/network.php:2207
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
+#: ../../Zotlabs/Lib/Enotify.php:183
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]einen %4$s[/zrl] kommentiert"
-#: ../../include/network.php:2209
+#: ../../Zotlabs/Lib/Enotify.php:191
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]%4$ss %5$s[/zrl] kommentiert"
+
+#: ../../Zotlabs/Lib/Enotify.php:200
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]Deinen %4$s[/zrl] kommentiert"
+
+#: ../../Zotlabs/Lib/Enotify.php:211
+#, php-format
+msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[$Projectname:Benachrichtigung] Kommentar in Unterhaltung #%1$d von %2$s"
+
+#: ../../Zotlabs/Lib/Enotify.php:212
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s hat eine Unterhaltung kommentiert, der Du folgst."
+
+#: ../../Zotlabs/Lib/Enotify.php:215 ../../Zotlabs/Lib/Enotify.php:230
+#: ../../Zotlabs/Lib/Enotify.php:256 ../../Zotlabs/Lib/Enotify.php:274
+#: ../../Zotlabs/Lib/Enotify.php:288
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren."
+
+#: ../../Zotlabs/Lib/Enotify.php:221
+#, php-format
+msgid "[$Projectname:Notify] %s posted to your profile wall"
+msgstr "[$Projectname:Benachrichtigung] %s schrieb auf Deine Pinnwand"
+
+#: ../../Zotlabs/Lib/Enotify.php:223
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s hat auf Deine Pinnwand auf %3$s geschrieben"
+
+#: ../../Zotlabs/Lib/Enotify.php:225
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s hat auf [zrl=%3$s]Deine Pinnwand[/zrl] geschrieben"
+
+#: ../../Zotlabs/Lib/Enotify.php:249
+#, php-format
+msgid "[$Projectname:Notify] %s tagged you"
+msgstr "[$Projectname:Benachrichtigung] %s hat Dich erwähnt"
+
+#: ../../Zotlabs/Lib/Enotify.php:250
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, %2$s hat Dich auf %3$s erwähnt"
+
+#: ../../Zotlabs/Lib/Enotify.php:251
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]hat Dich erwähnt[/zrl]."
+
+#: ../../Zotlabs/Lib/Enotify.php:263
+#, php-format
+msgid "[$Projectname:Notify] %1$s poked you"
+msgstr "[$Projectname:Benachrichtigung] %1$s hat Dich angestupst"
+
+#: ../../Zotlabs/Lib/Enotify.php:264
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s hat Dich auf %3$s angestupst"
+
+#: ../../Zotlabs/Lib/Enotify.php:265
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]hat Dich angestupst[/zrl]."
+
+#: ../../Zotlabs/Lib/Enotify.php:281
+#, php-format
+msgid "[$Projectname:Notify] %s tagged your post"
+msgstr "[$Projectname:Benachrichtigung] %s hat Deinen Beitrag verschlagwortet"
+
+#: ../../Zotlabs/Lib/Enotify.php:282
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s hat Deinen Beitrag auf %3$s verschlagwortet"
+
+#: ../../Zotlabs/Lib/Enotify.php:283
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]Deinen Beitrag[/zrl] verschlagwortet"
+
+#: ../../Zotlabs/Lib/Enotify.php:295
+msgid "[$Projectname:Notify] Introduction received"
+msgstr "[$Projectname:Benachrichtigung] Verbindungsanfrage erhalten"
+
+#: ../../Zotlabs/Lib/Enotify.php:296
+#, php-format
+msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
+msgstr "%1$s, Du hast eine neue Verbindungsanfrage von '%2$s' auf %3$s erhalten"
+
+#: ../../Zotlabs/Lib/Enotify.php:297
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
+msgstr "%1$s, Du hast [zrl=%2$s]eine neue Verbindungsanfrage[/zrl] von %3$s erhalten."
+
+#: ../../Zotlabs/Lib/Enotify.php:301 ../../Zotlabs/Lib/Enotify.php:320
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Du kannst Dir das Profil unter %s ansehen"
+
+#: ../../Zotlabs/Lib/Enotify.php:303
+#, php-format
+msgid "Please visit %s to approve or reject the connection request."
+msgstr "Bitte besuche %s , um die Verbindungsanfrage anzunehmen oder abzulehnen."
+
+#: ../../Zotlabs/Lib/Enotify.php:310
+msgid "[$Projectname:Notify] Friend suggestion received"
+msgstr "[$Projectname:Benachrichtigung] Freundschaftsvorschlag erhalten"
+
+#: ../../Zotlabs/Lib/Enotify.php:311
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, Du hast einen Kontaktvorschlag von „%2$s“ auf %3$s erhalten"
+
+#: ../../Zotlabs/Lib/Enotify.php:312
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, Du hast [zrl=%2$s]einen Kontaktvorschlag[/zrl] für %3$s von %4$s erhalten."
+
+#: ../../Zotlabs/Lib/Enotify.php:318
+msgid "Name:"
+msgstr "Name:"
+
+#: ../../Zotlabs/Lib/Enotify.php:319
+msgid "Photo:"
+msgstr "Foto:"
+
+#: ../../Zotlabs/Lib/Enotify.php:322
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen."
+
+#: ../../Zotlabs/Lib/Enotify.php:540
+msgid "[$Projectname:Notify]"
+msgstr "[$Projectname:Benachrichtigung]"
+
+#: ../../Zotlabs/Lib/Enotify.php:700
+msgid "created a new post"
+msgstr "Neuer Beitrag wurde erzeugt"
+
+#: ../../Zotlabs/Lib/Enotify.php:701
+#, php-format
+msgid "commented on %s's post"
+msgstr "hat %s's Beitrag kommentiert"
+
+#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:24
+msgid "Flag Adult Photos"
+msgstr "Nicht jugendfreie Fotos markieren"
+
+#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:25
+msgid ""
+"Provide photo edit option to hide inappropriate photos from default album "
+"view"
+msgstr "Stellt eine Option zum Verstecken von Fotos mit unangemessenen Inhalten in der Standard-Albumansicht bereit"
+
+#: ../../extend/addon/addon/chords/Mod_Chords.php:44
+msgid ""
+"This is a fairly comprehensive and complete guitar chord dictionary which "
+"will list most of the available ways to play a certain chord, starting from "
+"the base of the fingerboard up to a few frets beyond the twelfth fret "
+"(beyond which everything repeats). A couple of non-standard tunings are "
+"provided for the benefit of slide players, etc."
+msgstr ""
+
+#: ../../extend/addon/addon/chords/Mod_Chords.php:46
+msgid ""
+"Chord names start with a root note (A-G) and may include sharps (#) and "
+"flats (b). This software will parse most of the standard naming conventions "
+"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
+msgstr ""
+
+#: ../../extend/addon/addon/chords/Mod_Chords.php:48
+msgid ""
+"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
+"E7b13b11 ..."
+msgstr "Einige gültige Beispiele: A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."
+
+#: ../../extend/addon/addon/chords/Mod_Chords.php:51
+msgid "Guitar Chords"
+msgstr "Gitarrenakkorde"
+
+#: ../../extend/addon/addon/chords/Mod_Chords.php:52
+msgid "The complete online chord dictionary"
+msgstr "Das komplette online Akkord-Verzeichnis"
+
+#: ../../extend/addon/addon/chords/Mod_Chords.php:57
+msgid "Tuning"
+msgstr "Stimmen"
+
+#: ../../extend/addon/addon/chords/Mod_Chords.php:58
+msgid "Chord name: example: Em7"
+msgstr "Beispiel Akkord Name: Em7"
+
+#: ../../extend/addon/addon/chords/Mod_Chords.php:59
+msgid "Show for left handed stringing"
+msgstr "Linkshänder-Besaitung anzeigen"
+
+#: ../../extend/addon/addon/chords/chords.php:33
+msgid "Quick Reference"
+msgstr "Schnellreferenz"
+
+#: ../../extend/addon/addon/diaspora/diaspora.php:671
+msgid "Diaspora Protocol Settings updated."
+msgstr "Diaspora-Protokolleinstellungen aktualisiert."
+
+#: ../../extend/addon/addon/diaspora/diaspora.php:692
+msgid "Enable the Diaspora protocol for this channel"
+msgstr "Diaspora-Protokoll für diesen Kanal aktivieren"
+
+#: ../../extend/addon/addon/diaspora/diaspora.php:696
+msgid "Allow any Diaspora member to comment on your public posts"
+msgstr "Jedem Diaspora-Mitglied erlauben, Deine öffentlichen Beiträge zu kommentieren"
+
+#: ../../extend/addon/addon/diaspora/diaspora.php:700
+msgid "Prevent your hashtags from being redirected to other sites"
+msgstr "Verhindern, dass Deine hashtags zu anderen Seiten umgeleitet werden"
+
+#: ../../extend/addon/addon/diaspora/diaspora.php:705
+msgid "Followed hashtags (comma separated, do not include the #)"
+msgstr "Verfolgte Hashtags (Komma separierte Liste, ohne die #)"
+
+#: ../../extend/addon/addon/diaspora/diaspora.php:710
+msgid "Diaspora Protocol Settings"
+msgstr "Diaspora-Protokolleinstellungen"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:94
+msgid "Hubzilla Directory Stats"
+msgstr "Hubzilla-Verzeichnisstatistiken"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:95
+msgid "Total Hubs"
+msgstr "Hubs insgesamt"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:97
+msgid "Hubzilla Hubs"
+msgstr "Hubzilla Hubs"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:99
+msgid "Friendica Hubs"
+msgstr "Friendica Hubs"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:101
+msgid "Diaspora Pods"
+msgstr "Diaspora Pods"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:103
+msgid "Hubzilla Channels"
+msgstr "Hubzilla-Kanäle"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:105
+msgid "Friendica Channels"
+msgstr "Friendica-Kanäle"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:107
+msgid "Diaspora Channels"
+msgstr "Diaspora-Kanäle"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:109
+msgid "Aged 35 and above"
+msgstr "35 und älter"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:111
+msgid "Aged 34 and under"
+msgstr "34 und jünger"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:113
+msgid "Average Age"
+msgstr "Durchschnittsalter"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:115
+msgid "Known Chatrooms"
+msgstr "Bekannte Chaträume"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:117
+msgid "Known Tags"
+msgstr "Bekannte Schlagwörter"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:119
+msgid ""
+"Please note Diaspora and Friendica statistics are merely those **this "
+"directory** is aware of, and not all those known in the network. This also "
+"applies to chatrooms,"
+msgstr "Bitte berücksichtige, dass Diaspora und Friendica Statistiken nur solche einschließen, die **diesem Verzeichnis** bekannt sind, nicht alle im Netzwerk bekannten. Das gilt auch für Chaträume."
+
+#: ../../extend/addon/addon/donate/donate.php:21
+msgid "Project Servers and Resources"
+msgstr "Projektserver und -ressourcen"
+
+#: ../../extend/addon/addon/donate/donate.php:22
+msgid "Project Creator and Tech Lead"
+msgstr "Projektersteller und Technischer Leiter"
+
+#: ../../extend/addon/addon/donate/donate.php:23
+msgid "Admin, developer, directorymin, support bloke"
+msgstr "Administrator, Entwickler, Verzeichnis Betreibender, Supportleistende"
+
+#: ../../extend/addon/addon/donate/donate.php:50
+msgid ""
+"And the hundreds of other people and organisations who helped make the "
+"Hubzilla possible."
+msgstr "Und die hunderte anderen Menschen und Organisationen, die geholfen haben Hubzilla möglich zu machen."
+
+#: ../../extend/addon/addon/donate/donate.php:53
+msgid ""
+"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
+"their time and expertise - and often paying out of pocket for services they "
+"share with others."
+msgstr "Die Redmatrix/Hubzilla Projekte werden hauptsächlich von Freiwilligen bereitgestellt, die ihre Zeit und Expertise zur Verfügung stellen - und oft aus eigener Tasche für die Dienste zahlen, die sie mit anderen teilen."
+
+#: ../../extend/addon/addon/donate/donate.php:54
+msgid ""
+"There is no corporate funding and no ads, and we do not collect and sell "
+"your personal information. (We don't control your personal information - "
+"<strong>you do</strong>.)"
+msgstr "Es gibt keine Finanzierung durch Firmen, keine Werbung und wir verkaufen Deine persönlichen Daten nicht. (Wir kontrollieren Deine persönlichen Daten nicht - <strong>das machst Du</strong>.)"
+
+#: ../../extend/addon/addon/donate/donate.php:55
+msgid ""
+"Help support our ground-breaking work in decentralisation, web identity, and"
+" privacy."
+msgstr "Hilf uns bei unserer wegweisenden Arbeit im Bereich der Dezantralisation, von Web-Identitäten und Privatsphäre."
+
+#: ../../extend/addon/addon/donate/donate.php:57
+msgid ""
+"Your donations keep servers and services running and also helps us to "
+"provide innovative new features and continued development."
+msgstr "Die Spenden werden dafür verwendet Server und Dienste am laufen zu halten und helfen desweiteren innovative Neuerungen zu schaffen und die Entwicklung voran zu treiben."
+
+#: ../../extend/addon/addon/donate/donate.php:60
+msgid "Donate"
+msgstr "Spenden"
+
+#: ../../extend/addon/addon/donate/donate.php:62
+msgid ""
+"Choose a project, developer, or public hub to support with a one-time "
+"donation"
+msgstr "Wähle ein Projekt, einen Entwickler oder einen öffentlichen Hub den du mit einer einmaligen Spende unterstützen willst."
+
+#: ../../extend/addon/addon/donate/donate.php:63
+msgid "Donate Now"
+msgstr "Jetzt spenden"
+
+#: ../../extend/addon/addon/donate/donate.php:64
+msgid ""
+"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project "
+"only)"
+msgstr "<strong><em>Oder</em></strong> werde ein Unterstützer des Projekts (ausschließlich Hubzilla)"
+
+#: ../../extend/addon/addon/donate/donate.php:65
+msgid ""
+"Please indicate if you would like your first name or full name (or nothing) "
+"to appear in our sponsor listing"
+msgstr "Bitte teile uns mit ob dein kompletter Name oder dein Vorname (oder gar nichts) auf unserer Sponsoren-Seite veröffentlicht werden soll."
+
+#: ../../extend/addon/addon/donate/donate.php:66
+msgid "Sponsor"
+msgstr "Sponsor"
+
+#: ../../extend/addon/addon/donate/donate.php:69
+msgid "Special thanks to: "
+msgstr "Besonderer Dank an: "
+
+#: ../../extend/addon/addon/dwpost/dwpost.php:42
+msgid "Post to Dreamwidth"
+msgstr "Bei Dreamwidth veröffentlichen"
+
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+msgid "Enable Dreamwidth Post Plugin"
+msgstr "Aktiviere das Dreamwidth-Plugin"
+
+#: ../../extend/addon/addon/dwpost/dwpost.php:77
+msgid "Dreamwidth username"
+msgstr "Dreamwidth-Benutzername"
+
+#: ../../extend/addon/addon/dwpost/dwpost.php:81
+msgid "Dreamwidth password"
+msgstr "Dreamwidth-Passwort"
+
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+msgid "Post to Dreamwidth by default"
+msgstr "Standardmäßig auf auf Dreamwidth posten"
+
+#: ../../extend/addon/addon/dwpost/dwpost.php:89
+msgid "Dreamwidth Post Settings"
+msgstr "Dreamwidth-Beitragseinstellungen"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:45
+msgid "Flattr this!"
+msgstr "Flattr this!"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:83
+msgid "Flattr widget settings updated."
+msgstr "Flattr Widget Einstellungen aktualisiert"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:100
+msgid "Flattr user"
+msgstr "Flattr Nutzer"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
+msgid "URL of the Thing to flattr"
+msgstr "URL des Dings zum flattrn"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
+msgid "If empty channel URL is used"
+msgstr "Falls leer wird die Channel URL verwendet"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
+msgid "Title of the Thing to flattr"
+msgstr "Titel des Dings zum flattrn"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
+msgid "If empty \"channel name on The Hubzilla\" will be used"
+msgstr "Falls leer wird \"Kanalname auf The Hubzilla\" verwendet"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
+msgid "Static or dynamic flattr button"
+msgstr "Statischer oder dynamischer Flattr Button"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
+msgid "static"
+msgstr "statisch"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
+msgid "dynamic"
+msgstr "dynamisch"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
+msgid "Alignment of the widget"
+msgstr "Ausrichtung des Widgets"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
+msgid "left"
+msgstr "links"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
+msgid "right"
+msgstr "rechts"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+msgid "Enable Flattr widget"
+msgstr "Flattr Widget verwenden"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
+msgid "Flattr Widget Settings"
+msgstr "Flattr Widget Einstellungen"
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:118
+msgid "Contact not found."
+msgstr "Kontakt nicht gefunden."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:119
+msgid ""
+"This may occasionally happen if contact was requested by both persons and it"
+" has already been approved."
+msgstr "Dies kann unter Umständen passieren, wenn der Kontakt von beiden Seiten aus angefragt wurde und er bereits akzeptiert wurde.."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:238
+msgid "Response from remote site was not understood."
+msgstr "Antwort des entfernten Seite war unverständlich."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:247
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:252
+msgid "Unexpected response from remote site: "
+msgstr "Unerwartete Antwort der entfernten Seite"
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:261
+msgid "Confirmation completed successfully."
+msgstr "Bestätigung erfolgreich abgeschlossen."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:263
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:277
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:284
+msgid "Remote site reported: "
+msgstr "Meldung der entfernten Seite"
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:275
+msgid "Temporary failure. Please wait and try again."
+msgstr "Vorübergehende Störung. Bitte warte einen Moment und versuche es später erneut."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:282
+msgid "Introduction failed or was revoked."
+msgstr "Vorstellung fehlgeschlagen oder wurde zurück gezogen."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:428
+msgid "Unable to set contact photo."
+msgstr "Konnte das Kontakt-Photo nicht setzen."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:485
+#, php-format
+msgid "%1$s is now friends with %2$s"
+msgstr "%1$s ist nun mit %2$s befreundet"
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:570
+#, php-format
+msgid "No user record found for '%s' "
+msgstr "Kein Benutzereintrag für '%s' gefunden"
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:580
+msgid "Our site encryption key is apparently messed up."
+msgstr "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend kaputt."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:591
+msgid "Empty site URL was provided or URL could not be decrypted by us."
+msgstr "Eine leere Seiten URL wurde angegeben, oder die URL konnte von uns nicht entziffert werden."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:612
+msgid "Contact record was not found for you on our site."
+msgstr "Für dich wurden keinerlei Kontaktdaten auf unserer Seite gefunden."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:626
+#, php-format
+msgid "Site public key not available in contact record for URL %s."
+msgstr "Der öffentliche Schlüssel dieser Seite ist für die Kontaktdaten mit der URL %s nocht verfügbar."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:646
+msgid ""
+"The ID provided by your system is a duplicate on our system. It should work "
+"if you try again."
+msgstr "Die ID, die Durch Dein System angegeben wurde ist ein Duplikat auf unserem. Es sollte funktionieren, wenn Du es noch einmal versuchst."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:657
+msgid "Unable to set your contact credentials on our system."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:724
+msgid "Unable to update your contact profile details on our system"
+msgstr "Konnte die Details deines Profils auf unserem System nicht aktualisieren."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:751
+#: ../../extend/addon/addon/friendica/dfrn_request.php:749
+msgid "[Name Withheld]"
+msgstr "[Name zurück gehalten]"
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:796
+#, php-format
+msgid "%1$s has joined %2$s"
+msgstr "%1$s ist %2$s beigetreten"
+
+#: ../../extend/addon/addon/friendica/dfrn_poll.php:103
+#: ../../extend/addon/addon/friendica/dfrn_poll.php:536
+#, php-format
+msgid "%1$s welcomes %2$s"
+msgstr "%1$s heißt %2$s willkommen"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:102
+msgid "This introduction has already been accepted."
+msgstr "Die Vorstellung wurde bereits akzeptiert."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:123
+#: ../../extend/addon/addon/friendica/dfrn_request.php:528
+msgid "Profile location is not valid or does not contain profile information."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:128
+#: ../../extend/addon/addon/friendica/dfrn_request.php:533
+msgid "Warning: profile location has no identifiable owner name."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:130
+#: ../../extend/addon/addon/friendica/dfrn_request.php:535
+msgid "Warning: profile location has no profile photo."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:133
+#: ../../extend/addon/addon/friendica/dfrn_request.php:538
+#, 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] ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:180
+msgid "Introduction complete."
+msgstr "Einführung abgeschlossen."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:224
+msgid "Unrecoverable protocol error."
+msgstr "Nicht behebbarer Protokollfehler."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:252
+msgid "Profile unavailable."
+msgstr "Profil nicht verfügbar."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:277
+#, php-format
+msgid "%s has received too many connection requests today."
+msgstr "%s hat heute bereits zu viele Kontaktanfragen erhalten."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:278
+msgid "Spam protection measures have been invoked."
+msgstr "Maßnahmen zum Spam-Schutz wurden aktiviert."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:279
+msgid "Friends are advised to please try again in 24 hours."
+msgstr "Freunde sollten es bitte in 24 Stunden erneut versuchen."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:341
+msgid "Invalid locator"
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:350
+msgid "Invalid email address."
+msgstr "Ungültige E-Mail-Adresse."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:377
+msgid "This account has not been configured for email. Request failed."
+msgstr "Dieser Account wurde nicht für E-Mail konfiguriert. Anfrage gescheitert."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:473
+msgid "Unable to resolve your name at the provided location."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:486
+msgid "You have already introduced yourself here."
+msgstr "Du hast dich hier bereits vorgestellt."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:490
+#, php-format
+msgid "Apparently you are already friends with %s."
+msgstr "Anscheinend bist du bereits mit %s in Kontakt."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:511
+msgid "Invalid profile URL."
+msgstr "Ungültige Profil-URL."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:517
+msgid "Disallowed profile URL."
+msgstr "Nicht erlaubte Profil-URL."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:587
+msgid "Failed to update contact record."
+msgstr "Konnte den Verbindungseintrag nicht aktualisieren."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:608
+msgid "Your introduction has been sent."
+msgstr "Deine Vorstellung wurde gesendet."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:662
+msgid "Please login to confirm introduction."
+msgstr "Bitte melde dich an um die Vorstellung zu bestätigen."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:676
+msgid ""
+"Incorrect identity currently logged in. Please login to "
+"<strong>this</strong> profile."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:690
+#: ../../extend/addon/addon/friendica/dfrn_request.php:707
+msgid "Confirm"
+msgstr "Bestätigen"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:702
+msgid "Hide this contact"
+msgstr "Diesen Kontakt verbergen"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:705
+#, php-format
+msgid "Welcome home %s."
+msgstr "Willkommen daheim %s"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:706
+#, php-format
+msgid "Please confirm your introduction/connection request to %s."
+msgstr "Bitte bestätige deine Vorstellung/Kontaktanfrage bei %s."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:836
+msgid ""
+"Please enter your 'Identity Address' from one of the following supported "
+"communications networks:"
+msgstr "Bitte gib deine \"Identitäts Adresse\" von einem der folgenden unterstützten Kommunikations Netzwerke an."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:857
+#, php-format
+msgid ""
+"If you are not yet a member of the free social web, <a "
+"href=\"%s/siteinfo\">follow this link to find a public Friendica site and "
+"join us today</a>."
+msgstr ""
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:862
+msgid "Friend/Connection Request"
+msgstr "Freundschafts-/Verbindungsanfrage"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:863
+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"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:864
+msgid "Please answer the following:"
+msgstr "Bitte beantworten Sie folgendes:"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#, php-format
+msgid "Does %s know you?"
+msgstr "Kennt %s Sie?"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:869
+msgid "Add a personal note:"
+msgstr "Eine persönliche Nachricht hinterlassen:"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:871
+#: ../../include/network.php:2232 ../../include/network.php:2233
+msgid "Friendica"
+msgstr "Friendica"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:872
+msgid "StatusNet/Federated Social Web"
+msgstr "StatusNet/Föderierte Soziale Netzwerke"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:873
+#: ../../include/network.php:2238
msgid "Diaspora"
msgstr "Diaspora"
-#: ../../include/network.php:2210
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:874
+#, php-format
+msgid ""
+" - please do not use this form. Instead, enter %s into your Diaspora search"
+" bar."
+msgstr "- bitte verwende nicht dieses Formular sondern gib %s in die Suchleiste deiner Diaspora Seite ein."
-#: ../../include/network.php:2211
-msgid "Zot"
-msgstr "Zot!"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:875
+msgid "Your Identity Address:"
+msgstr "Ihre Identitätsadresse:"
-#: ../../include/network.php:2212
-msgid "LinkedIn"
-msgstr "LinkedIn"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:878
+msgid "Submit Request"
+msgstr "Anfrage absenden"
-#: ../../include/network.php:2213
-msgid "XMPP/IM"
-msgstr "XMPP/IM"
+#: ../../extend/addon/addon/friendica/friendica.php:113
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:114
+msgid "GNU-Social Protocol Settings updated."
+msgstr "GNU Social Protokoll Einstellungen aktualisiert"
-#: ../../include/network.php:2214
-msgid "MySpace"
-msgstr "MySpace"
+#: ../../extend/addon/addon/friendica/friendica.php:124
+msgid "Enable the (experimental) GNU-Social protocol for this channel"
+msgstr "GNU Social Protokoll (experimentell) für diesen Kanal aktualisieren"
+
+#: ../../extend/addon/addon/friendica/friendica.php:128
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
+msgid "GNU-Social Protocol Settings"
+msgstr "GNU Social Protokoll Einstellungen"
+
+#: ../../extend/addon/addon/friendica/friendica.php:185
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:319
+msgid "Follow"
+msgstr "Folgen"
-#: ../../include/photos.php:114
+#: ../../extend/addon/addon/friendica/friendica.php:188
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:322
#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
-msgstr "Bild überschreitet das Webseitenlimit von %lu Bytes"
+msgid "%1$s is now following %2$s"
+msgstr "%1$s folgt nun %2$s"
-#: ../../include/photos.php:121
-msgid "Image file is empty."
-msgstr "Bilddatei ist leer."
+#: ../../extend/addon/addon/frphotos/frphotos.php:91
+msgid "Friendica Photo Album Import"
+msgstr "Friendica-Fotoalbumimport"
-#: ../../include/photos.php:259
-msgid "Photo storage failed."
-msgstr "Fotospeicherung fehlgeschlagen."
+#: ../../extend/addon/addon/frphotos/frphotos.php:92
+msgid "This will import all your Friendica photo albums to this Red channel."
+msgstr "Hiermit werden all deine Fotoalben von Friendica in diesen Hubzilla Kanal importiert."
-#: ../../include/photos.php:299
-msgid "a new photo"
-msgstr "ein neues Foto"
+#: ../../extend/addon/addon/frphotos/frphotos.php:93
+msgid "Friendica Server base URL"
+msgstr "BasisURL des Friendica Servers"
+
+#: ../../extend/addon/addon/frphotos/frphotos.php:94
+msgid "Friendica Login Username"
+msgstr "Friendica-Anmeldebenutzername"
-#: ../../include/photos.php:303
+#: ../../extend/addon/addon/frphotos/frphotos.php:95
+msgid "Friendica Login Password"
+msgstr "Friendica-Anmeldepasswort"
+
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:125
+msgid "Enable the GNU-Social protocol for this channel"
+msgstr "GNU Social Protokoll für diesen Kanal aktualisieren"
+
+#: ../../extend/addon/addon/hubwall/hubwall.php:19
+msgid "Send email to all members"
+msgstr "E-Mail an alle Mitglieder senden"
+
+#: ../../extend/addon/addon/hubwall/hubwall.php:33
#, php-format
-msgctxt "photo_upload"
-msgid "%1$s posted %2$s to %3$s"
-msgstr "%1$s hat %2$s auf %3$s veröffentlicht"
+msgid "$1%s Administrator"
+msgstr "$1%s Administrator"
-#: ../../include/photos.php:506 ../../include/conversation.php:1674
-msgid "Photo Albums"
-msgstr "Fotoalben"
+#: ../../extend/addon/addon/hubwall/hubwall.php:50
+#: ../../extend/addon/addon/mailtest/mailtest.php:50
+msgid "No recipients found."
+msgstr "Keine Empfänger gefunden."
-#: ../../include/photos.php:510
-msgid "Upload New Photos"
-msgstr "Neue Fotos hochladen"
+#: ../../extend/addon/addon/hubwall/hubwall.php:73
+#, php-format
+msgid "%1$d of %2$d messages sent."
+msgstr "%1$d von %2$d Nachrichten gesendet."
-#: ../../include/nav.php:85 ../../include/nav.php:118 ../../boot.php:1738
-msgid "Logout"
-msgstr "Abmelden"
+#: ../../extend/addon/addon/hubwall/hubwall.php:81
+msgid "Send email to all hub members."
+msgstr "Eine E-Mail an alle Mitglieder dieses Hubs senden."
-#: ../../include/nav.php:85 ../../include/nav.php:118
-msgid "End this session"
-msgstr "Beende diese Sitzung"
+#: ../../extend/addon/addon/hubwall/hubwall.php:92
+#: ../../extend/addon/addon/mailtest/mailtest.php:96
+msgid "Message subject"
+msgstr "Betreff der Nachricht"
-#: ../../include/nav.php:88 ../../include/nav.php:149
-msgid "Home"
-msgstr "Home"
+#: ../../extend/addon/addon/hubwall/hubwall.php:93
+msgid "Sender Email address"
+msgstr "E-Mail Adresse des Absenders"
-#: ../../include/nav.php:88
-msgid "Your posts and conversations"
-msgstr "Deine Beiträge und Unterhaltungen"
+#: ../../extend/addon/addon/hubwall/hubwall.php:94
+msgid "Test mode (only send to hub administrator)"
+msgstr "Test Modus (nur an Hub Administratoren senden)"
-#: ../../include/nav.php:89
-msgid "Your profile page"
-msgstr "Deine Profilseite"
+#: ../../extend/addon/addon/ijpost/ijpost.php:42
+msgid "Post to Insanejournal"
+msgstr "Bei InsaneJournal veröffentlichen"
-#: ../../include/nav.php:91
-msgid "Manage/Edit profiles"
-msgstr "Profile verwalten"
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+msgid "Enable InsaneJournal Post Plugin"
+msgstr "Aktiviere das InsaneJournal Plugin"
+
+#: ../../extend/addon/addon/ijpost/ijpost.php:77
+msgid "InsaneJournal username"
+msgstr "InsaneJournal-Benutzername"
+
+#: ../../extend/addon/addon/ijpost/ijpost.php:81
+msgid "InsaneJournal password"
+msgstr "InsaneJournal-Passwort"
+
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+msgid "Post to InsaneJournal by default"
+msgstr "Standardmäßig bei InsaneJournal veröffentlichen"
+
+#: ../../extend/addon/addon/ijpost/ijpost.php:89
+msgid "InsaneJournal Post Settings"
+msgstr "InsaneJournal-Beitragseinstellungen"
+
+#: ../../extend/addon/addon/ijpost/ijpost.php:104
+msgid "Insane Journal Settings saved."
+msgstr "InsaneJournal-Einstellungen gespeichert."
+
+#: ../../extend/addon/addon/irc/irc.php:45
+msgid "Channels to auto connect"
+msgstr ""
+
+#: ../../extend/addon/addon/irc/irc.php:45
+#: ../../extend/addon/addon/irc/irc.php:49
+msgid "Comma separated list"
+msgstr "Kommagetrennte Liste"
+
+#: ../../extend/addon/addon/irc/irc.php:49
+#: ../../extend/addon/addon/irc/irc.php:96
+msgid "Popular Channels"
+msgstr "Beliebte Kanäle"
+
+#: ../../extend/addon/addon/irc/irc.php:53
+msgid "IRC Settings"
+msgstr "IRC-Einstellungen"
+
+#: ../../extend/addon/addon/irc/irc.php:69
+msgid "IRC settings saved."
+msgstr "IRC-Einstellungen gespeichert."
+
+#: ../../extend/addon/addon/irc/irc.php:74
+msgid "IRC Chatroom"
+msgstr "IRC-Chatraum"
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:305
+#: ../../include/channel.php:1056 ../../include/channel.php:1218
+msgid "Status:"
+msgstr "Status:"
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+msgid "Activate addon"
+msgstr "Addon aktiviren"
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+msgid "Hide Jappixmini Chat-Widget from the webinterface"
+msgstr "Jappix Mini Chat-Widget von der Weboberfläche verbergen"
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:318
+msgid "Jabber username"
+msgstr "Jabber-Benutzername"
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:324
+msgid "Jabber server"
+msgstr "Jabber-Server"
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:330
+msgid "Jabber BOSH host URL"
+msgstr "Jabber BOSH Host URL"
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:337
+msgid "Jabber password"
+msgstr "Jabber-Passwort"
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+msgid "Encrypt Jabber password with Hubzilla password"
+msgstr "Jabber-Passwort mit Hubzilla-Passwort verschlüsseln"
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:347
+#: ../../extend/addon/addon/redred/redred.php:115
+msgid "Hubzilla password"
+msgstr "Hubzilla-Passwort"
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+msgid "Approve subscription requests from Hubzilla contacts automatically"
+msgstr ""
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+msgid "Purge internal list of jabber addresses of contacts"
+msgstr "Interne Liste der Jabber Adressen von Kontakten löschen"
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:364
+msgid "Configuration Help"
+msgstr "Konfigurationshilfe"
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:368
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149
+msgid "Add Contact"
+msgstr "Kontakt hinzufügen"
+
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
+msgid "Jappix Mini Settings"
+msgstr "Jappix Mini Einstellungen"
+
+#: ../../extend/addon/addon/js_upload/js_upload.php:44
+msgid "Upload a file"
+msgstr "Datei hochladen"
+
+#: ../../extend/addon/addon/js_upload/js_upload.php:45
+msgid "Drop files here to upload"
+msgstr "Dateien zum Hochladen hier fallen lassen"
+
+#: ../../extend/addon/addon/js_upload/js_upload.php:47
+msgid "Failed"
+msgstr "Fehlgeschlagen"
+
+#: ../../extend/addon/addon/js_upload/js_upload.php:315
+msgid "No files were uploaded."
+msgstr "Es wurden keine Dateien hochgeladen."
+
+#: ../../extend/addon/addon/js_upload/js_upload.php:322
+msgid "Uploaded file is empty"
+msgstr "Hochgeladene Datei ist leer"
+
+#: ../../extend/addon/addon/js_upload/js_upload.php:335
+msgid "Image exceeds size limit of "
+msgstr "Bild überschreitet Größenbeschränkung von "
+
+#: ../../extend/addon/addon/js_upload/js_upload.php:347
+msgid "File has an invalid extension, it should be one of "
+msgstr "Die Datei hat eine ungültige Endung. Erlaubt sind folgende:"
+
+#: ../../extend/addon/addon/js_upload/js_upload.php:359
+msgid "Upload was cancelled, or server error encountered"
+msgstr "Das Hochladen wurde abgebrochen oder es ist ein Serverfehler aufgetreten."
+
+#: ../../extend/addon/addon/ldapauth/ldapauth.php:61
+msgid "An account has been created for you."
+msgstr "Ein Konto wurde für Sie erstellt."
+
+#: ../../extend/addon/addon/ldapauth/ldapauth.php:68
+msgid "Authentication successful but rejected: account creation is disabled."
+msgstr "Authentifizierung war erfolgreich wurde aber abgewiesen! Das Anlegen von Accounts wurde deaktiviert."
+
+#: ../../extend/addon/addon/libertree/libertree.php:38
+msgid "Post to Libertree"
+msgstr "Bei Libertree veröffentlichen"
+
+#: ../../extend/addon/addon/libertree/libertree.php:69
+msgid "Enable Libertree Post Plugin"
+msgstr "Aktivire das Libertree-Plugin"
+
+#: ../../extend/addon/addon/libertree/libertree.php:73
+msgid "Libertree API token"
+msgstr "Libertree API Token"
+
+#: ../../extend/addon/addon/libertree/libertree.php:77
+msgid "Libertree site URL"
+msgstr "URL der Libertree Seite"
+
+#: ../../extend/addon/addon/libertree/libertree.php:81
+msgid "Post to Libertree by default"
+msgstr "Standardmäßig bei Libertree veröffentlichen"
+
+#: ../../extend/addon/addon/libertree/libertree.php:85
+msgid "Libertree Post Settings"
+msgstr "Libertree-Beitragseinstellungen"
+
+#: ../../extend/addon/addon/libertree/libertree.php:99
+msgid "Libertree Settings saved."
+msgstr "Libertree-Einstellungen gespeichert."
+
+#: ../../extend/addon/addon/ljpost/ljpost.php:42
+msgid "Post to LiveJournal"
+msgstr "Bei LiveJurnal veröffentlichen"
+
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+msgid "Enable LiveJournal Post Plugin"
+msgstr "Aktiviere das LiveJurnal Plugin"
+
+#: ../../extend/addon/addon/ljpost/ljpost.php:74
+msgid "LiveJournal username"
+msgstr "LiveJournal-Benutzername"
+
+#: ../../extend/addon/addon/ljpost/ljpost.php:78
+msgid "LiveJournal password"
+msgstr "LiveJournal-Passwort"
+
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+msgid "Post to LiveJournal by default"
+msgstr "Standardmäßig bei LiveJurnal veröffentlichen"
+
+#: ../../extend/addon/addon/ljpost/ljpost.php:86
+msgid "LiveJournal Post Settings"
+msgstr "LiveJournal-Beitragseinstellungen"
+
+#: ../../extend/addon/addon/ljpost/ljpost.php:101
+msgid "LiveJournal Settings saved."
+msgstr "LiveJournal-Einstellungen gespeichert."
+
+#: ../../extend/addon/addon/logrot/logrot.php:36
+msgid "Logfile archive directory"
+msgstr "Verzeichnis der Logdatei"
+
+#: ../../extend/addon/addon/logrot/logrot.php:36
+msgid "Directory to store rotated logs"
+msgstr "Verzeichnis, in dem rotierte Logs gespeichert werden sollen"
+
+#: ../../extend/addon/addon/logrot/logrot.php:37
+msgid "Logfile size in bytes before rotating"
+msgstr "zu erreichende Logdateigröße in Bytes, bevor rotiert wird"
+
+#: ../../extend/addon/addon/logrot/logrot.php:38
+msgid "Number of logfiles to retain"
+msgstr "Anzahl aufzubewahrender rotierter Logdateien"
+
+#: ../../extend/addon/addon/mailhost/mailhost.php:36
+msgid "Email notification hub"
+msgstr "Hub für E-Mail-Benachrichtigungen"
+
+#: ../../extend/addon/addon/mailhost/mailhost.php:36
+msgid "Hostname"
+msgstr "Servername"
+
+#: ../../extend/addon/addon/mailhost/mailhost.php:40
+msgid "Mailhost Settings"
+msgstr "Mailhost-Einstellungen"
+
+#: ../../extend/addon/addon/mailhost/mailhost.php:54
+msgid "MAILHOST Settings saved."
+msgstr "MAILHOST-Einstellungen gespeichert."
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:19
+msgid "lonely"
+msgstr "einsam"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:20
+msgid "drunk"
+msgstr "betrunken"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:21
+msgid "horny"
+msgstr "geil"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:22
+msgid "stoned"
+msgstr "bekifft"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:23
+msgid "fucked up"
+msgstr "beschissen"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:24
+msgid "clusterfucked"
+msgstr "clusterfucked"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:25
+msgid "crazy"
+msgstr "verrückt"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:26
+msgid "hurt"
+msgstr "verletzt"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:27
+msgid "sleepy"
+msgstr "müde"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:28
+msgid "grumpy"
+msgstr "mürrisch"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:29
+msgid "high"
+msgstr "hoch"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:30
+msgid "semi-conscious"
+msgstr "halb bewusstlos"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:31
+msgid "in love"
+msgstr "verliebt"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:32
+msgid "in lust"
+msgstr ""
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:33
+msgid "naked"
+msgstr "nackt"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:34
+msgid "stinky"
+msgstr "stinkend"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:35
+msgid "sweaty"
+msgstr "verschwitzt"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:36
+msgid "bleeding out"
+msgstr "blutend"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:37
+msgid "victorious"
+msgstr "siegreich"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:38
+msgid "defeated"
+msgstr "besiegt"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:39
+msgid "envious"
+msgstr "neidisch"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:40
+msgid "jealous"
+msgstr "eifersüchtig"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:19
+msgid "bitchslap"
+msgstr "Ohrfeige"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:19
+msgid "bitchslapped"
+msgstr "geohrfeigt"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:20
+msgid "shag"
+msgstr "bumsen"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:20
+msgid "shagged"
+msgstr "gebumst"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:21
+msgid "patent"
+msgstr "Patent"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:21
+msgid "patented"
+msgstr "patentiert"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:22
+msgid "hug"
+msgstr "umarmen"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:22
+msgid "hugged"
+msgstr "umarmt"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:23
+msgid "murder"
+msgstr "ermorden"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:23
+msgid "murdered"
+msgstr "ermordet"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:24
+msgid "worship"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:24
+msgid "worshipped"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:25
+msgid "kiss"
+msgstr "küssen"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:25
+msgid "kissed"
+msgstr "geküsst"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:26
+msgid "tempt"
+msgstr "verlocken"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:26
+msgid "tempted"
+msgstr "verlockt"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:27
+msgid "raise eyebrows at"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:27
+msgid "raised their eyebrows at"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:28
+msgid "insult"
+msgstr "beleidigen"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:28
+msgid "insulted"
+msgstr "beleidigt"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:29
+msgid "praise"
+msgstr "loben"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:29
+msgid "praised"
+msgstr "gelobt"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:30
+msgid "be dubious of"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:30
+msgid "was dubious of"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:31
+msgid "eat"
+msgstr "essen"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:31
+msgid "ate"
+msgstr "aß"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:32
+msgid "giggle and fawn at"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:32
+msgid "giggled and fawned at"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:33
+msgid "doubt"
+msgstr "anzweifeln"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:33
+msgid "doubted"
+msgstr "angezweifelt"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:34
+msgid "glare"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:34
+msgid "glared at"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:35
+msgid "fuck"
+msgstr "ficken"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:35
+msgid "fucked"
+msgstr "gefickt"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:36
+msgid "bonk"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:36
+msgid "bonked"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:37
+msgid "declare undying love for"
+msgstr ""
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:37
+msgid "declared undying love for"
+msgstr ""
+
+#: ../../extend/addon/addon/msgfooter/msgfooter.php:46
+#: ../../extend/addon/addon/xmpp/xmpp.php:91
+msgid "Save Settings"
+msgstr "Einstellungen speichern"
+
+#: ../../extend/addon/addon/msgfooter/msgfooter.php:47
+msgid "text to include in all outgoing posts from this site"
+msgstr "Test der in alle Beiträge angefügt werden soll, die von dieser Seite ausgehen"
+
+#: ../../extend/addon/addon/nofed/nofed.php:42
+msgid "Federate"
+msgstr ""
+
+#: ../../extend/addon/addon/nofed/nofed.php:56
+msgid "nofed Settings saved."
+msgstr "nofed Einstellungen gespeichert"
+
+#: ../../extend/addon/addon/nofed/nofed.php:72
+msgid "Allow Federation Toggle"
+msgstr ""
+
+#: ../../extend/addon/addon/nofed/nofed.php:76
+msgid "Federate posts by default"
+msgstr ""
+
+#: ../../extend/addon/addon/nofed/nofed.php:80
+msgid "NoFed Settings"
+msgstr "NoFed-Einstellungen"
+
+#: ../../extend/addon/addon/nsabait/nsabait.php:125
+msgid "Nsabait Settings updated."
+msgstr "Nsabait-Einstellungen aktualisiert."
+
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+msgid "Enable NSAbait Plugin"
+msgstr ""
+
+#: ../../extend/addon/addon/nsabait/nsabait.php:161
+msgid "NSAbait Settings"
+msgstr "NSAbait-Einstellungen"
-#: ../../include/nav.php:93 ../../include/channel.php:963
+#: ../../extend/addon/addon/nsfw/nsfw.php:80
+msgid ""
+"This plugin looks in posts for the words/text you specify below, and "
+"collapses any content containing those keywords so it is not displayed at "
+"inappropriate times, such as sexual innuendo that may be improper in a work "
+"setting. It is polite and recommended to tag any content containing nudity "
+"with #NSFW. This filter can also match any other word/text you specify, and"
+" can thereby be used as a general purpose content filter."
+msgstr ""
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+msgid "Enable Content filter"
+msgstr "Inhaltsfilter aktivieren"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:88
+msgid "Comma separated list of keywords to hide"
+msgstr ""
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:88
+msgid "Use /expression/ to provide regular expressions"
+msgstr ""
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:92
+msgid "Not Safe For Work Settings"
+msgstr "Not Safe For Work Einstellungen"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:92
+msgid "General Purpose Content Filter"
+msgstr "Allzweck-Inhaltsfilter"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:110
+msgid "NSFW Settings saved."
+msgstr "NSFW-Einstellungen gespeichert."
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:207
+msgid "Possible adult content"
+msgstr "Möglicherweise nicht jugendfreie Inhalte"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:211
+#, php-format
+msgid "%s - click to open/close"
+msgstr "%s - zum öffnen/schließen anklicken"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:49
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:127
+msgid "System defaults:"
+msgstr "Systemstandardeinstellungen:"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
+msgid "Preferred Clipart IDs"
+msgstr ""
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
+msgid "List of preferred clipart ids. These will be shown first."
+msgstr ""
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
+msgid "Default Search Term"
+msgstr ""
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
+msgid "The default search term. These will be shown second."
+msgstr ""
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
+msgid "Return After"
+msgstr ""
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
+msgid "Page to load after image selection."
+msgstr ""
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:57
+#: ../../include/channel.php:965 ../../include/nav.php:93
msgid "Edit Profile"
msgstr "Profile bearbeiten"
-#: ../../include/nav.php:93
-msgid "Edit your profile"
-msgstr "Profil bearbeiten"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:58
+msgid "Profile List"
+msgstr "Profilliste"
-#: ../../include/nav.php:95
-msgid "Your photos"
-msgstr "Deine Bilder"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:60
+msgid "Order of Preferred"
+msgstr "Bevorzugte Reihenfolge"
-#: ../../include/nav.php:96
-msgid "Your files"
-msgstr "Deine Dateien"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:60
+msgid "Sort order of preferred clipart ids."
+msgstr ""
-#: ../../include/nav.php:99
-msgid "Your chatrooms"
-msgstr "Deine Chaträume"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
+msgid "Newest first"
+msgstr "Neueste zuerst"
-#: ../../include/nav.php:105 ../../include/conversation.php:1714
-msgid "Bookmarks"
-msgstr "Lesezeichen"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:64
+msgid "As entered"
+msgstr "Wie eingegeben"
-#: ../../include/nav.php:105
-msgid "Your bookmarks"
-msgstr "Deine Lesezeichen"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:66
+msgid "Order of other"
+msgstr ""
-#: ../../include/nav.php:109
-msgid "Your webpages"
-msgstr "Deine Webseiten"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:66
+msgid "Sort order of other clipart ids."
+msgstr ""
-#: ../../include/nav.php:111
-msgid "Your wiki"
-msgstr "Dein Wiki"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:68
+msgid "Most downloaded first"
+msgstr "Meist heruntergeladene zuerst"
-#: ../../include/nav.php:115
-msgid "Sign in"
-msgstr "Anmelden"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:69
+msgid "Most liked first"
+msgstr "Beliebteste zuerst"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:71
+msgid "Preferred IDs Message"
+msgstr ""
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:71
+msgid "Message to display above preferred results."
+msgstr ""
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:77
+msgid "Uploaded by: "
+msgstr "Hochgeladen von: "
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:77
+msgid "Drawn by: "
+msgstr "Gezeichnet von: "
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:191
+msgid "Or select from a free OpenClipart.org image:"
+msgstr ""
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:194
+msgid "Search Term"
+msgstr "Suchbegriff"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:216
+msgid "Unknown error. Please try again later."
+msgstr "Unbekannter Fehler. Bitte versuchen Sie es später erneut."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:303
+msgid "Profile photo updated successfully."
+msgstr "Profilfoto erfolgreich aktualisiert."
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:146
+msgid "View Larger"
+msgstr "Größer anzeigen"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+msgid "Tile Server URL"
+msgstr "Kachelserver-URL"
-#: ../../include/nav.php:132
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+msgid ""
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" "
+"target=\"_blank\">public tile servers</a>"
+msgstr "Eine Liste <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">öffentlicher Kachelserver</a>"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+msgid "Nominatim (reverse geocoding) Server URL"
+msgstr "Nominatim (reverse Geokodierung) Server URL"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+msgid ""
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" "
+"target=\"_blank\">Nominatim servers</a>"
+msgstr "Eine Liste der <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">Nominatim Server</a>"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+msgid "Default zoom"
+msgstr "Standardzoom"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+msgid ""
+"The default zoom level. (1:world, 18:highest, also depends on tile server)"
+msgstr "Die Standard-Vergrößerungsstufe (1:Welt, 18:höchste, hängt außerdem vom Kachelserver ab)."
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+msgid "Include marker on map"
+msgstr "Markierung auf der Karte einschließen"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+msgid "Include a marker on the map."
+msgstr "Binde eine Markierung auf der Karte ein."
+
+#: ../../extend/addon/addon/pageheader/pageheader.php:43
+msgid "Message to display on every page on this server"
+msgstr "Nachricht, die auf jeder Seite dieses Servers angezeigt werden soll"
+
+#: ../../extend/addon/addon/pageheader/pageheader.php:48
+msgid "Pageheader Settings"
+msgstr "Nachrichtenkopf-Einstellungen"
+
+#: ../../extend/addon/addon/pageheader/pageheader.php:64
+msgid "pageheader Settings saved."
+msgstr "Nachrichtenkopf-Einstellungen gespeichert."
+
+#: ../../extend/addon/addon/piwik/piwik.php:85
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
+msgstr "Diese Website verwendet <a href='http://www.piwik.org'>Piwik</a>, um die Besucherzugriffe auszuwerten."
+
+#: ../../extend/addon/addon/piwik/piwik.php:88
#, php-format
-msgid "%s - click to logout"
-msgstr "%s - Klick zum Abmelden"
+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 möchtest, dass Deine Besuche zu diesem Zweck gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen, welches Piwik davon abhält, Deine weiteren Besuche auf dieser Website zu verfolgen</a> (Opt-out)."
-#: ../../include/nav.php:135
-msgid "Remote authentication"
-msgstr "Über Konto auf anderem Server einloggen"
+#: ../../extend/addon/addon/piwik/piwik.php:96
+msgid "Piwik Base URL"
+msgstr "Piwik Basis-URL"
-#: ../../include/nav.php:135
-msgid "Click to authenticate to your home hub"
-msgstr "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren"
+#: ../../extend/addon/addon/piwik/piwik.php:96
+msgid ""
+"Absolute path to your Piwik installation. (without protocol (http/s), with "
+"trailing slash)"
+msgstr "Der absolute Pfad zu Deiner Piwik-Installation (ohne Protokoll (http/s), aber mit abschließendem Schrägstrich / )."
-#: ../../include/nav.php:149
-msgid "Home Page"
-msgstr "Homepage"
+#: ../../extend/addon/addon/piwik/piwik.php:97
+msgid "Site ID"
+msgstr "Seitenkennung"
-#: ../../include/nav.php:152
-msgid "Create an account"
-msgstr "Erzeuge ein Konto"
+#: ../../extend/addon/addon/piwik/piwik.php:98
+msgid "Show opt-out cookie link?"
+msgstr "Den Opt-out Cookie-Link anzeigen?"
-#: ../../include/nav.php:164
-msgid "Help and documentation"
-msgstr "Hilfe und Dokumentation"
+#: ../../extend/addon/addon/piwik/piwik.php:99
+msgid "Asynchronous tracking"
+msgstr "Asynchrones Tracking"
-#: ../../include/nav.php:168
-msgid "Applications, utilities, links, games"
-msgstr "Anwendungen (Apps), Zubehör, Links, Spiele"
+#: ../../extend/addon/addon/piwik/piwik.php:100
+msgid "Enable frontend JavaScript error tracking"
+msgstr "Ermögliche Frontend-JavaScript-Fehlertracking"
-#: ../../include/nav.php:170
-msgid "Search site @name, #tag, ?docs, content"
-msgstr "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt"
+#: ../../extend/addon/addon/piwik/piwik.php:100
+msgid "This feature requires Piwik >= 2.2.0"
+msgstr "Diese Funktion erfordert Piwik >= 2.2.0"
-#: ../../include/nav.php:172
-msgid "Channel Directory"
-msgstr "Kanal-Verzeichnis"
+#: ../../extend/addon/addon/planets/planets.php:121
+msgid "Planets Settings updated."
+msgstr "Planeten Einstellungen aktualisiert"
-#: ../../include/nav.php:184
-msgid "Your grid"
-msgstr "Dein Grid"
+#: ../../extend/addon/addon/planets/planets.php:153
+msgid "Enable Planets Plugin"
+msgstr "Aktiviere Planeten Plugin"
-#: ../../include/nav.php:185
-msgid "Mark all grid notifications seen"
-msgstr "Alle Grid-Benachrichtigungen als angesehen markieren"
+#: ../../extend/addon/addon/planets/planets.php:157
+msgid "Planets Settings"
+msgstr "Planeten Einstellungen"
-#: ../../include/nav.php:187
-msgid "Channel home"
-msgstr "Mein Kanal"
+#: ../../extend/addon/addon/pumpio/pumpio.php:148
+msgid "You are now authenticated to pumpio."
+msgstr "Du bist nun bei pumpio authenzifiziert."
-#: ../../include/nav.php:188
-msgid "Mark all channel notifications seen"
-msgstr "Markiere alle Kanal-Benachrichtigungen als angesehen"
+#: ../../extend/addon/addon/pumpio/pumpio.php:149
+msgid "return to the featured settings page"
+msgstr ""
-#: ../../include/nav.php:194
-msgid "Notices"
-msgstr "Benachrichtigungen"
+#: ../../extend/addon/addon/pumpio/pumpio.php:163
+msgid "Post to Pump.io"
+msgstr "Bei pumpio veröffentlichen"
-#: ../../include/nav.php:194
-msgid "Notifications"
-msgstr "Benachrichtigungen"
+#: ../../extend/addon/addon/pumpio/pumpio.php:198
+msgid "Pump.io servername"
+msgstr "Pump.io-Servername"
-#: ../../include/nav.php:195
-msgid "See all notifications"
-msgstr "Alle Benachrichtigungen ansehen"
+#: ../../extend/addon/addon/pumpio/pumpio.php:198
+msgid "Without \"http://\" or \"https://\""
+msgstr "Ohne \"http://\" oder \"https://\""
-#: ../../include/nav.php:198
-msgid "Private mail"
-msgstr "Persönliche Mail"
+#: ../../extend/addon/addon/pumpio/pumpio.php:202
+msgid "Pump.io username"
+msgstr "Pump.io-Benutzername"
-#: ../../include/nav.php:199
-msgid "See all private messages"
-msgstr "Alle persönlichen Nachrichten ansehen"
+#: ../../extend/addon/addon/pumpio/pumpio.php:202
+msgid "Without the servername"
+msgstr "Ohne dem Servernamen"
-#: ../../include/nav.php:200
-msgid "Mark all private messages seen"
-msgstr "Markiere alle persönlichen Nachrichten als gesehen"
+#: ../../extend/addon/addon/pumpio/pumpio.php:213
+msgid "You are not authenticated to pumpio"
+msgstr "Du bist nicht bei pumpio authentifiziert."
-#: ../../include/nav.php:201 ../../include/widgets.php:700
-msgid "Inbox"
-msgstr "Eingang"
+#: ../../extend/addon/addon/pumpio/pumpio.php:215
+msgid "(Re-)Authenticate your pump.io connection"
+msgstr "Deine pumpio Verbindung (erneut) authentifizieren"
-#: ../../include/nav.php:202 ../../include/widgets.php:705
-msgid "Outbox"
-msgstr "Ausgang"
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+msgid "Enable pump.io Post Plugin"
+msgstr "Aktiviere das pumpio-Plugin"
-#: ../../include/nav.php:203 ../../include/widgets.php:710
-msgid "New Message"
-msgstr "Neue Nachricht"
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+msgid "Post to pump.io by default"
+msgstr "Standardmäßig bei pumpio veröffentlichen"
-#: ../../include/nav.php:206
-msgid "Event Calendar"
-msgstr "Terminkalender"
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+msgid "Should posts be public"
+msgstr "Sollen die Beiträge öffentlich sein"
-#: ../../include/nav.php:207
-msgid "See all events"
-msgstr "Alle Termine ansehen"
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+msgid "Mirror all public posts"
+msgstr "Öffentliche Beiträge spiegeln"
-#: ../../include/nav.php:208
-msgid "Mark all events seen"
-msgstr "Markiere alle Termine als gesehen"
+#: ../../extend/addon/addon/pumpio/pumpio.php:237
+msgid "Pump.io Post Settings"
+msgstr "Pump.io-Beitragseinstellungen"
-#: ../../include/nav.php:211
-msgid "Manage Your Channels"
-msgstr "Verwalte Deine Kanäle"
+#: ../../extend/addon/addon/pumpio/pumpio.php:266
+msgid "PumpIO Settings saved."
+msgstr "PumpIO-Einstellungen gespeichert."
-#: ../../include/nav.php:213
-msgid "Account/Channel Settings"
-msgstr "Konto-/Kanal-Einstellungen"
+#: ../../extend/addon/addon/qrator/qrator.php:48
+msgid "QR code"
+msgstr "QR-Code"
-#: ../../include/nav.php:221 ../../include/widgets.php:1590
-msgid "Admin"
-msgstr "Administration"
+#: ../../extend/addon/addon/qrator/qrator.php:63
+msgid "QR Generator"
+msgstr "QR-Generator"
-#: ../../include/nav.php:221
-msgid "Site Setup and Configuration"
-msgstr "Seiten-Einrichtung und -Konfiguration"
+#: ../../extend/addon/addon/qrator/qrator.php:64
+msgid "Enter some text"
+msgstr ""
-#: ../../include/nav.php:252 ../../include/conversation.php:855
-msgid "Loading..."
-msgstr "Lädt ..."
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+msgid "Enable Rainbowtag"
+msgstr "Rainbowtag aktivieren"
-#: ../../include/nav.php:257
-msgid "@name, #tag, ?doc, content"
-msgstr "@Name, #Schlagwort, ?Dokumentation, Inhalt"
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
+msgid "Rainbowtag Settings"
+msgstr "Rainbowtag-Einstellungen"
-#: ../../include/nav.php:258
-msgid "Please wait..."
-msgstr "Bitte warten..."
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:101
+msgid "Rainbowtag Settings saved."
+msgstr "Rainbowtag-Einstellungen gespeichert."
-#: ../../include/oembed.php:349
-msgid "Embedded content"
-msgstr "Eingebetteter Inhalt"
+#: ../../extend/addon/addon/randpost/randpost.php:97
+msgid "You're welcome."
+msgstr "Gern geschehen."
-#: ../../include/oembed.php:358
-msgid "Embedding disabled"
-msgstr "Einbetten deaktiviert"
+#: ../../extend/addon/addon/randpost/randpost.php:98
+msgid "Ah shucks..."
+msgstr ""
-#: ../../include/permissions.php:35
-msgid "Can view my normal stream and posts"
-msgstr "Kann meine normalen Beiträge sehen"
+#: ../../extend/addon/addon/randpost/randpost.php:99
+msgid "Don't mention it."
+msgstr "Keine Ursache."
-#: ../../include/permissions.php:39
-msgid "Can view my webpages"
-msgstr "Kann meine Webseiten sehen"
+#: ../../extend/addon/addon/randpost/randpost.php:100
+msgid "&lt;blush&gt;"
+msgstr ""
-#: ../../include/permissions.php:43
-msgid "Can post on my channel page (\"wall\")"
-msgstr "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen"
+#: ../../extend/addon/addon/redfiles/redfiles.php:119
+msgid "Redmatrix File Storage Import"
+msgstr ""
-#: ../../include/permissions.php:46
-msgid "Can like/dislike stuff"
-msgstr "Kann andere Elemente mögen/nicht mögen"
+#: ../../extend/addon/addon/redfiles/redfiles.php:120
+msgid "This will import all your Redmatrix cloud files to this channel."
+msgstr "Hiermit werden alle deine Daten aus der Redmatrix Cloud in diesen Kanal importiert."
-#: ../../include/permissions.php:46
-msgid "Profiles and things other than posts/comments"
-msgstr "Profile und alles außer Beiträge und Kommentare"
+#: ../../extend/addon/addon/redfiles/redfiles.php:121
+#: ../../extend/addon/addon/redphotos/redphotos.php:131
+msgid "Redmatrix Server base URL"
+msgstr "Basis-URL des Redmatrix Servers"
-#: ../../include/permissions.php:48
-msgid "Can forward to all my channel contacts via post @mentions"
-msgstr "Kann an alle meine Kontakte via @-Erwähnung Nachrichten weiterleiten"
+#: ../../extend/addon/addon/redfiles/redfiles.php:122
+#: ../../extend/addon/addon/redphotos/redphotos.php:132
+msgid "Redmatrix Login Username"
+msgstr "Redmatrix-Anmeldebenutzername"
-#: ../../include/permissions.php:48
-msgid "Advanced - useful for creating group forum channels"
-msgstr "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen"
+#: ../../extend/addon/addon/redfiles/redfiles.php:123
+#: ../../extend/addon/addon/redphotos/redphotos.php:133
+msgid "Redmatrix Login Password"
+msgstr "Redmatrix-Anmeldepasswort"
-#: ../../include/permissions.php:49
-msgid "Can chat with me (when available)"
-msgstr "Kann mit mir chatten (wenn verfügbar)"
+#: ../../extend/addon/addon/redfiles/redfilehelper.php:67
+msgid "file"
+msgstr "Datei"
-#: ../../include/permissions.php:50
-msgid "Can write to my file storage and photos"
-msgstr "Kann in meine Datei- und Bilderordner schreiben"
+#: ../../extend/addon/addon/redphotos/redphotos.php:106
+msgid "Photos imported"
+msgstr "Fotos importiert"
-#: ../../include/permissions.php:51
-msgid "Can edit my webpages"
-msgstr "Kann meine Webseiten bearbeiten"
+#: ../../extend/addon/addon/redphotos/redphotos.php:129
+msgid "Redmatrix Photo Album Import"
+msgstr "Redmatrix-Fotoalbumimport"
-#: ../../include/permissions.php:53
-msgid "Somewhat advanced - very useful in open communities"
-msgstr "Etwas fortgeschritten – sehr nützlich in offenen Gemeinschaften"
+#: ../../extend/addon/addon/redphotos/redphotos.php:130
+msgid "This will import all your Redmatrix photo albums to this channel."
+msgstr "Hiermit werden all deine Fotoalben von Redmatrix in diesen Kanal importiert."
-#: ../../include/permissions.php:55
-msgid "Can administer my channel resources"
-msgstr "Kann meine Kanäle administrieren"
+#: ../../extend/addon/addon/redphotos/redphotos.php:134
+msgid "Import just this album"
+msgstr "Nur dieses Album importieren"
-#: ../../include/permissions.php:55
+#: ../../extend/addon/addon/redphotos/redphotos.php:134
+msgid "Leave blank to import all albums"
+msgstr "Leer lassen um alle Alben zu importieren"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:135
+msgid "Maximum count to import"
+msgstr "Maximal zu importierende Anzahl"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:135
+msgid "0 or blank to import all available"
+msgstr "0 oder leer lassen um alles zu importieren"
+
+#: ../../extend/addon/addon/redred/redred.php:45
+msgid "Post to Red"
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:60
+msgid "Channel is required."
+msgstr "Kanal ist erforderlich."
+
+#: ../../extend/addon/addon/redred/redred.php:65
+msgid "Invalid channel."
+msgstr "Ungültiger Kanal."
+
+#: ../../extend/addon/addon/redred/redred.php:76
+msgid "redred Settings saved."
+msgstr "redred-Einstellungen gespeichert."
+
+#: ../../extend/addon/addon/redred/redred.php:95
+msgid "Allow posting to another Hubzilla Channel"
+msgstr "Erlaube die Veröffentlichung in anderen Hubzilla Kanälen"
+
+#: ../../extend/addon/addon/redred/redred.php:99
+msgid "Send public postings to Hubzilla channel by default"
+msgstr ""
+
+#: ../../extend/addon/addon/redred/redred.php:103
+msgid "Hubzilla API Path"
+msgstr "Hubzilla-API-Pfad"
+
+#: ../../extend/addon/addon/redred/redred.php:103
+#: ../../extend/addon/addon/rtof/rtof.php:89
+msgid "https://{sitename}/api"
+msgstr "https://{sitename}/api"
+
+#: ../../extend/addon/addon/redred/redred.php:107
+msgid "Hubzilla login name"
+msgstr "Hubzilla-Anmeldename"
+
+#: ../../extend/addon/addon/redred/redred.php:111
+msgid "Hubzilla channel name"
+msgstr "Hubzilla-Kanalname"
+
+#: ../../extend/addon/addon/redred/redred.php:111
+#: ../../extend/addon/addon/openid/MysqlProvider.php:54
+msgid "Nickname"
+msgstr "Spitzname"
+
+#: ../../extend/addon/addon/redred/redred.php:119
+msgid "Hubzilla Crosspost Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/rtof/rtof.php:45
+msgid "Post to Friendica"
+msgstr "Bei Friendica veröffentlichen"
+
+#: ../../extend/addon/addon/rtof/rtof.php:62
+msgid "rtof Settings saved."
+msgstr "rtof-Einstellungen gespeichert."
+
+#: ../../extend/addon/addon/rtof/rtof.php:81
+msgid "Allow posting to Friendica"
+msgstr "Erlaube die Veröffentlichung bei Friendica"
+
+#: ../../extend/addon/addon/rtof/rtof.php:85
+msgid "Send public postings to Friendica by default"
+msgstr "Standardmäßig öffentliche Beiträge bei Friendica veröffentlichen"
+
+#: ../../extend/addon/addon/rtof/rtof.php:89
+msgid "Friendica API Path"
+msgstr "Friendica-API-Pfad"
+
+#: ../../extend/addon/addon/rtof/rtof.php:93
+msgid "Friendica login name"
+msgstr "Friendica-Anmeldename"
+
+#: ../../extend/addon/addon/rtof/rtof.php:97
+msgid "Friendica password"
+msgstr "Friendica-Passwort"
+
+#: ../../extend/addon/addon/rtof/rtof.php:101
+msgid "Hubzilla to Friendica Post Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/sendzid/sendzid.php:25
+msgid "Extended Identity Sharing"
+msgstr "Erweitertes Teilen von Identitäten"
+
+#: ../../extend/addon/addon/sendzid/sendzid.php:26
msgid ""
-"Extremely advanced. Leave this alone unless you know what you are doing"
-msgstr "Sehr fortgeschritten. Bearbeite das nur, wenn Du genau weißt, was Du tust"
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr ""
-#: ../../include/import.php:30
+#: ../../extend/addon/addon/skeleton/skeleton.php:59
+msgid "Some setting"
+msgstr ""
+
+#: ../../extend/addon/addon/skeleton/skeleton.php:61
+msgid "A setting"
+msgstr "Eine Einstellung"
+
+#: ../../extend/addon/addon/skeleton/skeleton.php:64
+msgid "Skeleton Settings"
+msgstr ""
+
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+msgid "Deactivate the feature"
+msgstr "Diese Funktion abschalten"
+
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+msgid "Hide the button and show the smilies directly."
+msgstr "Verstecke die Schaltfläche und zeige die Smilies direkt an."
+
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
+msgid "Smileybutton Settings"
+msgstr "Smileyknopf-Einstellungen"
+
+#: ../../extend/addon/addon/startpage/startpage.php:109
+msgid "Page to load after login"
+msgstr "Seite, die nach dem Login geladen werden soll"
+
+#: ../../extend/addon/addon/startpage/startpage.php:109
msgid ""
-"Cannot create a duplicate channel identifier on this system. Import failed."
-msgstr "Kann keinen doppelten Kanal-Identifikator auf diesem System erzeugen (Spitzname oder Hash schon belegt). Import fehlgeschlagen."
+"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
+"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
+"blank for default network page (grid)."
+msgstr "Beispiele: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (Gruppen-gefilterte Beiträge), &quot;channel&quot; oder &quot;notifications/system&quot; (freilassen für die Standard-Netzwerkseite (grid)."
-#: ../../include/import.php:97
-msgid "Channel clone failed. Import failed."
-msgstr "Klonen des Kanals fehlgeschlagen. Import fehlgeschlagen."
+#: ../../extend/addon/addon/startpage/startpage.php:113
+msgid "Startpage Settings"
+msgstr "Startseiteneinstellungen"
-#: ../../include/import.php:1441
-msgid "Unable to import element \""
+#: ../../extend/addon/addon/statusnet/statusnet.php:143
+msgid "Post to GNU social"
+msgstr "Bei GNU social veröffentlichen"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:195
+msgid ""
+"Please contact your site administrator.<br />The provided API URL is not "
+"valid."
+msgstr "Bitte kontaktiere den Administrator deines Hubs.<br />Die angegebene API URL ist nicht korrekt."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:232
+msgid "We could not contact the GNU social API with the Path you entered."
+msgstr "Mit dem angegebenen Pfad war es uns nicht möglich, die GNU social API zu erreichen."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:266
+msgid "GNU social settings updated."
+msgstr "GNU social Einstellungen aktualisiert."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:310
+msgid "Globally Available GNU social OAuthKeys"
+msgstr "Global verfügbare GNU social OAuthKeys"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:312
+msgid ""
+"There are preconfigured OAuth key pairs for some GNU social servers "
+"available. If you are using one of them, please use these credentials.<br "
+"/>If not feel free to connect to any other GNU social instance (see below)."
msgstr ""
-#: ../../include/items.php:918 ../../include/items.php:963
-msgid "(Unknown)"
-msgstr "(Unbekannt)"
+#: ../../extend/addon/addon/statusnet/statusnet.php:327
+msgid "Provide your own OAuth Credentials"
+msgstr ""
-#: ../../include/items.php:1162
-msgid "Visible to anybody on the internet."
-msgstr "Für jeden im Internet sichtbar."
+#: ../../extend/addon/addon/statusnet/statusnet.php:329
+msgid ""
+"No consumer key pair for GNU social found. Register your Hubzilla Account as"
+" an desktop client on your GNU social 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 "
+"Hubzilla installation at your favourite GNU social installation."
+msgstr ""
-#: ../../include/items.php:1164
-msgid "Visible to you only."
-msgstr "Nur für Dich sichtbar."
+#: ../../extend/addon/addon/statusnet/statusnet.php:333
+msgid "OAuth Consumer Key"
+msgstr "OAuth Consumer Key"
-#: ../../include/items.php:1166
-msgid "Visible to anybody in this network."
-msgstr "Für jedes $Projectname-Mitglied sichtbar."
+#: ../../extend/addon/addon/statusnet/statusnet.php:337
+msgid "OAuth Consumer Secret"
+msgstr "OAuth Consumer Secret"
-#: ../../include/items.php:1168
-msgid "Visible to anybody authenticated."
-msgstr "Für jeden sichtbar, der angemeldet ist."
+#: ../../extend/addon/addon/statusnet/statusnet.php:341
+msgid "Base API Path"
+msgstr "Basis Pfad der API"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:341
+msgid "Remember the trailing /"
+msgstr "Denke an das abschließende /"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:345
+msgid "GNU social application name"
+msgstr "GNU social Anwendungsname"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:368
+msgid ""
+"To connect to your GNU social account click the button below to get a "
+"security code from GNU social which you have to copy into the input box "
+"below and submit the form. Only your <strong>public</strong> posts will be "
+"posted to GNU social."
+msgstr ""
-#: ../../include/items.php:1170
+#: ../../extend/addon/addon/statusnet/statusnet.php:370
+msgid "Log in with GNU social"
+msgstr "Mit GNU social anmelden"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:373
+msgid "Copy the security code from GNU social here"
+msgstr "Kopiere den Sicherheitscode von GNU social hier her"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:383
+msgid "Cancel Connection Process"
+msgstr "Verbindungsprozes abbrechen"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:385
+msgid "Current GNU social API is"
+msgstr "Aktuelle GNU social API ist"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+msgid "Cancel GNU social Connection"
+msgstr "GNU social Verbindung trennen"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:401
+#: ../../extend/addon/addon/twitter/twitter.php:232
+msgid "Currently connected to: "
+msgstr "Momentan verbunden mit:"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:406
+msgid ""
+"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to GNU social will lead the visitor to a blank page "
+"informing the visitor that the access to your profile has been restricted."
+msgstr ""
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+msgid "Allow posting to GNU social"
+msgstr "Erlaube die Veröffentlichung bei GNU social"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+msgid ""
+"If enabled your public postings can be posted to the associated GNU-social "
+"account"
+msgstr "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen GNU social Account veröffentlicht werden."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+msgid "Post to GNU social by default"
+msgstr "Standardmäßig bei GNU social veröffentlichen"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+msgid ""
+"If enabled your public postings will be posted to the associated GNU-social "
+"account by default"
+msgstr "Wenn aktiv werden all deine öffentlichen Beiträge standardmäßig bei dem verbundenen GNU social Account veröffentlicht."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:255
+msgid "Clear OAuth configuration"
+msgstr "OAuth Konfiguration löschen"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:432
+msgid "GNU social Post Settings"
+msgstr "GNU social Einstellungen"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:891
+msgid "API URL"
+msgstr "API-URL"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:894
+msgid "Application name"
+msgstr "Anwendungsname"
+
+#: ../../extend/addon/addon/superblock/superblock.php:106
+msgid "Currently blocked"
+msgstr "Derzeit blockiert"
+
+#: ../../extend/addon/addon/superblock/superblock.php:108
+msgid "No channels currently blocked"
+msgstr "Momentan sind keine Kanäle blockiert"
+
+#: ../../extend/addon/addon/superblock/superblock.php:114
+msgid "\"Superblock\" Settings"
+msgstr "\"Superblock\"-Einstellungen"
+
+#: ../../extend/addon/addon/superblock/superblock.php:279
+msgid "Block Completely"
+msgstr "Vollständig blockieren"
+
+#: ../../extend/addon/addon/superblock/superblock.php:326
+msgid "superblock settings updated"
+msgstr "Superblock Einstellungen aktualisiert"
+
+#: ../../extend/addon/addon/testdrive/testdrive.php:104
#, php-format
-msgid "Visible to anybody on %s."
-msgstr "Für jeden auf %s sichtbar."
+msgid "Your account on %s will expire in a few days."
+msgstr "Dein Account auf %s wird in ein paar Tagen ablaufen."
-#: ../../include/items.php:1172
-msgid "Visible to all connections."
-msgstr "Für alle Verbindungen sichtbar."
+#: ../../extend/addon/addon/testdrive/testdrive.php:105
+msgid "Your $Productname test account is about to expire."
+msgstr "Dein $Productname Test-Account wird bald auslaufen."
-#: ../../include/items.php:1174
-msgid "Visible to approved connections."
-msgstr "Nur für akzeptierte Verbindungen sichtbar."
+#: ../../extend/addon/addon/tictac/tictac.php:21
+msgid "Three Dimensional Tic-Tac-Toe"
+msgstr "Dreidimensionales Tic-Tac-Toe"
-#: ../../include/items.php:1176
-msgid "Visible to specific connections."
-msgstr "Sichtbar für bestimmte Verbindungen."
+#: ../../extend/addon/addon/tictac/tictac.php:54
+msgid "3D Tic-Tac-Toe"
+msgstr "3D Tic-Tac-Toe"
-#: ../../include/items.php:3966
-msgid "Privacy group is empty."
-msgstr "Gruppe ist leer."
+#: ../../extend/addon/addon/tictac/tictac.php:59
+msgid "New game"
+msgstr "Neues Spiel"
+
+#: ../../extend/addon/addon/tictac/tictac.php:60
+msgid "New game with handicap"
+msgstr "Neues Handicaü-Spiel"
+
+#: ../../extend/addon/addon/tictac/tictac.php:61
+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 funktioniert wie das ursprüngliche Spiel, nur dass es auf mehreren Ebenen gleichzeitig gespielt wird."
+
+#: ../../extend/addon/addon/tictac/tictac.php:62
+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. Du gewinnst, wenn es dir gelingt drei in einer Reihe auf einer beliebigen Ebene oder diagonal über die verschiedenen Ebenen hinweg zu erreichen."
+
+#: ../../extend/addon/addon/tictac/tictac.php:64
+msgid ""
+"The handicap game disables the center position on the middle level because "
+"the player claiming this square often has an unfair advantage."
+msgstr "Bei einem Handicap-Spiel wird die Position im Zentrum der mittleren Ebene gesperrt, da der Spieler der dieses Feld für sich beansprucht meist einen unfairen Vorteil hat."
+
+#: ../../extend/addon/addon/tictac/tictac.php:183
+msgid "You go first..."
+msgstr "Du darfst anfangen..."
+
+#: ../../extend/addon/addon/tictac/tictac.php:188
+msgid "I'm going first this time..."
+msgstr "Diesmal werde ich anfangen..."
+
+#: ../../extend/addon/addon/tictac/tictac.php:194
+msgid "You won!"
+msgstr "Sie haben gewonnen!"
+
+#: ../../extend/addon/addon/tictac/tictac.php:200
+#: ../../extend/addon/addon/tictac/tictac.php:225
+msgid "\"Cat\" game!"
+msgstr ""
+
+#: ../../extend/addon/addon/tictac/tictac.php:223
+msgid "I won!"
+msgstr "Ich habe gewonnen!"
+
+#: ../../extend/addon/addon/tour/tour.php:75
+msgid "Edit your profile and change settings."
+msgstr "Bearbeite dein Profil und ändere die Einstellungen."
+
+#: ../../extend/addon/addon/tour/tour.php:76
+msgid "Click here to see activity from your connections."
+msgstr "Klicke hier, um die Aktivitäten Deiner Verbindungen zu sehen."
+
+#: ../../extend/addon/addon/tour/tour.php:77
+msgid "Click here to see your channel home."
+msgstr "Klicke hier, um Deine Kanal-Hauptseite zu sehen."
+
+#: ../../extend/addon/addon/tour/tour.php:78
+msgid "You can access your private messages from here."
+msgstr "Hierüber kannst Du auf Deine privaten Nachrichten zugreifen."
+
+#: ../../extend/addon/addon/tour/tour.php:79
+msgid "Create new events here."
+msgstr "Neue Termine hier erstellen"
+
+#: ../../extend/addon/addon/tour/tour.php:80
+msgid ""
+"You can accept new connections and change permissions for existing ones "
+"here. You can also e.g. create groups of contacts."
+msgstr "Du kannst hier neue Verbindungen akzeptieren sowie die Einstellungen bereits vorhandener Vebindungen bearbeiten. Außerdem kannst Du Verbindungen in Gruppen zusammenfassen."
+
+#: ../../extend/addon/addon/tour/tour.php:81
+msgid "System notifications will arrive here"
+msgstr "Systembenachrichtigungen werden hier eintreffen"
+
+#: ../../extend/addon/addon/tour/tour.php:82
+msgid "Search for content and users"
+msgstr "Nach Inhalt von Benutzern suchen"
+
+#: ../../extend/addon/addon/tour/tour.php:83
+msgid "Browse for new contacts"
+msgstr "Schaue nach möglichen neuen Verbindungen."
+
+#: ../../extend/addon/addon/tour/tour.php:84
+msgid "Launch installed apps"
+msgstr "Installierte Apps starten"
+
+#: ../../extend/addon/addon/tour/tour.php:85
+msgid "Looking for help? Click here."
+msgstr "Du benötigst Hilfe? Klicke hier."
+
+#: ../../extend/addon/addon/tour/tour.php:86
+msgid ""
+"New events have occurred in your network. Click here to see what has "
+"happened!"
+msgstr "In Deinem Netzwerk gibt es neue Ereignisse. Klicke hier, um zu sehen, was passiert ist!"
+
+#: ../../extend/addon/addon/tour/tour.php:87
+msgid "You have received a new private message. Click here to see from who!"
+msgstr "Du hast eine neue private Nachricht erhalten. Klicke hier, um zu sehen, von wem!"
+
+#: ../../extend/addon/addon/tour/tour.php:88
+msgid "There are events this week. Click here too see which!"
+msgstr "Es gibt neue Termine diese Woche. Klicke hier, um zu sehen, welche!"
+
+#: ../../extend/addon/addon/tour/tour.php:89
+msgid "You have received a new introduction. Click here to see who!"
+msgstr "Du hast eine neue Verbindungsanfrage erhalten. Klicke hier, um zu sehen, wer es ist!"
+
+#: ../../extend/addon/addon/tour/tour.php:90
+msgid ""
+"There is a new system notification. Click here to see what has happened!"
+msgstr "Es gibt eine neue Systembenachrichtigung. Klicke hier, um zu sehen, was passiert ist!"
+
+#: ../../extend/addon/addon/tour/tour.php:93
+msgid "Click here to share text, images, videos and sound."
+msgstr "Klicke hier, um Texte, Bilder, Videos und Klänge zu teilen."
+
+#: ../../extend/addon/addon/tour/tour.php:94
+msgid "You can write an optional title for your update (good for long posts)."
+msgstr "Du kannst Deinem Beitrag einen optionalen Titel geben (gut für lange Beiträge)."
-#: ../../include/items.php:3973
+#: ../../extend/addon/addon/tour/tour.php:95
+msgid "Entering some categories here makes it easier to find your post later."
+msgstr "Ein paar Kategorien hier einzugeben, macht es leichter, Deinen Beitrag später wiederzufinden."
+
+#: ../../extend/addon/addon/tour/tour.php:96
+msgid "Share photos, links, location, etc."
+msgstr "Teile Photos, Links, Standort, usw."
+
+#: ../../extend/addon/addon/tour/tour.php:97
+msgid ""
+"Only want to share content for a while? Make it expire at a certain date."
+msgstr "Du möchtest diesen Inhalt nur für eine Weile teilen? Dann lass ihn zu einem bestimmten Datum ablaufen."
+
+#: ../../extend/addon/addon/tour/tour.php:98
+msgid "You can password protect content."
+msgstr "Du kannst Inhalte mit einem Passwort schützen."
+
+#: ../../extend/addon/addon/tour/tour.php:99
+msgid "Choose who you share with."
+msgstr "Wähle aus, mit wem Du teilen möchtest."
+
+#: ../../extend/addon/addon/tour/tour.php:101
+msgid "Click here when you are done."
+msgstr "Klicke hier, wenn Du fertig bist."
+
+#: ../../extend/addon/addon/tour/tour.php:104
+msgid "Adjust from which channels posts should be displayed."
+msgstr "Lege fest, von welchen Kanälen Beiträge angezeigt werden sollen."
+
+#: ../../extend/addon/addon/tour/tour.php:105
+msgid "Only show posts from channels in the specified privacy group."
+msgstr "Zeige nur Beträge von Kanälen, die in einer bestimmten Gruppe sind."
+
+#: ../../extend/addon/addon/tour/tour.php:109
+msgid "Easily find posts containing tags (keywords preceded by the \"#\" symbol)."
+msgstr "Finde Beiträge, die bestimmte Tags enthalten (Stichworte, die mit dem \"#\"-Symbol beginnen)."
+
+#: ../../extend/addon/addon/tour/tour.php:110
+msgid "Easily find posts in given category."
+msgstr "Finde Beiträge in bestimmten Kategorien."
+
+#: ../../extend/addon/addon/tour/tour.php:111
+msgid "Easily find posts by date."
+msgstr "Finde Beiträge anhand des Datums."
+
+#: ../../extend/addon/addon/tour/tour.php:112
+msgid ""
+"Suggested users who have volounteered to be shown as suggestions, and who we"
+" think you might find interesting."
+msgstr "Vorgeschlagene Kanäle, die in ihren Einstellungen zugestimmt haben, als Vorschläge angezeigt zu werden, und die Du eventuell interessant finden könntest."
+
+#: ../../extend/addon/addon/tour/tour.php:113
+msgid "Here you see channels you have connected to."
+msgstr "Hier siehst du die Kanäle, mit denen Du verbunden bist."
+
+#: ../../extend/addon/addon/tour/tour.php:114
+msgid "Save your search so you can repeat it at a later date."
+msgstr "Speichere Deine Suche, so dass Du sie später leicht erneut durchführen kannst."
+
+#: ../../extend/addon/addon/tour/tour.php:117
+msgid ""
+"If you see this icon you can be sure that the sender is who it say it is. It"
+" is normal that it is not always possible to verify the sender, so the icon "
+"will be missing sometimes. There is usually no need to worry about that."
+msgstr "Wenn Du dieses Symbol siehst, kannst Du weitgehend sicher sein, dass der Ansender dem angegebenen entspricht. Nicht immer ist es möglich, den Absender zu verifizieren, daher fehlt das Symbol mitunter. Das ist aber in der Regel kein Grund zur Sorge."
+
+#: ../../extend/addon/addon/tour/tour.php:118
+msgid ""
+"Danger! It seems someone tried to forge a message! This message is not "
+"necessarily from who it says it is from!"
+msgstr "Vorsicht! Es kann sein, dass jemand versucht, eine Nachricht zu fälschen! Diese Nachricht muss nicht unbedingt vom angegebenen Absender stammen!"
+
+#: ../../extend/addon/addon/tour/tour.php:125
+msgid ""
+"Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can "
+"pause it at any time and continue where you left off by reloading the page, "
+"or navigting to another page.</p><p>You can also advance by pressing the "
+"return key"
+msgstr "Willkommen zu Hubzilla! Möchtest Du eine Tour der Benutzeroberfläche angezeigt bekommen?</p><p>Du kannst zu jeder Zeit pausieren und fortsetzen, wo Du aufgehört hast, indem Du die Seite neu lädtst, oder zu einer anderen Seite springst.</p><p>Du kannst auc durch das Drücken der Enter-Taste weitergehen."
+
+#: ../../extend/addon/addon/twitter/twitter.php:99
+msgid "Post to Twitter"
+msgstr "Bei Twitter veröffentlichen"
+
+#: ../../extend/addon/addon/twitter/twitter.php:154
+msgid "Twitter settings updated."
+msgstr "Twitter-Einstellungen aktualisiert."
+
+#: ../../extend/addon/addon/twitter/twitter.php:183
+msgid ""
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
+msgstr ""
+
+#: ../../extend/addon/addon/twitter/twitter.php:205
+msgid ""
+"At this Hubzilla 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 ""
+
+#: ../../extend/addon/addon/twitter/twitter.php:207
+msgid "Log in with Twitter"
+msgstr "Mit Twitter anmelden"
+
+#: ../../extend/addon/addon/twitter/twitter.php:210
+msgid "Copy the PIN from Twitter here"
+msgstr "PIN von Twitter hier her kopieren"
+
+#: ../../extend/addon/addon/twitter/twitter.php:237
+msgid ""
+"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to Twitter will lead the visitor to a blank page informing "
+"the visitor that the access to your profile has been restricted."
+msgstr ""
+
+#: ../../extend/addon/addon/twitter/twitter.php:242
+msgid "Allow posting to Twitter"
+msgstr "Erlaube die Veröffentlichung bei Twitter"
+
+#: ../../extend/addon/addon/twitter/twitter.php:242
+msgid ""
+"If enabled your public postings can be posted to the associated Twitter "
+"account"
+msgstr "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twitter Account veröffentlicht werden."
+
+#: ../../extend/addon/addon/twitter/twitter.php:246
+msgid "Send public postings to Twitter by default"
+msgstr "Standardmäßig öffentliche Beiträge bei Twitter veröffentlichen"
+
+#: ../../extend/addon/addon/twitter/twitter.php:246
+msgid ""
+"If enabled your public postings will be posted to the associated Twitter "
+"account by default"
+msgstr "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twitter Account veröffentlicht werden."
+
+#: ../../extend/addon/addon/twitter/twitter.php:264
+msgid "Twitter Post Settings"
+msgstr "Twitter-Beitragseinstellungen"
+
+#: ../../extend/addon/addon/twitter/twitter.php:773
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:95
+msgid "Submit Settings"
+msgstr "Einstellungen absenden"
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:25
+msgid "Show Upload Limits"
+msgstr "Hochladebeschränkungen anzeigen"
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:27
+msgid "Hubzilla configured maximum size: "
+msgstr "Die in Hubzilla eingestellte maximale Größe:"
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:28
+msgid "PHP upload_max_filesize: "
+msgstr "PHP upload_max_filesize:"
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:29
+msgid "PHP post_max_size (must be larger than upload_max_filesize): "
+msgstr "PHP post_max_size (muss größer sein als upload_max_filesize):"
+
+#: ../../extend/addon/addon/visage/visage.php:93
+msgid "Recent Channel/Profile Viewers"
+msgstr "Kürzliche Kanal/Profil Besucher"
+
+#: ../../extend/addon/addon/visage/visage.php:98
+msgid "This plugin/addon has not been configured."
+msgstr "Dieses Plugin/Addon wurde noch nicht konfiguriert."
+
+#: ../../extend/addon/addon/visage/visage.php:99
#, php-format
-msgid "Privacy group: %s"
-msgstr "Gruppe: %s"
+msgid "Please visit the Visage settings on %s"
+msgstr "Bitte rufe die Visage Einstellungen auf %s auf"
-#: ../../include/items.php:3985
-msgid "Connection not found."
-msgstr "Die Verbindung wurde nicht gefunden."
+#: ../../extend/addon/addon/visage/visage.php:99
+msgid "your feature settings page"
+msgstr ""
-#: ../../include/items.php:4338
-msgid "profile photo"
-msgstr "Profilfoto"
+#: ../../extend/addon/addon/visage/visage.php:112
+msgid "No entries."
+msgstr "Keine Einträge."
+
+#: ../../extend/addon/addon/visage/visage.php:166
+msgid "Enable Visage Visitor Logging"
+msgstr "Aktiviere das Visage-Besucher Logging"
+
+#: ../../extend/addon/addon/visage/visage.php:170
+msgid "Visage Settings"
+msgstr "Visage-Einstellungen"
+
+#: ../../extend/addon/addon/wholikesme/wholikesme.php:29
+msgid "Who likes me?"
+msgstr "Wer mag mich?"
+
+#: ../../extend/addon/addon/wppost/wppost.php:45
+msgid "Post to WordPress"
+msgstr "Auf WordPress posten"
+
+#: ../../extend/addon/addon/wppost/wppost.php:82
+msgid "Enable WordPress Post Plugin"
+msgstr "Aktiviere das WordPress-Plugin"
+
+#: ../../extend/addon/addon/wppost/wppost.php:86
+msgid "WordPress username"
+msgstr "WordPress-Benutzername"
+
+#: ../../extend/addon/addon/wppost/wppost.php:90
+msgid "WordPress password"
+msgstr "WordPress-Passwort"
+
+#: ../../extend/addon/addon/wppost/wppost.php:94
+msgid "WordPress API URL"
+msgstr "WordPress-API-URL"
+
+#: ../../extend/addon/addon/wppost/wppost.php:95
+msgid "Typically https://your-blog.tld/xmlrpc.php"
+msgstr "Normalerweise https://your-blog.tld/xmlrpc.php"
+
+#: ../../extend/addon/addon/wppost/wppost.php:98
+msgid "WordPress blogid"
+msgstr "WordPress blogid"
+
+#: ../../extend/addon/addon/wppost/wppost.php:99
+msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
+msgstr "Nötig für Mehrbenutzer Seiten wie wordpress.com, andernfalls frei lassen"
+
+#: ../../extend/addon/addon/wppost/wppost.php:105
+msgid "Post to WordPress by default"
+msgstr "Standardmäßig auf auf WordPress posten"
+
+#: ../../extend/addon/addon/wppost/wppost.php:109
+msgid "Forward comments (requires hubzilla_wp plugin)"
+msgstr "Kommentare weiterleiten (benötigt hubzilla_wp Plugin)"
+
+#: ../../extend/addon/addon/wppost/wppost.php:113
+msgid "WordPress Post Settings"
+msgstr "WordPress-Beitragseinstellungen"
+
+#: ../../extend/addon/addon/wppost/wppost.php:129
+msgid "Wordpress Settings saved."
+msgstr "Wordpress-Einstellungen gespeichert."
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:31
+msgid "XMPP settings updated."
+msgstr "XMPP-Einstellungen aktualisiert."
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+msgid "Enable Chat"
+msgstr "Chat aktivieren"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:58
+msgid "Individual credentials"
+msgstr "Individuelle Anmeldedaten"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:64
+msgid "Jabber BOSH server"
+msgstr "Jabber BOSH Server"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:69
+msgid "XMPP Settings"
+msgstr "XMPP-Einstellungen"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:92
+msgid "Jabber BOSH host"
+msgstr "Jabber BOSH Host"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:93
+msgid "Use central userbase"
+msgstr "Zentrale Benutzerbasis verwenden"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:93
+msgid ""
+"If enabled, members will automatically login to an ejabberd server that has "
+"to be installed on this machine with synchronized credentials via the "
+"\"auth_ejabberd.php\" script."
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:37
+msgid "Select Channel"
+msgstr "Kanal auswählen"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:42
+msgid "Read-write"
+msgstr "Lesen-schreiben"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:43
+msgid "Read-only"
+msgstr "Nur Lesen"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:116
+msgid "My Calendars"
+msgstr "Meine Kalender"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:118
+msgid "Shared Calendars"
+msgstr "Geteilte Kalender"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:122
+msgid "Share this calendar"
+msgstr "Diesen Kalender teilen"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:124
+msgid "Calendar name and color"
+msgstr "Kalendername und -farbe"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:126
+msgid "Create new calendar"
+msgstr "Neuen Kalender erstellen"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:128
+msgid "Calendar Name"
+msgstr "Kalendername"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:129
+msgid "Calendar Tools"
+msgstr "Kalenderwerkzeuge"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:130
+msgid "Import calendar"
+msgstr "Kalender importieren"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:131
+msgid "Select a calendar to import to"
+msgstr "Kalender zum Hineinimportieren auswählen"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:158
+msgid "Addressbooks"
+msgstr "Adressbücher"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:160
+msgid "Addressbook name"
+msgstr "Adressbuchname"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:162
+msgid "Create new addressbook"
+msgstr "Neues Adressbuch erstellen"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:163
+msgid "Addressbook Name"
+msgstr "Adressbuchname"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:165
+msgid "Addressbook Tools"
+msgstr "Adressbuchwerkzeuge"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:166
+msgid "Import addressbook"
+msgstr "Adressbuch importieren"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:167
+msgid "Select an addressbook to import to"
+msgstr "Adressbuch zum Hineinimportieren auswählen"
+
+#: ../../extend/addon/addon/cdav/cdav.php:36
+msgid "Errors encountered creating database table: "
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/cdav.php:197
+msgid "Default Calendar"
+msgstr "Standardkalender"
+
+#: ../../extend/addon/addon/cdav/cdav.php:206
+msgid "Default Addressbook"
+msgstr "Standardadressbuch"
+
+#: ../../extend/addon/addon/cdav/cdav.php:215
+msgid "CalDAV/CardDAV Settings saved."
+msgstr "CalDAV/CardDAV-Einstellungen gespeichert."
+
+#: ../../extend/addon/addon/cdav/cdav.php:234
+msgid "Enable CalDAV/CardDAV Server for this channel"
+msgstr "Aktiviere den CalDAV/CardDAV Server für diesen Kanal"
+
+#: ../../extend/addon/addon/cdav/cdav.php:237
+#, php-format
+msgid "Your CalDAV resources are located at %s "
+msgstr "Deine CalDAV Resourcen sind unter %s verfügbar"
+
+#: ../../extend/addon/addon/cdav/cdav.php:240
+#, php-format
+msgid "Your CardDAV resources are located at %s "
+msgstr "Deine CardDAV Ressourcen sind unter %s verfügbar"
+
+#: ../../extend/addon/addon/cdav/cdav.php:246
+msgid "CalDAV/CardDAV Settings"
+msgstr "CalDAV/CardDAV-Einstellungen"
+
+#: ../../extend/addon/addon/cdav/cdav.php:270
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145
+msgid "Mobile"
+msgstr "Mobil"
+
+#: ../../extend/addon/addon/cdav/cdav.php:271
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146 ../../include/nav.php:88
+msgid "Home"
+msgstr "Home"
+
+#: ../../extend/addon/addon/cdav/cdav.php:272
+msgid "Home, Voice"
+msgstr "Zuhause, Sprache"
+
+#: ../../extend/addon/addon/cdav/cdav.php:273
+msgid "Home, Fax"
+msgstr "Zuhause, Fax"
+
+#: ../../extend/addon/addon/cdav/cdav.php:274
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147
+msgid "Work"
+msgstr "Arbeit"
+
+#: ../../extend/addon/addon/cdav/cdav.php:275
+msgid "Work, Voice"
+msgstr "Arbeit, Sprache"
+
+#: ../../extend/addon/addon/cdav/cdav.php:276
+msgid "Work, Fax"
+msgstr "Arbeit, Fax"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:744
+msgid "INVALID EVENT DISMISSED!"
+msgstr "UNGÜLTIGEN TERMIN ABGELEHNT!"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
+msgid "Summary: "
+msgstr "Zusammenfassung:"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
+msgid "Date: "
+msgstr "Datum:"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:747
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:754
+msgid "Reason: "
+msgstr "Grund:"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:752
+msgid "INVALID CARD DISMISSED!"
+msgstr "UNGÜLTIGE KARTE ABGELEHNT!"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
+msgid "Name: "
+msgstr "Name: "
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:770
+msgid ""
+"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
+"Settings before you can use it."
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
+msgid "Example: YYYY-MM-DD HH:mm"
+msgstr "Beispiel: JJJJ-MM-TT HH:mm"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
+msgid "End date and time"
+msgstr "Enddatum und -zeit"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:852
+msgid "List month"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:853
+msgid "List week"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:854
+msgid "List day"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:861
+msgid "More"
+msgstr "Mehr"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:862
+msgid "Less"
+msgstr "Weniger"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:863
+msgid "Select calendar"
+msgstr "Kalender auswählen"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:865
+msgid "Delete all"
+msgstr "Alles löschen"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:867
+msgid "Sorry! Editing of recurrent events is not yet implemented."
+msgstr "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert."
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137
+msgid "Organisation"
+msgstr "Organisation"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138
+#: ../../include/page_widgets.php:46
+msgid "Title"
+msgstr "Titel"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139
+msgid "Phone"
+msgstr "Telefon"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141
+msgid "Instant messenger"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142
+msgid "Website"
+msgstr "Webseite"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144
+msgid "Note"
+msgstr "Hinweis"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150
+msgid "Add Field"
+msgstr "Feld hinzufügen"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155
+msgid "P.O. Box"
+msgstr ""
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156
+msgid "Additional"
+msgstr "Zusätzlich"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157
+msgid "Street"
+msgstr "Straße"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158
+msgid "Locality"
+msgstr "Ortschaft"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159
+msgid "Region"
+msgstr "Region"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160
+msgid "ZIP Code"
+msgstr "Postleitzahl"
+
+#: ../../extend/addon/addon/chess/chess.php:276
+#: ../../extend/addon/addon/chess/chess.php:430
+msgid "Invalid game."
+msgstr "Ungültiges Spiel."
+
+#: ../../extend/addon/addon/chess/chess.php:282
+#: ../../extend/addon/addon/chess/chess.php:436
+msgid "You are not a player in this game."
+msgstr "Sie sind kein Spieler in diesem Spiel."
+
+#: ../../extend/addon/addon/chess/chess.php:315
+msgid "You must be a local channel to create a game."
+msgstr "Um ein Spiel zu eröffnen, musst du ein lokaler Kanal sein"
+
+#: ../../extend/addon/addon/chess/chess.php:333
+msgid "You must select one opponent that is not yourself."
+msgstr "Du musst einen Gegner wählen, der nicht du selbst ist"
+
+#: ../../extend/addon/addon/chess/chess.php:336
+msgid "Creating new game..."
+msgstr "Neues Spiel wird erstellt..."
+
+#: ../../extend/addon/addon/chess/chess.php:342
+msgid "You must select white or black."
+msgstr "Sie müssen weiß oder schwarz auswählen."
+
+#: ../../extend/addon/addon/chess/chess.php:349
+msgid "Error creating new game."
+msgstr "Fehler beim Erstellen eines neuen Spiels."
+
+#: ../../extend/addon/addon/chess/chess.php:379 ../../include/channel.php:816
+msgid "Requested channel is not available."
+msgstr "Angeforderte Kanal nicht verfügbar."
+
+#: ../../extend/addon/addon/chess/chess.php:392
+msgid "You must select a local channel /chess/channelname"
+msgstr "Du musst einen lokalen Kanal/Schach(Kanalnamen aufwählen"
+
+#: ../../extend/addon/addon/chess/chess.php:920
+msgid "Enable notifications"
+msgstr "Benachrichtigungen aktivieren"
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:51
+msgid "Your Webbie:"
+msgstr "Dein Webbie"
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:54
+msgid "Fontsize (px):"
+msgstr "Schriftgröße (px):"
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:68
+msgid "Link:"
+msgstr "Link:"
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:70
+msgid "Like us on Hubzilla"
+msgstr "Like us on Hubzilla"
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:72
+msgid "Embed:"
+msgstr "Einbetten"
+
+#: ../../extend/addon/addon/openid/Mod_Id.php:85
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+msgid "Male"
+msgstr "Männlich"
+
+#: ../../extend/addon/addon/openid/Mod_Id.php:87
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+msgid "Female"
+msgstr "Weiblich"
+
+#: ../../extend/addon/addon/openid/Mod_Openid.php:30
+msgid "OpenID protocol error. No ID returned."
+msgstr "OpenID-Protokollfehler. Keine Kennung zurückgegeben."
+
+#: ../../extend/addon/addon/openid/Mod_Openid.php:193
+#: ../../include/auth.php:286
+msgid "Login failed."
+msgstr "Login fehlgeschlagen."
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:52
+msgid "First Name"
+msgstr "Vorname"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:53
+msgid "Last Name"
+msgstr "Nachname"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:55
+msgid "Full Name"
+msgstr "Voller Name"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:61
+msgid "Profile Photo 16px"
+msgstr "Profilfoto 16 px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:62
+msgid "Profile Photo 32px"
+msgstr "Profilfoto 32 px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:63
+msgid "Profile Photo 48px"
+msgstr "Profilfoto 48 px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:64
+msgid "Profile Photo 64px"
+msgstr "Profilfoto 64 px"
-#: ../../include/datetime.php:135
+#: ../../extend/addon/addon/openid/MysqlProvider.php:65
+msgid "Profile Photo 80px"
+msgstr "Profilfoto 80 px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:66
+msgid "Profile Photo 128px"
+msgstr "Profilfoto 128 px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:67
+msgid "Timezone"
+msgstr "Zeitzone"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:70
+msgid "Birth Year"
+msgstr "Geburtsjahr"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:71
+msgid "Birth Month"
+msgstr "Geburtsmonat"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:72
+msgid "Birth Day"
+msgstr "Geburtstag"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:73
+msgid "Birthdate"
+msgstr "Geburtsdatum"
+
+#: ../../extend/addon/addon/openid/openid.php:49
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "Wir haben ein Problem mit der OpenID festgestellt, mit der Du Dich anmelden wolltest. Bitte überprüfe sie noch einmal."
+
+#: ../../extend/addon/addon/openid/openid.php:49
+msgid "The error message was:"
+msgstr "Die Fehlermeldung war:"
+
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:44
+#, php-format
+msgid "Reconnecting %d connections"
+msgstr "Erneuere %d Verbindungen"
+
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:63
+msgid "Diaspora Reconnect"
+msgstr ""
+
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:65
+msgid ""
+"Use this form to re-establish Diaspora connections which were initially made"
+" from a different hub."
+msgstr ""
+
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:70
+msgid "Reconnect"
+msgstr "Erneut verbinden"
+
+#: ../../extend/addon/addon/mailtest/mailtest.php:19
+msgid "Send test email"
+msgstr "Test-E-Mail senden"
+
+#: ../../extend/addon/addon/mailtest/mailtest.php:66
+msgid "Mail sent."
+msgstr "Mail gesendet."
+
+#: ../../extend/addon/addon/mailtest/mailtest.php:68
+msgid "Sending of mail failed."
+msgstr "Senden der E-Mail fehlgeschlagen."
+
+#: ../../extend/addon/addon/mailtest/mailtest.php:77
+msgid "Mail Test"
+msgstr "Mail Test"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:57
+msgid "Errors encountered deleting database table "
+msgstr "Beim Löschen der Datenbanktabelle sind Fehler aufgetreten."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
+msgid "Drop tables when uninstalling?"
+msgstr "Lösche Tabellen beim Deinstallieren?"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
+msgid ""
+"If checked, the Rendezvous database tables will be deleted when the plugin "
+"is uninstalled."
+msgstr "Wenn ausgewählt, werden die Rendezvous-Tabellen in der Datenbank gelöscht, sobald das Plugin deinstalliert wird."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
+msgid "Mapbox Access Token"
+msgstr "Mapbox Zugangs-Token"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
+msgid ""
+"If you enter a Mapbox access token, it will be used to retrieve map tiles "
+"from Mapbox instead of the default OpenStreetMap tile server."
+msgstr "Wenn Du ein Mapbox Zugangs-Token eingibst, werden die Kartendaten (Kacheln) damit von Mapbox geladen, anstatt von OpenStreetMap, welches die Voreinstellung ist."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:122
+msgid "Rendezvous"
+msgstr "Rendezvous"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:127
+msgid ""
+"This identity has been deleted by another member due to inactivity. Please "
+"press the \"New identity\" button or refresh the page to register a new "
+"identity. You may use the same name."
+msgstr "Diese Identität wurde von einem anderen Mitglied aufgrund von Inaktivität gelöscht. Bitte klicke auf \"Neue Identität\" oder aktualisiere die Website im Browser, um eine neue Identität zu registrieren. Du kannst dabei den selben Namen verwenden."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:128
+msgid "Welcome to Rendezvous!"
+msgstr "Willkommen bei Rendezvous!"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:129
+msgid ""
+"Enter your name to join this rendezvous. To begin sharing your location with"
+" the other members, tap the GPS control. When your location is discovered, a"
+" red dot will appear and others will be able to see you on the map."
+msgstr "Gib Deinen Namen ein, um diesem Rendezvous beizutreten. Um Deinen Standort mit anderen Mitgliedern zu teilen, klicke auf das GPS Symbol. Sobald Dein Standort ermittelt ist, erscheint ein roter Punkt, und die Anderen werden Dich auf der Karte sehen können."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:131
+msgid "Let's meet here"
+msgstr "Lasst uns hier treffen"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:134
+msgid "New marker"
+msgstr "Neue Markierung"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:135
+msgid "Edit marker"
+msgstr "Markierung bearbeiten"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:136
+msgid "New identity"
+msgstr "Neue Identität"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:137
+msgid "Delete marker"
+msgstr "Markierung löschen"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:138
+msgid "Delete member"
+msgstr "Mitglied löschen"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:139
+msgid "Edit proximity alert"
+msgstr "Annäherungsalarm bearbeiten"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:140
+msgid ""
+"A proximity alert will be issued when this member is within a certain radius"
+" of you.<br><br>Enter a radius in meters (0 to disable):"
+msgstr "Ein Annäherungsalarm wird ausgelöst werden, sobald sich dieses Mitglied innerhalb eines bestimmten Radius von Dir aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:140
+msgid "distance"
+msgstr "Entfernung"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:150
+msgid "Add new rendezvous"
+msgstr "Neues Rendezvous hinzufügen"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:151
+msgid ""
+"Create a new rendezvous and share the access link with those you wish to "
+"invite to the group. Those who open the link become members of the "
+"rendezvous. They can view other member locations, add markers to the map, or"
+" share their own locations with the group."
+msgstr "Erstelle ein neues Rendezvous und teile den Zugriffslink mit allen, die Du in die Gruppe einladen möchtest. Die, die den Link öffnen, werden Mitglieder des Rendezvous. Sie können die Standorte der anderen Mitglieder sehen, Marker zur Karte hinzufügen oder ihre eigenen Standorte mit der Gruppe teilen."
+
+#: ../../include/Import/import_diaspora.php:16
+msgid "No username found in import file."
+msgstr "Kein Benutzername in der Importdatei gefunden."
+
+#: ../../include/Import/import_diaspora.php:41 ../../include/import.php:51
+msgid "Unable to create a unique channel address. Import failed."
+msgstr "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen."
+
+#: ../../include/dba/dba_driver.php:187
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden"
+
+#: ../../include/datetime.php:147
msgid "Birthday"
msgstr "Geburtstag"
-#: ../../include/datetime.php:137
+#: ../../include/datetime.php:149
msgid "Age: "
msgstr "Alter:"
-#: ../../include/datetime.php:139
+#: ../../include/datetime.php:151
msgid "YYYY-MM-DD or MM-DD"
msgstr "JJJJ-MM-TT oder MM-TT"
-#: ../../include/datetime.php:272 ../../boot.php:2578
+#: ../../include/datetime.php:286 ../../boot.php:2563
msgid "never"
msgstr "Nie"
-#: ../../include/datetime.php:278
+#: ../../include/datetime.php:292
msgid "less than a second ago"
msgstr "Vor weniger als einer Sekunde"
-#: ../../include/datetime.php:296
+#: ../../include/datetime.php:310
#, php-format
msgctxt "e.g. 22 hours ago, 1 minute ago"
msgid "%1$d %2$s ago"
msgstr "vor %1$d %2$s"
-#: ../../include/datetime.php:307
+#: ../../include/datetime.php:321
msgctxt "relative_date"
msgid "year"
msgid_plural "years"
msgstr[0] "Jahr"
msgstr[1] "Jahre"
-#: ../../include/datetime.php:310
+#: ../../include/datetime.php:324
msgctxt "relative_date"
msgid "month"
msgid_plural "months"
msgstr[0] "Monat"
msgstr[1] "Monate"
-#: ../../include/datetime.php:313
+#: ../../include/datetime.php:327
msgctxt "relative_date"
msgid "week"
msgid_plural "weeks"
msgstr[0] "Woche"
msgstr[1] "Wochen"
-#: ../../include/datetime.php:316
+#: ../../include/datetime.php:330
msgctxt "relative_date"
msgid "day"
msgid_plural "days"
msgstr[0] "Tag"
msgstr[1] "Tage"
-#: ../../include/datetime.php:319
+#: ../../include/datetime.php:333
msgctxt "relative_date"
msgid "hour"
msgid_plural "hours"
msgstr[0] "Stunde"
msgstr[1] "Stunden"
-#: ../../include/datetime.php:322
+#: ../../include/datetime.php:336
msgctxt "relative_date"
msgid "minute"
msgid_plural "minutes"
msgstr[0] "Minute"
msgstr[1] "Minuten"
-#: ../../include/datetime.php:325
+#: ../../include/datetime.php:339
msgctxt "relative_date"
msgid "second"
msgid_plural "seconds"
msgstr[0] "Sekunde"
msgstr[1] "Sekunden"
-#: ../../include/datetime.php:562
+#: ../../include/datetime.php:576
#, php-format
msgid "%1$s's birthday"
msgstr "%1$ss Geburtstag"
-#: ../../include/datetime.php:563
+#: ../../include/datetime.php:577
#, php-format
msgid "Happy Birthday %1$s"
msgstr "Alles Gute zum Geburtstag, %1$s"
@@ -7739,46 +10522,62 @@ msgstr "Bitte gib die benötigten Informationen ein."
msgid "Failed to store account information."
msgstr "Speichern der Nutzerkontodaten fehlgeschlagen."
-#: ../../include/account.php:258
+#: ../../include/account.php:263
#, php-format
msgid "Registration confirmation for %s"
msgstr "Registrierungsbestätigung für %s"
-#: ../../include/account.php:324
+#: ../../include/account.php:330
#, php-format
msgid "Registration request at %s"
msgstr "Registrierungsanfrage auf %s"
-#: ../../include/account.php:348
+#: ../../include/account.php:352
msgid "your registration password"
msgstr "Dein Registrierungspasswort"
-#: ../../include/account.php:351 ../../include/account.php:411
+#: ../../include/account.php:358 ../../include/account.php:420
#, php-format
msgid "Registration details for %s"
msgstr "Registrierungsdetails für %s"
-#: ../../include/account.php:423
+#: ../../include/account.php:431
msgid "Account approved."
msgstr "Nutzerkonto bestätigt."
-#: ../../include/account.php:463
+#: ../../include/account.php:471
#, php-format
msgid "Registration revoked for %s"
msgstr "Registrierung für %s wurde widerrufen"
-#: ../../include/account.php:748 ../../include/account.php:750
+#: ../../include/account.php:756 ../../include/account.php:758
msgid "Click here to upgrade."
msgstr "Klicke hier, um das Upgrade durchzuführen."
-#: ../../include/account.php:756
+#: ../../include/account.php:764
msgid "This action exceeds the limits set by your subscription plan."
msgstr "Diese Aktion überschreitet die Grenzen Ihres Abonnements."
-#: ../../include/account.php:761
+#: ../../include/account.php:769
msgid "This action is not available under your subscription plan."
msgstr "Diese Aktion ist in Ihrem Abonnement nicht verfügbar."
+#: ../../include/message.php:20
+msgid "No recipient provided."
+msgstr "Kein Empfänger angegeben"
+
+#: ../../include/message.php:25
+msgid "[no subject]"
+msgstr "[no subject]"
+
+#: ../../include/message.php:45
+msgid "Unable to determine sender."
+msgstr "Kann Absender nicht bestimmen."
+
+#: ../../include/message.php:223
+msgid "Stored post could not be verified."
+msgstr "Gespeicherter Beitrag konnten nicht überprüft werden."
+
#: ../../include/selectors.php:30
msgid "Frequently"
msgstr "Häufig"
@@ -7803,14 +10602,6 @@ msgstr "Wöchentlich"
msgid "Monthly"
msgstr "Monatlich"
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Male"
-msgstr "Männlich"
-
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Female"
-msgstr "Weiblich"
-
#: ../../include/selectors.php:49
msgid "Currently Male"
msgstr "Momentan männlich"
@@ -8027,600 +10818,6 @@ msgstr "Interessiert mich nicht"
msgid "Ask me"
msgstr "Frag mich mal"
-#: ../../include/bbcode.php:123 ../../include/bbcode.php:881
-#: ../../include/bbcode.php:884 ../../include/bbcode.php:889
-#: ../../include/bbcode.php:892 ../../include/bbcode.php:895
-#: ../../include/bbcode.php:898 ../../include/bbcode.php:903
-#: ../../include/bbcode.php:906 ../../include/bbcode.php:911
-#: ../../include/bbcode.php:914 ../../include/bbcode.php:917
-#: ../../include/bbcode.php:920
-msgid "Image/photo"
-msgstr "Bild/Foto"
-
-#: ../../include/bbcode.php:162 ../../include/bbcode.php:931
-msgid "Encrypted content"
-msgstr "Verschlüsselter Inhalt"
-
-#: ../../include/bbcode.php:178
-#, php-format
-msgid "Install %s element: "
-msgstr "Element %s installieren: "
-
-#: ../../include/bbcode.php:182
-#, php-format
-msgid ""
-"This post contains an installable %s element, however you lack permissions "
-"to install it on this site."
-msgstr "Dieser Beitrag beinhaltet ein installierbares %s Element, aber Du hast nicht die nötigen Rechte, um es auf diesem Hub zu installieren."
-
-#: ../../include/bbcode.php:261
-#, php-format
-msgid "%1$s wrote the following %2$s %3$s"
-msgstr "%1$s schrieb den folgenden %2$s %3$s"
-
-#: ../../include/bbcode.php:338 ../../include/bbcode.php:346
-msgid "Click to open/close"
-msgstr "Klicke zum Öffnen/Schließen"
-
-#: ../../include/bbcode.php:346
-msgid "spoiler"
-msgstr "Spoiler"
-
-#: ../../include/bbcode.php:619 ../../include/wiki.php:525
-msgid "Different viewers will see this text differently"
-msgstr "Verschiedene Betrachter werden diesen Text unterschiedlich sehen"
-
-#: ../../include/bbcode.php:869
-msgid "$1 wrote:"
-msgstr "$1 schrieb:"
-
-#: ../../include/event.php:22 ../../include/event.php:69
-#: ../../include/bb2diaspora.php:485
-msgid "l F d, Y \\@ g:i A"
-msgstr "l, d. F Y, H:i"
-
-#: ../../include/event.php:30 ../../include/event.php:73
-#: ../../include/bb2diaspora.php:491
-msgid "Starts:"
-msgstr "Beginnt:"
-
-#: ../../include/event.php:40 ../../include/event.php:77
-#: ../../include/bb2diaspora.php:499
-msgid "Finishes:"
-msgstr "Endet:"
-
-#: ../../include/event.php:821
-msgid "This event has been added to your calendar."
-msgstr "Dieser Termin wurde zu Deinem Kalender hinzugefügt"
-
-#: ../../include/event.php:1021
-msgid "Not specified"
-msgstr "Keine Angabe"
-
-#: ../../include/event.php:1022
-msgid "Needs Action"
-msgstr "Aktion erforderlich"
-
-#: ../../include/event.php:1023
-msgid "Completed"
-msgstr "Abgeschlossen"
-
-#: ../../include/event.php:1024
-msgid "In Process"
-msgstr "In Bearbeitung"
-
-#: ../../include/event.php:1025
-msgid "Cancelled"
-msgstr "gestrichen"
-
-#: ../../include/security.php:109
-msgid "guest:"
-msgstr "Gast:"
-
-#: ../../include/security.php:527
-msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
-msgstr "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde."
-
-#: ../../include/help.php:25
-msgid "Help:"
-msgstr "Hilfe:"
-
-#: ../../include/bookmarks.php:35
-#, php-format
-msgid "%1$s's bookmarks"
-msgstr "%1$ss Lesezeichen"
-
-#: ../../include/group.php:26
-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 "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die gelöscht wurde. Es <strong>könnten</strong> von damals noch Elemente (Beiträge, Dateien etc.) vorhanden sein, die allen jetzigen und zukünftigen Mitgliedern dieser Gruppe den Zugriff erlauben. Wenn das nicht Deine Absicht ist, erstelle bitte eine neue Gruppe mit einem anderen Namen."
-
-#: ../../include/group.php:248
-msgid "Add new connections to this privacy group"
-msgstr "Neue Verbindung zu dieser Gruppe hinzufügen"
-
-#: ../../include/group.php:289
-msgid "edit"
-msgstr "Bearbeiten"
-
-#: ../../include/group.php:311 ../../include/features.php:83
-msgid "Privacy Groups"
-msgstr "Gruppen"
-
-#: ../../include/group.php:312
-msgid "Edit group"
-msgstr "Gruppe ändern"
-
-#: ../../include/group.php:313
-msgid "Add privacy group"
-msgstr "Gruppe hinzufügen"
-
-#: ../../include/group.php:314
-msgid "Channels not in any privacy group"
-msgstr "Kanäle, die in keiner Gruppe sind"
-
-#: ../../include/group.php:316 ../../include/widgets.php:284
-msgid "add"
-msgstr "hinzufügen"
-
-#: ../../include/attach.php:248 ../../include/attach.php:334
-msgid "Item was not found."
-msgstr "Beitrag wurde nicht gefunden."
-
-#: ../../include/attach.php:500
-msgid "No source file."
-msgstr "Keine Quelldatei."
-
-#: ../../include/attach.php:522
-msgid "Cannot locate file to replace"
-msgstr "Kann Datei zum Ersetzen nicht finden"
-
-#: ../../include/attach.php:540
-msgid "Cannot locate file to revise/update"
-msgstr "Kann Datei zum Prüfen/Aktualisieren nicht finden"
-
-#: ../../include/attach.php:675
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "Datei überschreitet das Größen-Limit von %d"
-
-#: ../../include/attach.php:689
-#, php-format
-msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
-msgstr "Die Größe Deiner Datei-Anhänge hat das Maximum von %1$.0f MByte erreicht."
-
-#: ../../include/attach.php:847
-msgid "File upload failed. Possible system limit or action terminated."
-msgstr "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess."
-
-#: ../../include/attach.php:860
-msgid "Stored file could not be verified. Upload failed."
-msgstr "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen."
-
-#: ../../include/attach.php:916 ../../include/attach.php:932
-msgid "Path not available."
-msgstr "Pfad nicht verfügbar."
-
-#: ../../include/attach.php:978 ../../include/attach.php:1130
-msgid "Empty pathname"
-msgstr "Leere Pfadangabe"
-
-#: ../../include/attach.php:1004
-msgid "duplicate filename or path"
-msgstr "doppelter Dateiname oder Pfad"
-
-#: ../../include/attach.php:1026
-msgid "Path not found."
-msgstr "Pfad nicht gefunden."
-
-#: ../../include/attach.php:1084
-msgid "mkdir failed."
-msgstr "mkdir fehlgeschlagen."
-
-#: ../../include/attach.php:1088
-msgid "database storage failed."
-msgstr "Speichern in der Datenbank fehlgeschlagen."
-
-#: ../../include/attach.php:1136
-msgid "Empty path"
-msgstr "Leere Pfadangabe"
-
-#: ../../include/page_widgets.php:7
-msgid "New Page"
-msgstr "Neue Seite"
-
-#: ../../include/page_widgets.php:46
-msgid "Title"
-msgstr "Titel"
-
-#: ../../include/bb2diaspora.php:398
-msgid "Attachments:"
-msgstr "Anhänge:"
-
-#: ../../include/bb2diaspora.php:487
-msgid "$Projectname event notification:"
-msgstr "$Projectname-Terminbenachrichtigung:"
-
-#: ../../include/js_strings.php:5
-msgid "Delete this item?"
-msgstr "Dieses Element löschen?"
-
-#: ../../include/js_strings.php:8
-#, php-format
-msgid "%s show less"
-msgstr "%s weniger anzeigen"
-
-#: ../../include/js_strings.php:9
-#, php-format
-msgid "%s expand"
-msgstr "%s aufklappen"
-
-#: ../../include/js_strings.php:10
-#, php-format
-msgid "%s collapse"
-msgstr "%s einklappen"
-
-#: ../../include/js_strings.php:11
-msgid "Password too short"
-msgstr "Kennwort zu kurz"
-
-#: ../../include/js_strings.php:12
-msgid "Passwords do not match"
-msgstr "Kennwörter stimmen nicht überein"
-
-#: ../../include/js_strings.php:13
-msgid "everybody"
-msgstr "alle"
-
-#: ../../include/js_strings.php:14
-msgid "Secret Passphrase"
-msgstr "geheime Passphrase"
-
-#: ../../include/js_strings.php:15
-msgid "Passphrase hint"
-msgstr "Hinweis zur Passphrase"
-
-#: ../../include/js_strings.php:16
-msgid "Notice: Permissions have changed but have not yet been submitted."
-msgstr "Achtung: Berechtigungen wurden verändert, aber noch nicht gespeichert."
-
-#: ../../include/js_strings.php:17
-msgid "close all"
-msgstr "Alle schließen"
-
-#: ../../include/js_strings.php:18
-msgid "Nothing new here"
-msgstr "Nichts Neues hier"
-
-#: ../../include/js_strings.php:19
-msgid "Rate This Channel (this is public)"
-msgstr "Diesen Kanal bewerten (öffentlich sichtbar)"
-
-#: ../../include/js_strings.php:21
-msgid "Describe (optional)"
-msgstr "Beschreibung (optional)"
-
-#: ../../include/js_strings.php:23
-msgid "Please enter a link URL"
-msgstr "Gib eine URL ein:"
-
-#: ../../include/js_strings.php:24
-msgid "Unsaved changes. Are you sure you wish to leave this page?"
-msgstr "Ungespeicherte Änderungen. Bist Du sicher, dass Du diese Seite verlassen möchtest?"
-
-#: ../../include/js_strings.php:27
-msgid "timeago.prefixAgo"
-msgstr "timeago.prefixAgo"
-
-#: ../../include/js_strings.php:28
-msgid "timeago.prefixFromNow"
-msgstr " "
-
-#: ../../include/js_strings.php:29
-msgid "ago"
-msgstr "her"
-
-#: ../../include/js_strings.php:30
-msgid "from now"
-msgstr "von jetzt"
-
-#: ../../include/js_strings.php:31
-msgid "less than a minute"
-msgstr "weniger als eine Minute"
-
-#: ../../include/js_strings.php:32
-msgid "about a minute"
-msgstr "ungefähr eine Minute"
-
-#: ../../include/js_strings.php:33
-#, php-format
-msgid "%d minutes"
-msgstr "%d Minuten"
-
-#: ../../include/js_strings.php:34
-msgid "about an hour"
-msgstr "ungefähr eine Stunde"
-
-#: ../../include/js_strings.php:35
-#, php-format
-msgid "about %d hours"
-msgstr "ungefähr %d Stunden"
-
-#: ../../include/js_strings.php:36
-msgid "a day"
-msgstr "ein Tag"
-
-#: ../../include/js_strings.php:37
-#, php-format
-msgid "%d days"
-msgstr "%d Tage"
-
-#: ../../include/js_strings.php:38
-msgid "about a month"
-msgstr "ungefähr ein Monat"
-
-#: ../../include/js_strings.php:39
-#, php-format
-msgid "%d months"
-msgstr "%d Monate"
-
-#: ../../include/js_strings.php:40
-msgid "about a year"
-msgstr "ungefähr ein Jahr"
-
-#: ../../include/js_strings.php:41
-#, php-format
-msgid "%d years"
-msgstr "%d Jahre"
-
-#: ../../include/js_strings.php:42
-msgid " "
-msgstr " "
-
-#: ../../include/js_strings.php:43
-msgid "timeago.numbers"
-msgstr "timeago.numbers"
-
-#: ../../include/js_strings.php:45 ../../include/text.php:1289
-msgid "January"
-msgstr "Januar"
-
-#: ../../include/js_strings.php:46 ../../include/text.php:1289
-msgid "February"
-msgstr "Februar"
-
-#: ../../include/js_strings.php:47 ../../include/text.php:1289
-msgid "March"
-msgstr "März"
-
-#: ../../include/js_strings.php:48 ../../include/text.php:1289
-msgid "April"
-msgstr "April"
-
-#: ../../include/js_strings.php:49
-msgctxt "long"
-msgid "May"
-msgstr "Mai"
-
-#: ../../include/js_strings.php:50 ../../include/text.php:1289
-msgid "June"
-msgstr "Juni"
-
-#: ../../include/js_strings.php:51 ../../include/text.php:1289
-msgid "July"
-msgstr "Juli"
-
-#: ../../include/js_strings.php:52 ../../include/text.php:1289
-msgid "August"
-msgstr "August"
-
-#: ../../include/js_strings.php:53 ../../include/text.php:1289
-msgid "September"
-msgstr "September"
-
-#: ../../include/js_strings.php:54 ../../include/text.php:1289
-msgid "October"
-msgstr "Oktober"
-
-#: ../../include/js_strings.php:55 ../../include/text.php:1289
-msgid "November"
-msgstr "November"
-
-#: ../../include/js_strings.php:56 ../../include/text.php:1289
-msgid "December"
-msgstr "Dezember"
-
-#: ../../include/js_strings.php:57
-msgid "Jan"
-msgstr "Jan"
-
-#: ../../include/js_strings.php:58
-msgid "Feb"
-msgstr "Feb"
-
-#: ../../include/js_strings.php:59
-msgid "Mar"
-msgstr "Mär"
-
-#: ../../include/js_strings.php:60
-msgid "Apr"
-msgstr "Apr"
-
-#: ../../include/js_strings.php:61
-msgctxt "short"
-msgid "May"
-msgstr "Mai"
-
-#: ../../include/js_strings.php:62
-msgid "Jun"
-msgstr "Jun"
-
-#: ../../include/js_strings.php:63
-msgid "Jul"
-msgstr "Jul"
-
-#: ../../include/js_strings.php:64
-msgid "Aug"
-msgstr "Aug"
-
-#: ../../include/js_strings.php:65
-msgid "Sep"
-msgstr "Sep"
-
-#: ../../include/js_strings.php:66
-msgid "Oct"
-msgstr "Okt"
-
-#: ../../include/js_strings.php:67
-msgid "Nov"
-msgstr "Nov"
-
-#: ../../include/js_strings.php:68
-msgid "Dec"
-msgstr "Dez"
-
-#: ../../include/js_strings.php:69 ../../include/text.php:1285
-msgid "Sunday"
-msgstr "Sonntag"
-
-#: ../../include/js_strings.php:70 ../../include/text.php:1285
-msgid "Monday"
-msgstr "Montag"
-
-#: ../../include/js_strings.php:71 ../../include/text.php:1285
-msgid "Tuesday"
-msgstr "Dienstag"
-
-#: ../../include/js_strings.php:72 ../../include/text.php:1285
-msgid "Wednesday"
-msgstr "Mittwoch"
-
-#: ../../include/js_strings.php:73 ../../include/text.php:1285
-msgid "Thursday"
-msgstr "Donnerstag"
-
-#: ../../include/js_strings.php:74 ../../include/text.php:1285
-msgid "Friday"
-msgstr "Freitag"
-
-#: ../../include/js_strings.php:75 ../../include/text.php:1285
-msgid "Saturday"
-msgstr "Samstag"
-
-#: ../../include/js_strings.php:76
-msgid "Sun"
-msgstr "So"
-
-#: ../../include/js_strings.php:77
-msgid "Mon"
-msgstr "Mo"
-
-#: ../../include/js_strings.php:78
-msgid "Tue"
-msgstr "Di"
-
-#: ../../include/js_strings.php:79
-msgid "Wed"
-msgstr "Mi"
-
-#: ../../include/js_strings.php:80
-msgid "Thu"
-msgstr "Do"
-
-#: ../../include/js_strings.php:81
-msgid "Fri"
-msgstr "Fr"
-
-#: ../../include/js_strings.php:82
-msgid "Sat"
-msgstr "Sa"
-
-#: ../../include/js_strings.php:83
-msgctxt "calendar"
-msgid "today"
-msgstr "heute"
-
-#: ../../include/js_strings.php:84
-msgctxt "calendar"
-msgid "month"
-msgstr "Monat"
-
-#: ../../include/js_strings.php:85
-msgctxt "calendar"
-msgid "week"
-msgstr "Woche"
-
-#: ../../include/js_strings.php:86
-msgctxt "calendar"
-msgid "day"
-msgstr "Tag"
-
-#: ../../include/js_strings.php:87
-msgctxt "calendar"
-msgid "All day"
-msgstr "Ganztägig"
-
-#: ../../include/follow.php:27
-msgid "Channel is blocked on this site."
-msgstr "Der Kanal ist auf dieser Seite blockiert "
-
-#: ../../include/follow.php:32
-msgid "Channel location missing."
-msgstr "Adresse des Kanals fehlt."
-
-#: ../../include/follow.php:80
-msgid "Response from remote channel was incomplete."
-msgstr "Antwort des entfernten Kanals war unvollständig."
-
-#: ../../include/follow.php:97
-msgid "Channel was deleted and no longer exists."
-msgstr "Kanal wurde gelöscht und existiert nicht mehr."
-
-#: ../../include/follow.php:147 ../../include/follow.php:183
-msgid "Protocol disabled."
-msgstr "Protokoll deaktiviert."
-
-#: ../../include/follow.php:171
-msgid "Channel discovery failed."
-msgstr "Kanalsuche fehlgeschlagen"
-
-#: ../../include/follow.php:210
-msgid "Cannot connect to yourself."
-msgstr "Du kannst Dich nicht mit Dir selbst verbinden."
-
-#: ../../include/acl_selectors.php:169
-msgid "Who can see this?"
-msgstr "Wer kann das sehen?"
-
-#: ../../include/acl_selectors.php:170
-msgid "Custom selection"
-msgstr "Benutzerdefinierte Auswahl"
-
-#: ../../include/acl_selectors.php:171
-msgid ""
-"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
-" the scope of \"Show\"."
-msgstr "Wähle \"Anzeigen\", um Betrachtung zuzulassen. \"Nicht anzeigen\" überstimmt und limitiert den Aktionsradius von \"Anzeigen\" für Ausnahmen."
-
-#: ../../include/acl_selectors.php:172
-msgid "Show"
-msgstr "Anzeigen"
-
-#: ../../include/acl_selectors.php:173
-msgid "Don't show"
-msgstr "Nicht anzeigen"
-
-#: ../../include/acl_selectors.php:207
-#, php-format
-msgid ""
-"Post permissions %s cannot be changed %s after a post is shared.</br />These"
-" permissions set who is allowed to view the post."
-msgstr "Beitragsberechtigungen %s können nicht geändert werden %s, nachdem der Beitrag gesendet wurde.<br />Diese Berechtigungen bestimmen, wer den Beitrag sehen kann."
-
#: ../../include/channel.php:33
msgid "Unable to obtain identity information from database"
msgstr "Kann keine Identitäts-Informationen aus Datenbank beziehen"
@@ -8658,120 +10855,112 @@ msgstr "Kann die erstellte Identität nicht empfangen"
msgid "Default Profile"
msgstr "Standard-Profil"
-#: ../../include/channel.php:813
-msgid "Requested channel is not available."
-msgstr "Angeforderte Kanal nicht verfügbar."
-
-#: ../../include/channel.php:960
+#: ../../include/channel.php:962
msgid "Create New Profile"
msgstr "Neues Profil erstellen"
-#: ../../include/channel.php:980
+#: ../../include/channel.php:982
msgid "Visible to everybody"
msgstr "Für jeden sichtbar"
-#: ../../include/channel.php:1053 ../../include/channel.php:1166
+#: ../../include/channel.php:1055 ../../include/channel.php:1174
msgid "Gender:"
msgstr "Geschlecht:"
-#: ../../include/channel.php:1054 ../../include/channel.php:1210
-msgid "Status:"
-msgstr "Status:"
-
-#: ../../include/channel.php:1055 ../../include/channel.php:1221
+#: ../../include/channel.php:1057 ../../include/channel.php:1229
msgid "Homepage:"
msgstr "Homepage:"
-#: ../../include/channel.php:1056
+#: ../../include/channel.php:1058
msgid "Online Now"
msgstr "gerade online"
-#: ../../include/channel.php:1171
+#: ../../include/channel.php:1179
msgid "Like this channel"
msgstr "Dieser Kanal gefällt mir"
-#: ../../include/channel.php:1195
+#: ../../include/channel.php:1203
msgid "j F, Y"
msgstr "j. F Y"
-#: ../../include/channel.php:1196
+#: ../../include/channel.php:1204
msgid "j F"
msgstr "j. F"
-#: ../../include/channel.php:1203
+#: ../../include/channel.php:1211
msgid "Birthday:"
msgstr "Geburtstag:"
-#: ../../include/channel.php:1216
+#: ../../include/channel.php:1224
#, php-format
msgid "for %1$d %2$s"
msgstr "seit %1$d %2$s"
-#: ../../include/channel.php:1219
+#: ../../include/channel.php:1227
msgid "Sexual Preference:"
msgstr "Sexuelle Orientierung:"
-#: ../../include/channel.php:1225
+#: ../../include/channel.php:1233
msgid "Tags:"
msgstr "Schlagworte:"
-#: ../../include/channel.php:1227
+#: ../../include/channel.php:1235
msgid "Political Views:"
msgstr "Politische Ansichten:"
-#: ../../include/channel.php:1229
+#: ../../include/channel.php:1237
msgid "Religion:"
msgstr "Religion:"
-#: ../../include/channel.php:1233
+#: ../../include/channel.php:1241
msgid "Hobbies/Interests:"
msgstr "Hobbys/Interessen:"
-#: ../../include/channel.php:1235
+#: ../../include/channel.php:1243
msgid "Likes:"
msgstr "Gefällt:"
-#: ../../include/channel.php:1237
+#: ../../include/channel.php:1245
msgid "Dislikes:"
msgstr "Gefällt nicht:"
-#: ../../include/channel.php:1239
+#: ../../include/channel.php:1247
msgid "Contact information and Social Networks:"
msgstr "Kontaktinformation und soziale Netzwerke:"
-#: ../../include/channel.php:1241
+#: ../../include/channel.php:1249
msgid "My other channels:"
msgstr "Meine anderen Kanäle:"
-#: ../../include/channel.php:1243
+#: ../../include/channel.php:1251
msgid "Musical interests:"
msgstr "Musikalische Interessen:"
-#: ../../include/channel.php:1245
+#: ../../include/channel.php:1253
msgid "Books, literature:"
msgstr "Bücher, Literatur:"
-#: ../../include/channel.php:1247
+#: ../../include/channel.php:1255
msgid "Television:"
msgstr "Fernsehen:"
-#: ../../include/channel.php:1249
+#: ../../include/channel.php:1257
msgid "Film/dance/culture/entertainment:"
msgstr "Film/Tanz/Kultur/Unterhaltung:"
-#: ../../include/channel.php:1251
+#: ../../include/channel.php:1259
msgid "Love/Romance:"
msgstr "Liebe/Romantik:"
-#: ../../include/channel.php:1253
+#: ../../include/channel.php:1261
msgid "Work/employment:"
msgstr "Arbeit/Anstellung:"
-#: ../../include/channel.php:1255
+#: ../../include/channel.php:1263
msgid "School/education:"
msgstr "Schule/Ausbildung:"
-#: ../../include/channel.php:1276
+#: ../../include/channel.php:1284
msgid "Like this thing"
msgstr "Gefällt mir"
@@ -8788,727 +10977,1582 @@ msgstr "Öffne die markierte Adresse in einem neuen Browserfenster oder Tab"
msgid "User '%s' deleted"
msgstr "Benutzer '%s' gelöscht"
-#: ../../include/contact_widgets.php:11
-#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d Einladung verfügbar"
-msgstr[1] "%d Einladungen verfügbar"
+#: ../../include/dir_fns.php:141
+msgid "Directory Options"
+msgstr "Verzeichnisoptionen"
-#: ../../include/contact_widgets.php:19
-msgid "Find Channels"
-msgstr "Finde Kanäle"
+#: ../../include/dir_fns.php:143
+msgid "Safe Mode"
+msgstr "Sicherer Modus"
-#: ../../include/contact_widgets.php:20
-msgid "Enter name or interest"
-msgstr "Name oder Interessen eingeben"
+#: ../../include/dir_fns.php:144
+msgid "Public Forums Only"
+msgstr "Nur öffentliche Foren"
-#: ../../include/contact_widgets.php:21
-msgid "Connect/Follow"
-msgstr "Verbinden/Folgen"
+#: ../../include/dir_fns.php:145
+msgid "This Website Only"
+msgstr "Nur dieser Hub"
-#: ../../include/contact_widgets.php:22
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Beispiele: Robert Morgenstein, Angeln"
+#: ../../include/nav.php:85 ../../include/nav.php:118 ../../boot.php:1718
+msgid "Logout"
+msgstr "Abmelden"
-#: ../../include/contact_widgets.php:26
-msgid "Random Profile"
-msgstr "Zufallsprofil"
+#: ../../include/nav.php:85 ../../include/nav.php:118
+msgid "End this session"
+msgstr "Beende diese Sitzung"
-#: ../../include/contact_widgets.php:27
-msgid "Invite Friends"
-msgstr "Lade Freunde ein"
+#: ../../include/nav.php:88
+msgid "Your posts and conversations"
+msgstr "Deine Beiträge und Unterhaltungen"
-#: ../../include/contact_widgets.php:29
-msgid "Advanced example: name=fred and country=iceland"
-msgstr "Fortgeschrittenes Beispiel: name=fred and country=iceland"
+#: ../../include/nav.php:89
+msgid "Your profile page"
+msgstr "Deine Profilseite"
-#: ../../include/contact_widgets.php:53 ../../include/widgets.php:346
-#: ../../include/features.php:97
-msgid "Saved Folders"
-msgstr "Gespeicherte Ordner"
+#: ../../include/nav.php:91
+msgid "Manage/Edit profiles"
+msgstr "Profile verwalten"
-#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
-#: ../../include/widgets.php:349 ../../include/widgets.php:468
-msgid "Everything"
-msgstr "Alles"
+#: ../../include/nav.php:93
+msgid "Edit your profile"
+msgstr "Profil bearbeiten"
-#: ../../include/contact_widgets.php:91 ../../include/taxonomy.php:188
-#: ../../include/taxonomy.php:270 ../../include/widgets.php:46
-#: ../../include/widgets.php:465
-msgid "Categories"
-msgstr "Kategorien"
+#: ../../include/nav.php:95
+msgid "Your photos"
+msgstr "Deine Bilder"
-#: ../../include/contact_widgets.php:122
-#, php-format
-msgid "%d connection in common"
-msgid_plural "%d connections in common"
-msgstr[0] "%d gemeinsame Verbindung"
-msgstr[1] "%d gemeinsame Verbindungen"
+#: ../../include/nav.php:96
+msgid "Your files"
+msgstr "Deine Dateien"
-#: ../../include/contact_widgets.php:127
-msgid "show more"
-msgstr "mehr zeigen"
+#: ../../include/nav.php:99
+msgid "Your chatrooms"
+msgstr "Deine Chaträume"
-#: ../../include/auth.php:148
-msgid "Logged out."
-msgstr "Ausgeloggt."
+#: ../../include/nav.php:105 ../../include/conversation.php:1735
+msgid "Bookmarks"
+msgstr "Lesezeichen"
-#: ../../include/auth.php:275
-msgid "Failed authentication"
-msgstr "Authentifizierung fehlgeschlagen"
+#: ../../include/nav.php:105
+msgid "Your bookmarks"
+msgstr "Deine Lesezeichen"
-#: ../../include/auth.php:286
-msgid "Login failed."
-msgstr "Login fehlgeschlagen."
+#: ../../include/nav.php:109
+msgid "Your webpages"
+msgstr "Deine Webseiten"
-#: ../../include/activities.php:41
-msgid " and "
-msgstr "und"
+#: ../../include/nav.php:111
+msgid "Your wikis"
+msgstr "Ihre Wikis"
-#: ../../include/activities.php:49
-msgid "public profile"
-msgstr "öffentliches Profil"
+#: ../../include/nav.php:115
+msgid "Sign in"
+msgstr "Anmelden"
-#: ../../include/activities.php:58
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
-msgstr "%1$s hat %2$s auf &ldquo;%3$s&rdquo; geändert"
+#: ../../include/nav.php:131
+msgid "Remote authentication"
+msgstr "Über Konto auf anderem Server einloggen"
-#: ../../include/activities.php:59
-#, php-format
-msgid "Visit %1$s's %2$s"
-msgstr "Besuche %1$s's %2$s"
+#: ../../include/nav.php:131
+msgid "Click to authenticate to your home hub"
+msgstr "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren"
-#: ../../include/activities.php:62
-#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
-msgstr "%1$s hat ein aktualisiertes %2$s, %3$s wurde verändert."
+#: ../../include/nav.php:143
+msgid "Get me home"
+msgstr "Bringe mich nach Hause (eigener Kanal)"
-#: ../../include/conversation.php:204
-#, php-format
-msgid "%1$s is now connected with %2$s"
-msgstr "%1$s ist jetzt mit %2$s verbunden"
+#: ../../include/nav.php:145
+msgid "Log me out of this site"
+msgstr "Logge mich von dieser Seite aus"
-#: ../../include/conversation.php:239
-#, php-format
-msgid "%1$s poked %2$s"
-msgstr "%1$s stupste %2$s an"
+#: ../../include/nav.php:150
+msgid "Create an account"
+msgstr "Erzeuge ein Konto"
-#: ../../include/conversation.php:243 ../../include/text.php:1059
-#: ../../include/text.php:1064
-msgid "poked"
-msgstr "stupste"
+#: ../../include/nav.php:162
+msgid "Help and documentation"
+msgstr "Hilfe und Dokumentation"
-#: ../../include/conversation.php:694
-#, php-format
-msgid "View %s's profile @ %s"
-msgstr "%ss Profil auf %s ansehen"
+#: ../../include/nav.php:166
+msgid "Applications, utilities, links, games"
+msgstr "Anwendungen (Apps), Zubehör, Links, Spiele"
-#: ../../include/conversation.php:713
-msgid "Categories:"
-msgstr "Kategorien:"
+#: ../../include/nav.php:168
+msgid "Search site @name, #tag, ?docs, content"
+msgstr "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt"
-#: ../../include/conversation.php:714
-msgid "Filed under:"
-msgstr "Gespeichert unter:"
+#: ../../include/nav.php:170
+msgid "Channel Directory"
+msgstr "Kanal-Verzeichnis"
-#: ../../include/conversation.php:741
-msgid "View in context"
-msgstr "Im Zusammenhang anschauen"
+#: ../../include/nav.php:182
+msgid "Your grid"
+msgstr "Dein Grid"
-#: ../../include/conversation.php:851
-msgid "remove"
-msgstr "lösche"
+#: ../../include/nav.php:183
+msgid "Mark all grid notifications seen"
+msgstr "Alle Grid-Benachrichtigungen als angesehen markieren"
-#: ../../include/conversation.php:856
-msgid "Delete Selected Items"
-msgstr "Lösche die ausgewählten Elemente"
+#: ../../include/nav.php:185
+msgid "Channel home"
+msgstr "Mein Kanal"
-#: ../../include/conversation.php:949
-msgid "View Source"
-msgstr "Quelle anzeigen"
+#: ../../include/nav.php:186
+msgid "Mark all channel notifications seen"
+msgstr "Markiere alle Kanal-Benachrichtigungen als angesehen"
-#: ../../include/conversation.php:950
-msgid "Follow Thread"
-msgstr "Unterhaltung folgen"
+#: ../../include/nav.php:192
+msgid "Notices"
+msgstr "Benachrichtigungen"
-#: ../../include/conversation.php:951
-msgid "Unfollow Thread"
-msgstr "Unterhaltung nicht mehr folgen"
+#: ../../include/nav.php:192
+msgid "Notifications"
+msgstr "Benachrichtigungen"
-#: ../../include/conversation.php:956
-msgid "Activity/Posts"
-msgstr "Aktivitäten/Beiträge"
+#: ../../include/nav.php:193
+msgid "See all notifications"
+msgstr "Alle Benachrichtigungen ansehen"
-#: ../../include/conversation.php:958
-msgid "Edit Connection"
-msgstr "Verbindung bearbeiten"
+#: ../../include/nav.php:196
+msgid "Private mail"
+msgstr "Persönliche Mail"
-#: ../../include/conversation.php:959
-msgid "Message"
-msgstr "Nachricht"
+#: ../../include/nav.php:197
+msgid "See all private messages"
+msgstr "Alle persönlichen Nachrichten ansehen"
-#: ../../include/conversation.php:1076
-#, php-format
-msgid "%s likes this."
-msgstr "%s gefällt das."
+#: ../../include/nav.php:198
+msgid "Mark all private messages seen"
+msgstr "Markiere alle persönlichen Nachrichten als gesehen"
-#: ../../include/conversation.php:1076
-#, php-format
-msgid "%s doesn't like this."
-msgstr "%s gefällt das nicht."
+#: ../../include/nav.php:199 ../../include/widgets.php:700
+msgid "Inbox"
+msgstr "Eingang"
-#: ../../include/conversation.php:1080
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgid_plural "<span %1$s>%2$d people</span> like this."
-msgstr[0] "<span %1$s>%2$d Person</span> gefällt das."
-msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das."
+#: ../../include/nav.php:200 ../../include/widgets.php:705
+msgid "Outbox"
+msgstr "Ausgang"
-#: ../../include/conversation.php:1082
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgid_plural "<span %1$s>%2$d people</span> don't like this."
-msgstr[0] "<span %1$s>%2$d Person</span> gefällt das nicht."
-msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das nicht."
+#: ../../include/nav.php:201 ../../include/widgets.php:710
+msgid "New Message"
+msgstr "Neue Nachricht"
-#: ../../include/conversation.php:1088
-msgid "and"
-msgstr "und"
+#: ../../include/nav.php:204
+msgid "Event Calendar"
+msgstr "Terminkalender"
-#: ../../include/conversation.php:1091
-#, php-format
-msgid ", and %d other people"
-msgid_plural ", and %d other people"
-msgstr[0] ""
-msgstr[1] ", und %d andere"
+#: ../../include/nav.php:205
+msgid "See all events"
+msgstr "Alle Termine ansehen"
-#: ../../include/conversation.php:1092
-#, php-format
-msgid "%s like this."
-msgstr "%s gefällt das."
+#: ../../include/nav.php:206
+msgid "Mark all events seen"
+msgstr "Markiere alle Termine als gesehen"
-#: ../../include/conversation.php:1092
-#, php-format
-msgid "%s don't like this."
-msgstr "%s gefällt das nicht."
+#: ../../include/nav.php:209
+msgid "Manage Your Channels"
+msgstr "Verwalte Deine Kanäle"
-#: ../../include/conversation.php:1135
-msgid "Set your location"
-msgstr "Standort"
+#: ../../include/nav.php:211
+msgid "Account/Channel Settings"
+msgstr "Konto-/Kanal-Einstellungen"
-#: ../../include/conversation.php:1136
-msgid "Clear browser location"
-msgstr "Browser-Standort löschen"
+#: ../../include/nav.php:219 ../../include/widgets.php:1665
+msgid "Admin"
+msgstr "Administration"
-#: ../../include/conversation.php:1184
-msgid "Tag term:"
-msgstr "Schlagwort:"
+#: ../../include/nav.php:219
+msgid "Site Setup and Configuration"
+msgstr "Seiten-Einrichtung und -Konfiguration"
-#: ../../include/conversation.php:1185
-msgid "Where are you right now?"
-msgstr "Wo bist Du jetzt grade?"
+#: ../../include/nav.php:250 ../../include/conversation.php:869
+msgid "Loading..."
+msgstr "Lädt ..."
-#: ../../include/conversation.php:1194
-msgid "Comments enabled"
-msgstr "Kommentare aktiviert"
+#: ../../include/nav.php:255
+msgid "@name, #tag, ?doc, content"
+msgstr "@Name, #Schlagwort, ?Dokumentation, Inhalt"
-#: ../../include/conversation.php:1195
-msgid "Comments disabled"
-msgstr "Kommentare deaktiviert"
+#: ../../include/nav.php:256
+msgid "Please wait..."
+msgstr "Bitte warten..."
-#: ../../include/conversation.php:1233
-msgid "Page link name"
-msgstr "Link zur Seite"
+#: ../../include/features.php:58
+msgid "General Features"
+msgstr "Allgemeine Funktionen"
-#: ../../include/conversation.php:1236
-msgid "Post as"
-msgstr "Veröffentlichen als"
+#: ../../include/features.php:63
+msgid "Multiple Profiles"
+msgstr "Mehrfachprofile"
-#: ../../include/conversation.php:1250
-msgid "Toggle voting"
-msgstr "Umfragewerkzeug aktivieren"
+#: ../../include/features.php:64
+msgid "Ability to create multiple profiles"
+msgstr "Ermöglicht das Anlegen mehrerer Profile pro Kanal"
-#: ../../include/conversation.php:1253
-msgid "Disable comments"
+#: ../../include/features.php:72
+msgid "Advanced Profiles"
+msgstr "Erweiterte Profile"
+
+#: ../../include/features.php:73
+msgid "Additional profile sections and selections"
+msgstr "Stellt zusätzliche Bereiche und Felder im Profil zur Verfügung"
+
+#: ../../include/features.php:81
+msgid "Profile Import/Export"
+msgstr "Profil-Import/Export"
+
+#: ../../include/features.php:82
+msgid "Save and load profile details across sites/channels"
+msgstr "Ermöglicht das Speichern von Profilen, um sie in einen anderen Kanal zu importieren"
+
+#: ../../include/features.php:90
+msgid "Web Pages"
+msgstr "Webseiten"
+
+#: ../../include/features.php:91
+msgid "Provide managed web pages on your channel"
+msgstr "Ermöglicht das Erstellen von Webseiten in Deinem Kanal"
+
+#: ../../include/features.php:100
+msgid "Provide a wiki for your channel"
+msgstr "Stelle ein Wiki in Deinem Kanal zur Verfügung"
+
+#: ../../include/features.php:117
+msgid "Private Notes"
+msgstr "Private Notizen"
+
+#: ../../include/features.php:118
+msgid "Enables a tool to store notes and reminders (note: not encrypted)"
+msgstr "Aktiviert ein Werkzeug mit dem Notizen und Erinnerungen gespeichert werden können (Hinweis: nicht verschlüsselt)"
+
+#: ../../include/features.php:126
+msgid "Navigation Channel Select"
+msgstr "Kanal-Auswahl in der Navigationsleiste"
+
+#: ../../include/features.php:127
+msgid "Change channels directly from within the navigation dropdown menu"
+msgstr "Ermöglicht den direkten Wechsel zu anderen Kanälen über das Navigationsmenü"
+
+#: ../../include/features.php:135
+msgid "Photo Location"
+msgstr "Aufnahmeort"
+
+#: ../../include/features.php:136
+msgid "If location data is available on uploaded photos, link this to a map."
+msgstr "Verlinkt den Aufnahmeort von Fotos (falls verfügbar) auf einer Karte"
+
+#: ../../include/features.php:144
+msgid "Access Controlled Chatrooms"
+msgstr "Zugriffskontrollierte Chaträume"
+
+#: ../../include/features.php:145
+msgid "Provide chatrooms and chat services with access control."
+msgstr "Bieten Sie Chaträume und Chatdienste mit Zugriffskontrolle an."
+
+#: ../../include/features.php:153
+msgid "Smart Birthdays"
+msgstr "Smarte Geburtstage"
+
+#: ../../include/features.php:154
+msgid ""
+"Make birthday events timezone aware in case your friends are scattered "
+"across the planet."
+msgstr "Stellt für Geburtstage einen Zeitzonenbezug her, falls deine Freunde über den ganzen Planeten verstreut sind."
+
+#: ../../include/features.php:162
+msgid "Advanced Directory Search"
+msgstr "Erweiterte Verzeichnissuche"
+
+#: ../../include/features.php:163
+msgid "Allows creation of complex directory search queries"
+msgstr "Ermöglicht die Erstellung komplexer Verzeichnis-Suchabfragen"
+
+#: ../../include/features.php:171
+msgid "Advanced Theme and Layout Settings"
+msgstr "Erweiterte Design- und Layout-Einstellungen"
+
+#: ../../include/features.php:172
+msgid "Allows fine tuning of themes and page layouts"
+msgstr "Erlaubt die Feineinstellung von Designs und Seitenlayouts"
+
+#: ../../include/features.php:182
+msgid "Post Composition Features"
+msgstr "Nachbearbeitungsfunktionen"
+
+#: ../../include/features.php:186
+msgid "Large Photos"
+msgstr "Große Fotos"
+
+#: ../../include/features.php:187
+msgid ""
+"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
+"(640px) photo thumbnails"
+msgstr "Große Vorschaubilder (1024px) in Beiträgen anzeigen. Falls nicht aktiviert, werden kleine Vorschaubilder (640px) verwendet."
+
+#: ../../include/features.php:196
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Ermöglicht den automatischen Import von Inhalten für diesen Kanal von anderen Kanälen oder Feeds"
+
+#: ../../include/features.php:204
+msgid "Even More Encryption"
+msgstr "Noch mehr Verschlüsselung"
+
+#: ../../include/features.php:205
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Ermöglicht optional die zusätzliche Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Schlüssel)"
+
+#: ../../include/features.php:213
+msgid "Enable Voting Tools"
+msgstr "Umfragewerkzeuge aktivieren"
+
+#: ../../include/features.php:214
+msgid "Provide a class of post which others can vote on"
+msgstr "Aktiviert die Umfragewerkzeuge, um anderen die Möglichkeit zu geben, einem Beitrag zuzustimmen, ihn abzulehnen oder sich zu enthalten. (Muss im Beitrag selbst noch aktiviert werden.)"
+
+#: ../../include/features.php:222
+msgid "Disable Comments"
msgstr "Kommentare deaktivieren"
-#: ../../include/conversation.php:1254
-msgid "Toggle comments"
-msgstr "Kommentare umschalten"
+#: ../../include/features.php:223
+msgid "Provide the option to disable comments for a post"
+msgstr "Ermöglicht, die Kommentarfunktion für einzelne Beiträge abzuschalten"
-#: ../../include/conversation.php:1262
-msgid "Categories (optional, comma-separated list)"
-msgstr "Kategorien (optional, kommagetrennte Liste)"
+#: ../../include/features.php:231
+msgid "Delayed Posting"
+msgstr "Verzögertes Senden"
-#: ../../include/conversation.php:1285
-msgid "Other networks and post services"
-msgstr "Andere Netzwerke und Platformen"
+#: ../../include/features.php:232
+msgid "Allow posts to be published at a later date"
+msgstr "Ermöglicht es, Beiträge zu einem späteren Zeitpunkt zu veröffentlichen"
-#: ../../include/conversation.php:1291
-msgid "Set publish date"
-msgstr "Veröffentlichungsdatum festlegen"
+#: ../../include/features.php:240
+msgid "Content Expiration"
+msgstr "Verfall von Inhalten"
-#: ../../include/conversation.php:1540
-msgid "Discover"
-msgstr "Entdecken"
+#: ../../include/features.php:241
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Ermöglicht das automatische Löschen von Beiträgen, Kommentaren und/oder privaten Nachrichten zu einem zukünftigen Datum."
-#: ../../include/conversation.php:1543
-msgid "Imported public streams"
-msgstr "Importierte öffentliche Beiträge"
+#: ../../include/features.php:249
+msgid "Suppress Duplicate Posts/Comments"
+msgstr "Doppelte Beiträge unterdrücken"
-#: ../../include/conversation.php:1548
-msgid "Commented Order"
-msgstr "Neueste Kommentare"
+#: ../../include/features.php:250
+msgid ""
+"Prevent posts with identical content to be published with less than two "
+"minutes in between submissions."
+msgstr "Verhindert, dass innerhalb von zwei Minuten Beiträge mit identischem Inhalt veröffentlicht werden."
-#: ../../include/conversation.php:1551
-msgid "Sort by Comment Date"
-msgstr "Nach Kommentardatum sortiert"
+#: ../../include/features.php:261
+msgid "Network and Stream Filtering"
+msgstr "Netzwerk- und Stream-Filter"
-#: ../../include/conversation.php:1555
-msgid "Posted Order"
-msgstr "Neueste Beiträge"
+#: ../../include/features.php:265
+msgid "Search by Date"
+msgstr "Suche nach Datum"
-#: ../../include/conversation.php:1558
-msgid "Sort by Post Date"
-msgstr "Nach Beitragsdatum sortiert"
+#: ../../include/features.php:266
+msgid "Ability to select posts by date ranges"
+msgstr "Möglichkeit, Beiträge nach Zeiträumen auszuwählen"
-#: ../../include/conversation.php:1566
-msgid "Posts that mention or involve you"
-msgstr "Beiträge mit Beteiligung Deinerseits"
+#: ../../include/features.php:274 ../../include/group.php:311
+msgid "Privacy Groups"
+msgstr "Gruppen"
-#: ../../include/conversation.php:1575
-msgid "Activity Stream - by date"
-msgstr "Activity Stream – nach Datum sortiert"
+#: ../../include/features.php:275
+msgid "Enable management and selection of privacy groups"
+msgstr "Auswahl und Verwaltung von Gruppen für Kanäle aktivieren"
-#: ../../include/conversation.php:1581
-msgid "Starred"
-msgstr "Markiert"
+#: ../../include/features.php:283 ../../include/widgets.php:283
+msgid "Saved Searches"
+msgstr "Gespeicherte Suchanfragen"
-#: ../../include/conversation.php:1584
-msgid "Favourite Posts"
-msgstr "Markierte Beiträge"
+#: ../../include/features.php:284
+msgid "Save search terms for re-use"
+msgstr "Ermöglicht das Abspeichern von Suchbegriffen zur Wiederverwendung"
-#: ../../include/conversation.php:1591
-msgid "Spam"
-msgstr "Spam"
+#: ../../include/features.php:292
+msgid "Network Personal Tab"
+msgstr "Persönlicher Netzwerkreiter"
-#: ../../include/conversation.php:1594
-msgid "Posts flagged as SPAM"
-msgstr "Nachrichten, die als SPAM markiert wurden"
+#: ../../include/features.php:293
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Aktiviert einen Reiter in der Grid-Ansicht, der nur Netzwerk-Beiträge anzeigt, mit denen Du interagiert hast"
-#: ../../include/conversation.php:1653
-msgid "Status Messages and Posts"
-msgstr "Statusnachrichten und Beiträge"
+#: ../../include/features.php:301
+msgid "Network New Tab"
+msgstr "Netzwerkreiter Neu"
-#: ../../include/conversation.php:1662
-msgid "About"
-msgstr "Über"
+#: ../../include/features.php:302
+msgid "Enable tab to display all new Network activity"
+msgstr "Aktiviert einen Reiter in der Grid-Ansicht, der alle neuen Netzwerkaktivitäten anzeigt"
-#: ../../include/conversation.php:1665
-msgid "Profile Details"
-msgstr "Profil-Details"
+#: ../../include/features.php:310
+msgid "Affinity Tool"
+msgstr "Beziehungs-Tool"
-#: ../../include/conversation.php:1681
-msgid "Files and Storage"
-msgstr "Dateien und Speicher"
+#: ../../include/features.php:311
+msgid "Filter stream activity by depth of relationships"
+msgstr "Aktiviert ein Werkzeug in der Grid-Ansicht, das den Stream nach Grad der Beziehung filtern kann"
-#: ../../include/conversation.php:1701 ../../include/conversation.php:1704
-#: ../../include/widgets.php:883
-msgid "Chatrooms"
-msgstr "Chaträume"
+#: ../../include/features.php:320
+msgid "Show friend and connection suggestions"
+msgstr "Freund- und Verbindungsvorschläge anzeigen"
-#: ../../include/conversation.php:1717
-msgid "Saved Bookmarks"
-msgstr "Gespeicherte Lesezeichen"
+#: ../../include/features.php:328
+msgid "Connection Filtering"
+msgstr "Filter für Verbindungen"
-#: ../../include/conversation.php:1727
-msgid "Manage Webpages"
-msgstr "Webseiten verwalten"
+#: ../../include/features.php:329
+msgid "Filter incoming posts from connections based on keywords/content"
+msgstr "Ermöglicht die Filterung eingehender Beiträge anhand von Schlüsselwörtern (muss an der Verbindung konfiguriert werden)"
-#: ../../include/conversation.php:1792
-msgctxt "noun"
-msgid "Attending"
-msgid_plural "Attending"
-msgstr[0] "Zusage"
-msgstr[1] "Zusagen"
+#: ../../include/features.php:341
+msgid "Post/Comment Tools"
+msgstr "Beitrag-/Kommentar-Tools"
-#: ../../include/conversation.php:1795
-msgctxt "noun"
-msgid "Not Attending"
-msgid_plural "Not Attending"
-msgstr[0] "Absage"
-msgstr[1] "Absagen"
+#: ../../include/features.php:345
+msgid "Community Tagging"
+msgstr "Gemeinschaftliches Verschlagworten"
-#: ../../include/conversation.php:1798
-msgctxt "noun"
-msgid "Undecided"
-msgid_plural "Undecided"
-msgstr[0] " Unentschlossen"
-msgstr[1] "Unentschlossene"
+#: ../../include/features.php:346
+msgid "Ability to tag existing posts"
+msgstr "Ermöglicht das Verschlagworten existierender Beiträge"
-#: ../../include/conversation.php:1801
-msgctxt "noun"
-msgid "Agree"
-msgid_plural "Agrees"
-msgstr[0] "Zustimmung"
-msgstr[1] "Zustimmungen"
+#: ../../include/features.php:354
+msgid "Post Categories"
+msgstr "Beitrags-Kategorien"
-#: ../../include/conversation.php:1804
-msgctxt "noun"
-msgid "Disagree"
-msgid_plural "Disagrees"
-msgstr[0] "Ablehnung"
-msgstr[1] "Ablehnungen"
+#: ../../include/features.php:355
+msgid "Add categories to your posts"
+msgstr "Aktiviert Kategorien für Beiträge"
-#: ../../include/conversation.php:1807
-msgctxt "noun"
-msgid "Abstain"
-msgid_plural "Abstains"
-msgstr[0] "Enthaltung"
-msgstr[1] "Enthaltungen"
+#: ../../include/features.php:363
+msgid "Emoji Reactions"
+msgstr "Emoji Reaktionen"
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
-msgid "Tags"
-msgstr "Schlagwörter"
+#: ../../include/features.php:364
+msgid "Add emoji reaction ability to posts"
+msgstr "Aktiviert Emoji-Reaktionen für Beiträge"
-#: ../../include/taxonomy.php:293
-msgid "Keywords"
-msgstr "Schlüsselwörter"
+#: ../../include/features.php:372 ../../include/contact_widgets.php:53
+#: ../../include/widgets.php:346
+msgid "Saved Folders"
+msgstr "Gespeicherte Ordner"
-#: ../../include/taxonomy.php:314
-msgid "have"
-msgstr "habe"
+#: ../../include/features.php:373
+msgid "Ability to file posts under folders"
+msgstr "Möglichkeit, Beiträge in Verzeichnissen zu sammeln"
-#: ../../include/taxonomy.php:314
-msgid "has"
-msgstr "hat"
+#: ../../include/features.php:381
+msgid "Dislike Posts"
+msgstr "Gefällt-mir-nicht-Beiträge"
-#: ../../include/taxonomy.php:315
-msgid "want"
-msgstr "will"
+#: ../../include/features.php:382
+msgid "Ability to dislike posts/comments"
+msgstr "Aktiviert die „Gefällt mir nicht“-Schaltfläche"
-#: ../../include/taxonomy.php:315
-msgid "wants"
-msgstr "will"
+#: ../../include/features.php:390
+msgid "Star Posts"
+msgstr "Beiträge mit Sternchen versehen"
-#: ../../include/taxonomy.php:316
-msgid "likes"
-msgstr "gefällt"
+#: ../../include/features.php:391
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Ermöglicht die lokale Markierung spezieller Beiträge mit einem Sternchen-Symbol"
-#: ../../include/taxonomy.php:317
-msgid "dislikes"
-msgstr "missfällt"
+#: ../../include/features.php:399
+msgid "Tag Cloud"
+msgstr "Schlagwort-Wolke"
+
+#: ../../include/features.php:400
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Aktiviert die Anzeige einer Schlagwort-Wolke (Tag Cloud) auf Deiner Kanal-Seite"
+
+#: ../../include/features.php:412
+msgid "Premium Channel"
+msgstr "Premium-Kanal"
-#: ../../include/text.php:450
+#: ../../include/features.php:413
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Ermöglicht es, Einschränkungen und Bedingungen für Verbindungen dieses Kanals festzulegen"
+
+#: ../../include/text.php:460
msgid "prev"
msgstr "vorherige"
-#: ../../include/text.php:452
+#: ../../include/text.php:462
msgid "first"
msgstr "erste"
-#: ../../include/text.php:481
+#: ../../include/text.php:491
msgid "last"
msgstr "letzte"
-#: ../../include/text.php:484
+#: ../../include/text.php:494
msgid "next"
msgstr "nächste"
-#: ../../include/text.php:494
+#: ../../include/text.php:505
msgid "older"
msgstr "älter"
-#: ../../include/text.php:496
+#: ../../include/text.php:507
msgid "newer"
msgstr "neuer"
-#: ../../include/text.php:889
+#: ../../include/text.php:904
msgid "No connections"
msgstr "Keine Verbindungen"
-#: ../../include/text.php:914
+#: ../../include/text.php:929
#, php-format
msgid "View all %s connections"
msgstr "Alle Verbindungen von %s anzeigen"
-#: ../../include/text.php:1059 ../../include/text.php:1064
+#: ../../include/text.php:1074 ../../include/text.php:1079
msgid "poke"
msgstr "anstupsen"
-#: ../../include/text.php:1065
+#: ../../include/text.php:1074 ../../include/text.php:1079
+#: ../../include/conversation.php:243
+msgid "poked"
+msgstr "stupste"
+
+#: ../../include/text.php:1080
msgid "ping"
msgstr "anpingen"
-#: ../../include/text.php:1065
+#: ../../include/text.php:1080
msgid "pinged"
msgstr "pingte"
-#: ../../include/text.php:1066
+#: ../../include/text.php:1081
msgid "prod"
msgstr "knuffen"
-#: ../../include/text.php:1066
+#: ../../include/text.php:1081
msgid "prodded"
msgstr "knuffte"
-#: ../../include/text.php:1067
+#: ../../include/text.php:1082
msgid "slap"
msgstr "ohrfeigen"
-#: ../../include/text.php:1067
+#: ../../include/text.php:1082
msgid "slapped"
msgstr "ohrfeigte"
-#: ../../include/text.php:1068
+#: ../../include/text.php:1083
msgid "finger"
msgstr "befummeln"
-#: ../../include/text.php:1068
+#: ../../include/text.php:1083
msgid "fingered"
msgstr "befummelte"
-#: ../../include/text.php:1069
+#: ../../include/text.php:1084
msgid "rebuff"
msgstr "eine Abfuhr erteilen"
-#: ../../include/text.php:1069
+#: ../../include/text.php:1084
msgid "rebuffed"
msgstr "zurückgewiesen"
-#: ../../include/text.php:1081
+#: ../../include/text.php:1096
msgid "happy"
msgstr "glücklich"
-#: ../../include/text.php:1082
+#: ../../include/text.php:1097
msgid "sad"
msgstr "traurig"
-#: ../../include/text.php:1083
+#: ../../include/text.php:1098
msgid "mellow"
msgstr "sanft"
-#: ../../include/text.php:1084
+#: ../../include/text.php:1099
msgid "tired"
msgstr "müde"
-#: ../../include/text.php:1085
+#: ../../include/text.php:1100
msgid "perky"
msgstr "frech"
-#: ../../include/text.php:1086
+#: ../../include/text.php:1101
msgid "angry"
msgstr "sauer"
-#: ../../include/text.php:1087
+#: ../../include/text.php:1102
msgid "stupefied"
msgstr "verblüfft"
-#: ../../include/text.php:1088
+#: ../../include/text.php:1103
msgid "puzzled"
msgstr "verwirrt"
-#: ../../include/text.php:1089
+#: ../../include/text.php:1104
msgid "interested"
msgstr "interessiert"
-#: ../../include/text.php:1090
+#: ../../include/text.php:1105
msgid "bitter"
msgstr "verbittert"
-#: ../../include/text.php:1091
+#: ../../include/text.php:1106
msgid "cheerful"
msgstr "fröhlich"
-#: ../../include/text.php:1092
+#: ../../include/text.php:1107
msgid "alive"
msgstr "lebendig"
-#: ../../include/text.php:1093
+#: ../../include/text.php:1108
msgid "annoyed"
msgstr "verärgert"
-#: ../../include/text.php:1094
+#: ../../include/text.php:1109
msgid "anxious"
msgstr "unruhig"
-#: ../../include/text.php:1095
+#: ../../include/text.php:1110
msgid "cranky"
msgstr "schrullig"
-#: ../../include/text.php:1096
+#: ../../include/text.php:1111
msgid "disturbed"
msgstr "verstört"
-#: ../../include/text.php:1097
+#: ../../include/text.php:1112
msgid "frustrated"
msgstr "frustriert"
-#: ../../include/text.php:1098
+#: ../../include/text.php:1113
msgid "depressed"
msgstr "deprimiert"
-#: ../../include/text.php:1099
+#: ../../include/text.php:1114
msgid "motivated"
msgstr "motiviert"
-#: ../../include/text.php:1100
+#: ../../include/text.php:1115
msgid "relaxed"
msgstr "entspannt"
-#: ../../include/text.php:1101
+#: ../../include/text.php:1116
msgid "surprised"
msgstr "überrascht"
-#: ../../include/text.php:1289
+#: ../../include/text.php:1303 ../../include/js_strings.php:70
+msgid "Monday"
+msgstr "Montag"
+
+#: ../../include/text.php:1303 ../../include/js_strings.php:71
+msgid "Tuesday"
+msgstr "Dienstag"
+
+#: ../../include/text.php:1303 ../../include/js_strings.php:72
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+#: ../../include/text.php:1303 ../../include/js_strings.php:73
+msgid "Thursday"
+msgstr "Donnerstag"
+
+#: ../../include/text.php:1303 ../../include/js_strings.php:74
+msgid "Friday"
+msgstr "Freitag"
+
+#: ../../include/text.php:1303 ../../include/js_strings.php:75
+msgid "Saturday"
+msgstr "Samstag"
+
+#: ../../include/text.php:1303 ../../include/js_strings.php:69
+msgid "Sunday"
+msgstr "Sonntag"
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:45
+msgid "January"
+msgstr "Januar"
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:46
+msgid "February"
+msgstr "Februar"
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:47
+msgid "March"
+msgstr "März"
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:48
+msgid "April"
+msgstr "April"
+
+#: ../../include/text.php:1307
msgid "May"
msgstr "Mai"
-#: ../../include/text.php:1366 ../../include/text.php:1370
+#: ../../include/text.php:1307 ../../include/js_strings.php:50
+msgid "June"
+msgstr "Juni"
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:51
+msgid "July"
+msgstr "Juli"
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:52
+msgid "August"
+msgstr "August"
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:53
+msgid "September"
+msgstr "September"
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:54
+msgid "October"
+msgstr "Oktober"
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:55
+msgid "November"
+msgstr "November"
+
+#: ../../include/text.php:1307 ../../include/js_strings.php:56
+msgid "December"
+msgstr "Dezember"
+
+#: ../../include/text.php:1384 ../../include/text.php:1388
msgid "Unknown Attachment"
msgstr "Unbekannter Anhang"
-#: ../../include/text.php:1372
+#: ../../include/text.php:1390
msgid "unknown"
msgstr "unbekannt"
-#: ../../include/text.php:1408
+#: ../../include/text.php:1426
msgid "remove category"
msgstr "Kategorie entfernen"
-#: ../../include/text.php:1485
+#: ../../include/text.php:1503
msgid "remove from file"
msgstr "aus der Datei entfernen"
-#: ../../include/text.php:1784 ../../include/text.php:1855
+#: ../../include/text.php:1770 ../../include/language.php:367
msgid "default"
msgstr "Standard"
-#: ../../include/text.php:1792
+#: ../../include/text.php:1778
msgid "Page layout"
msgstr "Seiten-Layout"
-#: ../../include/text.php:1792
+#: ../../include/text.php:1778
msgid "You can create your own with the layouts tool"
msgstr "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen"
-#: ../../include/text.php:1834
+#: ../../include/text.php:1820
msgid "Page content type"
msgstr "Art des Seiteninhalts"
-#: ../../include/text.php:1867
-msgid "Select an alternate language"
-msgstr "Wähle eine alternative Sprache"
-
-#: ../../include/text.php:2004
+#: ../../include/text.php:1953
msgid "activity"
msgstr "Aktivität"
-#: ../../include/text.php:2305
+#: ../../include/text.php:2267
msgid "Design Tools"
msgstr "Gestaltungswerkzeuge"
-#: ../../include/text.php:2311
+#: ../../include/text.php:2273
msgid "Pages"
msgstr "Seiten"
-#: ../../include/text.php:2333
+#: ../../include/text.php:2295
msgid "Import website..."
msgstr "Webseite importieren..."
-#: ../../include/text.php:2334
+#: ../../include/text.php:2296
msgid "Select folder to import"
msgstr "Ordner zum Importieren auswählen"
-#: ../../include/text.php:2335
+#: ../../include/text.php:2297
msgid "Import from a zipped folder:"
msgstr "Aus einem gezippten Ordner importieren:"
-#: ../../include/text.php:2336
+#: ../../include/text.php:2298
msgid "Import from cloud files:"
msgstr "Aus Cloud-Dateien importieren:"
-#: ../../include/text.php:2337
+#: ../../include/text.php:2299
msgid "/cloud/channel/path/to/folder"
msgstr "/Cloud/Kanal/Pfad/zum/Ordner"
-#: ../../include/text.php:2338
+#: ../../include/text.php:2300
msgid "Enter path to website files"
msgstr "Pfad zu Webseitendateien eingeben"
-#: ../../include/text.php:2339
+#: ../../include/text.php:2301
msgid "Select folder"
msgstr "Ordner auswählen"
-#: ../../include/text.php:2340
+#: ../../include/text.php:2302
msgid "Export website..."
msgstr "Webseite exportieren..."
-#: ../../include/text.php:2341
+#: ../../include/text.php:2303
msgid "Export to a zip file"
msgstr "In eine ZIP-Datei exportieren"
-#: ../../include/text.php:2342
+#: ../../include/text.php:2304
msgid "website.zip"
msgstr "website.zip"
-#: ../../include/text.php:2343
+#: ../../include/text.php:2305
msgid "Enter a name for the zip file."
msgstr "Geben Sie einen für die ZIP-Datei ein."
-#: ../../include/text.php:2344
+#: ../../include/text.php:2306
msgid "Export to cloud files"
msgstr "In Cloud-Dateien exportieren"
-#: ../../include/text.php:2345
+#: ../../include/text.php:2307
msgid "/path/to/export/folder"
msgstr "/Pfad/zum/exportierenden/Ordner"
-#: ../../include/text.php:2346
+#: ../../include/text.php:2308
msgid "Enter a path to a cloud files destination."
msgstr "Gib den Pfad zu einem Datei-Speicherort in der Cloud ein."
-#: ../../include/text.php:2347
+#: ../../include/text.php:2309
msgid "Specify folder"
msgstr "Ordner angeben"
-#: ../../include/api.php:1330
-msgid "Public Timeline"
-msgstr "Öffentliche Zeitleiste"
+#: ../../include/bookmarks.php:35
+#, php-format
+msgid "%1$s's bookmarks"
+msgstr "%1$ss Lesezeichen"
-#: ../../include/dir_fns.php:141
-msgid "Directory Options"
-msgstr "Verzeichnisoptionen"
+#: ../../include/wiki.php:545 ../../include/bbcode.php:552
+#: ../../include/bbcode.php:683
+msgid "Different viewers will see this text differently"
+msgstr "Verschiedene Betrachter werden diesen Text unterschiedlich sehen"
-#: ../../include/dir_fns.php:143
-msgid "Safe Mode"
-msgstr "Sicherer Modus"
+#: ../../include/help.php:31
+msgid "Help:"
+msgstr "Hilfe:"
-#: ../../include/dir_fns.php:144
-msgid "Public Forums Only"
-msgstr "Nur öffentliche Foren"
+#: ../../include/page_widgets.php:7
+msgid "New Page"
+msgstr "Neue Seite"
-#: ../../include/dir_fns.php:145
-msgid "This Website Only"
-msgstr "Nur dieser Hub"
+#: ../../include/contact_widgets.php:11
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d Einladung verfügbar"
+msgstr[1] "%d Einladungen verfügbar"
-#: ../../include/message.php:20
-msgid "No recipient provided."
-msgstr "Kein Empfänger angegeben"
+#: ../../include/contact_widgets.php:19
+msgid "Find Channels"
+msgstr "Finde Kanäle"
-#: ../../include/message.php:25
-msgid "[no subject]"
-msgstr "[no subject]"
+#: ../../include/contact_widgets.php:20
+msgid "Enter name or interest"
+msgstr "Name oder Interessen eingeben"
-#: ../../include/message.php:45
-msgid "Unable to determine sender."
-msgstr "Kann Absender nicht bestimmen."
+#: ../../include/contact_widgets.php:21
+msgid "Connect/Follow"
+msgstr "Verbinden/Folgen"
-#: ../../include/message.php:222
-msgid "Stored post could not be verified."
-msgstr "Gespeicherter Beitrag konnten nicht überprüft werden."
+#: ../../include/contact_widgets.php:22
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Beispiele: Robert Morgenstein, Angeln"
+
+#: ../../include/contact_widgets.php:26
+msgid "Random Profile"
+msgstr "Zufallsprofil"
+
+#: ../../include/contact_widgets.php:27
+msgid "Invite Friends"
+msgstr "Lade Freunde ein"
+
+#: ../../include/contact_widgets.php:29
+msgid "Advanced example: name=fred and country=iceland"
+msgstr "Fortgeschrittenes Beispiel: name=fred and country=iceland"
+
+#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
+#: ../../include/widgets.php:349 ../../include/widgets.php:468
+msgid "Everything"
+msgstr "Alles"
+
+#: ../../include/contact_widgets.php:91 ../../include/taxonomy.php:188
+#: ../../include/taxonomy.php:270 ../../include/widgets.php:46
+#: ../../include/widgets.php:465
+msgid "Categories"
+msgstr "Kategorien"
+
+#: ../../include/contact_widgets.php:122
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d gemeinsame Verbindung"
+msgstr[1] "%d gemeinsame Verbindungen"
+
+#: ../../include/contact_widgets.php:127
+msgid "show more"
+msgstr "mehr zeigen"
+
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
+msgstr "Dieses Element löschen?"
+
+#: ../../include/js_strings.php:8
+#, php-format
+msgid "%s show less"
+msgstr "%s weniger anzeigen"
+
+#: ../../include/js_strings.php:9
+#, php-format
+msgid "%s expand"
+msgstr "%s aufklappen"
+
+#: ../../include/js_strings.php:10
+#, php-format
+msgid "%s collapse"
+msgstr "%s einklappen"
+
+#: ../../include/js_strings.php:11
+msgid "Password too short"
+msgstr "Kennwort zu kurz"
+
+#: ../../include/js_strings.php:12
+msgid "Passwords do not match"
+msgstr "Kennwörter stimmen nicht überein"
+
+#: ../../include/js_strings.php:13
+msgid "everybody"
+msgstr "alle"
+
+#: ../../include/js_strings.php:14
+msgid "Secret Passphrase"
+msgstr "geheime Passphrase"
+
+#: ../../include/js_strings.php:15
+msgid "Passphrase hint"
+msgstr "Hinweis zur Passphrase"
+
+#: ../../include/js_strings.php:16
+msgid "Notice: Permissions have changed but have not yet been submitted."
+msgstr "Achtung: Berechtigungen wurden verändert, aber noch nicht gespeichert."
+
+#: ../../include/js_strings.php:17
+msgid "close all"
+msgstr "Alle schließen"
+
+#: ../../include/js_strings.php:18
+msgid "Nothing new here"
+msgstr "Nichts Neues hier"
+
+#: ../../include/js_strings.php:19
+msgid "Rate This Channel (this is public)"
+msgstr "Diesen Kanal bewerten (öffentlich sichtbar)"
+
+#: ../../include/js_strings.php:21
+msgid "Describe (optional)"
+msgstr "Beschreibung (optional)"
+
+#: ../../include/js_strings.php:23
+msgid "Please enter a link URL"
+msgstr "Gib eine URL ein:"
+
+#: ../../include/js_strings.php:24
+msgid "Unsaved changes. Are you sure you wish to leave this page?"
+msgstr "Ungespeicherte Änderungen. Bist Du sicher, dass Du diese Seite verlassen möchtest?"
+
+#: ../../include/js_strings.php:27
+msgid "timeago.prefixAgo"
+msgstr "timeago.prefixAgo"
+
+#: ../../include/js_strings.php:28
+msgid "timeago.prefixFromNow"
+msgstr " "
+
+#: ../../include/js_strings.php:29
+msgid "ago"
+msgstr "her"
+
+#: ../../include/js_strings.php:30
+msgid "from now"
+msgstr "von jetzt"
+
+#: ../../include/js_strings.php:31
+msgid "less than a minute"
+msgstr "weniger als eine Minute"
+
+#: ../../include/js_strings.php:32
+msgid "about a minute"
+msgstr "ungefähr eine Minute"
+
+#: ../../include/js_strings.php:33
+#, php-format
+msgid "%d minutes"
+msgstr "%d Minuten"
+
+#: ../../include/js_strings.php:34
+msgid "about an hour"
+msgstr "ungefähr eine Stunde"
+
+#: ../../include/js_strings.php:35
+#, php-format
+msgid "about %d hours"
+msgstr "ungefähr %d Stunden"
+
+#: ../../include/js_strings.php:36
+msgid "a day"
+msgstr "ein Tag"
+
+#: ../../include/js_strings.php:37
+#, php-format
+msgid "%d days"
+msgstr "%d Tage"
+
+#: ../../include/js_strings.php:38
+msgid "about a month"
+msgstr "ungefähr ein Monat"
+
+#: ../../include/js_strings.php:39
+#, php-format
+msgid "%d months"
+msgstr "%d Monate"
+
+#: ../../include/js_strings.php:40
+msgid "about a year"
+msgstr "ungefähr ein Jahr"
+
+#: ../../include/js_strings.php:41
+#, php-format
+msgid "%d years"
+msgstr "%d Jahre"
+
+#: ../../include/js_strings.php:42
+msgid " "
+msgstr " "
+
+#: ../../include/js_strings.php:43
+msgid "timeago.numbers"
+msgstr "timeago.numbers"
+
+#: ../../include/js_strings.php:49
+msgctxt "long"
+msgid "May"
+msgstr "Mai"
+
+#: ../../include/js_strings.php:57
+msgid "Jan"
+msgstr "Jan"
+
+#: ../../include/js_strings.php:58
+msgid "Feb"
+msgstr "Feb"
+
+#: ../../include/js_strings.php:59
+msgid "Mar"
+msgstr "Mär"
+
+#: ../../include/js_strings.php:60
+msgid "Apr"
+msgstr "Apr"
+
+#: ../../include/js_strings.php:61
+msgctxt "short"
+msgid "May"
+msgstr "Mai"
+
+#: ../../include/js_strings.php:62
+msgid "Jun"
+msgstr "Jun"
+
+#: ../../include/js_strings.php:63
+msgid "Jul"
+msgstr "Jul"
+
+#: ../../include/js_strings.php:64
+msgid "Aug"
+msgstr "Aug"
+
+#: ../../include/js_strings.php:65
+msgid "Sep"
+msgstr "Sep"
+
+#: ../../include/js_strings.php:66
+msgid "Oct"
+msgstr "Okt"
+
+#: ../../include/js_strings.php:67
+msgid "Nov"
+msgstr "Nov"
+
+#: ../../include/js_strings.php:68
+msgid "Dec"
+msgstr "Dez"
+
+#: ../../include/js_strings.php:76
+msgid "Sun"
+msgstr "So"
+
+#: ../../include/js_strings.php:77
+msgid "Mon"
+msgstr "Mo"
+
+#: ../../include/js_strings.php:78
+msgid "Tue"
+msgstr "Di"
+
+#: ../../include/js_strings.php:79
+msgid "Wed"
+msgstr "Mi"
+
+#: ../../include/js_strings.php:80
+msgid "Thu"
+msgstr "Do"
+
+#: ../../include/js_strings.php:81
+msgid "Fri"
+msgstr "Fr"
+
+#: ../../include/js_strings.php:82
+msgid "Sat"
+msgstr "Sa"
+
+#: ../../include/js_strings.php:83
+msgctxt "calendar"
+msgid "today"
+msgstr "heute"
+
+#: ../../include/js_strings.php:84
+msgctxt "calendar"
+msgid "month"
+msgstr "Monat"
+
+#: ../../include/js_strings.php:85
+msgctxt "calendar"
+msgid "week"
+msgstr "Woche"
+
+#: ../../include/js_strings.php:86
+msgctxt "calendar"
+msgid "day"
+msgstr "Tag"
+
+#: ../../include/js_strings.php:87
+msgctxt "calendar"
+msgid "All day"
+msgstr "Ganztägig"
+
+#: ../../include/network.php:729
+msgid "view full size"
+msgstr "In Vollbildansicht anschauen"
+
+#: ../../include/network.php:1978
+msgid "No Subject"
+msgstr "Kein Betreff"
+
+#: ../../include/network.php:2234
+msgid "OStatus"
+msgstr "OStatus"
+
+#: ../../include/network.php:2235
+msgid "GNU-Social"
+msgstr "GNU-Social"
+
+#: ../../include/network.php:2236
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
+
+#: ../../include/network.php:2239
+msgid "Facebook"
+msgstr "Facebook"
+
+#: ../../include/network.php:2240
+msgid "Zot"
+msgstr "Zot!"
+
+#: ../../include/network.php:2241
+msgid "LinkedIn"
+msgstr "LinkedIn"
+
+#: ../../include/network.php:2242
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
+
+#: ../../include/network.php:2243
+msgid "MySpace"
+msgstr "MySpace"
+
+#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+msgid "Tags"
+msgstr "Schlagwörter"
+
+#: ../../include/taxonomy.php:293
+msgid "Keywords"
+msgstr "Schlüsselwörter"
+
+#: ../../include/taxonomy.php:314
+msgid "have"
+msgstr "habe"
+
+#: ../../include/taxonomy.php:314
+msgid "has"
+msgstr "hat"
+
+#: ../../include/taxonomy.php:315
+msgid "want"
+msgstr "will"
+
+#: ../../include/taxonomy.php:315
+msgid "wants"
+msgstr "will"
+
+#: ../../include/taxonomy.php:316
+msgid "likes"
+msgstr "gefällt"
+
+#: ../../include/taxonomy.php:317
+msgid "dislikes"
+msgstr "missfällt"
+
+#: ../../include/import.php:30
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "Kann keinen doppelten Kanal-Identifikator auf diesem System erzeugen (Spitzname oder Hash schon belegt). Import fehlgeschlagen."
+
+#: ../../include/import.php:90
+msgid "Channel clone failed. Import failed."
+msgstr "Klonen des Kanals fehlgeschlagen. Import fehlgeschlagen."
+
+#: ../../include/import.php:1354
+msgid "Unable to import element \""
+msgstr "Element konnte nicht importiert werden."
+
+#: ../../include/security.php:117
+msgid "guest:"
+msgstr "Gast:"
+
+#: ../../include/security.php:535
+msgid ""
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
+msgstr "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde."
+
+#: ../../include/zot.php:662
+msgid "Invalid data packet"
+msgstr "Ungültiges Datenpaket"
+
+#: ../../include/zot.php:678
+msgid "Unable to verify channel signature"
+msgstr "Konnte die Signatur des Kanals nicht verifizieren"
+
+#: ../../include/zot.php:2320
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr "Kann die Signatur der Seite von %s nicht verifizieren"
+
+#: ../../include/zot.php:3718
+msgid "invalid target signature"
+msgstr "Ungültige Signatur des Ziels"
+
+#: ../../include/items.php:837 ../../include/items.php:882
+msgid "(Unknown)"
+msgstr "(Unbekannt)"
+
+#: ../../include/items.php:1080
+msgid "Visible to anybody on the internet."
+msgstr "Für jeden im Internet sichtbar."
+
+#: ../../include/items.php:1082
+msgid "Visible to you only."
+msgstr "Nur für Dich sichtbar."
+
+#: ../../include/items.php:1084
+msgid "Visible to anybody in this network."
+msgstr "Für jedes $Projectname-Mitglied sichtbar."
+
+#: ../../include/items.php:1086
+msgid "Visible to anybody authenticated."
+msgstr "Für jeden sichtbar, der angemeldet ist."
+
+#: ../../include/items.php:1088
+#, php-format
+msgid "Visible to anybody on %s."
+msgstr "Für jeden auf %s sichtbar."
+
+#: ../../include/items.php:1090
+msgid "Visible to all connections."
+msgstr "Für alle Verbindungen sichtbar."
+
+#: ../../include/items.php:1092
+msgid "Visible to approved connections."
+msgstr "Nur für akzeptierte Verbindungen sichtbar."
+
+#: ../../include/items.php:1094
+msgid "Visible to specific connections."
+msgstr "Sichtbar für bestimmte Verbindungen."
+
+#: ../../include/items.php:3892
+msgid "Privacy group is empty."
+msgstr "Gruppe ist leer."
+
+#: ../../include/items.php:3899
+#, php-format
+msgid "Privacy group: %s"
+msgstr "Gruppe: %s"
+
+#: ../../include/items.php:3911
+msgid "Connection not found."
+msgstr "Die Verbindung wurde nicht gefunden."
+
+#: ../../include/items.php:4260
+msgid "profile photo"
+msgstr "Profilfoto"
+
+#: ../../include/items.php:4456
+#, php-format
+msgid "[Edited %s]"
+msgstr "[%s wurde bearbeitet]"
+
+#: ../../include/items.php:4456
+msgctxt "edit_activity"
+msgid "Post"
+msgstr "Beitrag"
+
+#: ../../include/items.php:4456
+msgctxt "edit_activity"
+msgid "Comment"
+msgstr "Kommentar"
+
+#: ../../include/auth.php:148
+msgid "Logged out."
+msgstr "Ausgeloggt."
+
+#: ../../include/auth.php:275
+msgid "Failed authentication"
+msgstr "Authentifizierung fehlgeschlagen"
+
+#: ../../include/activities.php:41
+msgid " and "
+msgstr "und"
+
+#: ../../include/activities.php:49
+msgid "public profile"
+msgstr "öffentliches Profil"
+
+#: ../../include/activities.php:58
+#, php-format
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s hat %2$s auf &ldquo;%3$s&rdquo; geändert"
+
+#: ../../include/activities.php:59
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "Besuche %1$s's %2$s"
+
+#: ../../include/activities.php:62
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s hat ein aktualisiertes %2$s, %3$s wurde verändert."
+
+#: ../../include/attach.php:248 ../../include/attach.php:336
+msgid "Item was not found."
+msgstr "Beitrag wurde nicht gefunden."
+
+#: ../../include/attach.php:497
+msgid "No source file."
+msgstr "Keine Quelldatei."
+
+#: ../../include/attach.php:519
+msgid "Cannot locate file to replace"
+msgstr "Kann Datei zum Ersetzen nicht finden"
+
+#: ../../include/attach.php:537
+msgid "Cannot locate file to revise/update"
+msgstr "Kann Datei zum Prüfen/Aktualisieren nicht finden"
+
+#: ../../include/attach.php:668
+#, php-format
+msgid "File exceeds size limit of %d"
+msgstr "Datei überschreitet das Größen-Limit von %d"
+
+#: ../../include/attach.php:682
+#, php-format
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+msgstr "Die Größe Deiner Datei-Anhänge hat das Maximum von %1$.0f MByte erreicht."
+
+#: ../../include/attach.php:852
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess."
+
+#: ../../include/attach.php:865
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen."
+
+#: ../../include/attach.php:920 ../../include/attach.php:936
+msgid "Path not available."
+msgstr "Pfad nicht verfügbar."
+
+#: ../../include/attach.php:982 ../../include/attach.php:1140
+msgid "Empty pathname"
+msgstr "Leere Pfadangabe"
+
+#: ../../include/attach.php:1008
+msgid "duplicate filename or path"
+msgstr "doppelter Dateiname oder Pfad"
+
+#: ../../include/attach.php:1030
+msgid "Path not found."
+msgstr "Pfad nicht gefunden."
+
+#: ../../include/attach.php:1094
+msgid "mkdir failed."
+msgstr "mkdir fehlgeschlagen."
+
+#: ../../include/attach.php:1098
+msgid "database storage failed."
+msgstr "Speichern in der Datenbank fehlgeschlagen."
+
+#: ../../include/attach.php:1146
+msgid "Empty path"
+msgstr "Leere Pfadangabe"
+
+#: ../../include/event.php:22 ../../include/event.php:69
+#: ../../include/bb2diaspora.php:498
+msgid "l F d, Y \\@ g:i A"
+msgstr "l, d. F Y, H:i"
+
+#: ../../include/event.php:30 ../../include/event.php:73
+#: ../../include/bb2diaspora.php:504
+msgid "Starts:"
+msgstr "Beginnt:"
+
+#: ../../include/event.php:40 ../../include/event.php:77
+#: ../../include/bb2diaspora.php:512
+msgid "Finishes:"
+msgstr "Endet:"
+
+#: ../../include/event.php:824
+msgid "This event has been added to your calendar."
+msgstr "Dieser Termin wurde zu Deinem Kalender hinzugefügt"
+
+#: ../../include/event.php:1024
+msgid "Not specified"
+msgstr "Keine Angabe"
+
+#: ../../include/event.php:1025
+msgid "Needs Action"
+msgstr "Aktion erforderlich"
+
+#: ../../include/event.php:1026
+msgid "Completed"
+msgstr "Abgeschlossen"
+
+#: ../../include/event.php:1027
+msgid "In Process"
+msgstr "In Bearbeitung"
+
+#: ../../include/event.php:1028
+msgid "Cancelled"
+msgstr "gestrichen"
+
+#: ../../include/follow.php:27
+msgid "Channel is blocked on this site."
+msgstr "Der Kanal ist auf dieser Seite blockiert "
+
+#: ../../include/follow.php:32
+msgid "Channel location missing."
+msgstr "Adresse des Kanals fehlt."
+
+#: ../../include/follow.php:80
+msgid "Response from remote channel was incomplete."
+msgstr "Antwort des entfernten Kanals war unvollständig."
+
+#: ../../include/follow.php:97
+msgid "Channel was deleted and no longer exists."
+msgstr "Kanal wurde gelöscht und existiert nicht mehr."
+
+#: ../../include/follow.php:147 ../../include/follow.php:183
+msgid "Protocol disabled."
+msgstr "Protokoll deaktiviert."
+
+#: ../../include/follow.php:171
+msgid "Channel discovery failed."
+msgstr "Kanalsuche fehlgeschlagen"
+
+#: ../../include/follow.php:210
+msgid "Cannot connect to yourself."
+msgstr "Du kannst Dich nicht mit Dir selbst verbinden."
+
+#: ../../include/group.php:26
+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 "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die gelöscht wurde. Es <strong>könnten</strong> von damals noch Elemente (Beiträge, Dateien etc.) vorhanden sein, die allen jetzigen und zukünftigen Mitgliedern dieser Gruppe den Zugriff erlauben. Wenn das nicht Deine Absicht ist, erstelle bitte eine neue Gruppe mit einem anderen Namen."
+
+#: ../../include/group.php:248
+msgid "Add new connections to this privacy group"
+msgstr "Neue Verbindung zu dieser Gruppe hinzufügen"
+
+#: ../../include/group.php:289
+msgid "edit"
+msgstr "Bearbeiten"
+
+#: ../../include/group.php:312
+msgid "Edit group"
+msgstr "Gruppe ändern"
+
+#: ../../include/group.php:313
+msgid "Add privacy group"
+msgstr "Gruppe hinzufügen"
+
+#: ../../include/group.php:314
+msgid "Channels not in any privacy group"
+msgstr "Kanäle, die in keiner Gruppe sind"
+
+#: ../../include/group.php:316 ../../include/widgets.php:284
+msgid "add"
+msgstr "hinzufügen"
+
+#: ../../include/language.php:380
+msgid "Select an alternate language"
+msgstr "Wähle eine alternative Sprache"
+
+#: ../../include/photos.php:115
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "Bild überschreitet das Webseitenlimit von %lu Bytes"
+
+#: ../../include/photos.php:122
+msgid "Image file is empty."
+msgstr "Bilddatei ist leer."
+
+#: ../../include/photos.php:260
+msgid "Photo storage failed."
+msgstr "Fotospeicherung fehlgeschlagen."
+
+#: ../../include/photos.php:300
+msgid "a new photo"
+msgstr "ein neues Foto"
+
+#: ../../include/photos.php:304
+#, php-format
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
+msgstr "%1$s hat %2$s auf %3$s veröffentlicht"
+
+#: ../../include/photos.php:507 ../../include/conversation.php:1695
+msgid "Photo Albums"
+msgstr "Fotoalben"
+
+#: ../../include/photos.php:511
+msgid "Upload New Photos"
+msgstr "Neue Fotos hochladen"
#: ../../include/widgets.php:103
msgid "System"
@@ -9551,10 +12595,6 @@ msgstr "Notizen"
msgid "Remove term"
msgstr "Eintrag löschen"
-#: ../../include/widgets.php:283 ../../include/features.php:84
-msgid "Saved Searches"
-msgstr "Gespeicherte Suchanfragen"
-
#: ../../include/widgets.php:390
msgid "Archives"
msgstr "Archive"
@@ -9639,6 +12679,11 @@ msgstr "Kalender exportieren"
msgid "Import Calendar"
msgstr "Kalender importieren"
+#: ../../include/widgets.php:883 ../../include/conversation.php:1722
+#: ../../include/conversation.php:1725
+msgid "Chatrooms"
+msgstr "Chaträume"
+
#: ../../include/widgets.php:887
msgid "Overview"
msgstr "Übersicht"
@@ -9647,375 +12692,508 @@ msgstr "Übersicht"
msgid "Chat Members"
msgstr "Chatmitglieder"
-#: ../../include/widgets.php:916
+#: ../../include/widgets.php:960
msgid "Wiki List"
msgstr "Wikiliste"
-#: ../../include/widgets.php:954
+#: ../../include/widgets.php:968
+msgid "Create new wiki"
+msgstr "Neues Wiki erstellen"
+
+#: ../../include/widgets.php:978
+msgid "Send notification"
+msgstr "Benachrichtigung senden"
+
+#: ../../include/widgets.php:1014
msgid "Wiki Pages"
msgstr "Wikiseiten"
-#: ../../include/widgets.php:989
+#: ../../include/widgets.php:1019
+msgid "Add new page"
+msgstr "Neue Seite hinzufügen"
+
+#: ../../include/widgets.php:1020
+msgid "Page name"
+msgstr "Seitenname"
+
+#: ../../include/widgets.php:1052
msgid "Bookmarked Chatrooms"
msgstr "Gespeicherte Chatrooms"
-#: ../../include/widgets.php:1020
+#: ../../include/widgets.php:1083
msgid "Suggested Chatrooms"
msgstr "Chatraum-Vorschläge"
-#: ../../include/widgets.php:1166 ../../include/widgets.php:1278
+#: ../../include/widgets.php:1228 ../../include/widgets.php:1340
msgid "photo/image"
msgstr "Foto/Bild"
-#: ../../include/widgets.php:1221
+#: ../../include/widgets.php:1283
msgid "Click to show more"
msgstr "Klick, um mehr anzuzeigen"
-#: ../../include/widgets.php:1372
+#: ../../include/widgets.php:1434
msgid "Rating Tools"
msgstr "Bewertungswerkzeuge"
-#: ../../include/widgets.php:1376 ../../include/widgets.php:1378
+#: ../../include/widgets.php:1438 ../../include/widgets.php:1440
msgid "Rate Me"
msgstr "Bewerte mich"
-#: ../../include/widgets.php:1381
+#: ../../include/widgets.php:1443
msgid "View Ratings"
msgstr "Bewertungen ansehen"
-#: ../../include/widgets.php:1465
+#: ../../include/widgets.php:1536
msgid "Forums"
msgstr "Foren"
-#: ../../include/widgets.php:1494
+#: ../../include/widgets.php:1565
msgid "Tasks"
msgstr "Aufgaben"
-#: ../../include/widgets.php:1505
+#: ../../include/widgets.php:1576
msgid "Documentation"
msgstr "Dokumentation"
-#: ../../include/widgets.php:1557 ../../include/widgets.php:1595
+#: ../../include/widgets.php:1632 ../../include/widgets.php:1670
msgid "Member registrations waiting for confirmation"
msgstr "Nutzer-Anmeldungen, die auf Bestätigung warten"
-#: ../../include/widgets.php:1563
+#: ../../include/widgets.php:1638
msgid "Inspect queue"
msgstr "Warteschlange kontrollieren"
-#: ../../include/widgets.php:1565
+#: ../../include/widgets.php:1640
msgid "DB updates"
msgstr "DB-Aktualisierungen"
-#: ../../include/widgets.php:1591
+#: ../../include/widgets.php:1666
msgid "Plugin Features"
msgstr "Plug-In Funktionen"
-#: ../../include/zot.php:700
-msgid "Invalid data packet"
-msgstr "Ungültiges Datenpaket"
+#: ../../include/acl_selectors.php:198
+msgid "Who can see this?"
+msgstr "Wer kann das sehen?"
-#: ../../include/zot.php:716
-msgid "Unable to verify channel signature"
-msgstr "Konnte die Signatur des Kanals nicht verifizieren"
+#: ../../include/acl_selectors.php:199
+msgid "Custom selection"
+msgstr "Benutzerdefinierte Auswahl"
-#: ../../include/zot.php:2329
+#: ../../include/acl_selectors.php:200
+msgid ""
+"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
+" the scope of \"Show\"."
+msgstr "Wähle \"Anzeigen\", um Betrachtung zuzulassen. \"Nicht anzeigen\" überstimmt und limitiert den Aktionsradius von \"Anzeigen\" für Ausnahmen."
+
+#: ../../include/acl_selectors.php:201
+msgid "Show"
+msgstr "Anzeigen"
+
+#: ../../include/acl_selectors.php:202
+msgid "Don't show"
+msgstr "Nicht anzeigen"
+
+#: ../../include/acl_selectors.php:235
#, php-format
-msgid "Unable to verify site signature for %s"
-msgstr "Kann die Signatur der Seite von %s nicht verifizieren"
+msgid ""
+"Post permissions %s cannot be changed %s after a post is shared.</br />These"
+" permissions set who is allowed to view the post."
+msgstr "Beitragsberechtigungen %s können nicht geändert werden %s, nachdem der Beitrag gesendet wurde.<br />Diese Berechtigungen bestimmen, wer den Beitrag sehen kann."
-#: ../../include/zot.php:3711
-msgid "invalid target signature"
-msgstr "Ungültige Signatur des Ziels"
+#: ../../include/oembed.php:312
+msgid " by "
+msgstr "von"
-#: ../../include/features.php:50
-msgid "General Features"
-msgstr "Allgemeine Funktionen"
+#: ../../include/oembed.php:313
+msgid " on "
+msgstr "am"
-#: ../../include/features.php:52
-msgid "Content Expiration"
-msgstr "Verfall von Inhalten"
+#: ../../include/oembed.php:342
+msgid "Embedded content"
+msgstr "Eingebetteter Inhalt"
-#: ../../include/features.php:52
-msgid "Remove posts/comments and/or private messages at a future time"
-msgstr "Ermöglicht das automatische Löschen von Beiträgen, Kommentaren und/oder privaten Nachrichten zu einem zukünftigen Datum."
+#: ../../include/oembed.php:351
+msgid "Embedding disabled"
+msgstr "Einbetten deaktiviert"
-#: ../../include/features.php:53
-msgid "Multiple Profiles"
-msgstr "Mehrfachprofile"
+#: ../../include/bb2diaspora.php:403
+msgid "Attachments:"
+msgstr "Anhänge:"
-#: ../../include/features.php:53
-msgid "Ability to create multiple profiles"
-msgstr "Ermöglicht das Anlegen mehrerer Profile pro Kanal"
+#: ../../include/bb2diaspora.php:500
+msgid "$Projectname event notification:"
+msgstr "$Projectname-Terminbenachrichtigung:"
-#: ../../include/features.php:54
-msgid "Advanced Profiles"
-msgstr "Erweiterte Profile"
+#: ../../include/permissions.php:35
+msgid "Can view my normal stream and posts"
+msgstr "Kann meine normalen Beiträge sehen"
-#: ../../include/features.php:54
-msgid "Additional profile sections and selections"
-msgstr "Stellt zusätzliche Bereiche und Felder im Profil zur Verfügung"
+#: ../../include/permissions.php:39
+msgid "Can view my webpages"
+msgstr "Kann meine Webseiten sehen"
-#: ../../include/features.php:55
-msgid "Profile Import/Export"
-msgstr "Profil-Import/Export"
+#: ../../include/permissions.php:43
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen"
-#: ../../include/features.php:55
-msgid "Save and load profile details across sites/channels"
-msgstr "Ermöglicht das Speichern von Profilen, um sie in einen anderen Kanal zu importieren"
+#: ../../include/permissions.php:46
+msgid "Can like/dislike stuff"
+msgstr "Kann andere Elemente mögen/nicht mögen"
-#: ../../include/features.php:56
-msgid "Web Pages"
-msgstr "Webseiten"
+#: ../../include/permissions.php:46
+msgid "Profiles and things other than posts/comments"
+msgstr "Profile und alles außer Beiträge und Kommentare"
-#: ../../include/features.php:56
-msgid "Provide managed web pages on your channel"
-msgstr "Ermöglicht das Erstellen von Webseiten in Deinem Kanal"
+#: ../../include/permissions.php:48
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Kann an alle meine Kontakte via @-Erwähnung Nachrichten weiterleiten"
-#: ../../include/features.php:57
-msgid "Provide a wiki for your channel"
-msgstr "Stelle ein Wiki in Deinem Kanal zur Verfügung"
+#: ../../include/permissions.php:48
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen"
-#: ../../include/features.php:59
-msgid "Private Notes"
-msgstr "Private Notizen"
+#: ../../include/permissions.php:49
+msgid "Can chat with me (when available)"
+msgstr "Kann mit mir chatten (wenn verfügbar)"
-#: ../../include/features.php:59
-msgid "Enables a tool to store notes and reminders (note: not encrypted)"
-msgstr "Aktiviert ein Werkzeug mit dem Notizen und Erinnerungen gespeichert werden können (Hinweis: nicht verschlüsselt)"
+#: ../../include/permissions.php:50
+msgid "Can write to my file storage and photos"
+msgstr "Kann in meine Datei- und Bilderordner schreiben"
-#: ../../include/features.php:60
-msgid "Navigation Channel Select"
-msgstr "Kanal-Auswahl in der Navigationsleiste"
+#: ../../include/permissions.php:51
+msgid "Can edit my webpages"
+msgstr "Kann meine Webseiten bearbeiten"
-#: ../../include/features.php:60
-msgid "Change channels directly from within the navigation dropdown menu"
-msgstr "Ermöglicht den direkten Wechsel zu anderen Kanälen über das Navigationsmenü"
+#: ../../include/permissions.php:53
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Etwas fortgeschritten – sehr nützlich in offenen Gemeinschaften"
-#: ../../include/features.php:61
-msgid "Photo Location"
-msgstr "Aufnahmeort"
+#: ../../include/permissions.php:55
+msgid "Can administer my channel resources"
+msgstr "Kann meine Kanäle administrieren"
-#: ../../include/features.php:61
-msgid "If location data is available on uploaded photos, link this to a map."
-msgstr "Verlinkt den Aufnahmeort von Fotos (falls verfügbar) auf einer Karte"
+#: ../../include/permissions.php:55
+msgid ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Sehr fortgeschritten. Bearbeite das nur, wenn Du genau weißt, was Du tust"
-#: ../../include/features.php:62
-msgid "Access Controlled Chatrooms"
-msgstr "Zugriffskontrollierte Chaträume"
+#: ../../include/conversation.php:204
+#, php-format
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s ist jetzt mit %2$s verbunden"
-#: ../../include/features.php:62
-msgid "Provide chatrooms and chat services with access control."
-msgstr "Bieten Sie Chaträume und Chatdienste mit Zugriffskontrolle an."
+#: ../../include/conversation.php:239
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s stupste %2$s an"
-#: ../../include/features.php:63
-msgid "Smart Birthdays"
-msgstr "Smarte Geburtstage"
+#: ../../include/conversation.php:710
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "%ss Profil auf %s ansehen"
-#: ../../include/features.php:63
-msgid ""
-"Make birthday events timezone aware in case your friends are scattered "
-"across the planet."
-msgstr "Stellt für Geburtstage einen Zeitzonenbezug her, falls deine Freunde über den ganzen Planeten verstreut sind."
+#: ../../include/conversation.php:729
+msgid "Categories:"
+msgstr "Kategorien:"
-#: ../../include/features.php:68
-msgid "Post Composition Features"
-msgstr "Nachbearbeitungsfunktionen"
+#: ../../include/conversation.php:730
+msgid "Filed under:"
+msgstr "Gespeichert unter:"
-#: ../../include/features.php:69
-msgid "Large Photos"
-msgstr "Große Fotos"
+#: ../../include/conversation.php:755
+msgid "View in context"
+msgstr "Im Zusammenhang anschauen"
-#: ../../include/features.php:69
-msgid ""
-"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
-"(640px) photo thumbnails"
-msgstr "Große Vorschaubilder (1024px) in Beiträgen anzeigen. Falls nicht aktiviert, werden kleine Vorschaubilder (640px) verwendet."
+#: ../../include/conversation.php:865
+msgid "remove"
+msgstr "lösche"
-#: ../../include/features.php:70
-msgid "Automatically import channel content from other channels or feeds"
-msgstr "Ermöglicht den automatischen Import von Inhalten für diesen Kanal von anderen Kanälen oder Feeds"
+#: ../../include/conversation.php:870
+msgid "Delete Selected Items"
+msgstr "Lösche die ausgewählten Elemente"
-#: ../../include/features.php:71
-msgid "Even More Encryption"
-msgstr "Noch mehr Verschlüsselung"
+#: ../../include/conversation.php:963
+msgid "View Source"
+msgstr "Quelle anzeigen"
-#: ../../include/features.php:71
-msgid ""
-"Allow optional encryption of content end-to-end with a shared secret key"
-msgstr "Ermöglicht optional die zusätzliche Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Schlüssel)"
+#: ../../include/conversation.php:964
+msgid "Follow Thread"
+msgstr "Unterhaltung folgen"
-#: ../../include/features.php:72
-msgid "Enable Voting Tools"
-msgstr "Umfragewerkzeuge aktivieren"
+#: ../../include/conversation.php:965
+msgid "Unfollow Thread"
+msgstr "Unterhaltung nicht mehr folgen"
-#: ../../include/features.php:72
-msgid "Provide a class of post which others can vote on"
-msgstr "Aktiviert die Umfragewerkzeuge, um anderen die Möglichkeit zu geben, einem Beitrag zuzustimmen, ihn abzulehnen oder sich zu enthalten. (Muss im Beitrag selbst noch aktiviert werden.)"
+#: ../../include/conversation.php:970
+msgid "Activity/Posts"
+msgstr "Aktivitäten/Beiträge"
-#: ../../include/features.php:73
-msgid "Disable Comments"
-msgstr "Kommentare deaktivieren"
+#: ../../include/conversation.php:972
+msgid "Edit Connection"
+msgstr "Verbindung bearbeiten"
-#: ../../include/features.php:73
-msgid "Provide the option to disable comments for a post"
-msgstr "Ermöglicht, die Kommentarfunktion für einzelne Beiträge abzuschalten"
+#: ../../include/conversation.php:973
+msgid "Message"
+msgstr "Nachricht"
-#: ../../include/features.php:74
-msgid "Delayed Posting"
-msgstr "Verzögertes Senden"
+#: ../../include/conversation.php:1093
+#, php-format
+msgid "%s likes this."
+msgstr "%s gefällt das."
-#: ../../include/features.php:74
-msgid "Allow posts to be published at a later date"
-msgstr "Ermöglicht es, Beiträge zu einem späteren Zeitpunkt zu veröffentlichen"
+#: ../../include/conversation.php:1093
+#, php-format
+msgid "%s doesn't like this."
+msgstr "%s gefällt das nicht."
-#: ../../include/features.php:75
-msgid "Suppress Duplicate Posts/Comments"
-msgstr "Doppelte Beiträge unterdrücken"
+#: ../../include/conversation.php:1097
+#, php-format
+msgid "<span %1$s>%2$d people</span> like this."
+msgid_plural "<span %1$s>%2$d people</span> like this."
+msgstr[0] "<span %1$s>%2$d Person</span> gefällt das."
+msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das."
-#: ../../include/features.php:75
-msgid ""
-"Prevent posts with identical content to be published with less than two "
-"minutes in between submissions."
-msgstr "Verhindert, dass innerhalb von zwei Minuten Beiträge mit identischem Inhalt veröffentlicht werden."
+#: ../../include/conversation.php:1099
+#, php-format
+msgid "<span %1$s>%2$d people</span> don't like this."
+msgid_plural "<span %1$s>%2$d people</span> don't like this."
+msgstr[0] "<span %1$s>%2$d Person</span> gefällt das nicht."
+msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das nicht."
-#: ../../include/features.php:81
-msgid "Network and Stream Filtering"
-msgstr "Netzwerk- und Stream-Filter"
+#: ../../include/conversation.php:1105
+msgid "and"
+msgstr "und"
-#: ../../include/features.php:82
-msgid "Search by Date"
-msgstr "Suche nach Datum"
+#: ../../include/conversation.php:1108
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ""
+msgstr[1] ", und %d andere"
-#: ../../include/features.php:82
-msgid "Ability to select posts by date ranges"
-msgstr "Möglichkeit, Beiträge nach Zeiträumen auszuwählen"
+#: ../../include/conversation.php:1109
+#, php-format
+msgid "%s like this."
+msgstr "%s gefällt das."
-#: ../../include/features.php:83
-msgid "Enable management and selection of privacy groups"
-msgstr "Auswahl und Verwaltung von Gruppen für Kanäle aktivieren"
+#: ../../include/conversation.php:1109
+#, php-format
+msgid "%s don't like this."
+msgstr "%s gefällt das nicht."
-#: ../../include/features.php:84
-msgid "Save search terms for re-use"
-msgstr "Ermöglicht das Abspeichern von Suchbegriffen zur Wiederverwendung"
+#: ../../include/conversation.php:1152
+msgid "Set your location"
+msgstr "Standort"
-#: ../../include/features.php:85
-msgid "Network Personal Tab"
-msgstr "Persönlicher Netzwerkreiter"
+#: ../../include/conversation.php:1153
+msgid "Clear browser location"
+msgstr "Browser-Standort löschen"
-#: ../../include/features.php:85
-msgid "Enable tab to display only Network posts that you've interacted on"
-msgstr "Aktiviert einen Reiter in der Grid-Ansicht, der nur Netzwerk-Beiträge anzeigt, mit denen Du interagiert hast"
+#: ../../include/conversation.php:1201
+msgid "Tag term:"
+msgstr "Schlagwort:"
-#: ../../include/features.php:86
-msgid "Network New Tab"
-msgstr "Netzwerkreiter Neu"
+#: ../../include/conversation.php:1202
+msgid "Where are you right now?"
+msgstr "Wo bist Du jetzt grade?"
-#: ../../include/features.php:86
-msgid "Enable tab to display all new Network activity"
-msgstr "Aktiviert einen Reiter in der Grid-Ansicht, der alle neuen Netzwerkaktivitäten anzeigt"
+#: ../../include/conversation.php:1211
+msgid "Comments enabled"
+msgstr "Kommentare aktiviert"
-#: ../../include/features.php:87
-msgid "Affinity Tool"
-msgstr "Beziehungs-Tool"
+#: ../../include/conversation.php:1212
+msgid "Comments disabled"
+msgstr "Kommentare deaktiviert"
-#: ../../include/features.php:87
-msgid "Filter stream activity by depth of relationships"
-msgstr "Aktiviert ein Werkzeug in der Grid-Ansicht, das den Stream nach Grad der Beziehung filtern kann"
+#: ../../include/conversation.php:1250
+msgid "Page link name"
+msgstr "Link zur Seite"
-#: ../../include/features.php:88
-msgid "Show friend and connection suggestions"
-msgstr "Freund- und Verbindungsvorschläge anzeigen"
+#: ../../include/conversation.php:1253
+msgid "Post as"
+msgstr "Veröffentlichen als"
-#: ../../include/features.php:93
-msgid "Post/Comment Tools"
-msgstr "Beitrag-/Kommentar-Tools"
+#: ../../include/conversation.php:1267
+msgid "Toggle voting"
+msgstr "Umfragewerkzeug aktivieren"
-#: ../../include/features.php:94
-msgid "Community Tagging"
-msgstr "Gemeinschaftliches Verschlagworten"
+#: ../../include/conversation.php:1270
+msgid "Disable comments"
+msgstr "Kommentare deaktivieren"
-#: ../../include/features.php:94
-msgid "Ability to tag existing posts"
-msgstr "Ermöglicht das Verschlagworten existierender Beiträge"
+#: ../../include/conversation.php:1271
+msgid "Toggle comments"
+msgstr "Kommentare umschalten"
-#: ../../include/features.php:95
-msgid "Post Categories"
-msgstr "Beitrags-Kategorien"
+#: ../../include/conversation.php:1279
+msgid "Categories (optional, comma-separated list)"
+msgstr "Kategorien (optional, kommagetrennte Liste)"
-#: ../../include/features.php:95
-msgid "Add categories to your posts"
-msgstr "Aktiviert Kategorien für Beiträge"
+#: ../../include/conversation.php:1302
+msgid "Other networks and post services"
+msgstr "Andere Netzwerke und Platformen"
-#: ../../include/features.php:96
-msgid "Emoji Reactions"
-msgstr "Emoji Reaktionen"
+#: ../../include/conversation.php:1308
+msgid "Set publish date"
+msgstr "Veröffentlichungsdatum festlegen"
-#: ../../include/features.php:96
-msgid "Add emoji reaction ability to posts"
-msgstr "Aktiviert Emoji-Reaktionen für Beiträge"
+#: ../../include/conversation.php:1562
+msgid "Discover"
+msgstr "Entdecken"
-#: ../../include/features.php:97
-msgid "Ability to file posts under folders"
-msgstr "Möglichkeit, Beiträge in Verzeichnissen zu sammeln"
+#: ../../include/conversation.php:1565
+msgid "Imported public streams"
+msgstr "Importierte öffentliche Beiträge"
-#: ../../include/features.php:98
-msgid "Dislike Posts"
-msgstr "Gefällt-mir-nicht-Beiträge"
+#: ../../include/conversation.php:1570
+msgid "Commented Order"
+msgstr "Neueste Kommentare"
-#: ../../include/features.php:98
-msgid "Ability to dislike posts/comments"
-msgstr "Aktiviert die „Gefällt mir nicht“-Schaltfläche"
+#: ../../include/conversation.php:1573
+msgid "Sort by Comment Date"
+msgstr "Nach Kommentardatum sortiert"
-#: ../../include/features.php:99
-msgid "Star Posts"
-msgstr "Beiträge mit Sternchen versehen"
+#: ../../include/conversation.php:1577
+msgid "Posted Order"
+msgstr "Neueste Beiträge"
-#: ../../include/features.php:99
-msgid "Ability to mark special posts with a star indicator"
-msgstr "Ermöglicht die lokale Markierung spezieller Beiträge mit einem Sternchen-Symbol"
+#: ../../include/conversation.php:1580
+msgid "Sort by Post Date"
+msgstr "Nach Beitragsdatum sortiert"
-#: ../../include/features.php:100
-msgid "Tag Cloud"
-msgstr "Schlagwort-Wolke"
+#: ../../include/conversation.php:1588
+msgid "Posts that mention or involve you"
+msgstr "Beiträge mit Beteiligung Deinerseits"
-#: ../../include/features.php:100
-msgid "Provide a personal tag cloud on your channel page"
-msgstr "Aktiviert die Anzeige einer Schlagwort-Wolke (Tag Cloud) auf Deiner Kanal-Seite"
+#: ../../include/conversation.php:1597
+msgid "Activity Stream - by date"
+msgstr "Activity Stream – nach Datum sortiert"
-#: ../../include/features.php:109
-msgid "Connection Filtering"
-msgstr "Filter für Verbindungen"
+#: ../../include/conversation.php:1603
+msgid "Starred"
+msgstr "Markiert"
-#: ../../include/features.php:110
-msgid "Filter incoming posts from connections based on keywords/content"
-msgstr "Ermöglicht die Filterung eingehender Beiträge anhand von Schlüsselwörtern (muss an der Verbindung konfiguriert werden)"
+#: ../../include/conversation.php:1606
+msgid "Favourite Posts"
+msgstr "Markierte Beiträge"
-#: ../../include/features.php:120
-msgid "Premium Channel"
-msgstr "Premium-Kanal"
+#: ../../include/conversation.php:1613
+msgid "Spam"
+msgstr "Spam"
+
+#: ../../include/conversation.php:1616
+msgid "Posts flagged as SPAM"
+msgstr "Nachrichten, die als SPAM markiert wurden"
+
+#: ../../include/conversation.php:1674
+msgid "Status Messages and Posts"
+msgstr "Statusnachrichten und Beiträge"
+
+#: ../../include/conversation.php:1683
+msgid "About"
+msgstr "Über"
+
+#: ../../include/conversation.php:1686
+msgid "Profile Details"
+msgstr "Profil-Details"
+
+#: ../../include/conversation.php:1702
+msgid "Files and Storage"
+msgstr "Dateien und Speicher"
+
+#: ../../include/conversation.php:1738
+msgid "Saved Bookmarks"
+msgstr "Gespeicherte Lesezeichen"
+
+#: ../../include/conversation.php:1748
+msgid "Manage Webpages"
+msgstr "Webseiten verwalten"
+
+#: ../../include/conversation.php:1813
+msgctxt "noun"
+msgid "Attending"
+msgid_plural "Attending"
+msgstr[0] "Zusage"
+msgstr[1] "Zusagen"
-#: ../../include/features.php:121
+#: ../../include/conversation.php:1816
+msgctxt "noun"
+msgid "Not Attending"
+msgid_plural "Not Attending"
+msgstr[0] "Absage"
+msgstr[1] "Absagen"
+
+#: ../../include/conversation.php:1819
+msgctxt "noun"
+msgid "Undecided"
+msgid_plural "Undecided"
+msgstr[0] " Unentschlossen"
+msgstr[1] "Unentschlossene"
+
+#: ../../include/conversation.php:1822
+msgctxt "noun"
+msgid "Agree"
+msgid_plural "Agrees"
+msgstr[0] "Zustimmung"
+msgstr[1] "Zustimmungen"
+
+#: ../../include/conversation.php:1825
+msgctxt "noun"
+msgid "Disagree"
+msgid_plural "Disagrees"
+msgstr[0] "Ablehnung"
+msgstr[1] "Ablehnungen"
+
+#: ../../include/conversation.php:1828
+msgctxt "noun"
+msgid "Abstain"
+msgid_plural "Abstains"
+msgstr[0] "Enthaltung"
+msgstr[1] "Enthaltungen"
+
+#: ../../include/bbcode.php:134 ../../include/bbcode.php:962
+#: ../../include/bbcode.php:965 ../../include/bbcode.php:970
+#: ../../include/bbcode.php:973 ../../include/bbcode.php:976
+#: ../../include/bbcode.php:979 ../../include/bbcode.php:984
+#: ../../include/bbcode.php:987 ../../include/bbcode.php:992
+#: ../../include/bbcode.php:995 ../../include/bbcode.php:998
+#: ../../include/bbcode.php:1001
+msgid "Image/photo"
+msgstr "Bild/Foto"
+
+#: ../../include/bbcode.php:173 ../../include/bbcode.php:1012
+msgid "Encrypted content"
+msgstr "Verschlüsselter Inhalt"
+
+#: ../../include/bbcode.php:189
+#, php-format
+msgid "Install %s element: "
+msgstr "Element %s installieren: "
+
+#: ../../include/bbcode.php:193
+#, php-format
msgid ""
-"Allows you to set restrictions and terms on those that connect with your "
-"channel"
-msgstr "Ermöglicht es, Einschränkungen und Bedingungen für Verbindungen dieses Kanals festzulegen"
+"This post contains an installable %s element, however you lack permissions "
+"to install it on this site."
+msgstr "Dieser Beitrag beinhaltet ein installierbares %s Element, aber Du hast nicht die nötigen Rechte, um es auf diesem Hub zu installieren."
-#: ../../include/features.php:128
-msgid "Advanced Directory Search"
-msgstr "Erweiterte Verzeichnissuche"
+#: ../../include/bbcode.php:272
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s schrieb den folgenden %2$s %3$s"
-#: ../../include/features.php:129
-msgid "Allows creation of complex directory search queries"
-msgstr "Ermöglicht die Erstellung komplexer Verzeichnis-Suchabfragen"
+#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
+msgid "Click to open/close"
+msgstr "Klicke zum Öffnen/Schließen"
-#: ../../include/features.php:135
-msgid "Advanced Theme and Layout Settings"
-msgstr "Erweiterte Design- und Layout-Einstellungen"
+#: ../../include/bbcode.php:357
+msgid "spoiler"
+msgstr "Spoiler"
-#: ../../include/features.php:136
-msgid "Allows fine tuning of themes and page layouts"
-msgstr "Erlaubt die Feineinstellung von Designs und Seitenlayouts"
+#: ../../include/bbcode.php:950
+msgid "$1 wrote:"
+msgstr "$1 schrieb:"
#: ../../view/theme/redbasic/php/config.php:9
msgid "Focus (Hubzilla default)"
@@ -10149,66 +13327,66 @@ msgstr "Größe der Avatare von Themenstartern"
msgid "Set size of followup author photos"
msgstr "Größe der Avatare von Kommentatoren"
-#: ../../boot.php:1195
+#: ../../boot.php:1175
#, php-format
msgctxt "opensearch"
msgid "Search %1$s (%2$s)"
msgstr "Suche %1$s (%2$s)"
-#: ../../boot.php:1195
+#: ../../boot.php:1175
msgctxt "opensearch"
msgid "$Projectname"
msgstr "$Projectname"
-#: ../../boot.php:1513
+#: ../../boot.php:1493
#, php-format
msgid "Update %s failed. See error logs."
msgstr "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen."
-#: ../../boot.php:1516
+#: ../../boot.php:1496
#, php-format
msgid "Update Error at %s"
msgstr "Aktualisierungsfehler auf %s"
-#: ../../boot.php:1720
+#: ../../boot.php:1700
msgid ""
"Create an account to access services and applications within the Hubzilla"
msgstr "Erstelle ein Konto, um Anwendungen und Dienste innerhalb von Hubzilla nutzen zu können."
-#: ../../boot.php:1741
+#: ../../boot.php:1721
msgid "Login/Email"
msgstr "Anmelden/E-Mail"
-#: ../../boot.php:1742
+#: ../../boot.php:1722
msgid "Password"
msgstr "Kennwort"
-#: ../../boot.php:1743
+#: ../../boot.php:1723
msgid "Remember me"
msgstr "Angaben speichern"
-#: ../../boot.php:1746
+#: ../../boot.php:1726
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
-#: ../../boot.php:2315
+#: ../../boot.php:2287
msgid "toggle mobile"
msgstr "auf/von mobile Ansicht wechseln"
-#: ../../boot.php:2470
+#: ../../boot.php:2442
msgid "Website SSL certificate is not valid. Please correct."
msgstr "Das SSL-Zertifikat der Website ist nicht gültig. Bitte beheben."
-#: ../../boot.php:2473
+#: ../../boot.php:2445
#, php-format
msgid "[hubzilla] Website SSL error for %s"
msgstr "[hubzilla] Website-SSL-Fehler für %s"
-#: ../../boot.php:2577
+#: ../../boot.php:2562
msgid "Cron/Scheduled tasks not running."
msgstr "Cron-Aufgaben laufen nicht."
-#: ../../boot.php:2581
+#: ../../boot.php:2566
#, php-format
msgid "[hubzilla] Cron tasks not running on %s"
msgstr "[hubzilla] Cron-Aufgaben für %s laufen nicht"
diff --git a/view/de/hstrings.php b/view/de/hstrings.php
index 7ad83fb3b..f77354929 100644
--- a/view/de/hstrings.php
+++ b/view/de/hstrings.php
@@ -72,23 +72,6 @@ App::$strings["Requested profile is not available."] = "Das angefragte Profil is
App::$strings["Some blurb about what to do when you're new here"] = "Ein Hinweis, was man tun kann, wenn man neu hier ist";
App::$strings["Away"] = "Abwesend";
App::$strings["Online"] = "Online";
-App::$strings["Invalid message"] = "Ungültige Beitrags-ID (mid)";
-App::$strings["no results"] = "keine Ergebnisse";
-App::$strings["channel sync processed"] = "Kanal-Sync verarbeitet";
-App::$strings["queued"] = "zur Warteschlange hinzugefügt";
-App::$strings["posted"] = "zugestellt";
-App::$strings["accepted for delivery"] = "für Zustellung akzeptiert";
-App::$strings["updated"] = "aktualisiert";
-App::$strings["update ignored"] = "Aktualisierung ignoriert";
-App::$strings["permission denied"] = "Zugriff verweigert";
-App::$strings["recipient not found"] = "Empfänger nicht gefunden.";
-App::$strings["mail recalled"] = "Mail widerrufen";
-App::$strings["duplicate mail received"] = "Doppelte Mail erhalten";
-App::$strings["mail delivered"] = "Mail zugestellt";
-App::$strings["Delivery report for %1\$s"] = "Zustellungsbericht für %1\$s";
-App::$strings["Options"] = "Optionen";
-App::$strings["Redeliver"] = "Erneut zustellen";
-App::$strings["Fetching URL returns error: %1\$s"] = "Abrufen der URL gab einen Fehler zurück: %1\$s";
App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Maximale Anzahl täglicher Neuanmeldungen erreicht. Bitte versuche es morgen noch einmal.";
App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Bitte stimme den Nutzungsbedingungen zu. Registrierung fehlgeschlagen.";
App::$strings["Passwords do not match."] = "Passwörter stimmen nicht überein.";
@@ -118,81 +101,204 @@ App::$strings["yes"] = "ja";
App::$strings["Registration"] = "Registrierung";
App::$strings["Membership on this site is by invitation only."] = "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich.";
App::$strings["Register"] = "Registrieren";
-App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Diese Seite verlangt möglicherweise eine Emailbestätigung nach dem Ansenden des Formulars. Wenn Du auf eine Login-Seite zurückgeleitet wirst, prüfe bitte auf neue Mail mit entsprechenden Hinweisen.";
-App::$strings["%s account blocked/unblocked"] = array(
- 0 => "%s Konto blockiert/freigegeben",
- 1 => "%s Konten blockiert/freigegeben",
-);
-App::$strings["%s account deleted"] = array(
- 0 => "%s Konto gelöscht",
- 1 => "%s Konten gelöscht",
-);
-App::$strings["Account not found"] = "Konto nicht gefunden";
-App::$strings["Account '%s' deleted"] = "Konto '%s' gelöscht";
-App::$strings["Account '%s' blocked"] = "Konto '%s' blockiert";
-App::$strings["Account '%s' unblocked"] = "Konto '%s' freigegeben";
-App::$strings["Administration"] = "Administration";
-App::$strings["Accounts"] = "Konten";
-App::$strings["Submit"] = "Absenden";
-App::$strings["select all"] = "Alle auswählen";
-App::$strings["Registrations waiting for confirm"] = "Registrierungen warten auf Bestätigung";
-App::$strings["Request date"] = "Antragsdatum";
-App::$strings["Email"] = "E-Mail";
-App::$strings["No registrations."] = "Keine Registrierungen.";
-App::$strings["Approve"] = "Genehmigen";
-App::$strings["Deny"] = "Verweigern";
-App::$strings["Block"] = "Blockieren";
+App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Diese Seite verlangt möglicherweise eine Emailbestätigung nach dem Absenden des Formulars. Wenn Du auf eine Login-Seite zurückgeleitet wirst, prüfe bitte Deinen Posteingang auf neue Mails mit entsprechenden Hinweisen.";
+App::$strings["Fetching URL returns error: %1\$s"] = "Abrufen der URL gab einen Fehler zurück: %1\$s";
+App::$strings["Profile Match"] = "Profil-Übereinstimmungen";
+App::$strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselwörter für den Abgleich gefunden. Bitte füge Schlüsselwörter zu Deinem Standardprofil hinzu.";
+App::$strings["is interested in:"] = "interessiert sich für:";
+App::$strings["Connect"] = "Verbinden";
+App::$strings["No matches"] = "Keine Übereinstimmungen";
+App::$strings["Could not access contact record."] = "Konnte nicht auf den Kontakteintrag zugreifen.";
+App::$strings["Could not locate selected profile."] = "Gewähltes Profil nicht gefunden.";
+App::$strings["Connection updated."] = "Verbindung aktualisiert.";
+App::$strings["Failed to update connection record."] = "Konnte den Verbindungseintrag nicht aktualisieren.";
+App::$strings["is now connected to"] = "ist jetzt verbunden mit";
+App::$strings["No"] = "Nein";
+App::$strings["Yes"] = "Ja";
+App::$strings["Could not access address book record."] = "Konnte nicht auf den Adressbuch-Eintrag zugreifen.";
+App::$strings["Refresh failed - channel is currently unavailable."] = "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar.";
+App::$strings["Unable to set address book parameters."] = "Konnte die Adressbuch-Parameter nicht setzen.";
+App::$strings["Connection has been removed."] = "Verbindung wurde gelöscht.";
+App::$strings["View Profile"] = "Profil ansehen";
+App::$strings["View %s's profile"] = "%ss Profil ansehen";
+App::$strings["Refresh Permissions"] = "Zugriffsrechte neu laden";
+App::$strings["Fetch updated permissions"] = "Aktualisierte Zugriffsrechte abfragen";
+App::$strings["Recent Activity"] = "Kürzliche Aktivitäten";
+App::$strings["View recent posts and comments"] = "Betrachte die neuesten Beiträge und Kommentare";
App::$strings["Unblock"] = "Freigeben";
-App::$strings["ID"] = "ID";
-App::$strings["All Channels"] = "Alle Kanäle";
-App::$strings["Register date"] = "Registrierungs-Datum";
-App::$strings["Last login"] = "Letzte Anmeldung";
-App::$strings["Expires"] = "Verfällt";
-App::$strings["Service Class"] = "Service-Klasse";
-App::$strings["Selected accounts will be deleted!\\n\\nEverything these accounts had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Die ausgewählten Konten werden gelöscht!\\n\\nAlles, was diese Konten auf diesem Hub veröffentlicht haben, wird endgültig gelöscht werden!\\n\\nBist du dir sicher?";
-App::$strings["The account {0} will be deleted!\\n\\nEverything this account has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Das Konto {0} wird gelöscht!\\n\\nAlles, was dieses Konto auf diesem Hub veröffentlicht hat, wird endgültig gelöscht werden!\\n\\nBist Du sicher?";
-App::$strings["%s channel censored/uncensored"] = array(
- 0 => "%s Kanal gesperrt/freigegeben",
- 1 => "%s Kanäle gesperrt/freigegeben",
-);
-App::$strings["%s channel code allowed/disallowed"] = array(
- 0 => "Code für %s Kanal gesperrt/freigegeben",
- 1 => "Code für %s Kanäle gesperrt/freigegeben",
-);
-App::$strings["%s channel deleted"] = array(
- 0 => "%s Kanal gelöscht",
- 1 => "%s Kanäle gelöscht",
-);
-App::$strings["Channel not found"] = "Kanal nicht gefunden";
-App::$strings["Channel '%s' deleted"] = "Kanal '%s' gelöscht";
-App::$strings["Channel '%s' censored"] = "Kanal '%s' gesperrt";
-App::$strings["Channel '%s' uncensored"] = "Kanal '%s' freigegeben";
-App::$strings["Channel '%s' code allowed"] = "Code für Kanal '%s' freigegeben";
-App::$strings["Channel '%s' code disallowed"] = "Code für Kanal '%s' gesperrt";
-App::$strings["Channels"] = "Kanäle";
-App::$strings["Censor"] = "Sperren";
-App::$strings["Uncensor"] = "Freigeben";
-App::$strings["Allow Code"] = "Code erlauben";
-App::$strings["Disallow Code"] = "Code sperren";
-App::$strings["Channel"] = "Kanal";
-App::$strings["UID"] = "UID";
+App::$strings["Block"] = "Blockieren";
+App::$strings["Block (or Unblock) all communications with this connection"] = "Jegliche Kommunikation mit dieser Verbindung blockieren/zulassen";
+App::$strings["This connection is blocked!"] = "Die Verbindung ist geblockt!";
+App::$strings["Unignore"] = "Nicht ignorieren";
+App::$strings["Ignore"] = "Ignorieren";
+App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Jegliche eingehende Kommunikation von dieser Verbindung ignorieren/zulassen";
+App::$strings["This connection is ignored!"] = "Die Verbindung wird ignoriert!";
+App::$strings["Unarchive"] = "Aus Archiv zurückholen";
+App::$strings["Archive"] = "Archivieren";
+App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Verbindung archivieren/aus dem Archiv zurückholen (Archiv = Kanal als erloschen markieren, aber die Beiträge behalten)";
+App::$strings["This connection is archived!"] = "Die Verbindung ist archiviert!";
+App::$strings["Unhide"] = "Wieder sichtbar machen";
+App::$strings["Hide"] = "Verstecken";
+App::$strings["Hide or Unhide this connection from your other connections"] = "Diese Verbindung vor anderen Verbindungen verstecken/zeigen";
+App::$strings["This connection is hidden!"] = "Die Verbindung ist versteckt!";
+App::$strings["Delete this connection"] = "Verbindung löschen";
+App::$strings["Me"] = "Ich";
+App::$strings["Family"] = "Familie";
+App::$strings["Friends"] = "Freunde";
+App::$strings["Acquaintances"] = "Bekannte";
+App::$strings["All"] = "Alle";
+App::$strings["Approve this connection"] = "Verbindung genehmigen";
+App::$strings["Accept connection to allow communication"] = "Akzeptiere die Verbindung, um Kommunikation zu ermöglichen";
+App::$strings["Set Affinity"] = "Beziehung festlegen";
+App::$strings["Set Profile"] = "Profil festlegen";
+App::$strings["Set Affinity & Profile"] = "Beziehung und Profile festlegen";
+App::$strings["none"] = "Keine";
+App::$strings["Connection Default Permissions"] = "Standardzugriffsrechte für neue Verbindungen:";
+App::$strings["Connection: %s"] = "Verbindung: %s";
+App::$strings["Apply these permissions automatically"] = "Diese Berechtigungen automatisch anwenden";
+App::$strings["Connection requests will be approved without your interaction"] = "Verbindungsanfragen werden sofort bestätigt, ohne dass Deine aktive Zustimmung erforderlich ist.";
+App::$strings["This connection's primary address is"] = "Die Hauptadresse der Verbindung ist";
+App::$strings["Available locations:"] = "Verfügbare Klone:";
+App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Die auf dieser Seite angegebenen Berechtigungen werden auf alle neuen Verbindungen angewendet.";
+App::$strings["Connection Tools"] = "Verbindungswerkzeuge";
+App::$strings["Slide to adjust your degree of friendship"] = "Verschieben, um den Grad der Freundschaft zu einzustellen";
+App::$strings["Rating"] = "Bewertung";
+App::$strings["Slide to adjust your rating"] = "Verschieben, um Deine Bewertung einzustellen";
+App::$strings["Optionally explain your rating"] = "Optional kannst Du Deine Bewertung begründen";
+App::$strings["Custom Filter"] = "Benutzerdefinierter Filter";
+App::$strings["Only import posts with this text"] = "Nur Beiträge mit diesem Text importieren";
+App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "Einzelne Wörter pro Zeile, #Tags oder /Reguläre Ausdrücke/. lang=xx (z.B. lang=de) ermöglicht Filterung nach Sprache. Leer lassen, um alle Beiträge zu importieren.";
+App::$strings["Do not import posts with this text"] = "Beiträge mit diesem Text nicht importieren";
+App::$strings["This information is public!"] = "Diese Information ist öffentlich!";
+App::$strings["Connection Pending Approval"] = "Verbindung wartet auf Bestätigung";
+App::$strings["inherited"] = "geerbt";
+App::$strings["Submit"] = "Absenden";
+App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle ein Profil, das wir %s zeigen sollen, wenn Deine Profilseite über eine verifizierte Verbindung aufgerufen wird.";
+App::$strings["Their Settings"] = "Deren Einstellungen";
+App::$strings["My Settings"] = "Meine Einstellungen";
+App::$strings["Individual Permissions"] = "Individuelle Zugriffsrechte";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals vererbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung und können hier nicht verändert werden.";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen.";
+App::$strings["Last update:"] = "Letzte Aktualisierung:";
+App::$strings["Invalid message"] = "Ungültige Beitrags-ID (mid)";
+App::$strings["no results"] = "keine Ergebnisse";
+App::$strings["channel sync processed"] = "Kanal-Sync verarbeitet";
+App::$strings["queued"] = "zur Warteschlange hinzugefügt";
+App::$strings["posted"] = "zugestellt";
+App::$strings["accepted for delivery"] = "für Zustellung akzeptiert";
+App::$strings["updated"] = "aktualisiert";
+App::$strings["update ignored"] = "Aktualisierung ignoriert";
+App::$strings["permission denied"] = "Zugriff verweigert";
+App::$strings["recipient not found"] = "Empfänger nicht gefunden.";
+App::$strings["mail recalled"] = "Mail widerrufen";
+App::$strings["duplicate mail received"] = "Doppelte Mail erhalten";
+App::$strings["mail delivered"] = "Mail zugestellt";
+App::$strings["Delivery report for %1\$s"] = "Zustellungsbericht für %1\$s";
+App::$strings["Options"] = "Optionen";
+App::$strings["Redeliver"] = "Erneut zustellen";
+App::$strings["Bookmark added"] = "Lesezeichen hinzugefügt";
+App::$strings["My Bookmarks"] = "Meine Lesezeichen";
+App::$strings["My Connections Bookmarks"] = "Lesezeichen meiner Kontakte";
+App::$strings["network"] = "Netzwerk";
+App::$strings["RSS"] = "RSS";
+App::$strings["Location not found."] = "Klon nicht gefunden.";
+App::$strings["Location lookup failed."] = "Nachschlagen des Kanal-Ortes fehlgeschlagen";
+App::$strings["Please select another location to become primary before removing the primary location."] = "Bitte mache einen anderen Kanal-Ort zum primären Ort, bevor Du den primären Ort löschst.";
+App::$strings["Syncing locations"] = "Synchronisiere Klone";
+App::$strings["No locations found."] = "Keine Klon-Adressen gefunden.";
+App::$strings["Manage Channel Locations"] = "Klon-Adressen verwalten";
+App::$strings["Location"] = "Ort";
App::$strings["Address"] = "Adresse";
-App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Alle ausgewählten Kanäle werden gelöscht!\\n\\nAlles was von diesen Kanälen auf diesem Server geschrieben wurde, wird dauerhaft gelöscht!\\n\\nBist Du sicher?";
-App::$strings["The channel {0} will be deleted!\\n\\nEverything that was posted in this channel on this site will be permanently deleted!\\n\\nAre you sure?"] = "Der Kanal {0} wird gelöscht!\\n\\nAlles was von diesem Kanal auf diesem Server geschrieben wurde, wird gelöscht!\\n\\nBist Du sicher?";
-App::$strings["Update has been marked successful"] = "Update wurde als erfolgreich markiert";
-App::$strings["Executing %s failed. Check system logs."] = "Ausführen von %s fehlgeschlagen. Überprüfe die Systemprotokolle.";
-App::$strings["Update %s was successfully applied."] = "Update %s wurde erfolgreich ausgeführt.";
-App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "Update %s lieferte keinen Rückgabewert. Erfolg unbekannt.";
-App::$strings["Update function %s could not be found."] = "Update-Funktion %s konnte nicht gefunden werden.";
-App::$strings["No failed updates."] = "Keine fehlgeschlagenen Aktualisierungen.";
-App::$strings["Failed Updates"] = "Fehlgeschlagene Aktualisierungen";
-App::$strings["Mark success (if update was manually applied)"] = "Als erfolgreich markieren (wenn das Update manuell ausgeführt wurde)";
-App::$strings["Attempt to execute this update step automatically"] = "Versuche, diesen Updateschritt automatisch auszuführen";
+App::$strings["Primary"] = "Primär";
+App::$strings["Drop"] = "Löschen";
+App::$strings["Sync Now"] = "Jetzt synchronisieren";
+App::$strings["Please wait several minutes between consecutive operations."] = "Bitte warte mehrere Minuten zwischen dem Ausführen zweier Operationen!";
+App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub einloggst und den Kanal dort löschst.";
+App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt.";
+App::$strings["Continue"] = "Fortfahren";
+App::$strings["Premium Channel Setup"] = "Premium-Kanal-Einrichtung";
+App::$strings["Enable premium channel connection restrictions"] = "Einschränkungen für einen Premium-Kanal aktivieren";
+App::$strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Bitte gib Deine Nutzungsbedingungen ein, z.B. Paypal-Quittung, Richtlinien etc.";
+App::$strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Unter Umständen sind weitere Schritte oder die Bestätigung der folgenden Bedingungen vor dem Verbinden mit diesem Kanal nötig.";
+App::$strings["Potential connections will then see the following text before proceeding:"] = "Potentielle Kontakte werden den folgenden Text sehen, bevor fortgefahren wird:";
+App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Indem ich fortfahre, bestätige ich die Erfüllung aller Anweisungen auf dieser Seite.";
+App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(Der Kanal-Besitzer hat keine speziellen Anweisungen hinterlegt.)";
+App::$strings["Restricted or Premium Channel"] = "Eingeschränkter oder Premium-Kanal";
+App::$strings["Invalid item."] = "Ungültiges Element.";
+App::$strings["Channel not found."] = "Kanal nicht gefunden.";
+App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
+App::$strings["Save to Folder:"] = "Speichern in Ordner:";
+App::$strings["- select -"] = "– auswählen –";
+App::$strings["Save"] = "Speichern";
+App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet.";
+App::$strings["Create a new channel"] = "Neuen Kanal anlegen";
+App::$strings["Create New"] = "Neu anlegen";
+App::$strings["Channel Manager"] = "Kanal-Manager";
+App::$strings["Current Channel"] = "Aktueller Kanal";
+App::$strings["Switch to one of your channels by selecting it."] = "Wechsle zu einem Deiner Kanäle, indem Du auf ihn klickst.";
+App::$strings["Default Channel"] = "Standard Kanal";
+App::$strings["Make Default"] = "Zum Standard machen";
+App::$strings["%d new messages"] = "%d neue Nachrichten";
+App::$strings["%d new introductions"] = "%d neue Vorstellungen";
+App::$strings["Delegated Channel"] = "Delegierte Kanäle";
+App::$strings["Blocked"] = "Blockiert";
+App::$strings["Ignored"] = "Ignoriert";
+App::$strings["Hidden"] = "Versteckt";
+App::$strings["Archived"] = "Archiviert";
+App::$strings["New"] = "Neu";
+App::$strings["New Connections"] = "Neue Verbindungen";
+App::$strings["Show pending (new) connections"] = "Ausstehende (neue) Verbindungsanfragen anzeigen";
+App::$strings["All Connections"] = "Alle Verbindungen";
+App::$strings["Show all connections"] = "Alle Verbindungen anzeigen";
+App::$strings["Only show blocked connections"] = "Nur blockierte Verbindungen anzeigen";
+App::$strings["Only show ignored connections"] = "Nur ignorierte Verbindungen anzeigen";
+App::$strings["Only show archived connections"] = "Nur archivierte Verbindungen anzeigen";
+App::$strings["Only show hidden connections"] = "Nur versteckte Verbindungen anzeigen";
+App::$strings["Pending approval"] = "Wartet auf Genehmigung";
+App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+App::$strings["Edit connection"] = "Verbindung bearbeiten";
+App::$strings["Delete connection"] = "Verbindung löschen";
+App::$strings["Channel address"] = "Kanaladresse";
+App::$strings["Network"] = "Netzwerk";
+App::$strings["Status"] = "Status";
+App::$strings["Connected"] = "Verbunden";
+App::$strings["Approve connection"] = "Verbindung genehmigen";
+App::$strings["Approve"] = "Genehmigen";
+App::$strings["Ignore connection"] = "Verbindung ignorieren";
+App::$strings["Recent activity"] = "Kürzliche Aktivitäten";
+App::$strings["Connections"] = "Verbindungen";
+App::$strings["Search"] = "Suche";
+App::$strings["Search your connections"] = "Verbindungen durchsuchen";
+App::$strings["Connections search"] = "Verbindung suchen";
+App::$strings["Find"] = "Finde";
+App::$strings["Image uploaded but image cropping failed."] = "Bild hochgeladen, aber das Zurechtschneiden schlug fehl.";
+App::$strings["Cover Photos"] = "Cover Foto";
+App::$strings["Image resize failed."] = "Bild-Anpassung fehlgeschlagen.";
+App::$strings["Unable to process image"] = "Kann Bild nicht verarbeiten";
+App::$strings["Image upload failed."] = "Hochladen des Bilds fehlgeschlagen.";
+App::$strings["Unable to process image."] = "Kann Bild nicht verarbeiten.";
+App::$strings["female"] = "weiblich";
+App::$strings["%1\$s updated her %2\$s"] = "%1\$s hat ihr %2\$s aktualisiert";
+App::$strings["male"] = "männlich";
+App::$strings["%1\$s updated his %2\$s"] = "%1\$s hat sein %2\$s aktualisiert";
+App::$strings["%1\$s updated their %2\$s"] = "%1\$s hat sein/ihr %2\$s aktualisiert";
+App::$strings["cover photo"] = "Cover Foto";
+App::$strings["Photo not available."] = "Foto nicht verfügbar.";
+App::$strings["Upload File:"] = "Datei hochladen:";
+App::$strings["Select a profile:"] = "Wähle ein Profil:";
+App::$strings["Upload Cover Photo"] = "Cover Foto hochladen";
+App::$strings["or"] = "oder";
+App::$strings["skip this step"] = "diesen Schritt überspringen";
+App::$strings["select a photo from your photo albums"] = "ein Foto aus meinen Fotoalben";
+App::$strings["Crop Image"] = "Bild zuschneiden";
+App::$strings["Please adjust the image cropping for optimum viewing."] = "Bitte schneide das Bild für eine optimale Anzeige passend zu.";
+App::$strings["Done Editing"] = "Bearbeitung fertigstellen";
App::$strings["Off"] = "Aus";
App::$strings["On"] = "An";
App::$strings["Lock feature %s"] = "Blockiere die Funktion %s";
App::$strings["Manage Additional Features"] = "Zusätzliche Funktionen verwalten";
App::$strings["Log settings updated."] = "Protokoll-Einstellungen aktualisiert.";
+App::$strings["Administration"] = "Administration";
App::$strings["Logs"] = "Protokolle";
App::$strings["Clear"] = "Leeren";
App::$strings["Debugging"] = "Debugging";
@@ -237,7 +343,6 @@ App::$strings["Field Name"] = "Feldname";
App::$strings["Label on profile pages"] = "Bezeichnung auf Profilseiten";
App::$strings["Help text"] = "Hilfetext";
App::$strings["Additional info (optional)"] = "Zusätzliche Informationen (optional)";
-App::$strings["Save"] = "Speichern";
App::$strings["Field definition not found"] = "Feld-Definition nicht gefunden";
App::$strings["Edit Profile Field"] = "Profilfeld bearbeiten";
App::$strings["Profile Fields"] = "Profil Felder";
@@ -277,14 +382,90 @@ App::$strings["Only allow embeds from secure (SSL) websites and links."] = "Erla
App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "Erlaube Einbettung von Inhalten mit ungefiltertem HTML nur von diesen Domains";
App::$strings["One site per line. By default embedded content is filtered."] = "Eine Website/Domain pro Zeile. Standardmäßig wird eingebetteter Inhalt gefiltert.";
App::$strings["Block embedded HTML from these domains"] = "Eingebettete HTML Inhalte von diesen Seiten blockieren";
+App::$strings["Theme settings updated."] = "Theme-Einstellungen aktualisiert.";
+App::$strings["No themes found."] = "Keine Theme gefunden.";
+App::$strings["Screenshot"] = "Bildschirmfoto";
+App::$strings["Themes"] = "Themes";
+App::$strings["[Experimental]"] = "[Experimentell]";
+App::$strings["[Unsupported]"] = "[Nicht unterstützt]";
+App::$strings["Password changed for account %d."] = "Passwort für Konto %d geändert.";
+App::$strings["Account settings updated."] = "Kontoeinstellungen aktualisiert.";
+App::$strings["Account not found."] = "Konto nicht gefunden.";
+App::$strings["Account Edit"] = "Kontobearbeitung";
+App::$strings["New Password"] = "Neues Passwort";
+App::$strings["New Password again"] = "Neues Passwort wiederholen";
+App::$strings["Technical skill level"] = "Technische Qualifikationsstufe";
+App::$strings["Account language (for emails)"] = "Kontosprache (für E-Mails)";
+App::$strings["Service class"] = "Dienstklasse";
+App::$strings["%s account blocked/unblocked"] = array(
+ 0 => "%s Konto blockiert/freigegeben",
+ 1 => "%s Konten blockiert/freigegeben",
+);
+App::$strings["%s account deleted"] = array(
+ 0 => "%s Konto gelöscht",
+ 1 => "%s Konten gelöscht",
+);
+App::$strings["Account not found"] = "Konto nicht gefunden";
+App::$strings["Account '%s' deleted"] = "Konto '%s' gelöscht";
+App::$strings["Account '%s' blocked"] = "Konto '%s' blockiert";
+App::$strings["Account '%s' unblocked"] = "Konto '%s' freigegeben";
+App::$strings["Accounts"] = "Konten";
+App::$strings["select all"] = "Alle auswählen";
+App::$strings["Registrations waiting for confirm"] = "Registrierungen warten auf Bestätigung";
+App::$strings["Request date"] = "Antragsdatum";
+App::$strings["Email"] = "E-Mail";
+App::$strings["No registrations."] = "Keine Registrierungen.";
+App::$strings["Deny"] = "Verweigern";
+App::$strings["ID"] = "ID";
+App::$strings["All Channels"] = "Alle Kanäle";
+App::$strings["Register date"] = "Registrierungs-Datum";
+App::$strings["Last login"] = "Letzte Anmeldung";
+App::$strings["Expires"] = "Verfällt";
+App::$strings["Service Class"] = "Service-Klasse";
+App::$strings["Selected accounts will be deleted!\\n\\nEverything these accounts had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Die ausgewählten Konten werden gelöscht!\\n\\nAlles, was diese Konten auf diesem Hub veröffentlicht haben, wird endgültig gelöscht werden!\\n\\nBist du dir sicher?";
+App::$strings["The account {0} will be deleted!\\n\\nEverything this account has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Das Konto {0} wird gelöscht!\\n\\nAlles, was dieses Konto auf diesem Hub veröffentlicht hat, wird endgültig gelöscht werden!\\n\\nBist Du sicher?";
+App::$strings["%s channel censored/uncensored"] = array(
+ 0 => "%s Kanal gesperrt/freigegeben",
+ 1 => "%s Kanäle gesperrt/freigegeben",
+);
+App::$strings["%s channel code allowed/disallowed"] = array(
+ 0 => "Code für %s Kanal gesperrt/freigegeben",
+ 1 => "Code für %s Kanäle gesperrt/freigegeben",
+);
+App::$strings["%s channel deleted"] = array(
+ 0 => "%s Kanal gelöscht",
+ 1 => "%s Kanäle gelöscht",
+);
+App::$strings["Channel not found"] = "Kanal nicht gefunden";
+App::$strings["Channel '%s' deleted"] = "Kanal '%s' gelöscht";
+App::$strings["Channel '%s' censored"] = "Kanal '%s' gesperrt";
+App::$strings["Channel '%s' uncensored"] = "Kanal '%s' freigegeben";
+App::$strings["Channel '%s' code allowed"] = "Code für Kanal '%s' freigegeben";
+App::$strings["Channel '%s' code disallowed"] = "Code für Kanal '%s' gesperrt";
+App::$strings["Channels"] = "Kanäle";
+App::$strings["Censor"] = "Sperren";
+App::$strings["Uncensor"] = "Freigeben";
+App::$strings["Allow Code"] = "Code erlauben";
+App::$strings["Disallow Code"] = "Code sperren";
+App::$strings["Channel"] = "Kanal";
+App::$strings["UID"] = "UID";
+App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Alle ausgewählten Kanäle werden gelöscht!\\n\\nAlles was von diesen Kanälen auf diesem Server geschrieben wurde, wird dauerhaft gelöscht!\\n\\nBist Du sicher?";
+App::$strings["The channel {0} will be deleted!\\n\\nEverything that was posted in this channel on this site will be permanently deleted!\\n\\nAre you sure?"] = "Der Kanal {0} wird gelöscht!\\n\\nAlles was von diesem Kanal auf diesem Server geschrieben wurde, wird gelöscht!\\n\\nBist Du sicher?";
+App::$strings["Update has been marked successful"] = "Update wurde als erfolgreich markiert";
+App::$strings["Executing %s failed. Check system logs."] = "Ausführen von %s fehlgeschlagen. Überprüfe die Systemprotokolle.";
+App::$strings["Update %s was successfully applied."] = "Update %s wurde erfolgreich ausgeführt.";
+App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "Update %s lieferte keinen Rückgabewert. Erfolg unbekannt.";
+App::$strings["Update function %s could not be found."] = "Update-Funktion %s konnte nicht gefunden werden.";
+App::$strings["No failed updates."] = "Keine fehlgeschlagenen Aktualisierungen.";
+App::$strings["Failed Updates"] = "Fehlgeschlagene Aktualisierungen";
+App::$strings["Mark success (if update was manually applied)"] = "Als erfolgreich markieren (wenn das Update manuell ausgeführt wurde)";
+App::$strings["Attempt to execute this update step automatically"] = "Versuche, diesen Updateschritt automatisch auszuführen";
App::$strings["Site settings updated."] = "Site-Einstellungen aktualisiert.";
App::$strings["Default"] = "Standard";
App::$strings["mobile"] = "mobil";
App::$strings["experimental"] = "experimentell";
App::$strings["unsupported"] = "nicht unterstützt";
-App::$strings["No"] = "Nein";
App::$strings["Yes - with approval"] = "Ja - mit Zustimmung";
-App::$strings["Yes"] = "Ja";
App::$strings["My site is not a public server"] = "Mein Server ist kein öffentlicher Server";
App::$strings["My site has paid access only"] = "Meine Seite hat nur bezahlten Zugriff";
App::$strings["My site has free access only"] = "Meine Seite hat nur freien Zugriff";
@@ -311,6 +492,8 @@ App::$strings["Members can set their own technical comfort level by default"] =
App::$strings["Banner/Logo"] = "Banner/Logo";
App::$strings["Administrator Information"] = "Administrator-Informationen";
App::$strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Kontaktinformationen für Administratoren des Servers. Wird auf der siteinfo-Seite angezeigt. BBCode kann verwendet werden.";
+App::$strings["Site Information"] = "Seiteninformationen";
+App::$strings["Publicly visible description of this site. Displayed on siteinfo page. BBCode can be used here"] = "Öffentlich sichtbare Beschreibung dieses Servers. Wird auf der siteinfo-Seite angezeigt. BBCode kann hier verwendet werden.";
App::$strings["System language"] = "System-Sprache";
App::$strings["System theme"] = "System-Theme";
App::$strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Standard-System-Theme – kann durch Nutzerprofile überschieben werden – <a href='#' id='cnftheme'>Theme-Einstellungen ändern</a>";
@@ -360,140 +543,35 @@ App::$strings["Maximum Load Average"] = "Maximales Load Average";
App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Maximale Systemlast, bevor Verteil- und Empfangsprozesse verschoben werden – Standard 50";
App::$strings["Expiration period in days for imported (grid/network) content"] = "Setze den Zeitraum (in Tagen), ab wann importierte (aus dem Netzwerk) Inhalte ablaufen sollen";
App::$strings["0 for no expiration of imported content"] = "0 = keine Löschung importierter Inhalte";
-App::$strings["Theme settings updated."] = "Theme-Einstellungen aktualisiert.";
-App::$strings["No themes found."] = "Keine Theme gefunden.";
-App::$strings["Screenshot"] = "Bildschirmfoto";
-App::$strings["Themes"] = "Themes";
-App::$strings["[Experimental]"] = "[Experimentell]";
-App::$strings["[Unsupported]"] = "[Nicht unterstützt]";
-App::$strings["Your service plan only allows %d channels."] = "Dein Vertrag erlaubt nur %d Kanäle.";
-App::$strings["Nothing to import."] = "Nichts zu importieren.";
-App::$strings["Unable to download data from old server"] = "Daten können vom alten Server nicht heruntergeladen werden";
-App::$strings["Imported file is empty."] = "Die importierte Datei ist leer.";
-App::$strings["Warning: Database versions differ by %1\$d updates."] = "Achtung: Datenbankversionen unterscheiden sich um %1\$d Aktualisierungen.";
-App::$strings["Cloned channel not found. Import failed."] = "Geklonter Kanal nicht gefunden. Import fehlgeschlagen.";
-App::$strings["No channel. Import failed."] = "Kein Kanal. Import fehlgeschlagen.";
-App::$strings["Import completed."] = "Import abgeschlossen.";
-App::$strings["You must be logged in to use this feature."] = "Du musst angemeldet sein um diese Funktion zu nutzen.";
-App::$strings["Import Channel"] = "Kanal importieren";
-App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren.";
-App::$strings["File to Upload"] = "Hochzuladende Datei:";
-App::$strings["Or provide the old server/hub details"] = "Oder gib die Details Deines bisherigen \$Projectname-Hubs ein";
-App::$strings["Your old identity address (xyz@example.com)"] = "Bisherige Kanal-Adresse (xyz@example.com)";
-App::$strings["Your old login email address"] = "Deine alte Login-E-Mail-Adresse";
-App::$strings["Your old login password"] = "Dein altes Passwort";
-App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige \$Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein.";
-App::$strings["Make this hub my primary location"] = "Dieser $Pojectname-Hub ist mein primärer Hub.";
-App::$strings["Import existing posts if possible (experimental - limited by available memory"] = "Importiere bestehende Beiträge falls möglich (experimentell - begrenzt durch zur Verfügung stehenden Speicher";
-App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur einmal ab und lasse diese Seite bis zur Fertigstellung offen.";
-App::$strings["Public access denied."] = "Öffentlichen Zugriff verweigert.";
-App::$strings["%d rating"] = array(
- 0 => "%d Bewertung",
- 1 => "%d Bewertungen",
-);
-App::$strings["Gender: "] = "Geschlecht:";
-App::$strings["Status: "] = "Status:";
-App::$strings["Homepage: "] = "Webseite:";
-App::$strings["Age:"] = "Alter:";
-App::$strings["Location:"] = "Ort:";
-App::$strings["Description:"] = "Beschreibung:";
-App::$strings["Hometown:"] = "Heimatstadt:";
-App::$strings["About:"] = "Über:";
-App::$strings["Connect"] = "Verbinden";
-App::$strings["Public Forum:"] = "Öffentliches Forum:";
-App::$strings["Keywords: "] = "Schlüsselwörter:";
-App::$strings["Don't suggest"] = "Nicht vorschlagen";
-App::$strings["Common connections:"] = "Gemeinsame Verbindungen:";
-App::$strings["Global Directory"] = "Globales Verzeichnis";
-App::$strings["Local Directory"] = "Lokales Verzeichnis";
-App::$strings["Find"] = "Finde";
-App::$strings["Finding:"] = "Ergebnisse:";
-App::$strings["Channel Suggestions"] = "Kanal-Vorschläge";
-App::$strings["next page"] = "nächste Seite";
-App::$strings["previous page"] = "vorherige Seite";
-App::$strings["Sort options"] = "Sortieroptionen";
-App::$strings["Alphabetic"] = "alphabetisch";
-App::$strings["Reverse Alphabetic"] = "Entgegengesetzt alphabetisch";
-App::$strings["Newest to Oldest"] = "Neueste zuerst";
-App::$strings["Oldest to Newest"] = "Älteste zuerst";
-App::$strings["No entries (some entries may be hidden)."] = "Keine Einträge gefunden (einige könnten versteckt sein).";
-App::$strings["Bookmark added"] = "Lesezeichen hinzugefügt";
-App::$strings["My Bookmarks"] = "Meine Lesezeichen";
-App::$strings["My Connections Bookmarks"] = "Lesezeichen meiner Kontakte";
-App::$strings["Edit post"] = "Bearbeite Beitrag";
-App::$strings["No ratings"] = "Keine Bewertungen";
+App::$strings["Public Hubs"] = "Öffentliche Hubs";
+App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Die hier aufgeführten Hubs sind öffentlich und erlauben die Registrierung im \$Projectname Netzwerk. Alle Hubs dieses Netzwerks sind miteinander verbunden, so dass die Mitgliedschaft auf einem Hub die Verbindung zu beliebigen Seiten und Kanälen auf anderen Hubs ermöglicht. Es könnte sein, dass einige dieser Hubs kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den Seiten der einzelnen Hubs <strong>könnten</strong> jeweils nähere Informationen dazu stehen.";
+App::$strings["Hub URL"] = "Hub-URL";
+App::$strings["Access Type"] = "Zugriffstyp";
+App::$strings["Registration Policy"] = "Registrierungsrichtlinien";
+App::$strings["Stats"] = "Statistiken";
+App::$strings["Software"] = "Software";
App::$strings["Ratings"] = "Bewertungen";
-App::$strings["Rating: "] = "Bewertung: ";
-App::$strings["Website: "] = "Webseite: ";
-App::$strings["Description: "] = "Beschreibung: ";
-App::$strings["Photos"] = "Fotos";
-App::$strings["Invalid item."] = "Ungültiges Element.";
-App::$strings["Channel not found."] = "Kanal nicht gefunden.";
-App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
-App::$strings["Save to Folder:"] = "Speichern in Ordner:";
-App::$strings["- select -"] = "– auswählen –";
-App::$strings["Blocked"] = "Blockiert";
-App::$strings["Ignored"] = "Ignoriert";
-App::$strings["Hidden"] = "Versteckt";
-App::$strings["Archived"] = "Archiviert";
-App::$strings["New"] = "Neu";
-App::$strings["All"] = "Alle";
-App::$strings["New Connections"] = "Neue Verbindungen";
-App::$strings["Show pending (new) connections"] = "Ausstehende (neue) Verbindungsanfragen anzeigen";
-App::$strings["All Connections"] = "Alle Verbindungen";
-App::$strings["Show all connections"] = "Alle Verbindungen anzeigen";
-App::$strings["Only show blocked connections"] = "Nur blockierte Verbindungen anzeigen";
-App::$strings["Only show ignored connections"] = "Nur ignorierte Verbindungen anzeigen";
-App::$strings["Only show archived connections"] = "Nur archivierte Verbindungen anzeigen";
-App::$strings["Only show hidden connections"] = "Nur versteckte Verbindungen anzeigen";
-App::$strings["Pending approval"] = "Wartet auf Genehmigung";
-App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
-App::$strings["Edit connection"] = "Verbindung bearbeiten";
-App::$strings["Delete connection"] = "Verbindung löschen";
-App::$strings["Channel address"] = "Kanaladresse";
-App::$strings["Network"] = "Netzwerk";
-App::$strings["Status"] = "Status";
-App::$strings["Connected"] = "Verbunden";
-App::$strings["Approve connection"] = "Verbindung genehmigen";
-App::$strings["Ignore connection"] = "Verbindung ignorieren";
-App::$strings["Ignore"] = "Ignorieren";
-App::$strings["Recent activity"] = "Kürzliche Aktivitäten";
-App::$strings["Connections"] = "Verbindungen";
-App::$strings["Search"] = "Suche";
-App::$strings["Search your connections"] = "Verbindungen durchsuchen";
-App::$strings["Connections search"] = "Verbindung suchen";
-App::$strings["Image uploaded but image cropping failed."] = "Bild hochgeladen, aber das Zurechtschneiden schlug fehl.";
-App::$strings["Cover Photos"] = "Cover Foto";
-App::$strings["Image resize failed."] = "Bild-Anpassung fehlgeschlagen.";
-App::$strings["Unable to process image"] = "Kann Bild nicht verarbeiten";
-App::$strings["Image upload failed."] = "Hochladen des Bilds fehlgeschlagen.";
-App::$strings["Unable to process image."] = "Kann Bild nicht verarbeiten.";
-App::$strings["female"] = "weiblich";
-App::$strings["%1\$s updated her %2\$s"] = "%1\$s hat ihr %2\$s aktualisiert";
-App::$strings["male"] = "männlich";
-App::$strings["%1\$s updated his %2\$s"] = "%1\$s hat sein %2\$s aktualisiert";
-App::$strings["%1\$s updated their %2\$s"] = "%1\$s hat sein/ihr %2\$s aktualisiert";
-App::$strings["cover photo"] = "Cover Foto";
-App::$strings["Photo not available."] = "Foto nicht verfügbar.";
-App::$strings["Upload File:"] = "Datei hochladen:";
-App::$strings["Select a profile:"] = "Wähle ein Profil:";
-App::$strings["Upload Cover Photo"] = "Cover Foto hochladen";
-App::$strings["or"] = "oder";
-App::$strings["skip this step"] = "diesen Schritt überspringen";
-App::$strings["select a photo from your photo albums"] = "ein Foto aus meinen Fotoalben";
-App::$strings["Crop Image"] = "Bild zuschneiden";
-App::$strings["Please adjust the image cropping for optimum viewing."] = "Bitte schneide das Bild für eine optimale Anzeige passend zu.";
-App::$strings["Done Editing"] = "Bearbeitung fertigstellen";
+App::$strings["Rate"] = "Bewerten";
+App::$strings["View"] = "Ansicht";
App::$strings["Item not found"] = "Element nicht gefunden";
-App::$strings["Block Name"] = "Block-Name";
-App::$strings["Insert web link"] = "Link einfügen";
-App::$strings["Title (optional)"] = "Titel (optional)";
-App::$strings["Edit Block"] = "Block bearbeiten";
App::$strings["Layout Name"] = "Layout-Name";
App::$strings["Layout Description (Optional)"] = "Layout-Beschreibung (optional)";
App::$strings["Edit Layout"] = "Layout bearbeiten";
App::$strings["Page link"] = "Seiten-Link";
+App::$strings["Insert web link"] = "Link einfügen";
App::$strings["Edit Webpage"] = "Webseite bearbeiten";
+App::$strings["Photos"] = "Fotos";
+App::$strings["You must be logged in to see this page."] = "Du musst angemeldet sein, um diese Seite betrachten zu können.";
+App::$strings["Posts and comments"] = "Beiträge und Kommentare";
+App::$strings["Only posts"] = "Nur Beiträge";
+App::$strings["Insufficient permissions. Request redirected to profile page."] = "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet.";
+App::$strings["No such group"] = "Gruppe nicht gefunden";
+App::$strings["No such channel"] = "Kanal nicht gefunden";
+App::$strings["forum"] = "Forum";
+App::$strings["Search Results For:"] = "Suchergebnisse für:";
+App::$strings["Privacy group is empty"] = "Gruppe ist leer";
+App::$strings["Privacy group: "] = "Gruppe:";
+App::$strings["Invalid connection."] = "Ungültige Verbindung.";
App::$strings["Unable to update menu."] = "Kann Menü nicht aktualisieren.";
App::$strings["Unable to create menu."] = "Kann Menü nicht erstellen.";
App::$strings["Menu Name"] = "Name des Menüs";
@@ -504,7 +582,6 @@ App::$strings["Allow Bookmarks"] = "Lesezeichen erlauben";
App::$strings["Menu may be used to store saved bookmarks"] = "Im Menü können gespeicherte Lesezeichen abgelegt werden";
App::$strings["Submit and proceed"] = "Absenden und fortfahren";
App::$strings["Menus"] = "Menüs";
-App::$strings["Drop"] = "Löschen";
App::$strings["Created"] = "Erstellt";
App::$strings["Edited"] = "Geändert";
App::$strings["Bookmarks allowed"] = "Lesezeichen erlaubt";
@@ -536,6 +613,65 @@ App::$strings["Categories (optional, comma separated list)"] = "Kategorien (opti
App::$strings["Version ID"] = "Versions-ID";
App::$strings["Price of app"] = "Preis der App";
App::$strings["Location (URL) to purchase app"] = "Ort (URL), um die App zu kaufen";
+App::$strings["Edit post"] = "Bearbeite Beitrag";
+App::$strings["Documentation Search"] = "Suche in der Dokumentation";
+App::$strings["\$Projectname Documentation"] = "\$Projectname-Dokumentation";
+App::$strings["Share content from Firefox to \$Projectname"] = "Inhalte von Firefox nach \$Projectname teilen";
+App::$strings["Activate the Firefox \$Projectname provider"] = "Aktiviert den \$Projectname-Provider für firefox";
+App::$strings["Apps"] = "Apps";
+App::$strings["\$Projectname"] = "\$Projectname";
+App::$strings["Welcome to %s"] = "Willkommen auf %s";
+App::$strings["Permission Denied."] = "Zugriff verweigert.";
+App::$strings["File not found."] = "Datei nicht gefunden.";
+App::$strings["Edit file permissions"] = "Dateiberechtigungen bearbeiten";
+App::$strings["Permissions"] = "Berechtigungen";
+App::$strings["Set/edit permissions"] = "Berechtigungen setzen/ändern";
+App::$strings["Include all files and sub folders"] = "Alle Dateien und Unterverzeichnisse einbinden";
+App::$strings["Return to file list"] = "Zurück zur Dateiliste";
+App::$strings["Copy/paste this code to attach file to a post"] = "Diesen Code kopieren und einfügen, um die Datei an einen Beitrag anzuhängen";
+App::$strings["Copy/paste this URL to link file from a web page"] = "Diese URL verwenden, um von einer Webseite aus auf die Datei zu verlinken";
+App::$strings["Share this file"] = "Diese Datei freigeben";
+App::$strings["Show URL to this file"] = "URL zu dieser Datei anzeigen";
+App::$strings["Notify your contacts about this file"] = "Meine Kontakte über diese Datei benachrichtigen";
+App::$strings["Public access denied."] = "Öffentlichen Zugriff verweigert.";
+App::$strings["%d rating"] = array(
+ 0 => "%d Bewertung",
+ 1 => "%d Bewertungen",
+);
+App::$strings["Gender: "] = "Geschlecht:";
+App::$strings["Status: "] = "Status:";
+App::$strings["Homepage: "] = "Webseite:";
+App::$strings["Age:"] = "Alter:";
+App::$strings["Location:"] = "Ort:";
+App::$strings["Description:"] = "Beschreibung:";
+App::$strings["Hometown:"] = "Heimatstadt:";
+App::$strings["About:"] = "Über:";
+App::$strings["Public Forum:"] = "Öffentliches Forum:";
+App::$strings["Keywords: "] = "Schlüsselwörter:";
+App::$strings["Don't suggest"] = "Nicht vorschlagen";
+App::$strings["Common connections:"] = "Gemeinsame Verbindungen:";
+App::$strings["Global Directory"] = "Globales Verzeichnis";
+App::$strings["Local Directory"] = "Lokales Verzeichnis";
+App::$strings["Finding:"] = "Ergebnisse:";
+App::$strings["Channel Suggestions"] = "Kanal-Vorschläge";
+App::$strings["next page"] = "nächste Seite";
+App::$strings["previous page"] = "vorherige Seite";
+App::$strings["Sort options"] = "Sortieroptionen";
+App::$strings["Alphabetic"] = "alphabetisch";
+App::$strings["Reverse Alphabetic"] = "Entgegengesetzt alphabetisch";
+App::$strings["Newest to Oldest"] = "Neueste zuerst";
+App::$strings["Oldest to Newest"] = "Älteste zuerst";
+App::$strings["No entries (some entries may be hidden)."] = "Keine Einträge gefunden (einige könnten versteckt sein).";
+App::$strings["Unable to locate original post."] = "Originalbeitrag nicht gefunden.";
+App::$strings["Empty post discarded."] = "Leeren Beitrag verworfen.";
+App::$strings["Executable content type not permitted to this channel."] = "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben.";
+App::$strings["Duplicate post suppressed."] = "Doppelter Beitrag unterdrückt.";
+App::$strings["System error. Post not saved."] = "Systemfehler. Beitrag nicht gespeichert.";
+App::$strings["Unable to obtain post information from database."] = "Beitragsinformationen können nicht aus der Datenbank abgerufen werden.";
+App::$strings["You have reached your limit of %1$.0f top level posts."] = "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht.";
+App::$strings["You have reached your limit of %1$.0f webpages."] = "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht.";
+App::$strings["toggle full screen mode"] = "auf Vollbildmodus umschalten";
+App::$strings["Channel added."] = "Kanal hinzugefügt.";
App::$strings["Unable to lookup recipient."] = "Konnte den Empfänger nicht finden.";
App::$strings["Unable to communicate with requested channel."] = "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen.";
App::$strings["Cannot verify requested channel."] = "Verifizierung des angeforderten Kanals fehlgeschlagen.";
@@ -562,75 +698,20 @@ App::$strings["Delete Conversation"] = "Unterhaltung löschen";
App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Keine sichere Kommunikation verfügbar. <strong>Eventuell</strong> kannst Du auf der Profilseite des Absenders antworten.";
App::$strings["Send Reply"] = "Antwort senden";
App::$strings["Your message for %s (%s):"] = "Deine Nachricht für %s (%s):";
-App::$strings["Item not available."] = "Element nicht verfügbar.";
-App::$strings["Share content from Firefox to \$Projectname"] = "Inhalte von Firefox nach \$Projectname teilen";
-App::$strings["Activate the Firefox \$Projectname provider"] = "Aktiviert den \$Projectname-Provider für firefox";
-App::$strings["Documentation Search"] = "Suche in der Dokumentation";
-App::$strings["\$Projectname Documentation"] = "\$Projectname-Dokumentation";
-App::$strings["\$Projectname"] = "\$Projectname";
-App::$strings["Welcome to %s"] = "Willkommen auf %s";
-App::$strings["Remote privacy information not available."] = "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar.";
-App::$strings["Visible to:"] = "Sichtbar für:";
-App::$strings["Permission Denied."] = "Zugriff verweigert.";
-App::$strings["File not found."] = "Datei nicht gefunden.";
-App::$strings["Edit file permissions"] = "Dateiberechtigungen bearbeiten";
-App::$strings["Permissions"] = "Berechtigungen";
-App::$strings["Set/edit permissions"] = "Berechtigungen setzen/ändern";
-App::$strings["Include all files and sub folders"] = "Alle Dateien und Unterverzeichnisse einbinden";
-App::$strings["Return to file list"] = "Zurück zur Dateiliste";
-App::$strings["Copy/paste this code to attach file to a post"] = "Diesen Code kopieren und einfügen, um die Datei an einen Beitrag anzuhängen";
-App::$strings["Copy/paste this URL to link file from a web page"] = "Diese URL verwenden, um von einer Webseite aus auf die Datei zu verlinken";
-App::$strings["Share this file"] = "Diese Datei freigeben";
-App::$strings["Show URL to this file"] = "URL zu dieser Datei anzeigen";
-App::$strings["Notify your contacts about this file"] = "Meine Kontakte über diese Datei benachrichtigen";
-App::$strings["Hub not found."] = "Server nicht gefunden.";
-App::$strings["Continue"] = "Fortfahren";
-App::$strings["Premium Channel Setup"] = "Premium-Kanal-Einrichtung";
-App::$strings["Enable premium channel connection restrictions"] = "Einschränkungen für einen Premium-Kanal aktivieren";
-App::$strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Bitte gib Deine Nutzungsbedingungen ein, z.B. Paypal-Quittung, Richtlinien etc.";
-App::$strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Unter Umständen sind weitere Schritte oder die Bestätigung der folgenden Bedingungen vor dem Verbinden mit diesem Kanal nötig.";
-App::$strings["Potential connections will then see the following text before proceeding:"] = "Potentielle Kontakte werden den folgenden Text sehen, bevor fortgefahren wird:";
-App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Indem ich fortfahre, bestätige ich die Erfüllung aller Anweisungen auf dieser Seite.";
-App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(Der Kanal-Besitzer hat keine speziellen Anweisungen hinterlegt.)";
-App::$strings["Restricted or Premium Channel"] = "Eingeschränkter oder Premium-Kanal";
-App::$strings["Privacy group created."] = "Gruppe wurde erstellt.";
-App::$strings["Could not create privacy group."] = "Gruppe konnte nicht erstellt werden.";
-App::$strings["Privacy group not found."] = "Gruppe nicht gefunden.";
-App::$strings["Privacy group updated."] = "Gruppe wurde aktualisiert.";
-App::$strings["Create a group of channels."] = "Erstelle eine Gruppe für Kanäle.";
-App::$strings["Privacy group name: "] = "Gruppenname:";
-App::$strings["Members are visible to other channels"] = "Mitglieder sind sichtbar für andere Kanäle";
-App::$strings["Privacy group removed."] = "Gruppe wurde entfernt.";
-App::$strings["Unable to remove privacy group."] = "Gruppe konnte nicht entfernt werden.";
-App::$strings["Privacy group editor"] = "Gruppeneditor";
-App::$strings["Members"] = "Mitglieder";
-App::$strings["All Connected Channels"] = "Alle verbundenen Kanäle";
-App::$strings["Click on a channel to add or remove."] = "Wähle einen Kanal zum hinzufügen oder entfernen aus.";
-App::$strings["Import Webpage Elements"] = "Webseitenelemente importieren";
-App::$strings["Import selected"] = "Import ausgewählt";
-App::$strings["Export Webpage Elements"] = "Webseitenelemente exportieren";
-App::$strings["Export selected"] = "Exportieren ausgewählt";
-App::$strings["Webpages"] = "Webseiten";
-App::$strings["Share"] = "Teilen";
-App::$strings["View"] = "Ansicht";
-App::$strings["Preview"] = "Vorschau";
-App::$strings["Actions"] = "Aktionen";
-App::$strings["Page Link"] = "Seiten-Link";
-App::$strings["Page Title"] = "Seitentitel";
-App::$strings["Invalid file type."] = "Ungültiger Dateityp.";
-App::$strings["Error opening zip file"] = "Fehler beim Öffnen der ZIP-Datei";
-App::$strings["Invalid folder path."] = "Ungültiger Ordnerpfad.";
-App::$strings["No webpage elements detected."] = "Keine Webseitenelemente erkannt.";
-App::$strings["Import complete."] = "Import abgeschlossen.";
App::$strings["webpage"] = "Webseite";
App::$strings["block"] = "Block";
App::$strings["layout"] = "Layout";
App::$strings["menu"] = "Menü";
App::$strings["%s element installed"] = "Element für %s installiert";
App::$strings["%s element installation failed"] = "Installation des Elements %s fehlgeschlagen";
+App::$strings["Nothing to import."] = "Nichts zu importieren.";
+App::$strings["Unable to download data from old server"] = "Daten können vom alten Server nicht heruntergeladen werden";
+App::$strings["Imported file is empty."] = "Die importierte Datei ist leer.";
+App::$strings["Warning: Database versions differ by %1\$d updates."] = "Achtung: Datenbankversionen unterscheiden sich um %1\$d Aktualisierungen.";
App::$strings["Import completed"] = "Import abgeschlossen";
App::$strings["Import Items"] = "Beiträge importieren";
App::$strings["Use this form to import existing posts and content from an export file."] = "Mit diesem Formular kannst Du existierende Beiträge und Inhalte aus einer Sicherungsdatei importieren.";
+App::$strings["File to Upload"] = "Hochzuladende Datei:";
App::$strings["Total invitation limit exceeded."] = "Einladungslimit überschritten.";
App::$strings["%s : Not a valid email address."] = "%s : Keine gültige Email Adresse.";
App::$strings["Please join us on \$Projectname"] = "Schließe Dich uns auf \$Projectname an!";
@@ -649,57 +730,28 @@ App::$strings["1. Register at any \$Projectname location (they are all inter-con
App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Gib meine \$Projectname-Adresse im Suchfeld ein.";
App::$strings["or visit"] = "oder besuche";
App::$strings["3. Click [Connect]"] = "3. Klicke auf [Verbinden]";
-App::$strings["Location not found."] = "Klon nicht gefunden.";
-App::$strings["Location lookup failed."] = "Nachschlagen des Kanal-Ortes fehlgeschlagen";
-App::$strings["Please select another location to become primary before removing the primary location."] = "Bitte mache einen anderen Kanal-Ort zum primären Ort, bevor Du den primären Ort löschst.";
-App::$strings["Syncing locations"] = "Synchronisiere Klone";
-App::$strings["No locations found."] = "Keine Klon-Adressen gefunden.";
-App::$strings["Manage Channel Locations"] = "Klon-Adressen verwalten";
-App::$strings["Location"] = "Ort";
-App::$strings["Primary"] = "Primär";
-App::$strings["Sync Now"] = "Jetzt synchronisieren";
-App::$strings["Please wait several minutes between consecutive operations."] = "Bitte warte mehrere Minuten zwischen dem Ausführen zweier Operationen!";
-App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub einloggst und den Kanal dort löschst.";
-App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt.";
-App::$strings["No such group"] = "Gruppe nicht gefunden";
-App::$strings["No such channel"] = "Kanal nicht gefunden";
-App::$strings["forum"] = "Forum";
-App::$strings["Search Results For:"] = "Suchergebnisse für:";
-App::$strings["Privacy group is empty"] = "Gruppe ist leer";
-App::$strings["Privacy group: "] = "Gruppe:";
-App::$strings["Invalid connection."] = "Ungültige Verbindung.";
-App::$strings["Like/Dislike"] = "Mögen/Nicht mögen";
-App::$strings["This action is restricted to members."] = "Diese Aktion kann nur von Mitgliedern ausgeführt werden.";
-App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Um fortzufahren <a href=\"rmagic\">melde Dich bitte mit Deiner \$Projectname-ID an</a> oder <a href=\"register\">registriere Dich als neues \$Projectname-Mitglied</a>.";
-App::$strings["Invalid request."] = "Ungültige Anfrage.";
-App::$strings["channel"] = "Kanal";
-App::$strings["thing"] = "Sache";
-App::$strings["Channel unavailable."] = "Kanal nicht vorhanden.";
-App::$strings["Previous action reversed."] = "Die vorherige Aktion wurde rückgängig gemacht.";
-App::$strings["photo"] = "Foto";
-App::$strings["status"] = "Status";
-App::$strings["event"] = "Termin";
-App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s";
-App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s nicht";
-App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s stimmt %2\$ss %3\$s zu";
-App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s lehnt %2\$ss %3\$s ab";
-App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s enthält sich zu %2\$ss %3\$s";
-App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s teil";
-App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s nicht teil";
-App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s nimmt vielleicht an %2\$ss %3\$s teil";
-App::$strings["Action completed."] = "Aktion durchgeführt.";
-App::$strings["Thank you."] = "Vielen Dank.";
-App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet.";
-App::$strings["Create a new channel"] = "Neuen Kanal anlegen";
-App::$strings["Create New"] = "Neu anlegen";
-App::$strings["Channel Manager"] = "Kanal-Manager";
-App::$strings["Current Channel"] = "Aktueller Kanal";
-App::$strings["Switch to one of your channels by selecting it."] = "Wechsle zu einem Deiner Kanäle, indem Du auf ihn klickst.";
-App::$strings["Default Channel"] = "Standard Kanal";
-App::$strings["Make Default"] = "Zum Standard machen";
-App::$strings["%d new messages"] = "%d neue Nachrichten";
-App::$strings["%d new introductions"] = "%d neue Vorstellungen";
-App::$strings["Delegated Channel"] = "Delegierte Kanäle";
+App::$strings["Block Name"] = "Block-Name";
+App::$strings["Title (optional)"] = "Titel (optional)";
+App::$strings["Edit Block"] = "Block bearbeiten";
+App::$strings["Privacy group created."] = "Gruppe wurde erstellt.";
+App::$strings["Could not create privacy group."] = "Gruppe konnte nicht erstellt werden.";
+App::$strings["Privacy group not found."] = "Gruppe nicht gefunden.";
+App::$strings["Privacy group updated."] = "Gruppe wurde aktualisiert.";
+App::$strings["Create a group of channels."] = "Erstelle eine Gruppe für Kanäle.";
+App::$strings["Privacy group name: "] = "Gruppenname:";
+App::$strings["Members are visible to other channels"] = "Mitglieder sind sichtbar für andere Kanäle";
+App::$strings["Privacy group removed."] = "Gruppe wurde entfernt.";
+App::$strings["Unable to remove privacy group."] = "Gruppe konnte nicht entfernt werden.";
+App::$strings["Privacy group editor"] = "Gruppeneditor";
+App::$strings["Members"] = "Mitglieder";
+App::$strings["All Connected Channels"] = "Alle verbundenen Kanäle";
+App::$strings["Click on a channel to add or remove."] = "Wähle einen Kanal zum hinzufügen oder entfernen aus.";
+App::$strings["Invalid profile identifier."] = "Ungültiger Profil-Identifikator";
+App::$strings["Profile Visibility Editor"] = "Profil-Sichtbarkeits-Editor";
+App::$strings["Profile"] = "Profil";
+App::$strings["Click on a contact to add or remove."] = "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen.";
+App::$strings["Visible To"] = "Sichtbar für";
+App::$strings["Hub not found."] = "Server nicht gefunden.";
App::$strings["Unable to create element."] = "Element konnte nicht erstellt werden.";
App::$strings["Unable to update menu element."] = "Kann Menü-Element nicht aktualisieren.";
App::$strings["Unable to add menu element."] = "Kann Menü-Bestandteil nicht hinzufügen.";
@@ -729,173 +781,88 @@ App::$strings["Menu item deleted."] = "Menü-Bestandteil gelöscht.";
App::$strings["Menu item could not be deleted."] = "Menü-Bestandteil kann nicht gelöscht werden.";
App::$strings["Edit Menu Element"] = "Bearbeite Menü-Bestandteil";
App::$strings["Link text"] = "Link Text";
-App::$strings["Rating"] = "Bewertung";
-App::$strings["Website:"] = "Webseite:";
-App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Kanal [%s] (auf diesem Server noch unbekannt)";
-App::$strings["Rating (this information is public)"] = "Bewertung (öffentlich sichtbar)";
-App::$strings["Optionally explain your rating (this information is public)"] = "Optional kannst du deine Bewertung erklären (öffentlich sichtbar)";
-App::$strings["No valid account found."] = "Kein gültiges Konto gefunden.";
-App::$strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Schau in Deine E-Mails.";
-App::$strings["Site Member (%s)"] = "Nutzer (%s)";
-App::$strings["Password reset requested at %s"] = "Passwort-Rücksetzung auf %s angefordert";
-App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Die Anfrage konnte nicht verifiziert werden. (Vielleicht hast Du schon einmal auf den Link in der E-Mail geklickt?) Passwort-Rücksetzung fehlgeschlagen.";
-App::$strings["Password Reset"] = "Zurücksetzen des Kennworts";
-App::$strings["Your password has been reset as requested."] = "Dein Passwort wurde wie angefordert neu erstellt.";
-App::$strings["Your new password is"] = "Dein neues Passwort lautet";
-App::$strings["Save or copy your new password - and then"] = "Speichere oder kopiere Dein neues Passwort – und dann";
-App::$strings["click here to login"] = "Klicke hier, um dich anzumelden";
-App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Dein Passwort kann unter <em>Einstellungen</em> nach einer erfolgreichen Anmeldung geändert werden.";
-App::$strings["Your password has changed at %s"] = "Auf %s wurde Dein Passwort geändert";
-App::$strings["Forgot your Password?"] = "Kennwort vergessen?";
-App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib Deine E-Mail-Adresse ein, um Dein Passwort zurücksetzen zu lassen. Du erhältst dann weitere Anweisungen per E-Mail.";
-App::$strings["Email Address"] = "E-Mail Adresse";
-App::$strings["Reset"] = "Zurücksetzen";
+App::$strings["No ratings"] = "Keine Bewertungen";
+App::$strings["Rating: "] = "Bewertung: ";
+App::$strings["Website: "] = "Webseite: ";
+App::$strings["Description: "] = "Beschreibung: ";
+App::$strings["Item not available."] = "Element nicht verfügbar.";
App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s ist %2\$s";
App::$strings["Mood"] = "Laune";
App::$strings["Set your current mood and tell your friends"] = "Wähle Deine aktuelle Stimmung und teile sie mit Deinen Freunden";
-App::$strings["Profile not found."] = "Profil nicht gefunden.";
-App::$strings["Profile deleted."] = "Profil gelöscht.";
-App::$strings["Profile-"] = "Profil-";
-App::$strings["New profile created."] = "Neues Profil erstellt.";
-App::$strings["Profile unavailable to clone."] = "Profil kann nicht geklont werden.";
-App::$strings["Profile unavailable to export."] = "Dieses Profil kann nicht exportiert werden.";
-App::$strings["Profile Name is required."] = "Profil-Name erforderlich.";
-App::$strings["Marital Status"] = "Familienstand";
-App::$strings["Romantic Partner"] = "Romantische Partner";
-App::$strings["Likes"] = "Gefällt";
-App::$strings["Dislikes"] = "Gefällt nicht";
-App::$strings["Work/Employment"] = "Arbeit/Anstellung";
-App::$strings["Religion"] = "Religion";
-App::$strings["Political Views"] = "Politische Ansichten";
-App::$strings["Gender"] = "Geschlecht";
-App::$strings["Sexual Preference"] = "Sexuelle Orientierung";
-App::$strings["Homepage"] = "Webseite";
-App::$strings["Interests"] = "Hobbys/Interessen";
-App::$strings["Profile updated."] = "Profil aktualisiert.";
-App::$strings["Hide your connections list from viewers of this profile"] = "Deine Verbindungen vor Betrachtern dieses Profils verbergen";
-App::$strings["Edit Profile Details"] = "Bearbeite Profil-Details";
-App::$strings["View this profile"] = "Dieses Profil ansehen";
-App::$strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
-App::$strings["Profile Tools"] = "Profilwerkzeuge";
-App::$strings["Change cover photo"] = "Titelbild ändern";
-App::$strings["Change profile photo"] = "Profilfoto ändern";
-App::$strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen übernehmen";
-App::$strings["Clone this profile"] = "Dieses Profil klonen";
-App::$strings["Delete this profile"] = "Dieses Profil löschen";
-App::$strings["Add profile things"] = "Sachen zum Profil hinzufügen";
-App::$strings["Personal"] = "Persönlich";
-App::$strings["Relation"] = "Beziehung";
-App::$strings["Miscellaneous"] = "Verschiedenes";
-App::$strings["Import profile from file"] = "Profil aus einer Datei importieren";
-App::$strings["Export profile to file"] = "Profil in eine Datei exportieren";
-App::$strings["Your gender"] = "Dein Geschlecht";
-App::$strings["Marital status"] = "Familienstand";
-App::$strings["Sexual preference"] = "Sexuelle Orientierung";
-App::$strings["Profile name"] = "Profilname";
-App::$strings["This is your default profile."] = "Das ist Dein Standardprofil.";
-App::$strings["Your full name"] = "Dein voller Name";
-App::$strings["Title/Description"] = "Titel/Beschreibung";
-App::$strings["Street address"] = "Straße und Hausnummer";
-App::$strings["Locality/City"] = "Wohnort";
-App::$strings["Region/State"] = "Region/Bundesstaat";
-App::$strings["Postal/Zip code"] = "Postleitzahl";
-App::$strings["Country"] = "Land";
-App::$strings["Who (if applicable)"] = "Wer (falls anwendbar)";
-App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Beispiele: cathy123, Cathy Williams, cathy@example.com";
-App::$strings["Since (date)"] = "Seit (Datum)";
-App::$strings["Tell us about yourself"] = "Erzähle uns ein wenig von Dir";
-App::$strings["Homepage URL"] = "Homepage-URL";
-App::$strings["Hometown"] = "Heimatort";
-App::$strings["Political views"] = "Politische Ansichten";
-App::$strings["Religious views"] = "Religiöse Ansichten";
-App::$strings["Keywords used in directory listings"] = "Schlüsselwörter, die in Verzeichnis-Auflistungen verwendet werden";
-App::$strings["Example: fishing photography software"] = "Beispiel: Angeln Fotografie Software";
-App::$strings["Musical interests"] = "Musikalische Interessen";
-App::$strings["Books, literature"] = "Bücher, Literatur";
-App::$strings["Television"] = "Fernsehen";
-App::$strings["Film/Dance/Culture/Entertainment"] = "Film/Tanz/Kultur/Unterhaltung";
-App::$strings["Hobbies/Interests"] = "Hobbys/Interessen";
-App::$strings["Love/Romance"] = "Liebe/Romantik";
-App::$strings["School/Education"] = "Schule/Ausbildung";
-App::$strings["Contact information and social networks"] = "Kontaktinformation und soziale Netzwerke";
-App::$strings["My other channels"] = "Meine anderen Kanäle";
-App::$strings["Profile Image"] = "Profilfoto:";
-App::$strings["Edit Profiles"] = "Profile bearbeiten";
App::$strings["No more system notifications."] = "Keine System-Benachrichtigungen mehr.";
App::$strings["System Notifications"] = "System-Benachrichtigungen";
-App::$strings["Profile Match"] = "Profil-Übereinstimmungen";
-App::$strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselwörter für den Abgleich gefunden. Bitte füge Schlüsselwörter zu Deinem Standardprofil hinzu.";
-App::$strings["is interested in:"] = "interessiert sich für:";
-App::$strings["No matches"] = "Keine Übereinstimmungen";
-App::$strings["Authorize application connection"] = "Zugriff für die Anwendung autorisieren";
-App::$strings["Return to your app and insert this Security Code:"] = "Gehen Sie zu Ihrer App zurück und tragen Sie diesen Sicherheitscode ein:";
-App::$strings["Please login to continue."] = "Zum Weitermachen, bitte einloggen.";
-App::$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 erlauben, Deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für Dich zu erstellen?";
-App::$strings["Calendar entries imported."] = "Kalendereinträge wurden importiert.";
-App::$strings["No calendar entries found."] = "Keine Kalendereinträge gefunden.";
-App::$strings["Event can not end before it has started."] = "Termin-Ende liegt vor dem Beginn.";
-App::$strings["Unable to generate preview."] = "Vorschau konnte nicht erzeugt werden.";
-App::$strings["Event title and start time are required."] = "Titel und Startzeit des Termins sind erforderlich.";
-App::$strings["Event not found."] = "Termin nicht gefunden.";
-App::$strings["Edit event title"] = "Termintitel bearbeiten";
-App::$strings["Event title"] = "Termintitel";
-App::$strings["Categories (comma-separated list)"] = "Kategorien (Kommagetrennte Liste)";
-App::$strings["Edit Category"] = "Kategorie bearbeiten";
-App::$strings["Category"] = "Kategorie";
-App::$strings["Edit start date and time"] = "Startdatum und -zeit bearbeiten";
-App::$strings["Start date and time"] = "Startdatum und -zeit";
-App::$strings["Finish date and time are not known or not relevant"] = "Enddatum und -zeit sind unbekannt oder irrelevant";
-App::$strings["Edit finish date and time"] = "Enddatum und -zeit bearbeiten";
-App::$strings["Finish date and time"] = "Enddatum und -zeit";
-App::$strings["Adjust for viewer timezone"] = "An die Zeitzone des Betrachters anpassen";
-App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht sinnvoll für globale Feiertage / Ferien.";
-App::$strings["Edit Description"] = "Beschreibung bearbeiten";
-App::$strings["Edit Location"] = "Ort bearbeiten";
-App::$strings["Share this event"] = "Den Termin teilen";
-App::$strings["Permission settings"] = "Berechtigungs-Einstellungen";
-App::$strings["Advanced Options"] = "Weitere Optionen";
-App::$strings["l, F j"] = "l, j. F";
-App::$strings["Edit event"] = "Termin bearbeiten";
-App::$strings["Delete event"] = "Termin löschen";
-App::$strings["Link to Source"] = "Link zur Quelle";
-App::$strings["calendar"] = "Kalender";
-App::$strings["Edit Event"] = "Termin bearbeiten";
-App::$strings["Create Event"] = "Termin anlegen";
+App::$strings["Page owner information could not be retrieved."] = "Informationen über den Besitzer der Seite konnten nicht gefunden werden.";
+App::$strings["Profile Photos"] = "Profilfotos";
+App::$strings["Album not found."] = "Album nicht gefunden.";
+App::$strings["Delete Album"] = "Album löschen";
+App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Mehrere Speicherordner mit diesem Albumnamen sind bereits vorhanden, aber in verschiedenen Verzeichnissen. Bitte entfernen Sie den oder die gewünschten Ordner mit dem Dateimanager";
+App::$strings["Delete Photo"] = "Foto löschen";
+App::$strings["No photos selected"] = "Keine Fotos ausgewählt";
+App::$strings["Access to this item is restricted."] = "Der Zugriff auf dieses Foto ist eingeschränkt.";
+App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB von %2$.2f MB Foto-Speicher belegt.";
+App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB Foto-Speicher belegt.";
+App::$strings["Upload Photos"] = "Fotos hochladen";
+App::$strings["Enter an album name"] = "Namen für ein neues Album eingeben";
+App::$strings["or select an existing album (doubleclick)"] = "oder ein bereits vorhandenes auswählen (Doppelklick)";
+App::$strings["Create a status post for this upload"] = "Einen Statusbeitrag für diesen Upload erzeugen";
+App::$strings["Caption (optional):"] = "Beschriftung (optional):";
+App::$strings["Description (optional):"] = "Beschreibung (optional):";
+App::$strings["Album name could not be decoded"] = "Albumname konnte nicht dekodiert werden";
+App::$strings["Contact Photos"] = "Kontakt-Bilder";
+App::$strings["Show Newest First"] = "Neueste zuerst anzeigen";
+App::$strings["Show Oldest First"] = "Älteste zuerst anzeigen";
+App::$strings["View Photo"] = "Foto ansehen";
+App::$strings["Edit Album"] = "Album bearbeiten";
+App::$strings["Permission denied. Access to this item may be restricted."] = "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden.";
+App::$strings["Photo not available"] = "Foto nicht verfügbar";
+App::$strings["Use as profile photo"] = "Als Profilfoto verwenden";
+App::$strings["Use as cover photo"] = "Als Titelbild verwenden";
+App::$strings["Private Photo"] = "Privates Foto";
App::$strings["Previous"] = "Voriges";
+App::$strings["View Full Size"] = "In voller Größe anzeigen";
App::$strings["Next"] = "Nächste";
-App::$strings["Export"] = "Exportieren";
-App::$strings["Month"] = "Monat";
-App::$strings["Week"] = "Woche";
-App::$strings["Day"] = "Tag";
-App::$strings["Today"] = "Heute";
-App::$strings["Event removed"] = "Termin gelöscht";
-App::$strings["Failed to remove event"] = "Termin konnte nicht gelöscht werden";
-App::$strings["Unable to locate original post."] = "Originalbeitrag nicht gefunden.";
-App::$strings["Empty post discarded."] = "Leeren Beitrag verworfen.";
-App::$strings["Executable content type not permitted to this channel."] = "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben.";
-App::$strings["Duplicate post suppressed."] = "Doppelter Beitrag unterdrückt.";
-App::$strings["System error. Post not saved."] = "Systemfehler. Beitrag nicht gespeichert.";
-App::$strings["Unable to obtain post information from database."] = "Beitragsinformationen können nicht aus der Datenbank abgerufen werden.";
-App::$strings["You have reached your limit of %1$.0f top level posts."] = "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht.";
-App::$strings["You have reached your limit of %1$.0f webpages."] = "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht.";
-App::$strings["Create Channel"] = "Einen neuen Kanal anlegen";
-App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Ein Kanal ist Deine Identität in diesem Netzwerk. Er kann eine Person, ein Blog oder ein Forum repräsentieren, nur um ein paar Beispiele zu nennen. Kanäle können Verbindungen miteinander eingehen, um Informationen zu teilen, jeweils basierend auf sehr detaillierten Berechtigungseinstellungen.";
-App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Server.";
-App::$strings["sent you a private message"] = "hat Dir eine private Nachricht geschickt";
-App::$strings["added your channel"] = "hat deinen Kanal hinzugefügt";
-App::$strings["g A l F d"] = "l, d. F, G:i \\U\\h\\r";
-App::$strings["[today]"] = "[Heute]";
-App::$strings["posted an event"] = "hat einen Termin veröffentlicht";
-App::$strings["Invalid request identifier."] = "Ungültiger Anfrage-Identifikator.";
-App::$strings["Discard"] = "Verwerfen";
-App::$strings["Mark all system notifications seen"] = "Markiere alle System-Benachrichtigungen als gesehen";
-App::$strings["Poke"] = "Anstupsen";
-App::$strings["Poke somebody"] = "Jemanden anstupsen";
-App::$strings["Poke/Prod"] = "Anstupsen/Knuffen";
-App::$strings["Poke, prod or do other things to somebody"] = "Jemanden anstupsen, knuffen oder sonstiges";
-App::$strings["Recipient"] = "Empfänger";
-App::$strings["Choose what you wish to do to recipient"] = "Wähle, was Du mit dem/r Empfänger/in tun willst";
-App::$strings["Make this post private"] = "Diesen Beitrag privat machen";
+App::$strings["Edit photo"] = "Foto bearbeiten";
+App::$strings["Rotate CW (right)"] = "Drehen im UZS (rechts)";
+App::$strings["Rotate CCW (left)"] = "Drehen gegen UZS (links)";
+App::$strings["Move photo to album"] = "Foto in Album verschieben";
+App::$strings["Enter a new album name"] = "Gib einen Namen für ein neues Album ein";
+App::$strings["or select an existing one (doubleclick)"] = "oder wähle ein bereits vorhandenes aus (Doppelklick)";
+App::$strings["Caption"] = "Bildunterschrift";
+App::$strings["Add a Tag"] = "Schlagwort hinzufügen";
+App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Beispiele: @ben, @Karl_Prester, @lieschen@example.com";
+App::$strings["Flag as adult in album view"] = "In der Albumansicht als nicht jugendfrei markieren";
+App::$strings["I like this (toggle)"] = "Mir gefällt das (Umschalter)";
+App::$strings["I don't like this (toggle)"] = "Mir gefällt das nicht (Umschalter)";
+App::$strings["Share"] = "Teilen";
+App::$strings["Please wait"] = "Bitte warten";
+App::$strings["This is you"] = "Das bist Du";
+App::$strings["Comment"] = "Kommentar";
+App::$strings["Preview"] = "Vorschau";
+App::$strings["__ctx:title__ Likes"] = "Gefällt mir";
+App::$strings["__ctx:title__ Dislikes"] = "Gefällt mir nicht";
+App::$strings["__ctx:title__ Agree"] = "Zustimmungen";
+App::$strings["__ctx:title__ Disagree"] = "Ablehnungen";
+App::$strings["__ctx:title__ Abstain"] = "Enthaltungen";
+App::$strings["__ctx:title__ Attending"] = "Zusagen";
+App::$strings["__ctx:title__ Not attending"] = "Absagen";
+App::$strings["__ctx:title__ Might attend"] = "Vielleicht";
+App::$strings["View all"] = "Alles anzeigen";
+App::$strings["__ctx:noun__ Like"] = array(
+ 0 => "Gefällt mir",
+ 1 => "Gefällt mir",
+);
+App::$strings["__ctx:noun__ Dislike"] = array(
+ 0 => "Gefällt nicht",
+ 1 => "Gefällt nicht",
+);
+App::$strings["Photo Tools"] = "Fotowerkzeuge";
+App::$strings["In This Photo:"] = "Auf diesem Foto:";
+App::$strings["Map"] = "Karte";
+App::$strings["__ctx:noun__ Likes"] = "Gefällt mir";
+App::$strings["__ctx:noun__ Dislikes"] = "Gefällt nicht";
+App::$strings["Close"] = "Schließen";
+App::$strings["View Album"] = "Album ansehen";
+App::$strings["Recent Photos"] = "Neueste Fotos";
App::$strings["\$Projectname Server - Setup"] = "\$Projectname Server-Einrichtung";
App::$strings["Could not connect to database."] = "Kann nicht mit der Datenbank verbinden.";
App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Konnte die angegebene Webseiten-URL nicht erreichen. Möglicherweise ein Problem mit dem SSL-Zertifikat oder dem DNS.";
@@ -930,11 +897,12 @@ App::$strings["If you don't have a command line version of PHP installed on serv
App::$strings["PHP executable path"] = "PHP-Pfad zu ausführbarer Datei";
App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Gib den vollen Pfad zum PHP-Interpreter an. Du kannst dieses Feld frei lassen und mit der Installation fortfahren.";
App::$strings["Command line PHP"] = "PHP-Befehlszeile";
+App::$strings["Unable to check command line PHP, as shell_exec() is disabled. This is required."] = "Prüfung auf Kommandozeilen-PHP fehlgeschlagen, da shell_exec() deaktiviert ist. Dies wird aber benötigt.";
App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Bei der Kommandozeilen-Version von PHP auf Deinem System ist \"register_argc_argv\" nicht aktiviert.";
App::$strings["This is required for message delivery to work."] = "Das wird benötigt, damit die Auslieferung von Nachrichten funktioniert.";
App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv";
App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "Die Maximalgröße für Uploads insgesamt liegt bei %s. Die Maximalgröße für eine Datei liegt bei %s. Es können maximal %d Dateien gleichzeitig hochgeladen werden.";
-App::$strings["You can adjust these settings in the servers php.ini."] = "Du kannst diese Einstellungen in der php.ini des Servers ändern.";
+App::$strings["You can adjust these settings in the server php.ini file."] = "Du kannst diese Einstellungen in der php.ini - Datei des Servers anpassen.";
App::$strings["PHP upload limits"] = "PHP-Hochladebeschränkungen";
App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fehler: Die „openssl_pkey_new“-Funktion auf diesem System ist nicht in der Lage, Schlüssel für die Verschlüsselung zu erzeugen.";
App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Wenn Du Windows verwendest, findest Du unter http://www.php.net/manual/en/openssl.installation.php eine Installationsanleitung.";
@@ -942,17 +910,19 @@ App::$strings["Generate encryption keys"] = "Verschlüsselungsschlüssel erzeuge
App::$strings["libCurl PHP module"] = "libCurl-PHP-Modul";
App::$strings["GD graphics PHP module"] = "GD-Grafik-PHP-Modul";
App::$strings["OpenSSL PHP module"] = "OpenSSL-PHP-Modul";
-App::$strings["mysqli or postgres PHP module"] = "mysqli oder postgres PHP-Modul";
+App::$strings["PDO database PHP module"] = "PDO-Datenbank-PHP-Modul";
App::$strings["mb_string PHP module"] = "mb_string-PHP-Modul";
App::$strings["xml PHP module"] = "xml-PHP-Modul";
App::$strings["Apache mod_rewrite module"] = "Apache-mod_rewrite-Modul";
App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fehler: Das Apache-Modul mod-rewrite wird benötigt, ist aber nicht installiert.";
-App::$strings["proc_open"] = "proc_open";
-App::$strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "Fehler: proc_open wird benötigt, ist aber entweder nicht installiert oder wurde in der php.ini deaktiviert";
+App::$strings["exec"] = "exec";
+App::$strings["Error: exec is required but is either not installed or has been disabled in php.ini"] = "Fehler: exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert";
+App::$strings["shell_exec"] = "shell_exec";
+App::$strings["Error: shell_exec is required but is either not installed or has been disabled in php.ini"] = "Fehler: shell_exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert";
App::$strings["Error: libCURL PHP module required but not installed."] = "Fehler: Das PHP-Modul libCURL wird benötigt, ist aber nicht installiert.";
App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fehler: Das PHP-Modul GD-Grafik mit JPEG-Unterstützung wird benötigt, ist aber nicht installiert.";
App::$strings["Error: openssl PHP module required but not installed."] = "Fehler: Das PHP-Modul openssl wird benötigt, ist aber nicht installiert.";
-App::$strings["Error: mysqli or postgres PHP module required but neither are installed."] = "Fehler: Das mysqli oder postgres PHP-Modul ist erforderlich, aber keines von beiden ist installiert.";
+App::$strings["Error: PDO database PHP module required but not installed."] = "Fehler: PDO-Datenbank-PHP-Modul ist erforderlich, aber nicht installiert.";
App::$strings["Error: mb_string PHP module required but not installed."] = "Fehler: Das PHP-Modul mb_string wird benötigt, ist aber nicht installiert.";
App::$strings["Error: xml PHP module required for DAV but not installed."] = "Fehler: Das xml-PHP-Modul wird für DAV benötigt, ist aber nicht installiert.";
App::$strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "Der Installations-Assistent muss in der Lage sein, die Datei \".htconfig.php\" im Stammverzeichnis des Web-Servers anzulegen, ist er aber nicht.";
@@ -960,12 +930,12 @@ App::$strings["This is most often a permission setting, as the web server may no
App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "Am Schluss dieses Vorgangs wird ein Text generiert, den Du unter dem Dateinamen .htconfig.php im Stammverzeichnis Deiner Hubzilla-Installation speichern musst.";
App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Alternativ kannst Du diesen Schritt überspringen und die Installation manuell vornehmen. Lies dazu die Datei install/INSTALL.txt.";
App::$strings[".htconfig.php is writable"] = ".htconfig.php ist beschreibbar";
-App::$strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "\$Projectname verwendet Smarty3 um Vorlagen für die Webdarstellung zu übersetzen. Smarty3 übersetzt diese Vorlagen nach PHP, um die Darstellung zu beschleunigen.";
+App::$strings["This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Diese Software verwendet die Smarty3 Template Engine, um Vorlagen für die Webdarstellung zu verarbeiten. Smarty3 übersetzt diese Vorlagen nach PHP, um die Darstellung zu beschleunigen.";
App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "Um diese kompilierten Vorlagen speichern zu können, braucht der Web-Server Schreibzugriff auf das Verzeichnis %s unterhalb des Hubzilla-Stammverzeichnisses.";
App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Bitte stelle sicher, dass der Nutzer, unter dem der Web-Server läuft (z.B. www-data), Schreibzugriff auf dieses Verzeichnis hat.";
App::$strings["Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."] = "Hinweis: Aus Sicherheitsgründen sollte der Web-Server nur auf %s Schreibrechte haben, nicht auf die Template-Dateien (.tpl), die das Verzeichnis enthält.";
App::$strings["%s is writable"] = "%s ist beschreibbar";
-App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "Diese Software benutzt das Verzeichnis store, um hochgeladene Dateien zu speichern. Der Web-Server benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Hubzilla-Stammverzeichnisses";
+App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"] = "Diese Software benutzt das Verzeichnis store, um hochgeladene Dateien zu speichern. Der Webserver benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Web-Stammverzeichnisses.";
App::$strings["store is writable"] = "store ist schreibbar";
App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "Das SSL-Zertifikat konnte nicht validiert werden. Korrigiere das Zertifikat oder deaktiviere den HTTPS-Zugriff auf diesen Server.";
App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "Wenn Du via HTTPS auf Deinen Server zugreifen möchtest, also Verbindungen über den Port 443 möglich sein sollen, ist ein SSL-Zertifikat einer Zertifizierungsstelle (CA) notwendig, das von den Browsern ohne Sicherheitsabfrage akzeptiert wird. Die Verwendung eines selbst signierten Zertifikates ist nicht möglich.";
@@ -981,30 +951,92 @@ App::$strings["The database configuration file \".htconfig.php\" could not be wr
App::$strings["Errors encountered creating database tables."] = "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten.";
App::$strings["<h1>What next</h1>"] = "<h1>Was als Nächstes</h1>";
App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob für den Poller einrichten.";
+App::$strings["Item is not editable"] = "Element kann nicht bearbeitet werden.";
+App::$strings["This site is not a directory server"] = "Diese Webseite ist kein Verzeichnisserver";
+App::$strings["Create Channel"] = "Einen neuen Kanal anlegen";
+App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Ein Kanal ist Deine Identität in diesem Netzwerk. Er kann eine Person, ein Blog oder ein Forum repräsentieren, nur um ein paar Beispiele zu nennen. Kanäle können Verbindungen miteinander eingehen, um Informationen zu teilen, jeweils basierend auf sehr detaillierten Berechtigungseinstellungen.";
+App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Server.";
+App::$strings["Mark all system notifications seen"] = "Markiere alle System-Benachrichtigungen als gesehen";
+App::$strings["Poke"] = "Anstupsen";
+App::$strings["Poke somebody"] = "Jemanden anstupsen";
+App::$strings["Poke/Prod"] = "Anstupsen/Knuffen";
+App::$strings["Poke, prod or do other things to somebody"] = "Jemanden anstupsen, knuffen oder sonstiges";
+App::$strings["Recipient"] = "Empfänger";
+App::$strings["Choose what you wish to do to recipient"] = "Wähle, was Du mit dem/r Empfänger/in tun willst";
+App::$strings["Make this post private"] = "Diesen Beitrag privat machen";
+App::$strings["Profile not found."] = "Profil nicht gefunden.";
+App::$strings["Profile deleted."] = "Profil gelöscht.";
+App::$strings["Profile-"] = "Profil-";
+App::$strings["New profile created."] = "Neues Profil erstellt.";
+App::$strings["Profile unavailable to clone."] = "Profil kann nicht geklont werden.";
+App::$strings["Profile unavailable to export."] = "Dieses Profil kann nicht exportiert werden.";
+App::$strings["Profile Name is required."] = "Profil-Name erforderlich.";
+App::$strings["Marital Status"] = "Familienstand";
+App::$strings["Romantic Partner"] = "Romantische Partner";
+App::$strings["Likes"] = "Gefällt";
+App::$strings["Dislikes"] = "Gefällt nicht";
+App::$strings["Work/Employment"] = "Arbeit/Anstellung";
+App::$strings["Religion"] = "Religion";
+App::$strings["Political Views"] = "Politische Ansichten";
+App::$strings["Gender"] = "Geschlecht";
+App::$strings["Sexual Preference"] = "Sexuelle Orientierung";
+App::$strings["Homepage"] = "Webseite";
+App::$strings["Interests"] = "Hobbys/Interessen";
+App::$strings["Profile updated."] = "Profil aktualisiert.";
+App::$strings["Hide your connections list from viewers of this profile"] = "Deine Verbindungen vor Betrachtern dieses Profils verbergen";
+App::$strings["Edit Profile Details"] = "Bearbeite Profil-Details";
+App::$strings["View this profile"] = "Dieses Profil ansehen";
+App::$strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
+App::$strings["Profile Tools"] = "Profilwerkzeuge";
+App::$strings["Change cover photo"] = "Titelbild ändern";
+App::$strings["Change profile photo"] = "Profilfoto ändern";
+App::$strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen übernehmen";
+App::$strings["Clone this profile"] = "Dieses Profil klonen";
+App::$strings["Delete this profile"] = "Dieses Profil löschen";
+App::$strings["Add profile things"] = "Sachen zum Profil hinzufügen";
+App::$strings["Personal"] = "Persönlich";
+App::$strings["Relation"] = "Beziehung";
+App::$strings["Miscellaneous"] = "Verschiedenes";
+App::$strings["Import profile from file"] = "Profil aus einer Datei importieren";
+App::$strings["Export profile to file"] = "Profil in eine Datei exportieren";
+App::$strings["Your gender"] = "Dein Geschlecht";
+App::$strings["Marital status"] = "Familienstand";
+App::$strings["Sexual preference"] = "Sexuelle Orientierung";
+App::$strings["Profile name"] = "Profilname";
+App::$strings["This is your default profile."] = "Das ist Dein Standardprofil.";
+App::$strings["Your full name"] = "Dein voller Name";
+App::$strings["Title/Description"] = "Titel/Beschreibung";
+App::$strings["Street address"] = "Straße und Hausnummer";
+App::$strings["Locality/City"] = "Wohnort";
+App::$strings["Region/State"] = "Region/Bundesstaat";
+App::$strings["Postal/Zip code"] = "Postleitzahl";
+App::$strings["Country"] = "Land";
+App::$strings["Who (if applicable)"] = "Wer (falls anwendbar)";
+App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Beispiele: cathy123, Cathy Williams, cathy@example.com";
+App::$strings["Since (date)"] = "Seit (Datum)";
+App::$strings["Tell us about yourself"] = "Erzähle uns ein wenig von Dir";
+App::$strings["Homepage URL"] = "Homepage-URL";
+App::$strings["Hometown"] = "Heimatort";
+App::$strings["Political views"] = "Politische Ansichten";
+App::$strings["Religious views"] = "Religiöse Ansichten";
+App::$strings["Keywords used in directory listings"] = "Schlüsselwörter, die in Verzeichnis-Auflistungen verwendet werden";
+App::$strings["Example: fishing photography software"] = "Beispiel: Angeln Fotografie Software";
+App::$strings["Musical interests"] = "Musikalische Interessen";
+App::$strings["Books, literature"] = "Bücher, Literatur";
+App::$strings["Television"] = "Fernsehen";
+App::$strings["Film/Dance/Culture/Entertainment"] = "Film/Tanz/Kultur/Unterhaltung";
+App::$strings["Hobbies/Interests"] = "Hobbys/Interessen";
+App::$strings["Love/Romance"] = "Liebe/Romantik";
+App::$strings["School/Education"] = "Schule/Ausbildung";
+App::$strings["Contact information and social networks"] = "Kontaktinformation und soziale Netzwerke";
+App::$strings["My other channels"] = "Meine anderen Kanäle";
+App::$strings["Profile Image"] = "Profilfoto:";
+App::$strings["Edit Profiles"] = "Profile bearbeiten";
App::$strings["Unable to find your hub."] = "Konnte Deinen Server nicht finden.";
App::$strings["Post successful."] = "Veröffentlichung erfolgreich.";
-App::$strings["Invalid profile identifier."] = "Ungültiger Profil-Identifikator";
-App::$strings["Profile Visibility Editor"] = "Profil-Sichtbarkeits-Editor";
-App::$strings["Profile"] = "Profil";
-App::$strings["Click on a contact to add or remove."] = "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen.";
-App::$strings["Visible To"] = "Sichtbar für";
App::$strings["This setting requires special processing and editing has been blocked."] = "Diese Einstellung erfordert eine besondere Verarbeitung und ist blockiert.";
App::$strings["Configuration Editor"] = "Konfigurationseditor";
App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Warnung: Einige Einstellungen können Deinen Kanal funktionsunfähig machen. Bitte verlasse diese Seite, es sei denn Du bist vertraut damit, wie dieses Feature korrekt verwendet wird.";
-App::$strings["Apps"] = "Apps";
-App::$strings["Version %s"] = "Version %s";
-App::$strings["Installed plugins/addons/apps:"] = "Installierte Plugins/Addons/Apps";
-App::$strings["No installed plugins/addons/apps"] = "Keine installierten Plugins/Addons/Apps";
-App::$strings["This is a hub of \$Projectname - a global cooperative network of decentralized privacy enhanced websites."] = "Dieser Hub ist Teil von \$Projectname – ein globales, kooperatives Netzwerk aus dezentralen Websites, die Rücksicht auf Deine Privatsphäre nehmen.";
-App::$strings["Tag: "] = "Schlagwort: ";
-App::$strings["Last background fetch: "] = "Letzter Hintergrundabruf:";
-App::$strings["Current load average: "] = "Aktuelles Load Average:";
-App::$strings["Running at web location"] = "Erreichbar unter der Web-Adresse";
-App::$strings["Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more about \$Projectname."] = "Bitte besuchen Sie <a href=\"http://hubzilla.org\">hubzilla.org</a>, um mehr über \$Projectname zu erfahren.";
-App::$strings["Bug reports and issues: please visit"] = "Probleme oder Fehler gefunden? Bitte besuche";
-App::$strings["\$projectname issues"] = "\$projectname-Bugtracker";
-App::$strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "Vorschläge, Lob, usw.: E-Mail an 'redmatrix' at librelist - dot - com";
-App::$strings["Site Administrators"] = "Administratoren";
App::$strings["Blocks"] = "Blöcke";
App::$strings["Block Title"] = "Titel des Blocks";
App::$strings["Layouts"] = "Layouts";
@@ -1012,99 +1044,79 @@ App::$strings["Help"] = "Hilfe";
App::$strings["Comanche page description language help"] = "Hilfe zur Comanche-Seitenbeschreibungssprache";
App::$strings["Layout Description"] = "Layout-Beschreibung";
App::$strings["Download PDL file"] = "PDL-Datei herunterladen";
-App::$strings["Profile Photos"] = "Profilfotos";
+App::$strings["Website:"] = "Webseite:";
+App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Kanal [%s] (auf diesem Server noch unbekannt)";
+App::$strings["Rating (this information is public)"] = "Bewertung (öffentlich sichtbar)";
+App::$strings["Optionally explain your rating (this information is public)"] = "Optional kannst du deine Bewertung erklären (öffentlich sichtbar)";
+App::$strings["Like/Dislike"] = "Mögen/Nicht mögen";
+App::$strings["This action is restricted to members."] = "Diese Aktion kann nur von Mitgliedern ausgeführt werden.";
+App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Um fortzufahren <a href=\"rmagic\">melde Dich bitte mit Deiner \$Projectname-ID an</a> oder <a href=\"register\">registriere Dich als neues \$Projectname-Mitglied</a>.";
+App::$strings["Invalid request."] = "Ungültige Anfrage.";
+App::$strings["channel"] = "Kanal";
+App::$strings["thing"] = "Sache";
+App::$strings["Channel unavailable."] = "Kanal nicht vorhanden.";
+App::$strings["Previous action reversed."] = "Die vorherige Aktion wurde rückgängig gemacht.";
+App::$strings["photo"] = "Foto";
+App::$strings["status"] = "Status";
+App::$strings["event"] = "Termin";
+App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s";
+App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s nicht";
+App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s stimmt %2\$ss %3\$s zu";
+App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s lehnt %2\$ss %3\$s ab";
+App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s enthält sich zu %2\$ss %3\$s";
+App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s teil";
+App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s nicht teil";
+App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s nimmt vielleicht an %2\$ss %3\$s teil";
+App::$strings["Action completed."] = "Aktion durchgeführt.";
+App::$strings["Thank you."] = "Vielen Dank.";
App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Leere den Browser Cache oder nutze Umschalten-Neu Laden, falls das neue Foto nicht sofort angezeigt wird.";
+App::$strings["Use Photo for Profile"] = "Foto für Profil verwenden";
App::$strings["Upload Profile Photo"] = "Lade neues Profilfoto hoch";
-App::$strings["Permissions denied."] = "Berechtigung verweigert.";
-App::$strings["Import"] = "Import";
+App::$strings["Use"] = "Verwenden";
+App::$strings["Items tagged with: %s"] = "Beiträge mit Schlagwort: %s";
+App::$strings["Search results for: %s"] = "Suchergebnisse für: %s";
App::$strings["No channel."] = "Kein Kanal.";
App::$strings["Common connections"] = "Gemeinsame Verbindungen";
App::$strings["No connections in common."] = "Keine gemeinsamen Verbindungen.";
-App::$strings["network"] = "Netzwerk";
-App::$strings["RSS"] = "RSS";
-App::$strings["Public Hubs"] = "Öffentliche Hubs";
-App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Die hier aufgeführten Hubs sind öffentlich und erlauben die Registrierung im \$Projectname Netzwerk. Alle Hubs dieses Netzwerks sind miteinander verbunden, so dass die Mitgliedschaft auf einem Hub die Verbindung zu beliebigen Seiten und Kanälen auf anderen Hubs ermöglicht. Es könnte sein, dass einige dieser Hubs kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den Seiten der einzelnen Hubs <strong>könnten</strong> jeweils nähere Informationen dazu stehen.";
-App::$strings["Hub URL"] = "Hub-URL";
-App::$strings["Access Type"] = "Zugriffstyp";
-App::$strings["Registration Policy"] = "Registrierungsrichtlinien";
-App::$strings["Stats"] = "Statistiken";
-App::$strings["Software"] = "Software";
-App::$strings["Rate"] = "Bewerten";
-App::$strings["Layout updated."] = "Layout aktualisiert.";
-App::$strings["Feature disabled."] = "Funktion deaktiviert.";
-App::$strings["Edit System Page Description"] = "Systemseitenbeschreibung bearbeiten";
-App::$strings["Layout not found."] = "Layout nicht gefunden.";
-App::$strings["Module Name:"] = "Modulname:";
-App::$strings["Layout Help"] = "Layout-Hilfe";
-App::$strings["Could not access contact record."] = "Konnte nicht auf den Kontakteintrag zugreifen.";
-App::$strings["Could not locate selected profile."] = "Gewähltes Profil nicht gefunden.";
-App::$strings["Connection updated."] = "Verbindung aktualisiert.";
-App::$strings["Failed to update connection record."] = "Konnte den Verbindungseintrag nicht aktualisieren.";
-App::$strings["is now connected to"] = "ist jetzt verbunden mit";
-App::$strings["Could not access address book record."] = "Konnte nicht auf den Adressbuch-Eintrag zugreifen.";
-App::$strings["Refresh failed - channel is currently unavailable."] = "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar.";
-App::$strings["Unable to set address book parameters."] = "Konnte die Adressbuch-Parameter nicht setzen.";
-App::$strings["Connection has been removed."] = "Verbindung wurde gelöscht.";
-App::$strings["View Profile"] = "Profil ansehen";
-App::$strings["View %s's profile"] = "%ss Profil ansehen";
-App::$strings["Refresh Permissions"] = "Zugriffsrechte neu laden";
-App::$strings["Fetch updated permissions"] = "Aktualisierte Zugriffsrechte abfragen";
-App::$strings["Recent Activity"] = "Kürzliche Aktivitäten";
-App::$strings["View recent posts and comments"] = "Betrachte die neuesten Beiträge und Kommentare";
-App::$strings["Block (or Unblock) all communications with this connection"] = "Jegliche Kommunikation mit dieser Verbindung blockieren/zulassen";
-App::$strings["This connection is blocked!"] = "Die Verbindung ist geblockt!";
-App::$strings["Unignore"] = "Nicht ignorieren";
-App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Jegliche eingehende Kommunikation von dieser Verbindung ignorieren/zulassen";
-App::$strings["This connection is ignored!"] = "Die Verbindung wird ignoriert!";
-App::$strings["Unarchive"] = "Aus Archiv zurückholen";
-App::$strings["Archive"] = "Archivieren";
-App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Verbindung archivieren/aus dem Archiv zurückholen (Archiv = Kanal als erloschen markieren, aber die Beiträge behalten)";
-App::$strings["This connection is archived!"] = "Die Verbindung ist archiviert!";
-App::$strings["Unhide"] = "Wieder sichtbar machen";
-App::$strings["Hide"] = "Verstecken";
-App::$strings["Hide or Unhide this connection from your other connections"] = "Diese Verbindung vor anderen Verbindungen verstecken/zeigen";
-App::$strings["This connection is hidden!"] = "Die Verbindung ist versteckt!";
-App::$strings["Delete this connection"] = "Verbindung löschen";
-App::$strings["Me"] = "Ich";
-App::$strings["Family"] = "Familie";
-App::$strings["Friends"] = "Freunde";
-App::$strings["Acquaintances"] = "Bekannte";
-App::$strings["Approve this connection"] = "Verbindung genehmigen";
-App::$strings["Accept connection to allow communication"] = "Akzeptiere die Verbindung, um Kommunikation zu ermöglichen";
-App::$strings["Set Affinity"] = "Beziehung festlegen";
-App::$strings["Set Profile"] = "Profil festlegen";
-App::$strings["Set Affinity & Profile"] = "Beziehung und Profile festlegen";
-App::$strings["none"] = "Keine";
-App::$strings["Connection Default Permissions"] = "Standardzugriffsrechte für neue Verbindungen:";
-App::$strings["Connection: %s"] = "Verbindung: %s";
-App::$strings["Apply these permissions automatically"] = "Diese Berechtigungen automatisch anwenden";
-App::$strings["Connection requests will be approved without your interaction"] = "Verbindungsanfragen werden sofort bestätigt, ohne dass Deine aktive Zustimmung erforderlich ist.";
-App::$strings["This connection's primary address is"] = "Die Hauptadresse der Verbindung ist";
-App::$strings["Available locations:"] = "Verfügbare Klone:";
-App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Die auf dieser Seite angegebenen Berechtigungen werden auf alle neuen Verbindungen angewendet.";
-App::$strings["Connection Tools"] = "Verbindungswerkzeuge";
-App::$strings["Slide to adjust your degree of friendship"] = "Verschieben, um den Grad der Freundschaft zu einzustellen";
-App::$strings["Slide to adjust your rating"] = "Verschieben, um Deine Bewertung einzustellen";
-App::$strings["Optionally explain your rating"] = "Optional kannst Du Deine Bewertung begründen";
-App::$strings["Custom Filter"] = "Benutzerdefinierter Filter";
-App::$strings["Only import posts with this text"] = "Nur Beiträge mit diesem Text importieren";
-App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "Einzelne Wörter pro Zeile, #Tags oder /Reguläre Ausdrücke/. lang=xx (z.B. lang=de) ermöglicht Filterung nach Sprache. Leer lassen, um alle Beiträge zu importieren.";
-App::$strings["Do not import posts with this text"] = "Beiträge mit diesem Text nicht importieren";
-App::$strings["This information is public!"] = "Diese Information ist öffentlich!";
-App::$strings["Connection Pending Approval"] = "Verbindung wartet auf Bestätigung";
-App::$strings["inherited"] = "geerbt";
-App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle ein Profil, das wir %s zeigen sollen, wenn Deine Profilseite über eine verifizierte Verbindung aufgerufen wird.";
-App::$strings["Their Settings"] = "Deren Einstellungen";
-App::$strings["My Settings"] = "Meine Einstellungen";
-App::$strings["Individual Permissions"] = "Individuelle Zugriffsrechte";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals vererbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung und können hier nicht verändert werden.";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen.";
-App::$strings["Last update:"] = "Letzte Aktualisierung:";
+App::$strings["Authorize application connection"] = "Zugriff für die Anwendung autorisieren";
+App::$strings["Return to your app and insert this Security Code:"] = "Gehen Sie zu Ihrer App zurück und tragen Sie diesen Sicherheitscode ein:";
+App::$strings["Please login to continue."] = "Zum Weitermachen, bitte einloggen.";
+App::$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 erlauben, Deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für Dich zu erstellen?";
+App::$strings["sent you a private message"] = "hat Dir eine private Nachricht geschickt";
+App::$strings["added your channel"] = "hat deinen Kanal hinzugefügt";
+App::$strings["g A l F d"] = "l, d. F, G:i \\U\\h\\r";
+App::$strings["[today]"] = "[Heute]";
+App::$strings["posted an event"] = "hat einen Termin veröffentlicht";
+App::$strings["About this site"] = "Über diese Seite";
+App::$strings["Site Name"] = "Seitenname";
+App::$strings["Administrator"] = "Administrator";
+App::$strings["Software and Project information"] = "Software und Projektinformationen";
+App::$strings["This site is powered by \$Projectname"] = "Diese Website wird bereitgestellt durch \$Projectname";
+App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Verbundene, dezentrale Netzwerk- und Identitätsdienste, ermöglicht mittels Zot";
+App::$strings["Version %s"] = "Version %s";
+App::$strings["Project homepage"] = "Projekt-Website";
+App::$strings["Developer homepage"] = "Entwickler-Website";
+App::$strings["No valid account found."] = "Kein gültiges Konto gefunden.";
+App::$strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Schau in Deine E-Mails.";
+App::$strings["Site Member (%s)"] = "Nutzer (%s)";
+App::$strings["Password reset requested at %s"] = "Passwort-Rücksetzung auf %s angefordert";
+App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Die Anfrage konnte nicht verifiziert werden. (Vielleicht hast Du schon einmal auf den Link in der E-Mail geklickt?) Passwort-Rücksetzung fehlgeschlagen.";
+App::$strings["Password Reset"] = "Zurücksetzen des Kennworts";
+App::$strings["Your password has been reset as requested."] = "Dein Passwort wurde wie angefordert neu erstellt.";
+App::$strings["Your new password is"] = "Dein neues Passwort lautet";
+App::$strings["Save or copy your new password - and then"] = "Speichere oder kopiere Dein neues Passwort – und dann";
+App::$strings["click here to login"] = "Klicke hier, um dich anzumelden";
+App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Dein Passwort kann unter <em>Einstellungen</em> nach einer erfolgreichen Anmeldung geändert werden.";
+App::$strings["Your password has changed at %s"] = "Auf %s wurde Dein Passwort geändert";
+App::$strings["Forgot your Password?"] = "Kennwort vergessen?";
+App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib Deine E-Mail-Adresse ein, um Dein Passwort zurücksetzen zu lassen. Du erhältst dann weitere Anweisungen per E-Mail.";
+App::$strings["Email Address"] = "E-Mail Adresse";
+App::$strings["Reset"] = "Zurücksetzen";
App::$strings["Select a bookmark folder"] = "Lesezeichenordner wählen";
App::$strings["Save Bookmark"] = "Lesezeichen speichern";
App::$strings["URL of bookmark"] = "URL des Lesezeichens";
App::$strings["Or enter new bookmark folder name"] = "Oder gib einen neuen Namen für den Lesezeichenordner ein";
-App::$strings["This site is not a directory server"] = "Diese Webseite ist kein Verzeichnisserver";
+App::$strings["This directory server requires an access token"] = "Dieser Verzeichnisserver benötigt einen Zugriffstoken";
App::$strings["Authentication failed."] = "Authentifizierung fehlgeschlagen.";
App::$strings["Remote Authentication"] = "Entfernte Authentifizierung";
App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Deine Kanal-Adresse (z. B. channel@example.com)";
@@ -1119,12 +1131,12 @@ App::$strings["Please enter your password for verification:"] = "Bitte gib zur B
App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Dieses Konto, all seine Kanäle sowie alle Kanal-Klone aus dem Netzwerk löschen";
App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "Standardmäßig werden nur die Kanalklone auf diesem \$Projectname-Hub aus dem Netzwerk entfernt";
App::$strings["Remove Account"] = "Konto entfernen";
-App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Innerhalb von 48 Stunden nach einer Änderung des Passworts können keine Kanäle gelöscht werden.";
-App::$strings["Remove This Channel"] = "Diesen Kanal löschen";
-App::$strings["This channel will be completely removed from the network. "] = "Dieser Kanal wird vollständig aus dem Netzwerk gelöscht.";
-App::$strings["Remove this channel and all its clones from the network"] = "Lösche diesen Kanal und all seine Klone aus dem Netzwerk";
-App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Standardmäßig wird der Kanal nur auf diesem Server gelöscht, seine Klone verbleiben im Netzwerk";
-App::$strings["Remove Channel"] = "Kanal löschen";
+App::$strings["Layout updated."] = "Layout aktualisiert.";
+App::$strings["Feature disabled."] = "Funktion deaktiviert.";
+App::$strings["Edit System Page Description"] = "Systemseitenbeschreibung bearbeiten";
+App::$strings["Layout not found."] = "Layout nicht gefunden.";
+App::$strings["Module Name:"] = "Modulname:";
+App::$strings["Layout Help"] = "Layout-Hilfe";
App::$strings["Export Channel"] = "Kanal exportieren";
App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exportiert die grundlegenden Kanal-Informationen in eine kleine Datei. Diese stellt eine Sicherung Deiner Verbindungen, Berechtigungen, Profile und Basisdaten bereit, die für den Import auf einem anderen Hub verwendet werden kann, aber nicht die Beiträge Deines Kanals enthält.";
App::$strings["Export Content"] = "Kanal und Inhalte exportieren";
@@ -1134,42 +1146,75 @@ App::$strings["You may also export your posts and conversations for a particular
App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Um alle Beiträge eines bestimmten Jahres, zum Beispiel dieses Jahres, auszuwählen, klicke <a href=\"%1\$s\">%2\$s</a>.";
App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Um alle Beiträge eines bestimmten Monats auszuwählen, zum Beispiel vom Januar diesen Jahres, klicke <a href=\"%1\$s\">%2\$s</a>.";
App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Diese Inhalts-Sicherungen können wiederhergestellt werden, indem Du <a href=\"%1\$s\">%2\$s</a> auf jeglichem Hub besuchst, der diesen Kanal enthält. Das funktioniert am besten, wenn Du dabei die zeitliche Reihenfolge einhältst, also die Sicherungen für den ältesten Zeitraum zuerst importierst.";
-App::$strings["Item is not editable"] = "Element kann nicht bearbeitet werden.";
-App::$strings["Items tagged with: %s"] = "Beiträge mit Schlagwort: %s";
-App::$strings["Search results for: %s"] = "Suchergebnisse für: %s";
-App::$strings["You must be logged in to see this page."] = "Du musst angemeldet sein, um diese Seite betrachten zu können.";
-App::$strings["Posts and comments"] = "Beiträge und Kommentare";
-App::$strings["Only posts"] = "Nur Beiträge";
-App::$strings["Insufficient permissions. Request redirected to profile page."] = "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet.";
+App::$strings["Permissions denied."] = "Berechtigung verweigert.";
+App::$strings["l, F j"] = "l, j. F";
+App::$strings["Link to Source"] = "Link zur Quelle";
+App::$strings["Edit Event"] = "Termin bearbeiten";
+App::$strings["Create Event"] = "Termin anlegen";
+App::$strings["Export"] = "Exportieren";
+App::$strings["Import"] = "Import";
+App::$strings["Today"] = "Heute";
+App::$strings["# Accounts"] = "Anzahl der Konten";
+App::$strings["# blocked accounts"] = "Anzahl der blockierten Konten";
+App::$strings["# expired accounts"] = "Anzahl der abgelaufenen Konten";
+App::$strings["# expiring accounts"] = "Anzahl der ablaufenden Konten";
+App::$strings["# Channels"] = "Anzahl der Kanäle";
+App::$strings["# primary"] = "Anzahl der primären Kanäle";
+App::$strings["# clones"] = "Anzahl der Klone";
+App::$strings["Message queues"] = "Nachrichten-Warteschlangen";
+App::$strings["Your software should be updated"] = "Die installierte Software sollte aktualisiert werden";
+App::$strings["Summary"] = "Zusammenfassung";
+App::$strings["Registered accounts"] = "Registrierte Konten";
+App::$strings["Pending registrations"] = "Ausstehende Registrierungen";
+App::$strings["Registered channels"] = "Registrierte Kanäle";
+App::$strings["Active plugins"] = "Aktive Plug-Ins";
+App::$strings["Version"] = "Version";
+App::$strings["Repository version (master)"] = "Repository-Version (master)";
+App::$strings["Repository version (dev)"] = "Repository-Version (dev)";
+App::$strings["Remote privacy information not available."] = "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar.";
+App::$strings["Visible to:"] = "Sichtbar für:";
App::$strings["No service class restrictions found."] = "Keine Dienstklassenbeschränkungen gefunden.";
-App::$strings["Thing updated"] = "Sache aktualisiert";
-App::$strings["Object store: failed"] = "Speichern des Objekts fehlgeschlagen";
-App::$strings["Thing added"] = "Sache hinzugefügt";
-App::$strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
-App::$strings["Show Thing"] = "Sache anzeigen";
-App::$strings["item not found."] = "Eintrag nicht gefunden";
-App::$strings["Edit Thing"] = "Sache bearbeiten";
-App::$strings["Select a profile"] = "Wähle ein Profil";
-App::$strings["Post an activity"] = "Aktivitätsnachricht senden";
-App::$strings["Only sends to viewers of the applicable profile"] = "Nur an Betrachter des ausgewählten Profils senden";
-App::$strings["Name of thing e.g. something"] = "Name der Sache, z. B. irgendwas";
-App::$strings["URL of thing (optional)"] = "URL der Sache (optional)";
-App::$strings["URL for photo of thing (optional)"] = "URL eines Fotos der Sache (optional)";
-App::$strings["Add Thing to your Profile"] = "Die Sache Deinem Profil hinzufügen";
-App::$strings["This directory server requires an access token"] = "Dieser Verzeichnisserver benötigt einen Zugriffstoken";
+App::$strings["Import Webpage Elements"] = "Webseitenelemente importieren";
+App::$strings["Import selected"] = "Import ausgewählt";
+App::$strings["Export Webpage Elements"] = "Webseitenelemente exportieren";
+App::$strings["Export selected"] = "Exportieren ausgewählt";
+App::$strings["Webpages"] = "Webseiten";
+App::$strings["Actions"] = "Aktionen";
+App::$strings["Page Link"] = "Seiten-Link";
+App::$strings["Page Title"] = "Seitentitel";
+App::$strings["Invalid file type."] = "Ungültiger Dateityp.";
+App::$strings["Error opening zip file"] = "Fehler beim Öffnen der ZIP-Datei";
+App::$strings["Invalid folder path."] = "Ungültiger Ordnerpfad.";
+App::$strings["No webpage elements detected."] = "Keine Webseitenelemente erkannt.";
+App::$strings["Import complete."] = "Import abgeschlossen.";
+App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Innerhalb von 48 Stunden nach einer Änderung des Passworts können keine Kanäle gelöscht werden.";
+App::$strings["Remove This Channel"] = "Diesen Kanal löschen";
+App::$strings["This channel will be completely removed from the network. "] = "Dieser Kanal wird vollständig aus dem Netzwerk gelöscht.";
+App::$strings["Remove this channel and all its clones from the network"] = "Lösche diesen Kanal und all seine Klone aus dem Netzwerk";
+App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Standardmäßig wird der Kanal nur auf diesem Server gelöscht, seine Klone verbleiben im Netzwerk";
+App::$strings["Remove Channel"] = "Kanal löschen";
App::$strings["Files: shared with me"] = "Dateien, die mit mir geteilt wurden";
App::$strings["NEW"] = "NEU";
App::$strings["Remove all files"] = "Alle Dateien löschen";
App::$strings["Remove this file"] = "Diese Datei löschen";
App::$strings["Not found"] = "Nicht gefunden";
-App::$strings["Wiki"] = "Wiki";
-App::$strings["Sandbox"] = "Sandbox";
-App::$strings["\"# Wiki Sandbox\\n\\nContent you **edit** and **preview** here *will not be saved*.\""] = "\"# Wiki Sandkasten\\n\\nInhalte, die Du hier **veränderst** und **als Vorschau anzeigst**, *werden nicht gespeichert*.\"";
+App::$strings["Invalid channel"] = "Ungültiger Kanal";
+App::$strings["Error retrieving wiki"] = "Fehler beim Abrufen des Wiki";
+App::$strings["Error creating zip file export folder"] = "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses ";
+App::$strings["Error downloading wiki: "] = "Fehler beim Herunterladen des Wiki:";
+App::$strings["Wikis"] = "Wikis";
+App::$strings["Download"] = "Herunterladen";
+App::$strings["Wiki name"] = "Name des Wiki";
+App::$strings["Content type"] = "Inhaltstyp";
+App::$strings["Create a status post for this wiki"] = "Erzeuge einen Statusbeitrag für dieses Wiki";
+App::$strings["Wiki not found"] = "Wiki nicht gefunden";
+App::$strings["Rename page"] = "Seite umbenennen";
+App::$strings["Error retrieving page content"] = "Fehler beim Abrufen des Seiteninhalts";
App::$strings["Revision Comparison"] = "Revisionsvergleich";
App::$strings["Revert"] = "Rückgängig machen";
-App::$strings["Enter the name of your new wiki:"] = "Gib einen Namen für Dein neues Wiki ein:";
-App::$strings["Enter the name of the new page:"] = "Geben Sie den Namen der neuen Seite ein:";
-App::$strings["Enter the new name:"] = "Geben Sie den neuen Namen ein:";
+App::$strings["Choose an available wiki from the list on the left."] = "Wähle ein vorhandenes Wiki aus der Liste auf der linken Seite aus.";
+App::$strings["Source"] = "Quelle";
+App::$strings["New page name"] = "Neuer Seitenname";
App::$strings["Embed image from photo albums"] = "Bild aus Fotoalben einbetten";
App::$strings["Embed an image from your albums"] = "Betten Sie ein Bild aus Ihren Alben ein";
App::$strings["OK"] = "Ok";
@@ -1179,6 +1224,10 @@ App::$strings["Choose a different album..."] = "Wählen Sie ein anderes Album au
App::$strings["Error getting album list"] = "Fehler beim Holen der Albenliste";
App::$strings["Error getting photo link"] = "Fehler beim Holen des Fotolinks";
App::$strings["Error getting album"] = "Fehler beim Holen des Albums";
+App::$strings["Error creating wiki. Invalid name."] = "Fehler beim Erstellen des Wiki. Ungültiger Name.";
+App::$strings["Wiki created, but error creating Home page."] = "Das Wiki wurde erzeugt, aber es gab einen Fehler bei der Erstellung der Startseite";
+App::$strings["Error creating wiki"] = "Fehler beim Erstellen des Wiki";
+App::$strings["New page created"] = "Neue Seite erstellt";
App::$strings["Failed to create source. No channel selected."] = "Konnte die Quelle nicht anlegen. Kein Kanal ausgewählt.";
App::$strings["Source created."] = "Quelle erstellt.";
App::$strings["Source updated."] = "Quelle aktualisiert.";
@@ -1204,113 +1253,31 @@ App::$strings["Ignore/Hide"] = "Ignorieren/Verstecken";
App::$strings["post"] = "Beitrag";
App::$strings["comment"] = "Kommentar";
App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s hat %2\$ss %3\$s mit %4\$s verschlagwortet";
-App::$strings["Tag removed"] = "Schlagwort entfernt";
-App::$strings["Remove Item Tag"] = "Schlagwort entfernen";
-App::$strings["Select a tag to remove: "] = "Schlagwort zum Entfernen auswählen:";
-App::$strings["Page owner information could not be retrieved."] = "Informationen über den Besitzer der Seite konnten nicht gefunden werden.";
-App::$strings["Album not found."] = "Album nicht gefunden.";
-App::$strings["Delete Album"] = "Album löschen";
-App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Mehrere Speicherordner mit diesem Albumnamen sind bereits vorhanden, aber in verschiedenen Verzeichnissen. Bitte entfernen Sie den oder die gewünschten Ordner mit dem Dateimanager";
-App::$strings["Delete Photo"] = "Foto löschen";
-App::$strings["No photos selected"] = "Keine Fotos ausgewählt";
-App::$strings["Access to this item is restricted."] = "Der Zugriff auf dieses Foto ist eingeschränkt.";
-App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB von %2$.2f MB Foto-Speicher belegt.";
-App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB Foto-Speicher belegt.";
-App::$strings["Upload Photos"] = "Fotos hochladen";
-App::$strings["Enter an album name"] = "Namen für ein neues Album eingeben";
-App::$strings["or select an existing album (doubleclick)"] = "oder ein bereits vorhandenes auswählen (Doppelklick)";
-App::$strings["Create a status post for this upload"] = "Einen Statusbeitrag für diesen Upload erzeugen";
-App::$strings["Caption (optional):"] = "Beschriftung (optional):";
-App::$strings["Description (optional):"] = "Beschreibung (optional):";
-App::$strings["Album name could not be decoded"] = "Albumname konnte nicht dekodiert werden";
-App::$strings["Contact Photos"] = "Kontakt-Bilder";
-App::$strings["Show Newest First"] = "Neueste zuerst anzeigen";
-App::$strings["Show Oldest First"] = "Älteste zuerst anzeigen";
-App::$strings["View Photo"] = "Foto ansehen";
-App::$strings["Edit Album"] = "Album bearbeiten";
-App::$strings["Permission denied. Access to this item may be restricted."] = "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden.";
-App::$strings["Photo not available"] = "Foto nicht verfügbar";
-App::$strings["Use as profile photo"] = "Als Profilfoto verwenden";
-App::$strings["Use as cover photo"] = "Als Titelbild verwenden";
-App::$strings["Private Photo"] = "Privates Foto";
-App::$strings["View Full Size"] = "In voller Größe anzeigen";
-App::$strings["Edit photo"] = "Foto bearbeiten";
-App::$strings["Rotate CW (right)"] = "Drehen im UZS (rechts)";
-App::$strings["Rotate CCW (left)"] = "Drehen gegen UZS (links)";
-App::$strings["Move photo to album"] = "Foto in Album verschieben";
-App::$strings["Enter a new album name"] = "Gib einen Namen für ein neues Album ein";
-App::$strings["or select an existing one (doubleclick)"] = "oder wähle ein bereits vorhandenes aus (Doppelklick)";
-App::$strings["Caption"] = "Bildunterschrift";
-App::$strings["Add a Tag"] = "Schlagwort hinzufügen";
-App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Beispiele: @ben, @Karl_Prester, @lieschen@example.com";
-App::$strings["Flag as adult in album view"] = "In der Albumansicht als nicht jugendfrei markieren";
-App::$strings["I like this (toggle)"] = "Mir gefällt das (Umschalter)";
-App::$strings["I don't like this (toggle)"] = "Mir gefällt das nicht (Umschalter)";
-App::$strings["Please wait"] = "Bitte warten";
-App::$strings["This is you"] = "Das bist Du";
-App::$strings["Comment"] = "Kommentar";
-App::$strings["__ctx:title__ Likes"] = "Gefällt mir";
-App::$strings["__ctx:title__ Dislikes"] = "Gefällt mir nicht";
-App::$strings["__ctx:title__ Agree"] = "Zustimmungen";
-App::$strings["__ctx:title__ Disagree"] = "Ablehnungen";
-App::$strings["__ctx:title__ Abstain"] = "Enthaltungen";
-App::$strings["__ctx:title__ Attending"] = "Zusagen";
-App::$strings["__ctx:title__ Not attending"] = "Absagen";
-App::$strings["__ctx:title__ Might attend"] = "Vielleicht";
-App::$strings["View all"] = "Alles anzeigen";
-App::$strings["__ctx:noun__ Like"] = array(
- 0 => "Gefällt mir",
- 1 => "Gefällt mir",
-);
-App::$strings["__ctx:noun__ Dislike"] = array(
- 0 => "Gefällt nicht",
- 1 => "Gefällt nicht",
-);
-App::$strings["Photo Tools"] = "Fotowerkzeuge";
-App::$strings["In This Photo:"] = "Auf diesem Foto:";
-App::$strings["Map"] = "Karte";
-App::$strings["__ctx:noun__ Likes"] = "Gefällt mir";
-App::$strings["__ctx:noun__ Dislikes"] = "Gefällt nicht";
-App::$strings["Close"] = "Schließen";
-App::$strings["View Album"] = "Album ansehen";
-App::$strings["Recent Photos"] = "Neueste Fotos";
-App::$strings["Channel added."] = "Kanal hinzugefügt.";
-App::$strings["No connections."] = "Keine Verbindungen.";
-App::$strings["Visit %s's profile [%s]"] = "%ss Profil [%s] besuchen";
-App::$strings["View Connections"] = "Verbindungen anzeigen";
-App::$strings["Source of Item"] = "Quelle des Elements";
-App::$strings["Room not found"] = "Chatraum nicht gefunden";
-App::$strings["Leave Room"] = "Raum verlassen";
-App::$strings["Delete Room"] = "Raum löschen";
-App::$strings["I am away right now"] = "Ich bin gerade nicht da";
-App::$strings["I am online"] = "Ich bin online";
-App::$strings["Bookmark this room"] = "Lesezeichen für diesen Raum setzen";
-App::$strings["New Chatroom"] = "Neuer Chatraum";
-App::$strings["Chatroom name"] = "Chatraumname";
-App::$strings["Expiration of chats (minutes)"] = "Verfall von Chats (Minuten)";
-App::$strings["%1\$s's Chatrooms"] = "%1\$ss Chaträume";
-App::$strings["No chatrooms available"] = "Keine Chaträume verfügbar";
-App::$strings["Expiration"] = "Verfall";
-App::$strings["min"] = "min";
-App::$strings["Xchan Lookup"] = "Xchan-Suche";
-App::$strings["Lookup xchan beginning with (or webbie): "] = "Nach xchans oder Webbies (Kanal-Adressen) suchen, die wie folgt beginnen:";
-App::$strings["# Accounts"] = "Anzahl der Konten";
-App::$strings["# blocked accounts"] = "Anzahl der blockierten Konten";
-App::$strings["# expired accounts"] = "Anzahl der abgelaufenen Konten";
-App::$strings["# expiring accounts"] = "Anzahl der ablaufenden Konten";
-App::$strings["# Channels"] = "Anzahl der Kanäle";
-App::$strings["# primary"] = "Anzahl der primären Kanäle";
-App::$strings["# clones"] = "Anzahl der Klone";
-App::$strings["Message queues"] = "Nachrichten-Warteschlangen";
-App::$strings["Your software should be updated"] = "Die installierte Software sollte aktualisiert werden";
-App::$strings["Summary"] = "Zusammenfassung";
-App::$strings["Registered accounts"] = "Registrierte Konten";
-App::$strings["Pending registrations"] = "Ausstehende Registrierungen";
-App::$strings["Registered channels"] = "Registrierte Kanäle";
-App::$strings["Active plugins"] = "Aktive Plug-Ins";
-App::$strings["Version"] = "Version";
-App::$strings["Repository version (master)"] = "Repository-Version (master)";
-App::$strings["Repository version (dev)"] = "Repository-Version (dev)";
+App::$strings["Additional Features"] = "Zusätzliche Funktionen";
+App::$strings["Name is required"] = "Name ist erforderlich";
+App::$strings["Key and Secret are required"] = "Schlüssel und Geheimnis werden benötigt";
+App::$strings["Add application"] = "Anwendung hinzufügen";
+App::$strings["Name of application"] = "Name der Anwendung";
+App::$strings["Consumer Key"] = "Consumer Key";
+App::$strings["Automatically generated - change if desired. Max length 20"] = "Automatisch erzeugt – ändern, falls erwünscht. Maximale Länge 20";
+App::$strings["Consumer Secret"] = "Consumer Secret";
+App::$strings["Redirect"] = "Umleitung";
+App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "Umleitungs-URl – lasse das leer, solange Deine Anwendung es nicht explizit erfordert";
+App::$strings["Icon url"] = "Symbol-URL";
+App::$strings["Application not found."] = "Die Anwendung wurde nicht gefunden.";
+App::$strings["Connected Apps"] = "Verbundene Apps";
+App::$strings["Client key starts with"] = "Client Key beginnt mit";
+App::$strings["No name"] = "Kein Name";
+App::$strings["Remove authorization"] = "Authorisierung aufheben";
+App::$strings["This channel is limited to %d tokens"] = "Dieser Kanal ist auf %d Token begrenzt";
+App::$strings["Name and Password are required."] = "Name und Passwort sind erforderlich.";
+App::$strings["Token saved."] = "Token gespeichert.";
+App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Mit diesem Formular kannst Du temporäre Zugangs-IDs anlegen, um Inhalte mit Nicht-Mitgliedern zu teilen. Die IDs können in Berechtigungslisten (ACLs) verwendet werden, und Besucher können sich damit einloggen, um auf private Inhalte zuzugreifen.";
+App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "Du kannst auch <em>Dropbox</em>-ähnliche Zugriffslinks an Andere weitergeben, indem du das Login-Passwort an eine entsprechende URL anhängst wie nachfolgend gezeigt. Beispiele:";
+App::$strings["Guest Access Tokens"] = "Gastzugangstoken";
+App::$strings["Login Name"] = "Anmeldename";
+App::$strings["Login Password"] = "Anmeldepasswort";
+App::$strings["Expires (yyyy-mm-dd)"] = "Läuft ab (jjjj-mm-tt)";
App::$strings["Not valid email."] = "Keine gültige E-Mail Adresse.";
App::$strings["Protected email address. Cannot change to that email."] = "Geschützte E-Mail Adresse. Diese kann nicht verändert werden.";
App::$strings["System failure storing new email. Please try again."] = "Systemfehler während des Speicherns der neuen Mail. Bitte versuche es noch einmal.";
@@ -1341,6 +1308,7 @@ App::$strings["Anybody on the internet"] = "Jeder im Internet";
App::$strings["Publish your default profile in the network directory"] = "Standard-Profil im Netzwerk-Verzeichnis veröffentlichen";
App::$strings["Allow us to suggest you as a potential friend to new members?"] = "Dürfen wir Dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?";
App::$strings["Your channel address is"] = "Deine Kanal-Adresse lautet";
+App::$strings["Your files/photos are accessible via WebDAV at"] = "Deine Dateien/Fotos sind via WebDAV verfügbar auf";
App::$strings["Channel Settings"] = "Kanal-Einstellungen";
App::$strings["Basic Settings"] = "Grundeinstellungen";
App::$strings["Full Name:"] = "Voller Name:";
@@ -1432,6 +1400,8 @@ App::$strings["Minimum of 10 seconds, no maximum"] = "Minimum 10 Sekunden, kein
App::$strings["Maximum number of conversations to load at any time:"] = "Maximale Anzahl von Unterhaltungen, die auf einmal geladen werden sollen:";
App::$strings["Maximum of 100 items"] = "Maximum: 100 Beiträge";
App::$strings["Show emoticons (smilies) as images"] = "Emoticons (Smilies) als Bilder anzeigen";
+App::$strings["Manual conversation updates"] = "Manuelle Konversationsaktualisierung";
+App::$strings["Default is automatic, which may increase screen jumping"] = "Voreinstellung ist Automatisch, was aber das Springen der Seitenanzeige erhöhen kann.";
App::$strings["Link post titles to source"] = "Beitragstitel zum Originalbeitrag verlinken";
App::$strings["System Page Layout Editor - (advanced)"] = "System-Seitenlayout-Editor (für Experten)";
App::$strings["Use blog/list mode on channel page"] = "Blog-/Listenmodus auf der Kanalseite verwenden";
@@ -1442,94 +1412,94 @@ App::$strings["click to expand content exceeding this height"] = "Blöcke, deren
App::$strings["Grid page max height of content (in pixels)"] = "Maximale Höhe (in Pixel) des Inhalts der Netzwerkseite";
App::$strings["No feature settings configured"] = "Keine Funktions-Einstellungen konfiguriert";
App::$strings["Feature/Addon Settings"] = "Funktions-/Addon-Einstellungen";
-App::$strings["Additional Features"] = "Zusätzliche Funktionen";
-App::$strings["Name is required"] = "Name ist erforderlich";
-App::$strings["Key and Secret are required"] = "Schlüssel und Geheimnis werden benötigt";
-App::$strings["Add application"] = "Anwendung hinzufügen";
-App::$strings["Name of application"] = "Name der Anwendung";
-App::$strings["Consumer Key"] = "Consumer Key";
-App::$strings["Automatically generated - change if desired. Max length 20"] = "Automatisch erzeugt – ändern, falls erwünscht. Maximale Länge 20";
-App::$strings["Consumer Secret"] = "Consumer Secret";
-App::$strings["Redirect"] = "Umleitung";
-App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "Umleitungs-URl – lasse das leer, solange Deine Anwendung es nicht explizit erfordert";
-App::$strings["Icon url"] = "Symbol-URL";
-App::$strings["Application not found."] = "Die Anwendung wurde nicht gefunden.";
-App::$strings["Connected Apps"] = "Verbundene Apps";
-App::$strings["Client key starts with"] = "Client Key beginnt mit";
-App::$strings["No name"] = "Kein Name";
-App::$strings["Remove authorization"] = "Authorisierung aufheben";
-App::$strings["This channel is limited to %d tokens"] = "Dieser Kanal ist auf %d Token begrenzt";
-App::$strings["Name and Password are required."] = "Name und Passwort sind erforderlich.";
-App::$strings["Token saved."] = "Token gespeichert.";
-App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Mit diesem Formular kannst Du temporäre Zugangs-IDs anlegen, um Inhalte mit Nicht-Mitgliedern zu teilen. Die IDs können in Berechtigungslisten (ACLs) verwendet werden, und Besucher können sich damit einloggen, um auf private Inhalte zuzugreifen.";
-App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "Du kannst auch <em>Dropbox</em>-ähnliche Zugriffslinks an Andere weitergeben, indem du das Login-Passwort an eine entsprechende URL anhängst wie nachfolgend gezeigt. Beispiele:";
-App::$strings["Guest Access Tokens"] = "Gastzugangstoken";
-App::$strings["Login Name"] = "Anmeldename";
-App::$strings["Login Password"] = "Anmeldepasswort";
-App::$strings["Expires (yyyy-mm-dd)"] = "Läuft ab (jjjj-mm-tt)";
+App::$strings["Tag removed"] = "Schlagwort entfernt";
+App::$strings["Remove Item Tag"] = "Schlagwort entfernen";
+App::$strings["Select a tag to remove: "] = "Schlagwort zum Entfernen auswählen:";
+App::$strings["Thing updated"] = "Sache aktualisiert";
+App::$strings["Object store: failed"] = "Speichern des Objekts fehlgeschlagen";
+App::$strings["Thing added"] = "Sache hinzugefügt";
+App::$strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+App::$strings["Show Thing"] = "Sache anzeigen";
+App::$strings["item not found."] = "Eintrag nicht gefunden";
+App::$strings["Edit Thing"] = "Sache bearbeiten";
+App::$strings["Select a profile"] = "Wähle ein Profil";
+App::$strings["Post an activity"] = "Aktivitätsnachricht senden";
+App::$strings["Only sends to viewers of the applicable profile"] = "Nur an Betrachter des ausgewählten Profils senden";
+App::$strings["Name of thing e.g. something"] = "Name der Sache, z. B. irgendwas";
+App::$strings["URL of thing (optional)"] = "URL der Sache (optional)";
+App::$strings["URL for photo of thing (optional)"] = "URL eines Fotos der Sache (optional)";
+App::$strings["Add Thing to your Profile"] = "Die Sache Deinem Profil hinzufügen";
+App::$strings["Your service plan only allows %d channels."] = "Dein Vertrag erlaubt nur %d Kanäle.";
+App::$strings["Cloned channel not found. Import failed."] = "Geklonter Kanal nicht gefunden. Import fehlgeschlagen.";
+App::$strings["No channel. Import failed."] = "Kein Kanal. Import fehlgeschlagen.";
+App::$strings["Import completed."] = "Import abgeschlossen.";
+App::$strings["You must be logged in to use this feature."] = "Du musst angemeldet sein um diese Funktion zu nutzen.";
+App::$strings["Import Channel"] = "Kanal importieren";
+App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren.";
+App::$strings["Or provide the old server/hub details"] = "Oder gib die Details Deines bisherigen \$Projectname-Hubs ein";
+App::$strings["Your old identity address (xyz@example.com)"] = "Bisherige Kanal-Adresse (xyz@example.com)";
+App::$strings["Your old login email address"] = "Deine alte Login-E-Mail-Adresse";
+App::$strings["Your old login password"] = "Dein altes Passwort";
+App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige \$Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein.";
+App::$strings["Make this hub my primary location"] = "Dieser $Pojectname-Hub ist mein primärer Hub.";
+App::$strings["Import existing posts if possible (experimental - limited by available memory"] = "Importiere bestehende Beiträge falls möglich (experimentell - begrenzt durch zur Verfügung stehenden Speicher";
+App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur einmal ab und lasse diese Seite bis zur Fertigstellung offen.";
+App::$strings["No connections."] = "Keine Verbindungen.";
+App::$strings["Visit %s's profile [%s]"] = "%ss Profil [%s] besuchen";
+App::$strings["View Connections"] = "Verbindungen anzeigen";
+App::$strings["Source of Item"] = "Quelle des Elements";
+App::$strings["Room not found"] = "Chatraum nicht gefunden";
+App::$strings["Leave Room"] = "Raum verlassen";
+App::$strings["Delete Room"] = "Raum löschen";
+App::$strings["I am away right now"] = "Ich bin gerade nicht da";
+App::$strings["I am online"] = "Ich bin online";
+App::$strings["Bookmark this room"] = "Lesezeichen für diesen Raum setzen";
+App::$strings["New Chatroom"] = "Neuer Chatraum";
+App::$strings["Chatroom name"] = "Chatraumname";
+App::$strings["Expiration of chats (minutes)"] = "Verfall von Chats (Minuten)";
+App::$strings["%1\$s's Chatrooms"] = "%1\$ss Chaträume";
+App::$strings["No chatrooms available"] = "Keine Chaträume verfügbar";
+App::$strings["Expiration"] = "Verfall";
+App::$strings["min"] = "min";
+App::$strings["Xchan Lookup"] = "Xchan-Suche";
+App::$strings["Lookup xchan beginning with (or webbie): "] = "Nach xchans oder Webbies (Kanal-Adressen) suchen, die wie folgt beginnen:";
+App::$strings["Calendar entries imported."] = "Kalendereinträge wurden importiert.";
+App::$strings["No calendar entries found."] = "Keine Kalendereinträge gefunden.";
+App::$strings["Event can not end before it has started."] = "Termin-Ende liegt vor dem Beginn.";
+App::$strings["Unable to generate preview."] = "Vorschau konnte nicht erzeugt werden.";
+App::$strings["Event title and start time are required."] = "Titel und Startzeit des Termins sind erforderlich.";
+App::$strings["Event not found."] = "Termin nicht gefunden.";
+App::$strings["Edit event title"] = "Termintitel bearbeiten";
+App::$strings["Event title"] = "Termintitel";
+App::$strings["Categories (comma-separated list)"] = "Kategorien (Kommagetrennte Liste)";
+App::$strings["Edit Category"] = "Kategorie bearbeiten";
+App::$strings["Category"] = "Kategorie";
+App::$strings["Edit start date and time"] = "Startdatum und -zeit bearbeiten";
+App::$strings["Start date and time"] = "Startdatum und -zeit";
+App::$strings["Finish date and time are not known or not relevant"] = "Enddatum und -zeit sind unbekannt oder irrelevant";
+App::$strings["Edit finish date and time"] = "Enddatum und -zeit bearbeiten";
+App::$strings["Finish date and time"] = "Enddatum und -zeit";
+App::$strings["Adjust for viewer timezone"] = "An die Zeitzone des Betrachters anpassen";
+App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht sinnvoll für globale Feiertage / Ferien.";
+App::$strings["Edit Description"] = "Beschreibung bearbeiten";
+App::$strings["Edit Location"] = "Ort bearbeiten";
+App::$strings["Permission settings"] = "Berechtigungs-Einstellungen";
+App::$strings["Advanced Options"] = "Weitere Optionen";
+App::$strings["Edit event"] = "Termin bearbeiten";
+App::$strings["Delete event"] = "Termin löschen";
+App::$strings["calendar"] = "Kalender";
+App::$strings["Month"] = "Monat";
+App::$strings["Week"] = "Woche";
+App::$strings["Day"] = "Tag";
+App::$strings["Event removed"] = "Termin gelöscht";
+App::$strings["Failed to remove event"] = "Termin konnte nicht gelöscht werden";
App::$strings["Missing room name"] = "Der Chatraum hat keinen Namen";
App::$strings["Duplicate room name"] = "Name des Chatraums bereits vergeben";
App::$strings["Invalid room specifier."] = "Ungültiger Raumbezeichner.";
App::$strings["Room not found."] = "Chatraum konnte nicht gefunden werden.";
App::$strings["Room is full"] = "Der Chatraum ist voll";
-App::$strings["\$Projectname Notification"] = "\$Projectname-Benachrichtigung";
-App::$strings["\$projectname"] = "\$projectname";
-App::$strings["Thank You,"] = "Danke.";
-App::$strings["%s Administrator"] = "der Administrator von %s";
-App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
-App::$strings["[Hubzilla:Notify] New mail received at %s"] = "[Hubzilla:Benachrichtigung] Neue Mail empfangen auf %s";
-App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s hat Dir eine private Nachricht auf %3\$s gesendet.";
-App::$strings["%1\$s sent you %2\$s."] = "%1\$s hat Dir %2\$s geschickt.";
-App::$strings["a private message"] = "eine private Nachricht";
-App::$strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um die private Nachricht anzusehen und/oder darauf zu antworten.";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]einen %4\$s[/zrl] kommentiert";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]%4\$ss %5\$s[/zrl] kommentiert";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]Deinen %4\$s[/zrl] kommentiert";
-App::$strings["[Hubzilla:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Hubzilla:Benachrichtigung] Kommentar in Unterhaltung #%1\$d von %2\$s";
-App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s hat eine Unterhaltung kommentiert, der Du folgst.";
-App::$strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren.";
-App::$strings["[Hubzilla:Notify] %s posted to your profile wall"] = "[Hubzilla:Benachrichtigung] %s schrieb auf Deine Pinnwand";
-App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s hat auf Deine Pinnwand auf %3\$s geschrieben";
-App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s hat auf [zrl=%3\$s]Deine Pinnwand[/zrl] geschrieben";
-App::$strings["[Hubzilla:Notify] %s tagged you"] = "[Hubzilla:Benachrichtigung] %s hat Dich erwähnt";
-App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s hat Dich auf %3\$s erwähnt";
-App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]hat Dich erwähnt[/zrl].";
-App::$strings["[Hubzilla:Notify] %1\$s poked you"] = "[Hubzilla:Benachrichtigung] %1\$s hat Dich angestupst";
-App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s hat Dich auf %3\$s angestupst";
-App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]hat Dich angestupst[/zrl].";
-App::$strings["[Hubzilla:Notify] %s tagged your post"] = "[Hubzilla:Benachrichtigung] %s hat Deinen Beitrag verschlagwortet";
-App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s hat Deinen Beitrag auf %3\$s verschlagwortet";
-App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]Deinen Beitrag[/zrl] verschlagwortet";
-App::$strings["[Hubzilla:Notify] Introduction received"] = "[Hubzilla:Benachrichtigung] Vorstellung erhalten";
-App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, Du hast eine neue Verbindungsanfrage von '%2\$s' auf %3\$s erhalten";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, Du hast [zrl=%2\$s]eine neue Verbindungsanfrage[/zrl] von %3\$s erhalten.";
-App::$strings["You may visit their profile at %s"] = "Du kannst Dir das Profil unter %s ansehen";
-App::$strings["Please visit %s to approve or reject the connection request."] = "Bitte besuche %s , um die Verbindungsanfrage anzunehmen oder abzulehnen.";
-App::$strings["[Hubzilla:Notify] Friend suggestion received"] = "[Hubzilla:Benachrichtigung] Freundschaftsvorschlag erhalten";
-App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, Du hast einen Kontaktvorschlag von „%2\$s“ auf %3\$s erhalten";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, Du hast [zrl=%2\$s]einen Kontaktvorschlag[/zrl] für %3\$s von %4\$s erhalten.";
-App::$strings["Name:"] = "Name:";
-App::$strings["Photo:"] = "Foto:";
-App::$strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen.";
-App::$strings["[Hubzilla:Notify]"] = "[Hubzilla:Benachrichtigung]";
-App::$strings["created a new post"] = "Neuer Beitrag wurde erzeugt";
-App::$strings["commented on %s's post"] = "hat %s's Beitrag kommentiert";
-App::$strings["Visible to your default audience"] = "Standard-Sichtbarkeit gemäß Kanaleinstellungen";
-App::$strings["Only me"] = "Nur ich";
-App::$strings["Public"] = "Öffentlich";
-App::$strings["Anybody in the \$Projectname network"] = "Jeder innerhalb des \$Projectname Netzwerks";
-App::$strings["Any account on %s"] = "Jedes Nutzerkonto auf %s";
-App::$strings["Any of my connections"] = "Alle meine Verbindungen";
-App::$strings["Only connections I specifically allow"] = "Nur Verbindungen, denen ich es explizit erlaube";
-App::$strings["Anybody authenticated (could include visitors from other networks)"] = "Jeder, der angemeldet ist (kann Besucher anderer Netzwerke beinhalten)";
-App::$strings["Any connections including those who haven't yet been approved"] = "Alle Verbindungen einschließlich der noch nicht bestätigten";
-App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner normalen Beiträge (Stream).";
-App::$strings["This is your default setting for who can view your default channel profile"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deines Standard-Kanalprofils.";
-App::$strings["This is your default setting for who can view your connections"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Verbindungen.";
-App::$strings["This is your default setting for who can view your file storage and photos"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Dateien und Fotos.";
-App::$strings["This is your default setting for the audience of your webpages"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Webseiten.";
App::$strings["Site Admin"] = "Hub-Administration";
-App::$strings["Bug Report"] = "Fehler-Rückmeldung";
+App::$strings["Report Bug"] = "Fehler melden";
App::$strings["View Bookmarks"] = "Lesezeichen ansehen";
App::$strings["My Chatrooms"] = "Meine Chaträume";
App::$strings["Firefox Share"] = "Teilen-Knopf für Firefox";
@@ -1537,6 +1507,7 @@ App::$strings["Remote Diagnostics"] = "Ferndiagnose";
App::$strings["Suggest Channels"] = "Kanäle vorschlagen";
App::$strings["Login"] = "Anmelden";
App::$strings["Grid"] = "Grid";
+App::$strings["Wiki"] = "Wiki";
App::$strings["Channel Home"] = "Mein Kanal";
App::$strings["Events"] = "Termine";
App::$strings["Directory"] = "Verzeichnis";
@@ -1551,6 +1522,20 @@ App::$strings["Language"] = "Sprache";
App::$strings["Post"] = "Beitrag schreiben";
App::$strings["Profile Photo"] = "Profilfoto";
App::$strings["Purchase"] = "Kaufen";
+App::$strings["Visible to your default audience"] = "Standard-Sichtbarkeit gemäß Kanaleinstellungen";
+App::$strings["Only me"] = "Nur ich";
+App::$strings["Public"] = "Öffentlich";
+App::$strings["Anybody in the \$Projectname network"] = "Jeder innerhalb des \$Projectname Netzwerks";
+App::$strings["Any account on %s"] = "Jedes Nutzerkonto auf %s";
+App::$strings["Any of my connections"] = "Alle meine Verbindungen";
+App::$strings["Only connections I specifically allow"] = "Nur Verbindungen, denen ich es explizit erlaube";
+App::$strings["Anybody authenticated (could include visitors from other networks)"] = "Jeder, der angemeldet ist (kann Besucher anderer Netzwerke beinhalten)";
+App::$strings["Any connections including those who haven't yet been approved"] = "Alle Verbindungen einschließlich der noch nicht bestätigten";
+App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner normalen Beiträge (Stream).";
+App::$strings["This is your default setting for who can view your default channel profile"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deines Standard-Kanalprofils.";
+App::$strings["This is your default setting for who can view your connections"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Verbindungen.";
+App::$strings["This is your default setting for who can view your file storage and photos"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Dateien und Fotos.";
+App::$strings["This is your default setting for the audience of your webpages"] = "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Webseiten.";
App::$strings["Private Message"] = "Private Nachricht";
App::$strings["Select"] = "Auswählen";
App::$strings["Save to Folder"] = "In Ordner speichern";
@@ -1584,6 +1569,10 @@ App::$strings["via Wall-To-Wall:"] = "via Wall-To-Wall:";
App::$strings["from %s"] = "via %s";
App::$strings["last edited: %s"] = "zuletzt bearbeitet: %s";
App::$strings["Expires: %s"] = "Verfällt: %s";
+App::$strings["Attend"] = "Zusagen";
+App::$strings["Attendance Options"] = "Zusageoptionen";
+App::$strings["Vote"] = "Abstimmen";
+App::$strings["Voting Options"] = "Abstimmungsoptionen";
App::$strings["Save Bookmarks"] = "Favoriten speichern";
App::$strings["Add to Calendar"] = "Zum Kalender hinzufügen";
App::$strings["Mark all seen"] = "Alle als gelesen markieren";
@@ -1596,108 +1585,712 @@ App::$strings["Code"] = "Code";
App::$strings["Image"] = "Bild";
App::$strings["Insert Link"] = "Link einfügen";
App::$strings["Video"] = "Video";
-App::$strings["No username found in import file."] = "Kein Benutzername in der Importdatei gefunden.";
-App::$strings["Unable to create a unique channel address. Import failed."] = "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen.";
-App::$strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden";
-App::$strings["view full size"] = "In Vollbildansicht anschauen";
-App::$strings["Administrator"] = "Administrator";
-App::$strings["No Subject"] = "Kein Betreff";
+App::$strings["\$Projectname Notification"] = "\$Projectname-Benachrichtigung";
+App::$strings["\$projectname"] = "\$projectname";
+App::$strings["Thank You,"] = "Danke.";
+App::$strings["%s Administrator"] = "der Administrator von %s";
+App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
+App::$strings["[\$Projectname:Notify] New mail received at %s"] = "[\$Projectname:Benachrichtigung] Neue Mail empfangen auf %s";
+App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s hat Dir eine private Nachricht auf %3\$s gesendet.";
+App::$strings["%1\$s sent you %2\$s."] = "%1\$s hat Dir %2\$s geschickt.";
+App::$strings["a private message"] = "eine private Nachricht";
+App::$strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um die private Nachricht anzusehen und/oder darauf zu antworten.";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]einen %4\$s[/zrl] kommentiert";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]%4\$ss %5\$s[/zrl] kommentiert";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]Deinen %4\$s[/zrl] kommentiert";
+App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Benachrichtigung] Kommentar in Unterhaltung #%1\$d von %2\$s";
+App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s hat eine Unterhaltung kommentiert, der Du folgst.";
+App::$strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren.";
+App::$strings["[\$Projectname:Notify] %s posted to your profile wall"] = "[\$Projectname:Benachrichtigung] %s schrieb auf Deine Pinnwand";
+App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s hat auf Deine Pinnwand auf %3\$s geschrieben";
+App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s hat auf [zrl=%3\$s]Deine Pinnwand[/zrl] geschrieben";
+App::$strings["[\$Projectname:Notify] %s tagged you"] = "[\$Projectname:Benachrichtigung] %s hat Dich erwähnt";
+App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s hat Dich auf %3\$s erwähnt";
+App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]hat Dich erwähnt[/zrl].";
+App::$strings["[\$Projectname:Notify] %1\$s poked you"] = "[\$Projectname:Benachrichtigung] %1\$s hat Dich angestupst";
+App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s hat Dich auf %3\$s angestupst";
+App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]hat Dich angestupst[/zrl].";
+App::$strings["[\$Projectname:Notify] %s tagged your post"] = "[\$Projectname:Benachrichtigung] %s hat Deinen Beitrag verschlagwortet";
+App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s hat Deinen Beitrag auf %3\$s verschlagwortet";
+App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]Deinen Beitrag[/zrl] verschlagwortet";
+App::$strings["[\$Projectname:Notify] Introduction received"] = "[\$Projectname:Benachrichtigung] Verbindungsanfrage erhalten";
+App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, Du hast eine neue Verbindungsanfrage von '%2\$s' auf %3\$s erhalten";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, Du hast [zrl=%2\$s]eine neue Verbindungsanfrage[/zrl] von %3\$s erhalten.";
+App::$strings["You may visit their profile at %s"] = "Du kannst Dir das Profil unter %s ansehen";
+App::$strings["Please visit %s to approve or reject the connection request."] = "Bitte besuche %s , um die Verbindungsanfrage anzunehmen oder abzulehnen.";
+App::$strings["[\$Projectname:Notify] Friend suggestion received"] = "[\$Projectname:Benachrichtigung] Freundschaftsvorschlag erhalten";
+App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, Du hast einen Kontaktvorschlag von „%2\$s“ auf %3\$s erhalten";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, Du hast [zrl=%2\$s]einen Kontaktvorschlag[/zrl] für %3\$s von %4\$s erhalten.";
+App::$strings["Name:"] = "Name:";
+App::$strings["Photo:"] = "Foto:";
+App::$strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen.";
+App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Benachrichtigung]";
+App::$strings["created a new post"] = "Neuer Beitrag wurde erzeugt";
+App::$strings["commented on %s's post"] = "hat %s's Beitrag kommentiert";
+App::$strings["Flag Adult Photos"] = "Nicht jugendfreie Fotos markieren";
+App::$strings["Provide photo edit option to hide inappropriate photos from default album view"] = "Stellt eine Option zum Verstecken von Fotos mit unangemessenen Inhalten in der Standard-Albumansicht bereit";
+App::$strings["This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc."] = "";
+App::$strings["Chord names start with a root note (A-G) and may include sharps (#) and flats (b). This software will parse most of the standard naming conventions such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."] = "";
+App::$strings["Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."] = "Einige gültige Beispiele: A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ...";
+App::$strings["Guitar Chords"] = "Gitarrenakkorde";
+App::$strings["The complete online chord dictionary"] = "Das komplette online Akkord-Verzeichnis";
+App::$strings["Tuning"] = "Stimmen";
+App::$strings["Chord name: example: Em7"] = "Beispiel Akkord Name: Em7";
+App::$strings["Show for left handed stringing"] = "Linkshänder-Besaitung anzeigen";
+App::$strings["Quick Reference"] = "Schnellreferenz";
+App::$strings["Diaspora Protocol Settings updated."] = "Diaspora-Protokolleinstellungen aktualisiert.";
+App::$strings["Enable the Diaspora protocol for this channel"] = "Diaspora-Protokoll für diesen Kanal aktivieren";
+App::$strings["Allow any Diaspora member to comment on your public posts"] = "Jedem Diaspora-Mitglied erlauben, Deine öffentlichen Beiträge zu kommentieren";
+App::$strings["Prevent your hashtags from being redirected to other sites"] = "Verhindern, dass Deine hashtags zu anderen Seiten umgeleitet werden";
+App::$strings["Followed hashtags (comma separated, do not include the #)"] = "Verfolgte Hashtags (Komma separierte Liste, ohne die #)";
+App::$strings["Diaspora Protocol Settings"] = "Diaspora-Protokolleinstellungen";
+App::$strings["Hubzilla Directory Stats"] = "Hubzilla-Verzeichnisstatistiken";
+App::$strings["Total Hubs"] = "Hubs insgesamt";
+App::$strings["Hubzilla Hubs"] = "Hubzilla Hubs";
+App::$strings["Friendica Hubs"] = "Friendica Hubs";
+App::$strings["Diaspora Pods"] = "Diaspora Pods";
+App::$strings["Hubzilla Channels"] = "Hubzilla-Kanäle";
+App::$strings["Friendica Channels"] = "Friendica-Kanäle";
+App::$strings["Diaspora Channels"] = "Diaspora-Kanäle";
+App::$strings["Aged 35 and above"] = "35 und älter";
+App::$strings["Aged 34 and under"] = "34 und jünger";
+App::$strings["Average Age"] = "Durchschnittsalter";
+App::$strings["Known Chatrooms"] = "Bekannte Chaträume";
+App::$strings["Known Tags"] = "Bekannte Schlagwörter";
+App::$strings["Please note Diaspora and Friendica statistics are merely those **this directory** is aware of, and not all those known in the network. This also applies to chatrooms,"] = "Bitte berücksichtige, dass Diaspora und Friendica Statistiken nur solche einschließen, die **diesem Verzeichnis** bekannt sind, nicht alle im Netzwerk bekannten. Das gilt auch für Chaträume.";
+App::$strings["Project Servers and Resources"] = "Projektserver und -ressourcen";
+App::$strings["Project Creator and Tech Lead"] = "Projektersteller und Technischer Leiter";
+App::$strings["Admin, developer, directorymin, support bloke"] = "Administrator, Entwickler, Verzeichnis Betreibender, Supportleistende";
+App::$strings["And the hundreds of other people and organisations who helped make the Hubzilla possible."] = "Und die hunderte anderen Menschen und Organisationen, die geholfen haben Hubzilla möglich zu machen.";
+App::$strings["The Redmatrix/Hubzilla projects are provided primarily by volunteers giving their time and expertise - and often paying out of pocket for services they share with others."] = "Die Redmatrix/Hubzilla Projekte werden hauptsächlich von Freiwilligen bereitgestellt, die ihre Zeit und Expertise zur Verfügung stellen - und oft aus eigener Tasche für die Dienste zahlen, die sie mit anderen teilen.";
+App::$strings["There is no corporate funding and no ads, and we do not collect and sell your personal information. (We don't control your personal information - <strong>you do</strong>.)"] = "Es gibt keine Finanzierung durch Firmen, keine Werbung und wir verkaufen Deine persönlichen Daten nicht. (Wir kontrollieren Deine persönlichen Daten nicht - <strong>das machst Du</strong>.)";
+App::$strings["Help support our ground-breaking work in decentralisation, web identity, and privacy."] = "Hilf uns bei unserer wegweisenden Arbeit im Bereich der Dezantralisation, von Web-Identitäten und Privatsphäre.";
+App::$strings["Your donations keep servers and services running and also helps us to provide innovative new features and continued development."] = "Die Spenden werden dafür verwendet Server und Dienste am laufen zu halten und helfen desweiteren innovative Neuerungen zu schaffen und die Entwicklung voran zu treiben.";
+App::$strings["Donate"] = "Spenden";
+App::$strings["Choose a project, developer, or public hub to support with a one-time donation"] = "Wähle ein Projekt, einen Entwickler oder einen öffentlichen Hub den du mit einer einmaligen Spende unterstützen willst.";
+App::$strings["Donate Now"] = "Jetzt spenden";
+App::$strings["<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"] = "<strong><em>Oder</em></strong> werde ein Unterstützer des Projekts (ausschließlich Hubzilla)";
+App::$strings["Please indicate if you would like your first name or full name (or nothing) to appear in our sponsor listing"] = "Bitte teile uns mit ob dein kompletter Name oder dein Vorname (oder gar nichts) auf unserer Sponsoren-Seite veröffentlicht werden soll.";
+App::$strings["Sponsor"] = "Sponsor";
+App::$strings["Special thanks to: "] = "Besonderer Dank an: ";
+App::$strings["Post to Dreamwidth"] = "Bei Dreamwidth veröffentlichen";
+App::$strings["Enable Dreamwidth Post Plugin"] = "Aktiviere das Dreamwidth-Plugin";
+App::$strings["Dreamwidth username"] = "Dreamwidth-Benutzername";
+App::$strings["Dreamwidth password"] = "Dreamwidth-Passwort";
+App::$strings["Post to Dreamwidth by default"] = "Standardmäßig auf auf Dreamwidth posten";
+App::$strings["Dreamwidth Post Settings"] = "Dreamwidth-Beitragseinstellungen";
+App::$strings["Flattr this!"] = "Flattr this!";
+App::$strings["Flattr widget settings updated."] = "Flattr Widget Einstellungen aktualisiert";
+App::$strings["Flattr user"] = "Flattr Nutzer";
+App::$strings["URL of the Thing to flattr"] = "URL des Dings zum flattrn";
+App::$strings["If empty channel URL is used"] = "Falls leer wird die Channel URL verwendet";
+App::$strings["Title of the Thing to flattr"] = "Titel des Dings zum flattrn";
+App::$strings["If empty \"channel name on The Hubzilla\" will be used"] = "Falls leer wird \"Kanalname auf The Hubzilla\" verwendet";
+App::$strings["Static or dynamic flattr button"] = "Statischer oder dynamischer Flattr Button";
+App::$strings["static"] = "statisch";
+App::$strings["dynamic"] = "dynamisch";
+App::$strings["Alignment of the widget"] = "Ausrichtung des Widgets";
+App::$strings["left"] = "links";
+App::$strings["right"] = "rechts";
+App::$strings["Enable Flattr widget"] = "Flattr Widget verwenden";
+App::$strings["Flattr Widget Settings"] = "Flattr Widget Einstellungen";
+App::$strings["Contact not found."] = "Kontakt nicht gefunden.";
+App::$strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "Dies kann unter Umständen passieren, wenn der Kontakt von beiden Seiten aus angefragt wurde und er bereits akzeptiert wurde..";
+App::$strings["Response from remote site was not understood."] = "Antwort des entfernten Seite war unverständlich.";
+App::$strings["Unexpected response from remote site: "] = "Unerwartete Antwort der entfernten Seite";
+App::$strings["Confirmation completed successfully."] = "Bestätigung erfolgreich abgeschlossen.";
+App::$strings["Remote site reported: "] = "Meldung der entfernten Seite";
+App::$strings["Temporary failure. Please wait and try again."] = "Vorübergehende Störung. Bitte warte einen Moment und versuche es später erneut.";
+App::$strings["Introduction failed or was revoked."] = "Vorstellung fehlgeschlagen oder wurde zurück gezogen.";
+App::$strings["Unable to set contact photo."] = "Konnte das Kontakt-Photo nicht setzen.";
+App::$strings["%1\$s is now friends with %2\$s"] = "%1\$s ist nun mit %2\$s befreundet";
+App::$strings["No user record found for '%s' "] = "Kein Benutzereintrag für '%s' gefunden";
+App::$strings["Our site encryption key is apparently messed up."] = "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend kaputt.";
+App::$strings["Empty site URL was provided or URL could not be decrypted by us."] = "Eine leere Seiten URL wurde angegeben, oder die URL konnte von uns nicht entziffert werden.";
+App::$strings["Contact record was not found for you on our site."] = "Für dich wurden keinerlei Kontaktdaten auf unserer Seite gefunden.";
+App::$strings["Site public key not available in contact record for URL %s."] = "Der öffentliche Schlüssel dieser Seite ist für die Kontaktdaten mit der URL %s nocht verfügbar.";
+App::$strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "Die ID, die Durch Dein System angegeben wurde ist ein Duplikat auf unserem. Es sollte funktionieren, wenn Du es noch einmal versuchst.";
+App::$strings["Unable to set your contact credentials on our system."] = "";
+App::$strings["Unable to update your contact profile details on our system"] = "Konnte die Details deines Profils auf unserem System nicht aktualisieren.";
+App::$strings["[Name Withheld]"] = "[Name zurück gehalten]";
+App::$strings["%1\$s has joined %2\$s"] = "%1\$s ist %2\$s beigetreten";
+App::$strings["%1\$s welcomes %2\$s"] = "%1\$s heißt %2\$s willkommen";
+App::$strings["This introduction has already been accepted."] = "Die Vorstellung wurde bereits akzeptiert.";
+App::$strings["Profile location is not valid or does not contain profile information."] = "";
+App::$strings["Warning: profile location has no identifiable owner name."] = "";
+App::$strings["Warning: profile location has no profile photo."] = "";
+App::$strings["%d required parameter was not found at the given location"] = array(
+ 0 => "",
+ 1 => "",
+);
+App::$strings["Introduction complete."] = "Einführung abgeschlossen.";
+App::$strings["Unrecoverable protocol error."] = "Nicht behebbarer Protokollfehler.";
+App::$strings["Profile unavailable."] = "Profil nicht verfügbar.";
+App::$strings["%s has received too many connection requests today."] = "%s hat heute bereits zu viele Kontaktanfragen erhalten.";
+App::$strings["Spam protection measures have been invoked."] = "Maßnahmen zum Spam-Schutz wurden aktiviert.";
+App::$strings["Friends are advised to please try again in 24 hours."] = "Freunde sollten es bitte in 24 Stunden erneut versuchen.";
+App::$strings["Invalid locator"] = "";
+App::$strings["Invalid email address."] = "Ungültige E-Mail-Adresse.";
+App::$strings["This account has not been configured for email. Request failed."] = "Dieser Account wurde nicht für E-Mail konfiguriert. Anfrage gescheitert.";
+App::$strings["Unable to resolve your name at the provided location."] = "";
+App::$strings["You have already introduced yourself here."] = "Du hast dich hier bereits vorgestellt.";
+App::$strings["Apparently you are already friends with %s."] = "Anscheinend bist du bereits mit %s in Kontakt.";
+App::$strings["Invalid profile URL."] = "Ungültige Profil-URL.";
+App::$strings["Disallowed profile URL."] = "Nicht erlaubte Profil-URL.";
+App::$strings["Failed to update contact record."] = "Konnte den Verbindungseintrag nicht aktualisieren.";
+App::$strings["Your introduction has been sent."] = "Deine Vorstellung wurde gesendet.";
+App::$strings["Please login to confirm introduction."] = "Bitte melde dich an um die Vorstellung zu bestätigen.";
+App::$strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "";
+App::$strings["Confirm"] = "Bestätigen";
+App::$strings["Hide this contact"] = "Diesen Kontakt verbergen";
+App::$strings["Welcome home %s."] = "Willkommen daheim %s";
+App::$strings["Please confirm your introduction/connection request to %s."] = "Bitte bestätige deine Vorstellung/Kontaktanfrage bei %s.";
+App::$strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "Bitte gib deine \"Identitäts Adresse\" von einem der folgenden unterstützten Kommunikations Netzwerke an.";
+App::$strings["If you are not yet a member of the free social web, <a href=\"%s/siteinfo\">follow this link to find a public Friendica site and join us today</a>."] = "";
+App::$strings["Friend/Connection Request"] = "Freundschafts-/Verbindungsanfrage";
+App::$strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca";
+App::$strings["Please answer the following:"] = "Bitte beantworten Sie folgendes:";
+App::$strings["Does %s know you?"] = "Kennt %s Sie?";
+App::$strings["Add a personal note:"] = "Eine persönliche Nachricht hinterlassen:";
App::$strings["Friendica"] = "Friendica";
-App::$strings["OStatus"] = "OStatus";
-App::$strings["GNU-Social"] = "GNU-Social";
-App::$strings["RSS/Atom"] = "RSS/Atom";
+App::$strings["StatusNet/Federated Social Web"] = "StatusNet/Föderierte Soziale Netzwerke";
App::$strings["Diaspora"] = "Diaspora";
-App::$strings["Facebook"] = "Facebook";
-App::$strings["Zot"] = "Zot!";
-App::$strings["LinkedIn"] = "LinkedIn";
-App::$strings["XMPP/IM"] = "XMPP/IM";
-App::$strings["MySpace"] = "MySpace";
-App::$strings["Image exceeds website size limit of %lu bytes"] = "Bild überschreitet das Webseitenlimit von %lu Bytes";
-App::$strings["Image file is empty."] = "Bilddatei ist leer.";
-App::$strings["Photo storage failed."] = "Fotospeicherung fehlgeschlagen.";
-App::$strings["a new photo"] = "ein neues Foto";
-App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s hat %2\$s auf %3\$s veröffentlicht";
-App::$strings["Photo Albums"] = "Fotoalben";
-App::$strings["Upload New Photos"] = "Neue Fotos hochladen";
-App::$strings["Logout"] = "Abmelden";
-App::$strings["End this session"] = "Beende diese Sitzung";
-App::$strings["Home"] = "Home";
-App::$strings["Your posts and conversations"] = "Deine Beiträge und Unterhaltungen";
-App::$strings["Your profile page"] = "Deine Profilseite";
-App::$strings["Manage/Edit profiles"] = "Profile verwalten";
+App::$strings[" - please do not use this form. Instead, enter %s into your Diaspora search bar."] = "- bitte verwende nicht dieses Formular sondern gib %s in die Suchleiste deiner Diaspora Seite ein.";
+App::$strings["Your Identity Address:"] = "Ihre Identitätsadresse:";
+App::$strings["Submit Request"] = "Anfrage absenden";
+App::$strings["GNU-Social Protocol Settings updated."] = "GNU Social Protokoll Einstellungen aktualisiert";
+App::$strings["Enable the (experimental) GNU-Social protocol for this channel"] = "GNU Social Protokoll (experimentell) für diesen Kanal aktualisieren";
+App::$strings["GNU-Social Protocol Settings"] = "GNU Social Protokoll Einstellungen";
+App::$strings["Follow"] = "Folgen";
+App::$strings["%1\$s is now following %2\$s"] = "%1\$s folgt nun %2\$s";
+App::$strings["Friendica Photo Album Import"] = "Friendica-Fotoalbumimport";
+App::$strings["This will import all your Friendica photo albums to this Red channel."] = "Hiermit werden all deine Fotoalben von Friendica in diesen Hubzilla Kanal importiert.";
+App::$strings["Friendica Server base URL"] = "BasisURL des Friendica Servers";
+App::$strings["Friendica Login Username"] = "Friendica-Anmeldebenutzername";
+App::$strings["Friendica Login Password"] = "Friendica-Anmeldepasswort";
+App::$strings["Enable the GNU-Social protocol for this channel"] = "GNU Social Protokoll für diesen Kanal aktualisieren";
+App::$strings["Send email to all members"] = "E-Mail an alle Mitglieder senden";
+App::$strings["$1%s Administrator"] = "$1%s Administrator";
+App::$strings["No recipients found."] = "Keine Empfänger gefunden.";
+App::$strings["%1\$d of %2\$d messages sent."] = "%1\$d von %2\$d Nachrichten gesendet.";
+App::$strings["Send email to all hub members."] = "Eine E-Mail an alle Mitglieder dieses Hubs senden.";
+App::$strings["Message subject"] = "Betreff der Nachricht";
+App::$strings["Sender Email address"] = "E-Mail Adresse des Absenders";
+App::$strings["Test mode (only send to hub administrator)"] = "Test Modus (nur an Hub Administratoren senden)";
+App::$strings["Post to Insanejournal"] = "Bei InsaneJournal veröffentlichen";
+App::$strings["Enable InsaneJournal Post Plugin"] = "Aktiviere das InsaneJournal Plugin";
+App::$strings["InsaneJournal username"] = "InsaneJournal-Benutzername";
+App::$strings["InsaneJournal password"] = "InsaneJournal-Passwort";
+App::$strings["Post to InsaneJournal by default"] = "Standardmäßig bei InsaneJournal veröffentlichen";
+App::$strings["InsaneJournal Post Settings"] = "InsaneJournal-Beitragseinstellungen";
+App::$strings["Insane Journal Settings saved."] = "InsaneJournal-Einstellungen gespeichert.";
+App::$strings["Channels to auto connect"] = "";
+App::$strings["Comma separated list"] = "Kommagetrennte Liste";
+App::$strings["Popular Channels"] = "Beliebte Kanäle";
+App::$strings["IRC Settings"] = "IRC-Einstellungen";
+App::$strings["IRC settings saved."] = "IRC-Einstellungen gespeichert.";
+App::$strings["IRC Chatroom"] = "IRC-Chatraum";
+App::$strings["Status:"] = "Status:";
+App::$strings["Activate addon"] = "Addon aktiviren";
+App::$strings["Hide Jappixmini Chat-Widget from the webinterface"] = "Jappix Mini Chat-Widget von der Weboberfläche verbergen";
+App::$strings["Jabber username"] = "Jabber-Benutzername";
+App::$strings["Jabber server"] = "Jabber-Server";
+App::$strings["Jabber BOSH host URL"] = "Jabber BOSH Host URL";
+App::$strings["Jabber password"] = "Jabber-Passwort";
+App::$strings["Encrypt Jabber password with Hubzilla password"] = "Jabber-Passwort mit Hubzilla-Passwort verschlüsseln";
+App::$strings["Hubzilla password"] = "Hubzilla-Passwort";
+App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "";
+App::$strings["Purge internal list of jabber addresses of contacts"] = "Interne Liste der Jabber Adressen von Kontakten löschen";
+App::$strings["Configuration Help"] = "Konfigurationshilfe";
+App::$strings["Add Contact"] = "Kontakt hinzufügen";
+App::$strings["Jappix Mini Settings"] = "Jappix Mini Einstellungen";
+App::$strings["Upload a file"] = "Datei hochladen";
+App::$strings["Drop files here to upload"] = "Dateien zum Hochladen hier fallen lassen";
+App::$strings["Failed"] = "Fehlgeschlagen";
+App::$strings["No files were uploaded."] = "Es wurden keine Dateien hochgeladen.";
+App::$strings["Uploaded file is empty"] = "Hochgeladene Datei ist leer";
+App::$strings["Image exceeds size limit of "] = "Bild überschreitet Größenbeschränkung von ";
+App::$strings["File has an invalid extension, it should be one of "] = "Die Datei hat eine ungültige Endung. Erlaubt sind folgende:";
+App::$strings["Upload was cancelled, or server error encountered"] = "Das Hochladen wurde abgebrochen oder es ist ein Serverfehler aufgetreten.";
+App::$strings["An account has been created for you."] = "Ein Konto wurde für Sie erstellt.";
+App::$strings["Authentication successful but rejected: account creation is disabled."] = "Authentifizierung war erfolgreich wurde aber abgewiesen! Das Anlegen von Accounts wurde deaktiviert.";
+App::$strings["Post to Libertree"] = "Bei Libertree veröffentlichen";
+App::$strings["Enable Libertree Post Plugin"] = "Aktivire das Libertree-Plugin";
+App::$strings["Libertree API token"] = "Libertree API Token";
+App::$strings["Libertree site URL"] = "URL der Libertree Seite";
+App::$strings["Post to Libertree by default"] = "Standardmäßig bei Libertree veröffentlichen";
+App::$strings["Libertree Post Settings"] = "Libertree-Beitragseinstellungen";
+App::$strings["Libertree Settings saved."] = "Libertree-Einstellungen gespeichert.";
+App::$strings["Post to LiveJournal"] = "Bei LiveJurnal veröffentlichen";
+App::$strings["Enable LiveJournal Post Plugin"] = "Aktiviere das LiveJurnal Plugin";
+App::$strings["LiveJournal username"] = "LiveJournal-Benutzername";
+App::$strings["LiveJournal password"] = "LiveJournal-Passwort";
+App::$strings["Post to LiveJournal by default"] = "Standardmäßig bei LiveJurnal veröffentlichen";
+App::$strings["LiveJournal Post Settings"] = "LiveJournal-Beitragseinstellungen";
+App::$strings["LiveJournal Settings saved."] = "LiveJournal-Einstellungen gespeichert.";
+App::$strings["Logfile archive directory"] = "Verzeichnis der Logdatei";
+App::$strings["Directory to store rotated logs"] = "Verzeichnis, in dem rotierte Logs gespeichert werden sollen";
+App::$strings["Logfile size in bytes before rotating"] = "zu erreichende Logdateigröße in Bytes, bevor rotiert wird";
+App::$strings["Number of logfiles to retain"] = "Anzahl aufzubewahrender rotierter Logdateien";
+App::$strings["Email notification hub"] = "Hub für E-Mail-Benachrichtigungen";
+App::$strings["Hostname"] = "Servername";
+App::$strings["Mailhost Settings"] = "Mailhost-Einstellungen";
+App::$strings["MAILHOST Settings saved."] = "MAILHOST-Einstellungen gespeichert.";
+App::$strings["lonely"] = "einsam";
+App::$strings["drunk"] = "betrunken";
+App::$strings["horny"] = "geil";
+App::$strings["stoned"] = "bekifft";
+App::$strings["fucked up"] = "beschissen";
+App::$strings["clusterfucked"] = "clusterfucked";
+App::$strings["crazy"] = "verrückt";
+App::$strings["hurt"] = "verletzt";
+App::$strings["sleepy"] = "müde";
+App::$strings["grumpy"] = "mürrisch";
+App::$strings["high"] = "hoch";
+App::$strings["semi-conscious"] = "halb bewusstlos";
+App::$strings["in love"] = "verliebt";
+App::$strings["in lust"] = "";
+App::$strings["naked"] = "nackt";
+App::$strings["stinky"] = "stinkend";
+App::$strings["sweaty"] = "verschwitzt";
+App::$strings["bleeding out"] = "blutend";
+App::$strings["victorious"] = "siegreich";
+App::$strings["defeated"] = "besiegt";
+App::$strings["envious"] = "neidisch";
+App::$strings["jealous"] = "eifersüchtig";
+App::$strings["bitchslap"] = "Ohrfeige";
+App::$strings["bitchslapped"] = "geohrfeigt";
+App::$strings["shag"] = "bumsen";
+App::$strings["shagged"] = "gebumst";
+App::$strings["patent"] = "Patent";
+App::$strings["patented"] = "patentiert";
+App::$strings["hug"] = "umarmen";
+App::$strings["hugged"] = "umarmt";
+App::$strings["murder"] = "ermorden";
+App::$strings["murdered"] = "ermordet";
+App::$strings["worship"] = "";
+App::$strings["worshipped"] = "";
+App::$strings["kiss"] = "küssen";
+App::$strings["kissed"] = "geküsst";
+App::$strings["tempt"] = "verlocken";
+App::$strings["tempted"] = "verlockt";
+App::$strings["raise eyebrows at"] = "";
+App::$strings["raised their eyebrows at"] = "";
+App::$strings["insult"] = "beleidigen";
+App::$strings["insulted"] = "beleidigt";
+App::$strings["praise"] = "loben";
+App::$strings["praised"] = "gelobt";
+App::$strings["be dubious of"] = "";
+App::$strings["was dubious of"] = "";
+App::$strings["eat"] = "essen";
+App::$strings["ate"] = "aß";
+App::$strings["giggle and fawn at"] = "";
+App::$strings["giggled and fawned at"] = "";
+App::$strings["doubt"] = "anzweifeln";
+App::$strings["doubted"] = "angezweifelt";
+App::$strings["glare"] = "";
+App::$strings["glared at"] = "";
+App::$strings["fuck"] = "ficken";
+App::$strings["fucked"] = "gefickt";
+App::$strings["bonk"] = "";
+App::$strings["bonked"] = "";
+App::$strings["declare undying love for"] = "";
+App::$strings["declared undying love for"] = "";
+App::$strings["Save Settings"] = "Einstellungen speichern";
+App::$strings["text to include in all outgoing posts from this site"] = "Test der in alle Beiträge angefügt werden soll, die von dieser Seite ausgehen";
+App::$strings["Federate"] = "";
+App::$strings["nofed Settings saved."] = "nofed Einstellungen gespeichert";
+App::$strings["Allow Federation Toggle"] = "";
+App::$strings["Federate posts by default"] = "";
+App::$strings["NoFed Settings"] = "NoFed-Einstellungen";
+App::$strings["Nsabait Settings updated."] = "Nsabait-Einstellungen aktualisiert.";
+App::$strings["Enable NSAbait Plugin"] = "";
+App::$strings["NSAbait Settings"] = "NSAbait-Einstellungen";
+App::$strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";
+App::$strings["Enable Content filter"] = "Inhaltsfilter aktivieren";
+App::$strings["Comma separated list of keywords to hide"] = "";
+App::$strings["Use /expression/ to provide regular expressions"] = "";
+App::$strings["Not Safe For Work Settings"] = "Not Safe For Work Einstellungen";
+App::$strings["General Purpose Content Filter"] = "Allzweck-Inhaltsfilter";
+App::$strings["NSFW Settings saved."] = "NSFW-Einstellungen gespeichert.";
+App::$strings["Possible adult content"] = "Möglicherweise nicht jugendfreie Inhalte";
+App::$strings["%s - click to open/close"] = "%s - zum öffnen/schließen anklicken";
+App::$strings["System defaults:"] = "Systemstandardeinstellungen:";
+App::$strings["Preferred Clipart IDs"] = "";
+App::$strings["List of preferred clipart ids. These will be shown first."] = "";
+App::$strings["Default Search Term"] = "";
+App::$strings["The default search term. These will be shown second."] = "";
+App::$strings["Return After"] = "";
+App::$strings["Page to load after image selection."] = "";
App::$strings["Edit Profile"] = "Profile bearbeiten";
-App::$strings["Edit your profile"] = "Profil bearbeiten";
-App::$strings["Your photos"] = "Deine Bilder";
-App::$strings["Your files"] = "Deine Dateien";
-App::$strings["Your chatrooms"] = "Deine Chaträume";
-App::$strings["Bookmarks"] = "Lesezeichen";
-App::$strings["Your bookmarks"] = "Deine Lesezeichen";
-App::$strings["Your webpages"] = "Deine Webseiten";
-App::$strings["Your wiki"] = "Dein Wiki";
-App::$strings["Sign in"] = "Anmelden";
-App::$strings["%s - click to logout"] = "%s - Klick zum Abmelden";
-App::$strings["Remote authentication"] = "Über Konto auf anderem Server einloggen";
-App::$strings["Click to authenticate to your home hub"] = "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren";
-App::$strings["Home Page"] = "Homepage";
-App::$strings["Create an account"] = "Erzeuge ein Konto";
-App::$strings["Help and documentation"] = "Hilfe und Dokumentation";
-App::$strings["Applications, utilities, links, games"] = "Anwendungen (Apps), Zubehör, Links, Spiele";
-App::$strings["Search site @name, #tag, ?docs, content"] = "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt";
-App::$strings["Channel Directory"] = "Kanal-Verzeichnis";
-App::$strings["Your grid"] = "Dein Grid";
-App::$strings["Mark all grid notifications seen"] = "Alle Grid-Benachrichtigungen als angesehen markieren";
-App::$strings["Channel home"] = "Mein Kanal";
-App::$strings["Mark all channel notifications seen"] = "Markiere alle Kanal-Benachrichtigungen als angesehen";
-App::$strings["Notices"] = "Benachrichtigungen";
-App::$strings["Notifications"] = "Benachrichtigungen";
-App::$strings["See all notifications"] = "Alle Benachrichtigungen ansehen";
-App::$strings["Private mail"] = "Persönliche Mail";
-App::$strings["See all private messages"] = "Alle persönlichen Nachrichten ansehen";
-App::$strings["Mark all private messages seen"] = "Markiere alle persönlichen Nachrichten als gesehen";
-App::$strings["Inbox"] = "Eingang";
-App::$strings["Outbox"] = "Ausgang";
-App::$strings["New Message"] = "Neue Nachricht";
-App::$strings["Event Calendar"] = "Terminkalender";
-App::$strings["See all events"] = "Alle Termine ansehen";
-App::$strings["Mark all events seen"] = "Markiere alle Termine als gesehen";
-App::$strings["Manage Your Channels"] = "Verwalte Deine Kanäle";
-App::$strings["Account/Channel Settings"] = "Konto-/Kanal-Einstellungen";
-App::$strings["Admin"] = "Administration";
-App::$strings["Site Setup and Configuration"] = "Seiten-Einrichtung und -Konfiguration";
-App::$strings["Loading..."] = "Lädt ...";
-App::$strings["@name, #tag, ?doc, content"] = "@Name, #Schlagwort, ?Dokumentation, Inhalt";
-App::$strings["Please wait..."] = "Bitte warten...";
-App::$strings["Embedded content"] = "Eingebetteter Inhalt";
-App::$strings["Embedding disabled"] = "Einbetten deaktiviert";
-App::$strings["Can view my normal stream and posts"] = "Kann meine normalen Beiträge sehen";
-App::$strings["Can view my webpages"] = "Kann meine Webseiten sehen";
-App::$strings["Can post on my channel page (\"wall\")"] = "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen";
-App::$strings["Can like/dislike stuff"] = "Kann andere Elemente mögen/nicht mögen";
-App::$strings["Profiles and things other than posts/comments"] = "Profile und alles außer Beiträge und Kommentare";
-App::$strings["Can forward to all my channel contacts via post @mentions"] = "Kann an alle meine Kontakte via @-Erwähnung Nachrichten weiterleiten";
-App::$strings["Advanced - useful for creating group forum channels"] = "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen";
-App::$strings["Can chat with me (when available)"] = "Kann mit mir chatten (wenn verfügbar)";
-App::$strings["Can write to my file storage and photos"] = "Kann in meine Datei- und Bilderordner schreiben";
-App::$strings["Can edit my webpages"] = "Kann meine Webseiten bearbeiten";
-App::$strings["Somewhat advanced - very useful in open communities"] = "Etwas fortgeschritten – sehr nützlich in offenen Gemeinschaften";
-App::$strings["Can administer my channel resources"] = "Kann meine Kanäle administrieren";
-App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Sehr fortgeschritten. Bearbeite das nur, wenn Du genau weißt, was Du tust";
-App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kann keinen doppelten Kanal-Identifikator auf diesem System erzeugen (Spitzname oder Hash schon belegt). Import fehlgeschlagen.";
-App::$strings["Channel clone failed. Import failed."] = "Klonen des Kanals fehlgeschlagen. Import fehlgeschlagen.";
-App::$strings["Unable to import element \""] = "";
-App::$strings["(Unknown)"] = "(Unbekannt)";
-App::$strings["Visible to anybody on the internet."] = "Für jeden im Internet sichtbar.";
-App::$strings["Visible to you only."] = "Nur für Dich sichtbar.";
-App::$strings["Visible to anybody in this network."] = "Für jedes \$Projectname-Mitglied sichtbar.";
-App::$strings["Visible to anybody authenticated."] = "Für jeden sichtbar, der angemeldet ist.";
-App::$strings["Visible to anybody on %s."] = "Für jeden auf %s sichtbar.";
-App::$strings["Visible to all connections."] = "Für alle Verbindungen sichtbar.";
-App::$strings["Visible to approved connections."] = "Nur für akzeptierte Verbindungen sichtbar.";
-App::$strings["Visible to specific connections."] = "Sichtbar für bestimmte Verbindungen.";
-App::$strings["Privacy group is empty."] = "Gruppe ist leer.";
-App::$strings["Privacy group: %s"] = "Gruppe: %s";
-App::$strings["Connection not found."] = "Die Verbindung wurde nicht gefunden.";
-App::$strings["profile photo"] = "Profilfoto";
+App::$strings["Profile List"] = "Profilliste";
+App::$strings["Order of Preferred"] = "Bevorzugte Reihenfolge";
+App::$strings["Sort order of preferred clipart ids."] = "";
+App::$strings["Newest first"] = "Neueste zuerst";
+App::$strings["As entered"] = "Wie eingegeben";
+App::$strings["Order of other"] = "";
+App::$strings["Sort order of other clipart ids."] = "";
+App::$strings["Most downloaded first"] = "Meist heruntergeladene zuerst";
+App::$strings["Most liked first"] = "Beliebteste zuerst";
+App::$strings["Preferred IDs Message"] = "";
+App::$strings["Message to display above preferred results."] = "";
+App::$strings["Uploaded by: "] = "Hochgeladen von: ";
+App::$strings["Drawn by: "] = "Gezeichnet von: ";
+App::$strings["Or select from a free OpenClipart.org image:"] = "";
+App::$strings["Search Term"] = "Suchbegriff";
+App::$strings["Unknown error. Please try again later."] = "Unbekannter Fehler. Bitte versuchen Sie es später erneut.";
+App::$strings["Profile photo updated successfully."] = "Profilfoto erfolgreich aktualisiert.";
+App::$strings["View Larger"] = "Größer anzeigen";
+App::$strings["Tile Server URL"] = "Kachelserver-URL";
+App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "Eine Liste <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">öffentlicher Kachelserver</a>";
+App::$strings["Nominatim (reverse geocoding) Server URL"] = "Nominatim (reverse Geokodierung) Server URL";
+App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">Nominatim servers</a>"] = "Eine Liste der <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">Nominatim Server</a>";
+App::$strings["Default zoom"] = "Standardzoom";
+App::$strings["The default zoom level. (1:world, 18:highest, also depends on tile server)"] = "Die Standard-Vergrößerungsstufe (1:Welt, 18:höchste, hängt außerdem vom Kachelserver ab).";
+App::$strings["Include marker on map"] = "Markierung auf der Karte einschließen";
+App::$strings["Include a marker on the map."] = "Binde eine Markierung auf der Karte ein.";
+App::$strings["Message to display on every page on this server"] = "Nachricht, die auf jeder Seite dieses Servers angezeigt werden soll";
+App::$strings["Pageheader Settings"] = "Nachrichtenkopf-Einstellungen";
+App::$strings["pageheader Settings saved."] = "Nachrichtenkopf-Einstellungen gespeichert.";
+App::$strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Diese Website verwendet <a href='http://www.piwik.org'>Piwik</a>, um die Besucherzugriffe auszuwerten.";
+App::$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 möchtest, dass Deine Besuche zu diesem Zweck gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen, welches Piwik davon abhält, Deine weiteren Besuche auf dieser Website zu verfolgen</a> (Opt-out).";
+App::$strings["Piwik Base URL"] = "Piwik Basis-URL";
+App::$strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Der absolute Pfad zu Deiner Piwik-Installation (ohne Protokoll (http/s), aber mit abschließendem Schrägstrich / ).";
+App::$strings["Site ID"] = "Seitenkennung";
+App::$strings["Show opt-out cookie link?"] = "Den Opt-out Cookie-Link anzeigen?";
+App::$strings["Asynchronous tracking"] = "Asynchrones Tracking";
+App::$strings["Enable frontend JavaScript error tracking"] = "Ermögliche Frontend-JavaScript-Fehlertracking";
+App::$strings["This feature requires Piwik >= 2.2.0"] = "Diese Funktion erfordert Piwik >= 2.2.0";
+App::$strings["Planets Settings updated."] = "Planeten Einstellungen aktualisiert";
+App::$strings["Enable Planets Plugin"] = "Aktiviere Planeten Plugin";
+App::$strings["Planets Settings"] = "Planeten Einstellungen";
+App::$strings["You are now authenticated to pumpio."] = "Du bist nun bei pumpio authenzifiziert.";
+App::$strings["return to the featured settings page"] = "";
+App::$strings["Post to Pump.io"] = "Bei pumpio veröffentlichen";
+App::$strings["Pump.io servername"] = "Pump.io-Servername";
+App::$strings["Without \"http://\" or \"https://\""] = "Ohne \"http://\" oder \"https://\"";
+App::$strings["Pump.io username"] = "Pump.io-Benutzername";
+App::$strings["Without the servername"] = "Ohne dem Servernamen";
+App::$strings["You are not authenticated to pumpio"] = "Du bist nicht bei pumpio authentifiziert.";
+App::$strings["(Re-)Authenticate your pump.io connection"] = "Deine pumpio Verbindung (erneut) authentifizieren";
+App::$strings["Enable pump.io Post Plugin"] = "Aktiviere das pumpio-Plugin";
+App::$strings["Post to pump.io by default"] = "Standardmäßig bei pumpio veröffentlichen";
+App::$strings["Should posts be public"] = "Sollen die Beiträge öffentlich sein";
+App::$strings["Mirror all public posts"] = "Öffentliche Beiträge spiegeln";
+App::$strings["Pump.io Post Settings"] = "Pump.io-Beitragseinstellungen";
+App::$strings["PumpIO Settings saved."] = "PumpIO-Einstellungen gespeichert.";
+App::$strings["QR code"] = "QR-Code";
+App::$strings["QR Generator"] = "QR-Generator";
+App::$strings["Enter some text"] = "";
+App::$strings["Enable Rainbowtag"] = "Rainbowtag aktivieren";
+App::$strings["Rainbowtag Settings"] = "Rainbowtag-Einstellungen";
+App::$strings["Rainbowtag Settings saved."] = "Rainbowtag-Einstellungen gespeichert.";
+App::$strings["You're welcome."] = "Gern geschehen.";
+App::$strings["Ah shucks..."] = "";
+App::$strings["Don't mention it."] = "Keine Ursache.";
+App::$strings["&lt;blush&gt;"] = "";
+App::$strings["Redmatrix File Storage Import"] = "";
+App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Hiermit werden alle deine Daten aus der Redmatrix Cloud in diesen Kanal importiert.";
+App::$strings["Redmatrix Server base URL"] = "Basis-URL des Redmatrix Servers";
+App::$strings["Redmatrix Login Username"] = "Redmatrix-Anmeldebenutzername";
+App::$strings["Redmatrix Login Password"] = "Redmatrix-Anmeldepasswort";
+App::$strings["file"] = "Datei";
+App::$strings["Photos imported"] = "Fotos importiert";
+App::$strings["Redmatrix Photo Album Import"] = "Redmatrix-Fotoalbumimport";
+App::$strings["This will import all your Redmatrix photo albums to this channel."] = "Hiermit werden all deine Fotoalben von Redmatrix in diesen Kanal importiert.";
+App::$strings["Import just this album"] = "Nur dieses Album importieren";
+App::$strings["Leave blank to import all albums"] = "Leer lassen um alle Alben zu importieren";
+App::$strings["Maximum count to import"] = "Maximal zu importierende Anzahl";
+App::$strings["0 or blank to import all available"] = "0 oder leer lassen um alles zu importieren";
+App::$strings["Post to Red"] = "";
+App::$strings["Channel is required."] = "Kanal ist erforderlich.";
+App::$strings["Invalid channel."] = "Ungültiger Kanal.";
+App::$strings["redred Settings saved."] = "redred-Einstellungen gespeichert.";
+App::$strings["Allow posting to another Hubzilla Channel"] = "Erlaube die Veröffentlichung in anderen Hubzilla Kanälen";
+App::$strings["Send public postings to Hubzilla channel by default"] = "";
+App::$strings["Hubzilla API Path"] = "Hubzilla-API-Pfad";
+App::$strings["https://{sitename}/api"] = "https://{sitename}/api";
+App::$strings["Hubzilla login name"] = "Hubzilla-Anmeldename";
+App::$strings["Hubzilla channel name"] = "Hubzilla-Kanalname";
+App::$strings["Nickname"] = "Spitzname";
+App::$strings["Hubzilla Crosspost Settings"] = "";
+App::$strings["Post to Friendica"] = "Bei Friendica veröffentlichen";
+App::$strings["rtof Settings saved."] = "rtof-Einstellungen gespeichert.";
+App::$strings["Allow posting to Friendica"] = "Erlaube die Veröffentlichung bei Friendica";
+App::$strings["Send public postings to Friendica by default"] = "Standardmäßig öffentliche Beiträge bei Friendica veröffentlichen";
+App::$strings["Friendica API Path"] = "Friendica-API-Pfad";
+App::$strings["Friendica login name"] = "Friendica-Anmeldename";
+App::$strings["Friendica password"] = "Friendica-Passwort";
+App::$strings["Hubzilla to Friendica Post Settings"] = "";
+App::$strings["Extended Identity Sharing"] = "Erweitertes Teilen von Identitäten";
+App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "";
+App::$strings["Some setting"] = "";
+App::$strings["A setting"] = "Eine Einstellung";
+App::$strings["Skeleton Settings"] = "";
+App::$strings["Deactivate the feature"] = "Diese Funktion abschalten";
+App::$strings["Hide the button and show the smilies directly."] = "Verstecke die Schaltfläche und zeige die Smilies direkt an.";
+App::$strings["Smileybutton Settings"] = "Smileyknopf-Einstellungen";
+App::$strings["Page to load after login"] = "Seite, die nach dem Login geladen werden soll";
+App::$strings["Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave blank for default network page (grid)."] = "Beispiele: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (Gruppen-gefilterte Beiträge), &quot;channel&quot; oder &quot;notifications/system&quot; (freilassen für die Standard-Netzwerkseite (grid).";
+App::$strings["Startpage Settings"] = "Startseiteneinstellungen";
+App::$strings["Post to GNU social"] = "Bei GNU social veröffentlichen";
+App::$strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Bitte kontaktiere den Administrator deines Hubs.<br />Die angegebene API URL ist nicht korrekt.";
+App::$strings["We could not contact the GNU social API with the Path you entered."] = "Mit dem angegebenen Pfad war es uns nicht möglich, die GNU social API zu erreichen.";
+App::$strings["GNU social settings updated."] = "GNU social Einstellungen aktualisiert.";
+App::$strings["Globally Available GNU social OAuthKeys"] = "Global verfügbare GNU social OAuthKeys";
+App::$strings["There are preconfigured OAuth key pairs for some GNU social servers available. If you are using one of them, please use these credentials.<br />If not feel free to connect to any other GNU social instance (see below)."] = "";
+App::$strings["Provide your own OAuth Credentials"] = "";
+App::$strings["No consumer key pair for GNU social found. Register your Hubzilla Account as an desktop client on your GNU social 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 Hubzilla installation at your favourite GNU social installation."] = "";
+App::$strings["OAuth Consumer Key"] = "OAuth Consumer Key";
+App::$strings["OAuth Consumer Secret"] = "OAuth Consumer Secret";
+App::$strings["Base API Path"] = "Basis Pfad der API";
+App::$strings["Remember the trailing /"] = "Denke an das abschließende /";
+App::$strings["GNU social application name"] = "GNU social Anwendungsname";
+App::$strings["To connect to your GNU social account click the button below to get a security code from GNU social which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to GNU social."] = "";
+App::$strings["Log in with GNU social"] = "Mit GNU social anmelden";
+App::$strings["Copy the security code from GNU social here"] = "Kopiere den Sicherheitscode von GNU social hier her";
+App::$strings["Cancel Connection Process"] = "Verbindungsprozes abbrechen";
+App::$strings["Current GNU social API is"] = "Aktuelle GNU social API ist";
+App::$strings["Cancel GNU social Connection"] = "GNU social Verbindung trennen";
+App::$strings["Currently connected to: "] = "Momentan verbunden mit:";
+App::$strings["<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to GNU social will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "";
+App::$strings["Allow posting to GNU social"] = "Erlaube die Veröffentlichung bei GNU social";
+App::$strings["If enabled your public postings can be posted to the associated GNU-social account"] = "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen GNU social Account veröffentlicht werden.";
+App::$strings["Post to GNU social by default"] = "Standardmäßig bei GNU social veröffentlichen";
+App::$strings["If enabled your public postings will be posted to the associated GNU-social account by default"] = "Wenn aktiv werden all deine öffentlichen Beiträge standardmäßig bei dem verbundenen GNU social Account veröffentlicht.";
+App::$strings["Clear OAuth configuration"] = "OAuth Konfiguration löschen";
+App::$strings["GNU social Post Settings"] = "GNU social Einstellungen";
+App::$strings["API URL"] = "API-URL";
+App::$strings["Application name"] = "Anwendungsname";
+App::$strings["Currently blocked"] = "Derzeit blockiert";
+App::$strings["No channels currently blocked"] = "Momentan sind keine Kanäle blockiert";
+App::$strings["\"Superblock\" Settings"] = "\"Superblock\"-Einstellungen";
+App::$strings["Block Completely"] = "Vollständig blockieren";
+App::$strings["superblock settings updated"] = "Superblock Einstellungen aktualisiert";
+App::$strings["Your account on %s will expire in a few days."] = "Dein Account auf %s wird in ein paar Tagen ablaufen.";
+App::$strings["Your $Productname test account is about to expire."] = "Dein $Productname Test-Account wird bald auslaufen.";
+App::$strings["Three Dimensional Tic-Tac-Toe"] = "Dreidimensionales Tic-Tac-Toe";
+App::$strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
+App::$strings["New game"] = "Neues Spiel";
+App::$strings["New game with handicap"] = "Neues Handicaü-Spiel";
+App::$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 funktioniert wie das ursprüngliche Spiel, nur dass es auf mehreren Ebenen gleichzeitig gespielt wird.";
+App::$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. Du gewinnst, wenn es dir gelingt drei in einer Reihe auf einer beliebigen Ebene oder diagonal über die verschiedenen Ebenen hinweg zu erreichen.";
+App::$strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Bei einem Handicap-Spiel wird die Position im Zentrum der mittleren Ebene gesperrt, da der Spieler der dieses Feld für sich beansprucht meist einen unfairen Vorteil hat.";
+App::$strings["You go first..."] = "Du darfst anfangen...";
+App::$strings["I'm going first this time..."] = "Diesmal werde ich anfangen...";
+App::$strings["You won!"] = "Sie haben gewonnen!";
+App::$strings["\"Cat\" game!"] = "";
+App::$strings["I won!"] = "Ich habe gewonnen!";
+App::$strings["Edit your profile and change settings."] = "Bearbeite dein Profil und ändere die Einstellungen.";
+App::$strings["Click here to see activity from your connections."] = "Klicke hier, um die Aktivitäten Deiner Verbindungen zu sehen.";
+App::$strings["Click here to see your channel home."] = "Klicke hier, um Deine Kanal-Hauptseite zu sehen.";
+App::$strings["You can access your private messages from here."] = "Hierüber kannst Du auf Deine privaten Nachrichten zugreifen.";
+App::$strings["Create new events here."] = "Neue Termine hier erstellen";
+App::$strings["You can accept new connections and change permissions for existing ones here. You can also e.g. create groups of contacts."] = "Du kannst hier neue Verbindungen akzeptieren sowie die Einstellungen bereits vorhandener Vebindungen bearbeiten. Außerdem kannst Du Verbindungen in Gruppen zusammenfassen.";
+App::$strings["System notifications will arrive here"] = "Systembenachrichtigungen werden hier eintreffen";
+App::$strings["Search for content and users"] = "Nach Inhalt von Benutzern suchen";
+App::$strings["Browse for new contacts"] = "Schaue nach möglichen neuen Verbindungen.";
+App::$strings["Launch installed apps"] = "Installierte Apps starten";
+App::$strings["Looking for help? Click here."] = "Du benötigst Hilfe? Klicke hier.";
+App::$strings["New events have occurred in your network. Click here to see what has happened!"] = "In Deinem Netzwerk gibt es neue Ereignisse. Klicke hier, um zu sehen, was passiert ist!";
+App::$strings["You have received a new private message. Click here to see from who!"] = "Du hast eine neue private Nachricht erhalten. Klicke hier, um zu sehen, von wem!";
+App::$strings["There are events this week. Click here too see which!"] = "Es gibt neue Termine diese Woche. Klicke hier, um zu sehen, welche!";
+App::$strings["You have received a new introduction. Click here to see who!"] = "Du hast eine neue Verbindungsanfrage erhalten. Klicke hier, um zu sehen, wer es ist!";
+App::$strings["There is a new system notification. Click here to see what has happened!"] = "Es gibt eine neue Systembenachrichtigung. Klicke hier, um zu sehen, was passiert ist!";
+App::$strings["Click here to share text, images, videos and sound."] = "Klicke hier, um Texte, Bilder, Videos und Klänge zu teilen.";
+App::$strings["You can write an optional title for your update (good for long posts)."] = "Du kannst Deinem Beitrag einen optionalen Titel geben (gut für lange Beiträge).";
+App::$strings["Entering some categories here makes it easier to find your post later."] = "Ein paar Kategorien hier einzugeben, macht es leichter, Deinen Beitrag später wiederzufinden.";
+App::$strings["Share photos, links, location, etc."] = "Teile Photos, Links, Standort, usw.";
+App::$strings["Only want to share content for a while? Make it expire at a certain date."] = "Du möchtest diesen Inhalt nur für eine Weile teilen? Dann lass ihn zu einem bestimmten Datum ablaufen.";
+App::$strings["You can password protect content."] = "Du kannst Inhalte mit einem Passwort schützen.";
+App::$strings["Choose who you share with."] = "Wähle aus, mit wem Du teilen möchtest.";
+App::$strings["Click here when you are done."] = "Klicke hier, wenn Du fertig bist.";
+App::$strings["Adjust from which channels posts should be displayed."] = "Lege fest, von welchen Kanälen Beiträge angezeigt werden sollen.";
+App::$strings["Only show posts from channels in the specified privacy group."] = "Zeige nur Beträge von Kanälen, die in einer bestimmten Gruppe sind.";
+App::$strings["Easily find posts containing tags (keywords preceded by the \"#\" symbol)."] = "Finde Beiträge, die bestimmte Tags enthalten (Stichworte, die mit dem \"#\"-Symbol beginnen).";
+App::$strings["Easily find posts in given category."] = "Finde Beiträge in bestimmten Kategorien.";
+App::$strings["Easily find posts by date."] = "Finde Beiträge anhand des Datums.";
+App::$strings["Suggested users who have volounteered to be shown as suggestions, and who we think you might find interesting."] = "Vorgeschlagene Kanäle, die in ihren Einstellungen zugestimmt haben, als Vorschläge angezeigt zu werden, und die Du eventuell interessant finden könntest.";
+App::$strings["Here you see channels you have connected to."] = "Hier siehst du die Kanäle, mit denen Du verbunden bist.";
+App::$strings["Save your search so you can repeat it at a later date."] = "Speichere Deine Suche, so dass Du sie später leicht erneut durchführen kannst.";
+App::$strings["If you see this icon you can be sure that the sender is who it say it is. It is normal that it is not always possible to verify the sender, so the icon will be missing sometimes. There is usually no need to worry about that."] = "Wenn Du dieses Symbol siehst, kannst Du weitgehend sicher sein, dass der Ansender dem angegebenen entspricht. Nicht immer ist es möglich, den Absender zu verifizieren, daher fehlt das Symbol mitunter. Das ist aber in der Regel kein Grund zur Sorge.";
+App::$strings["Danger! It seems someone tried to forge a message! This message is not necessarily from who it says it is from!"] = "Vorsicht! Es kann sein, dass jemand versucht, eine Nachricht zu fälschen! Diese Nachricht muss nicht unbedingt vom angegebenen Absender stammen!";
+App::$strings["Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can pause it at any time and continue where you left off by reloading the page, or navigting to another page.</p><p>You can also advance by pressing the return key"] = "Willkommen zu Hubzilla! Möchtest Du eine Tour der Benutzeroberfläche angezeigt bekommen?</p><p>Du kannst zu jeder Zeit pausieren und fortsetzen, wo Du aufgehört hast, indem Du die Seite neu lädtst, oder zu einer anderen Seite springst.</p><p>Du kannst auc durch das Drücken der Enter-Taste weitergehen.";
+App::$strings["Post to Twitter"] = "Bei Twitter veröffentlichen";
+App::$strings["Twitter settings updated."] = "Twitter-Einstellungen aktualisiert.";
+App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "";
+App::$strings["At this Hubzilla 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."] = "";
+App::$strings["Log in with Twitter"] = "Mit Twitter anmelden";
+App::$strings["Copy the PIN from Twitter here"] = "PIN von Twitter hier her kopieren";
+App::$strings["<strong>Note:</strong> Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "";
+App::$strings["Allow posting to Twitter"] = "Erlaube die Veröffentlichung bei Twitter";
+App::$strings["If enabled your public postings can be posted to the associated Twitter account"] = "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twitter Account veröffentlicht werden.";
+App::$strings["Send public postings to Twitter by default"] = "Standardmäßig öffentliche Beiträge bei Twitter veröffentlichen";
+App::$strings["If enabled your public postings will be posted to the associated Twitter account by default"] = "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twitter Account veröffentlicht werden.";
+App::$strings["Twitter Post Settings"] = "Twitter-Beitragseinstellungen";
+App::$strings["Submit Settings"] = "Einstellungen absenden";
+App::$strings["Show Upload Limits"] = "Hochladebeschränkungen anzeigen";
+App::$strings["Hubzilla configured maximum size: "] = "Die in Hubzilla eingestellte maximale Größe:";
+App::$strings["PHP upload_max_filesize: "] = "PHP upload_max_filesize:";
+App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] = "PHP post_max_size (muss größer sein als upload_max_filesize):";
+App::$strings["Recent Channel/Profile Viewers"] = "Kürzliche Kanal/Profil Besucher";
+App::$strings["This plugin/addon has not been configured."] = "Dieses Plugin/Addon wurde noch nicht konfiguriert.";
+App::$strings["Please visit the Visage settings on %s"] = "Bitte rufe die Visage Einstellungen auf %s auf";
+App::$strings["your feature settings page"] = "";
+App::$strings["No entries."] = "Keine Einträge.";
+App::$strings["Enable Visage Visitor Logging"] = "Aktiviere das Visage-Besucher Logging";
+App::$strings["Visage Settings"] = "Visage-Einstellungen";
+App::$strings["Who likes me?"] = "Wer mag mich?";
+App::$strings["Post to WordPress"] = "Auf WordPress posten";
+App::$strings["Enable WordPress Post Plugin"] = "Aktiviere das WordPress-Plugin";
+App::$strings["WordPress username"] = "WordPress-Benutzername";
+App::$strings["WordPress password"] = "WordPress-Passwort";
+App::$strings["WordPress API URL"] = "WordPress-API-URL";
+App::$strings["Typically https://your-blog.tld/xmlrpc.php"] = "Normalerweise https://your-blog.tld/xmlrpc.php";
+App::$strings["WordPress blogid"] = "WordPress blogid";
+App::$strings["For multi-user sites such as wordpress.com, otherwise leave blank"] = "Nötig für Mehrbenutzer Seiten wie wordpress.com, andernfalls frei lassen";
+App::$strings["Post to WordPress by default"] = "Standardmäßig auf auf WordPress posten";
+App::$strings["Forward comments (requires hubzilla_wp plugin)"] = "Kommentare weiterleiten (benötigt hubzilla_wp Plugin)";
+App::$strings["WordPress Post Settings"] = "WordPress-Beitragseinstellungen";
+App::$strings["Wordpress Settings saved."] = "Wordpress-Einstellungen gespeichert.";
+App::$strings["XMPP settings updated."] = "XMPP-Einstellungen aktualisiert.";
+App::$strings["Enable Chat"] = "Chat aktivieren";
+App::$strings["Individual credentials"] = "Individuelle Anmeldedaten";
+App::$strings["Jabber BOSH server"] = "Jabber BOSH Server";
+App::$strings["XMPP Settings"] = "XMPP-Einstellungen";
+App::$strings["Jabber BOSH host"] = "Jabber BOSH Host";
+App::$strings["Use central userbase"] = "Zentrale Benutzerbasis verwenden";
+App::$strings["If enabled, members will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the \"auth_ejabberd.php\" script."] = "";
+App::$strings["Select Channel"] = "Kanal auswählen";
+App::$strings["Read-write"] = "Lesen-schreiben";
+App::$strings["Read-only"] = "Nur Lesen";
+App::$strings["My Calendars"] = "Meine Kalender";
+App::$strings["Shared Calendars"] = "Geteilte Kalender";
+App::$strings["Share this calendar"] = "Diesen Kalender teilen";
+App::$strings["Calendar name and color"] = "Kalendername und -farbe";
+App::$strings["Create new calendar"] = "Neuen Kalender erstellen";
+App::$strings["Calendar Name"] = "Kalendername";
+App::$strings["Calendar Tools"] = "Kalenderwerkzeuge";
+App::$strings["Import calendar"] = "Kalender importieren";
+App::$strings["Select a calendar to import to"] = "Kalender zum Hineinimportieren auswählen";
+App::$strings["Addressbooks"] = "Adressbücher";
+App::$strings["Addressbook name"] = "Adressbuchname";
+App::$strings["Create new addressbook"] = "Neues Adressbuch erstellen";
+App::$strings["Addressbook Name"] = "Adressbuchname";
+App::$strings["Addressbook Tools"] = "Adressbuchwerkzeuge";
+App::$strings["Import addressbook"] = "Adressbuch importieren";
+App::$strings["Select an addressbook to import to"] = "Adressbuch zum Hineinimportieren auswählen";
+App::$strings["Errors encountered creating database table: "] = "";
+App::$strings["Default Calendar"] = "Standardkalender";
+App::$strings["Default Addressbook"] = "Standardadressbuch";
+App::$strings["CalDAV/CardDAV Settings saved."] = "CalDAV/CardDAV-Einstellungen gespeichert.";
+App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "Aktiviere den CalDAV/CardDAV Server für diesen Kanal";
+App::$strings["Your CalDAV resources are located at %s "] = "Deine CalDAV Resourcen sind unter %s verfügbar";
+App::$strings["Your CardDAV resources are located at %s "] = "Deine CardDAV Ressourcen sind unter %s verfügbar";
+App::$strings["CalDAV/CardDAV Settings"] = "CalDAV/CardDAV-Einstellungen";
+App::$strings["Mobile"] = "Mobil";
+App::$strings["Home"] = "Home";
+App::$strings["Home, Voice"] = "Zuhause, Sprache";
+App::$strings["Home, Fax"] = "Zuhause, Fax";
+App::$strings["Work"] = "Arbeit";
+App::$strings["Work, Voice"] = "Arbeit, Sprache";
+App::$strings["Work, Fax"] = "Arbeit, Fax";
+App::$strings["INVALID EVENT DISMISSED!"] = "UNGÜLTIGEN TERMIN ABGELEHNT!";
+App::$strings["Summary: "] = "Zusammenfassung:";
+App::$strings["Date: "] = "Datum:";
+App::$strings["Reason: "] = "Grund:";
+App::$strings["INVALID CARD DISMISSED!"] = "UNGÜLTIGE KARTE ABGELEHNT!";
+App::$strings["Name: "] = "Name: ";
+App::$strings["You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV Settings before you can use it."] = "";
+App::$strings["Example: YYYY-MM-DD HH:mm"] = "Beispiel: JJJJ-MM-TT HH:mm";
+App::$strings["End date and time"] = "Enddatum und -zeit";
+App::$strings["List month"] = "";
+App::$strings["List week"] = "";
+App::$strings["List day"] = "";
+App::$strings["More"] = "Mehr";
+App::$strings["Less"] = "Weniger";
+App::$strings["Select calendar"] = "Kalender auswählen";
+App::$strings["Delete all"] = "Alles löschen";
+App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert.";
+App::$strings["Organisation"] = "Organisation";
+App::$strings["Title"] = "Titel";
+App::$strings["Phone"] = "Telefon";
+App::$strings["Instant messenger"] = "";
+App::$strings["Website"] = "Webseite";
+App::$strings["Note"] = "Hinweis";
+App::$strings["Add Field"] = "Feld hinzufügen";
+App::$strings["P.O. Box"] = "";
+App::$strings["Additional"] = "Zusätzlich";
+App::$strings["Street"] = "Straße";
+App::$strings["Locality"] = "Ortschaft";
+App::$strings["Region"] = "Region";
+App::$strings["ZIP Code"] = "Postleitzahl";
+App::$strings["Invalid game."] = "Ungültiges Spiel.";
+App::$strings["You are not a player in this game."] = "Sie sind kein Spieler in diesem Spiel.";
+App::$strings["You must be a local channel to create a game."] = "Um ein Spiel zu eröffnen, musst du ein lokaler Kanal sein";
+App::$strings["You must select one opponent that is not yourself."] = "Du musst einen Gegner wählen, der nicht du selbst ist";
+App::$strings["Creating new game..."] = "Neues Spiel wird erstellt...";
+App::$strings["You must select white or black."] = "Sie müssen weiß oder schwarz auswählen.";
+App::$strings["Error creating new game."] = "Fehler beim Erstellen eines neuen Spiels.";
+App::$strings["Requested channel is not available."] = "Angeforderte Kanal nicht verfügbar.";
+App::$strings["You must select a local channel /chess/channelname"] = "Du musst einen lokalen Kanal/Schach(Kanalnamen aufwählen";
+App::$strings["Enable notifications"] = "Benachrichtigungen aktivieren";
+App::$strings["Your Webbie:"] = "Dein Webbie";
+App::$strings["Fontsize (px):"] = "Schriftgröße (px):";
+App::$strings["Link:"] = "Link:";
+App::$strings["Like us on Hubzilla"] = "Like us on Hubzilla";
+App::$strings["Embed:"] = "Einbetten";
+App::$strings["Male"] = "Männlich";
+App::$strings["Female"] = "Weiblich";
+App::$strings["OpenID protocol error. No ID returned."] = "OpenID-Protokollfehler. Keine Kennung zurückgegeben.";
+App::$strings["Login failed."] = "Login fehlgeschlagen.";
+App::$strings["First Name"] = "Vorname";
+App::$strings["Last Name"] = "Nachname";
+App::$strings["Full Name"] = "Voller Name";
+App::$strings["Profile Photo 16px"] = "Profilfoto 16 px";
+App::$strings["Profile Photo 32px"] = "Profilfoto 32 px";
+App::$strings["Profile Photo 48px"] = "Profilfoto 48 px";
+App::$strings["Profile Photo 64px"] = "Profilfoto 64 px";
+App::$strings["Profile Photo 80px"] = "Profilfoto 80 px";
+App::$strings["Profile Photo 128px"] = "Profilfoto 128 px";
+App::$strings["Timezone"] = "Zeitzone";
+App::$strings["Birth Year"] = "Geburtsjahr";
+App::$strings["Birth Month"] = "Geburtsmonat";
+App::$strings["Birth Day"] = "Geburtstag";
+App::$strings["Birthdate"] = "Geburtsdatum";
+App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Wir haben ein Problem mit der OpenID festgestellt, mit der Du Dich anmelden wolltest. Bitte überprüfe sie noch einmal.";
+App::$strings["The error message was:"] = "Die Fehlermeldung war:";
+App::$strings["Reconnecting %d connections"] = "Erneuere %d Verbindungen";
+App::$strings["Diaspora Reconnect"] = "";
+App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "";
+App::$strings["Reconnect"] = "Erneut verbinden";
+App::$strings["Send test email"] = "Test-E-Mail senden";
+App::$strings["Mail sent."] = "Mail gesendet.";
+App::$strings["Sending of mail failed."] = "Senden der E-Mail fehlgeschlagen.";
+App::$strings["Mail Test"] = "Mail Test";
+App::$strings["Errors encountered deleting database table "] = "Beim Löschen der Datenbanktabelle sind Fehler aufgetreten.";
+App::$strings["Drop tables when uninstalling?"] = "Lösche Tabellen beim Deinstallieren?";
+App::$strings["If checked, the Rendezvous database tables will be deleted when the plugin is uninstalled."] = "Wenn ausgewählt, werden die Rendezvous-Tabellen in der Datenbank gelöscht, sobald das Plugin deinstalliert wird.";
+App::$strings["Mapbox Access Token"] = "Mapbox Zugangs-Token";
+App::$strings["If you enter a Mapbox access token, it will be used to retrieve map tiles from Mapbox instead of the default OpenStreetMap tile server."] = "Wenn Du ein Mapbox Zugangs-Token eingibst, werden die Kartendaten (Kacheln) damit von Mapbox geladen, anstatt von OpenStreetMap, welches die Voreinstellung ist.";
+App::$strings["Rendezvous"] = "Rendezvous";
+App::$strings["This identity has been deleted by another member due to inactivity. Please press the \"New identity\" button or refresh the page to register a new identity. You may use the same name."] = "Diese Identität wurde von einem anderen Mitglied aufgrund von Inaktivität gelöscht. Bitte klicke auf \"Neue Identität\" oder aktualisiere die Website im Browser, um eine neue Identität zu registrieren. Du kannst dabei den selben Namen verwenden.";
+App::$strings["Welcome to Rendezvous!"] = "Willkommen bei Rendezvous!";
+App::$strings["Enter your name to join this rendezvous. To begin sharing your location with the other members, tap the GPS control. When your location is discovered, a red dot will appear and others will be able to see you on the map."] = "Gib Deinen Namen ein, um diesem Rendezvous beizutreten. Um Deinen Standort mit anderen Mitgliedern zu teilen, klicke auf das GPS Symbol. Sobald Dein Standort ermittelt ist, erscheint ein roter Punkt, und die Anderen werden Dich auf der Karte sehen können.";
+App::$strings["Let's meet here"] = "Lasst uns hier treffen";
+App::$strings["New marker"] = "Neue Markierung";
+App::$strings["Edit marker"] = "Markierung bearbeiten";
+App::$strings["New identity"] = "Neue Identität";
+App::$strings["Delete marker"] = "Markierung löschen";
+App::$strings["Delete member"] = "Mitglied löschen";
+App::$strings["Edit proximity alert"] = "Annäherungsalarm bearbeiten";
+App::$strings["A proximity alert will be issued when this member is within a certain radius of you.<br><br>Enter a radius in meters (0 to disable):"] = "Ein Annäherungsalarm wird ausgelöst werden, sobald sich dieses Mitglied innerhalb eines bestimmten Radius von Dir aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):";
+App::$strings["distance"] = "Entfernung";
+App::$strings["Add new rendezvous"] = "Neues Rendezvous hinzufügen";
+App::$strings["Create a new rendezvous and share the access link with those you wish to invite to the group. Those who open the link become members of the rendezvous. They can view other member locations, add markers to the map, or share their own locations with the group."] = "Erstelle ein neues Rendezvous und teile den Zugriffslink mit allen, die Du in die Gruppe einladen möchtest. Die, die den Link öffnen, werden Mitglieder des Rendezvous. Sie können die Standorte der anderen Mitglieder sehen, Marker zur Karte hinzufügen oder ihre eigenen Standorte mit der Gruppe teilen.";
+App::$strings["No username found in import file."] = "Kein Benutzername in der Importdatei gefunden.";
+App::$strings["Unable to create a unique channel address. Import failed."] = "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen.";
+App::$strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden";
App::$strings["Birthday"] = "Geburtstag";
App::$strings["Age: "] = "Alter:";
App::$strings["YYYY-MM-DD or MM-DD"] = "JJJJ-MM-TT oder MM-TT";
@@ -1750,14 +2343,16 @@ App::$strings["Registration revoked for %s"] = "Registrierung für %s wurde wide
App::$strings["Click here to upgrade."] = "Klicke hier, um das Upgrade durchzuführen.";
App::$strings["This action exceeds the limits set by your subscription plan."] = "Diese Aktion überschreitet die Grenzen Ihres Abonnements.";
App::$strings["This action is not available under your subscription plan."] = "Diese Aktion ist in Ihrem Abonnement nicht verfügbar.";
+App::$strings["No recipient provided."] = "Kein Empfänger angegeben";
+App::$strings["[no subject]"] = "[no subject]";
+App::$strings["Unable to determine sender."] = "Kann Absender nicht bestimmen.";
+App::$strings["Stored post could not be verified."] = "Gespeicherter Beitrag konnten nicht überprüft werden.";
App::$strings["Frequently"] = "Häufig";
App::$strings["Hourly"] = "Stündlich";
App::$strings["Twice daily"] = "Zwei Mal am Tag";
App::$strings["Daily"] = "Täglich";
App::$strings["Weekly"] = "Wöchentlich";
App::$strings["Monthly"] = "Monatlich";
-App::$strings["Male"] = "Männlich";
-App::$strings["Female"] = "Weiblich";
App::$strings["Currently Male"] = "Momentan männlich";
App::$strings["Currently Female"] = "Momentan weiblich";
App::$strings["Mostly Male"] = "Größtenteils männlich";
@@ -1812,55 +2407,276 @@ App::$strings["Uncertain"] = "Ungewiss";
App::$strings["It's complicated"] = "Es ist kompliziert";
App::$strings["Don't care"] = "Interessiert mich nicht";
App::$strings["Ask me"] = "Frag mich mal";
-App::$strings["Image/photo"] = "Bild/Foto";
-App::$strings["Encrypted content"] = "Verschlüsselter Inhalt";
-App::$strings["Install %s element: "] = "Element %s installieren: ";
-App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Dieser Beitrag beinhaltet ein installierbares %s Element, aber Du hast nicht die nötigen Rechte, um es auf diesem Hub zu installieren.";
-App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schrieb den folgenden %2\$s %3\$s";
-App::$strings["Click to open/close"] = "Klicke zum Öffnen/Schließen";
-App::$strings["spoiler"] = "Spoiler";
+App::$strings["Unable to obtain identity information from database"] = "Kann keine Identitäts-Informationen aus Datenbank beziehen";
+App::$strings["Empty name"] = "Namensfeld leer";
+App::$strings["Name too long"] = "Name ist zu lang";
+App::$strings["No account identifier"] = "Keine Account-Kennung";
+App::$strings["Nickname is required."] = "Spitzname ist erforderlich.";
+App::$strings["Reserved nickname. Please choose another."] = "Reservierter Kurzname. Bitte wähle einen anderen.";
+App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt.";
+App::$strings["Unable to retrieve created identity"] = "Kann die erstellte Identität nicht empfangen";
+App::$strings["Default Profile"] = "Standard-Profil";
+App::$strings["Create New Profile"] = "Neues Profil erstellen";
+App::$strings["Visible to everybody"] = "Für jeden sichtbar";
+App::$strings["Gender:"] = "Geschlecht:";
+App::$strings["Homepage:"] = "Homepage:";
+App::$strings["Online Now"] = "gerade online";
+App::$strings["Like this channel"] = "Dieser Kanal gefällt mir";
+App::$strings["j F, Y"] = "j. F Y";
+App::$strings["j F"] = "j. F";
+App::$strings["Birthday:"] = "Geburtstag:";
+App::$strings["for %1\$d %2\$s"] = "seit %1\$d %2\$s";
+App::$strings["Sexual Preference:"] = "Sexuelle Orientierung:";
+App::$strings["Tags:"] = "Schlagworte:";
+App::$strings["Political Views:"] = "Politische Ansichten:";
+App::$strings["Religion:"] = "Religion:";
+App::$strings["Hobbies/Interests:"] = "Hobbys/Interessen:";
+App::$strings["Likes:"] = "Gefällt:";
+App::$strings["Dislikes:"] = "Gefällt nicht:";
+App::$strings["Contact information and Social Networks:"] = "Kontaktinformation und soziale Netzwerke:";
+App::$strings["My other channels:"] = "Meine anderen Kanäle:";
+App::$strings["Musical interests:"] = "Musikalische Interessen:";
+App::$strings["Books, literature:"] = "Bücher, Literatur:";
+App::$strings["Television:"] = "Fernsehen:";
+App::$strings["Film/dance/culture/entertainment:"] = "Film/Tanz/Kultur/Unterhaltung:";
+App::$strings["Love/Romance:"] = "Liebe/Romantik:";
+App::$strings["Work/employment:"] = "Arbeit/Anstellung:";
+App::$strings["School/education:"] = "Schule/Ausbildung:";
+App::$strings["Like this thing"] = "Gefällt mir";
+App::$strings["New window"] = "Neues Fenster";
+App::$strings["Open the selected location in a different window or browser tab"] = "Öffne die markierte Adresse in einem neuen Browserfenster oder Tab";
+App::$strings["User '%s' deleted"] = "Benutzer '%s' gelöscht";
+App::$strings["Directory Options"] = "Verzeichnisoptionen";
+App::$strings["Safe Mode"] = "Sicherer Modus";
+App::$strings["Public Forums Only"] = "Nur öffentliche Foren";
+App::$strings["This Website Only"] = "Nur dieser Hub";
+App::$strings["Logout"] = "Abmelden";
+App::$strings["End this session"] = "Beende diese Sitzung";
+App::$strings["Your posts and conversations"] = "Deine Beiträge und Unterhaltungen";
+App::$strings["Your profile page"] = "Deine Profilseite";
+App::$strings["Manage/Edit profiles"] = "Profile verwalten";
+App::$strings["Edit your profile"] = "Profil bearbeiten";
+App::$strings["Your photos"] = "Deine Bilder";
+App::$strings["Your files"] = "Deine Dateien";
+App::$strings["Your chatrooms"] = "Deine Chaträume";
+App::$strings["Bookmarks"] = "Lesezeichen";
+App::$strings["Your bookmarks"] = "Deine Lesezeichen";
+App::$strings["Your webpages"] = "Deine Webseiten";
+App::$strings["Your wikis"] = "Ihre Wikis";
+App::$strings["Sign in"] = "Anmelden";
+App::$strings["Remote authentication"] = "Über Konto auf anderem Server einloggen";
+App::$strings["Click to authenticate to your home hub"] = "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren";
+App::$strings["Get me home"] = "Bringe mich nach Hause (eigener Kanal)";
+App::$strings["Log me out of this site"] = "Logge mich von dieser Seite aus";
+App::$strings["Create an account"] = "Erzeuge ein Konto";
+App::$strings["Help and documentation"] = "Hilfe und Dokumentation";
+App::$strings["Applications, utilities, links, games"] = "Anwendungen (Apps), Zubehör, Links, Spiele";
+App::$strings["Search site @name, #tag, ?docs, content"] = "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt";
+App::$strings["Channel Directory"] = "Kanal-Verzeichnis";
+App::$strings["Your grid"] = "Dein Grid";
+App::$strings["Mark all grid notifications seen"] = "Alle Grid-Benachrichtigungen als angesehen markieren";
+App::$strings["Channel home"] = "Mein Kanal";
+App::$strings["Mark all channel notifications seen"] = "Markiere alle Kanal-Benachrichtigungen als angesehen";
+App::$strings["Notices"] = "Benachrichtigungen";
+App::$strings["Notifications"] = "Benachrichtigungen";
+App::$strings["See all notifications"] = "Alle Benachrichtigungen ansehen";
+App::$strings["Private mail"] = "Persönliche Mail";
+App::$strings["See all private messages"] = "Alle persönlichen Nachrichten ansehen";
+App::$strings["Mark all private messages seen"] = "Markiere alle persönlichen Nachrichten als gesehen";
+App::$strings["Inbox"] = "Eingang";
+App::$strings["Outbox"] = "Ausgang";
+App::$strings["New Message"] = "Neue Nachricht";
+App::$strings["Event Calendar"] = "Terminkalender";
+App::$strings["See all events"] = "Alle Termine ansehen";
+App::$strings["Mark all events seen"] = "Markiere alle Termine als gesehen";
+App::$strings["Manage Your Channels"] = "Verwalte Deine Kanäle";
+App::$strings["Account/Channel Settings"] = "Konto-/Kanal-Einstellungen";
+App::$strings["Admin"] = "Administration";
+App::$strings["Site Setup and Configuration"] = "Seiten-Einrichtung und -Konfiguration";
+App::$strings["Loading..."] = "Lädt ...";
+App::$strings["@name, #tag, ?doc, content"] = "@Name, #Schlagwort, ?Dokumentation, Inhalt";
+App::$strings["Please wait..."] = "Bitte warten...";
+App::$strings["General Features"] = "Allgemeine Funktionen";
+App::$strings["Multiple Profiles"] = "Mehrfachprofile";
+App::$strings["Ability to create multiple profiles"] = "Ermöglicht das Anlegen mehrerer Profile pro Kanal";
+App::$strings["Advanced Profiles"] = "Erweiterte Profile";
+App::$strings["Additional profile sections and selections"] = "Stellt zusätzliche Bereiche und Felder im Profil zur Verfügung";
+App::$strings["Profile Import/Export"] = "Profil-Import/Export";
+App::$strings["Save and load profile details across sites/channels"] = "Ermöglicht das Speichern von Profilen, um sie in einen anderen Kanal zu importieren";
+App::$strings["Web Pages"] = "Webseiten";
+App::$strings["Provide managed web pages on your channel"] = "Ermöglicht das Erstellen von Webseiten in Deinem Kanal";
+App::$strings["Provide a wiki for your channel"] = "Stelle ein Wiki in Deinem Kanal zur Verfügung";
+App::$strings["Private Notes"] = "Private Notizen";
+App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Aktiviert ein Werkzeug mit dem Notizen und Erinnerungen gespeichert werden können (Hinweis: nicht verschlüsselt)";
+App::$strings["Navigation Channel Select"] = "Kanal-Auswahl in der Navigationsleiste";
+App::$strings["Change channels directly from within the navigation dropdown menu"] = "Ermöglicht den direkten Wechsel zu anderen Kanälen über das Navigationsmenü";
+App::$strings["Photo Location"] = "Aufnahmeort";
+App::$strings["If location data is available on uploaded photos, link this to a map."] = "Verlinkt den Aufnahmeort von Fotos (falls verfügbar) auf einer Karte";
+App::$strings["Access Controlled Chatrooms"] = "Zugriffskontrollierte Chaträume";
+App::$strings["Provide chatrooms and chat services with access control."] = "Bieten Sie Chaträume und Chatdienste mit Zugriffskontrolle an.";
+App::$strings["Smart Birthdays"] = "Smarte Geburtstage";
+App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Stellt für Geburtstage einen Zeitzonenbezug her, falls deine Freunde über den ganzen Planeten verstreut sind.";
+App::$strings["Advanced Directory Search"] = "Erweiterte Verzeichnissuche";
+App::$strings["Allows creation of complex directory search queries"] = "Ermöglicht die Erstellung komplexer Verzeichnis-Suchabfragen";
+App::$strings["Advanced Theme and Layout Settings"] = "Erweiterte Design- und Layout-Einstellungen";
+App::$strings["Allows fine tuning of themes and page layouts"] = "Erlaubt die Feineinstellung von Designs und Seitenlayouts";
+App::$strings["Post Composition Features"] = "Nachbearbeitungsfunktionen";
+App::$strings["Large Photos"] = "Große Fotos";
+App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Große Vorschaubilder (1024px) in Beiträgen anzeigen. Falls nicht aktiviert, werden kleine Vorschaubilder (640px) verwendet.";
+App::$strings["Automatically import channel content from other channels or feeds"] = "Ermöglicht den automatischen Import von Inhalten für diesen Kanal von anderen Kanälen oder Feeds";
+App::$strings["Even More Encryption"] = "Noch mehr Verschlüsselung";
+App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Ermöglicht optional die zusätzliche Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Schlüssel)";
+App::$strings["Enable Voting Tools"] = "Umfragewerkzeuge aktivieren";
+App::$strings["Provide a class of post which others can vote on"] = "Aktiviert die Umfragewerkzeuge, um anderen die Möglichkeit zu geben, einem Beitrag zuzustimmen, ihn abzulehnen oder sich zu enthalten. (Muss im Beitrag selbst noch aktiviert werden.)";
+App::$strings["Disable Comments"] = "Kommentare deaktivieren";
+App::$strings["Provide the option to disable comments for a post"] = "Ermöglicht, die Kommentarfunktion für einzelne Beiträge abzuschalten";
+App::$strings["Delayed Posting"] = "Verzögertes Senden";
+App::$strings["Allow posts to be published at a later date"] = "Ermöglicht es, Beiträge zu einem späteren Zeitpunkt zu veröffentlichen";
+App::$strings["Content Expiration"] = "Verfall von Inhalten";
+App::$strings["Remove posts/comments and/or private messages at a future time"] = "Ermöglicht das automatische Löschen von Beiträgen, Kommentaren und/oder privaten Nachrichten zu einem zukünftigen Datum.";
+App::$strings["Suppress Duplicate Posts/Comments"] = "Doppelte Beiträge unterdrücken";
+App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Verhindert, dass innerhalb von zwei Minuten Beiträge mit identischem Inhalt veröffentlicht werden.";
+App::$strings["Network and Stream Filtering"] = "Netzwerk- und Stream-Filter";
+App::$strings["Search by Date"] = "Suche nach Datum";
+App::$strings["Ability to select posts by date ranges"] = "Möglichkeit, Beiträge nach Zeiträumen auszuwählen";
+App::$strings["Privacy Groups"] = "Gruppen";
+App::$strings["Enable management and selection of privacy groups"] = "Auswahl und Verwaltung von Gruppen für Kanäle aktivieren";
+App::$strings["Saved Searches"] = "Gespeicherte Suchanfragen";
+App::$strings["Save search terms for re-use"] = "Ermöglicht das Abspeichern von Suchbegriffen zur Wiederverwendung";
+App::$strings["Network Personal Tab"] = "Persönlicher Netzwerkreiter";
+App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Aktiviert einen Reiter in der Grid-Ansicht, der nur Netzwerk-Beiträge anzeigt, mit denen Du interagiert hast";
+App::$strings["Network New Tab"] = "Netzwerkreiter Neu";
+App::$strings["Enable tab to display all new Network activity"] = "Aktiviert einen Reiter in der Grid-Ansicht, der alle neuen Netzwerkaktivitäten anzeigt";
+App::$strings["Affinity Tool"] = "Beziehungs-Tool";
+App::$strings["Filter stream activity by depth of relationships"] = "Aktiviert ein Werkzeug in der Grid-Ansicht, das den Stream nach Grad der Beziehung filtern kann";
+App::$strings["Show friend and connection suggestions"] = "Freund- und Verbindungsvorschläge anzeigen";
+App::$strings["Connection Filtering"] = "Filter für Verbindungen";
+App::$strings["Filter incoming posts from connections based on keywords/content"] = "Ermöglicht die Filterung eingehender Beiträge anhand von Schlüsselwörtern (muss an der Verbindung konfiguriert werden)";
+App::$strings["Post/Comment Tools"] = "Beitrag-/Kommentar-Tools";
+App::$strings["Community Tagging"] = "Gemeinschaftliches Verschlagworten";
+App::$strings["Ability to tag existing posts"] = "Ermöglicht das Verschlagworten existierender Beiträge";
+App::$strings["Post Categories"] = "Beitrags-Kategorien";
+App::$strings["Add categories to your posts"] = "Aktiviert Kategorien für Beiträge";
+App::$strings["Emoji Reactions"] = "Emoji Reaktionen";
+App::$strings["Add emoji reaction ability to posts"] = "Aktiviert Emoji-Reaktionen für Beiträge";
+App::$strings["Saved Folders"] = "Gespeicherte Ordner";
+App::$strings["Ability to file posts under folders"] = "Möglichkeit, Beiträge in Verzeichnissen zu sammeln";
+App::$strings["Dislike Posts"] = "Gefällt-mir-nicht-Beiträge";
+App::$strings["Ability to dislike posts/comments"] = "Aktiviert die „Gefällt mir nicht“-Schaltfläche";
+App::$strings["Star Posts"] = "Beiträge mit Sternchen versehen";
+App::$strings["Ability to mark special posts with a star indicator"] = "Ermöglicht die lokale Markierung spezieller Beiträge mit einem Sternchen-Symbol";
+App::$strings["Tag Cloud"] = "Schlagwort-Wolke";
+App::$strings["Provide a personal tag cloud on your channel page"] = "Aktiviert die Anzeige einer Schlagwort-Wolke (Tag Cloud) auf Deiner Kanal-Seite";
+App::$strings["Premium Channel"] = "Premium-Kanal";
+App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Ermöglicht es, Einschränkungen und Bedingungen für Verbindungen dieses Kanals festzulegen";
+App::$strings["prev"] = "vorherige";
+App::$strings["first"] = "erste";
+App::$strings["last"] = "letzte";
+App::$strings["next"] = "nächste";
+App::$strings["older"] = "älter";
+App::$strings["newer"] = "neuer";
+App::$strings["No connections"] = "Keine Verbindungen";
+App::$strings["View all %s connections"] = "Alle Verbindungen von %s anzeigen";
+App::$strings["poke"] = "anstupsen";
+App::$strings["poked"] = "stupste";
+App::$strings["ping"] = "anpingen";
+App::$strings["pinged"] = "pingte";
+App::$strings["prod"] = "knuffen";
+App::$strings["prodded"] = "knuffte";
+App::$strings["slap"] = "ohrfeigen";
+App::$strings["slapped"] = "ohrfeigte";
+App::$strings["finger"] = "befummeln";
+App::$strings["fingered"] = "befummelte";
+App::$strings["rebuff"] = "eine Abfuhr erteilen";
+App::$strings["rebuffed"] = "zurückgewiesen";
+App::$strings["happy"] = "glücklich";
+App::$strings["sad"] = "traurig";
+App::$strings["mellow"] = "sanft";
+App::$strings["tired"] = "müde";
+App::$strings["perky"] = "frech";
+App::$strings["angry"] = "sauer";
+App::$strings["stupefied"] = "verblüfft";
+App::$strings["puzzled"] = "verwirrt";
+App::$strings["interested"] = "interessiert";
+App::$strings["bitter"] = "verbittert";
+App::$strings["cheerful"] = "fröhlich";
+App::$strings["alive"] = "lebendig";
+App::$strings["annoyed"] = "verärgert";
+App::$strings["anxious"] = "unruhig";
+App::$strings["cranky"] = "schrullig";
+App::$strings["disturbed"] = "verstört";
+App::$strings["frustrated"] = "frustriert";
+App::$strings["depressed"] = "deprimiert";
+App::$strings["motivated"] = "motiviert";
+App::$strings["relaxed"] = "entspannt";
+App::$strings["surprised"] = "überrascht";
+App::$strings["Monday"] = "Montag";
+App::$strings["Tuesday"] = "Dienstag";
+App::$strings["Wednesday"] = "Mittwoch";
+App::$strings["Thursday"] = "Donnerstag";
+App::$strings["Friday"] = "Freitag";
+App::$strings["Saturday"] = "Samstag";
+App::$strings["Sunday"] = "Sonntag";
+App::$strings["January"] = "Januar";
+App::$strings["February"] = "Februar";
+App::$strings["March"] = "März";
+App::$strings["April"] = "April";
+App::$strings["May"] = "Mai";
+App::$strings["June"] = "Juni";
+App::$strings["July"] = "Juli";
+App::$strings["August"] = "August";
+App::$strings["September"] = "September";
+App::$strings["October"] = "Oktober";
+App::$strings["November"] = "November";
+App::$strings["December"] = "Dezember";
+App::$strings["Unknown Attachment"] = "Unbekannter Anhang";
+App::$strings["unknown"] = "unbekannt";
+App::$strings["remove category"] = "Kategorie entfernen";
+App::$strings["remove from file"] = "aus der Datei entfernen";
+App::$strings["default"] = "Standard";
+App::$strings["Page layout"] = "Seiten-Layout";
+App::$strings["You can create your own with the layouts tool"] = "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen";
+App::$strings["Page content type"] = "Art des Seiteninhalts";
+App::$strings["activity"] = "Aktivität";
+App::$strings["Design Tools"] = "Gestaltungswerkzeuge";
+App::$strings["Pages"] = "Seiten";
+App::$strings["Import website..."] = "Webseite importieren...";
+App::$strings["Select folder to import"] = "Ordner zum Importieren auswählen";
+App::$strings["Import from a zipped folder:"] = "Aus einem gezippten Ordner importieren:";
+App::$strings["Import from cloud files:"] = "Aus Cloud-Dateien importieren:";
+App::$strings["/cloud/channel/path/to/folder"] = "/Cloud/Kanal/Pfad/zum/Ordner";
+App::$strings["Enter path to website files"] = "Pfad zu Webseitendateien eingeben";
+App::$strings["Select folder"] = "Ordner auswählen";
+App::$strings["Export website..."] = "Webseite exportieren...";
+App::$strings["Export to a zip file"] = "In eine ZIP-Datei exportieren";
+App::$strings["website.zip"] = "website.zip";
+App::$strings["Enter a name for the zip file."] = "Geben Sie einen für die ZIP-Datei ein.";
+App::$strings["Export to cloud files"] = "In Cloud-Dateien exportieren";
+App::$strings["/path/to/export/folder"] = "/Pfad/zum/exportierenden/Ordner";
+App::$strings["Enter a path to a cloud files destination."] = "Gib den Pfad zu einem Datei-Speicherort in der Cloud ein.";
+App::$strings["Specify folder"] = "Ordner angeben";
+App::$strings["%1\$s's bookmarks"] = "%1\$ss Lesezeichen";
App::$strings["Different viewers will see this text differently"] = "Verschiedene Betrachter werden diesen Text unterschiedlich sehen";
-App::$strings["$1 wrote:"] = "$1 schrieb:";
-App::$strings["l F d, Y \\@ g:i A"] = "l, d. F Y, H:i";
-App::$strings["Starts:"] = "Beginnt:";
-App::$strings["Finishes:"] = "Endet:";
-App::$strings["This event has been added to your calendar."] = "Dieser Termin wurde zu Deinem Kalender hinzugefügt";
-App::$strings["Not specified"] = "Keine Angabe";
-App::$strings["Needs Action"] = "Aktion erforderlich";
-App::$strings["Completed"] = "Abgeschlossen";
-App::$strings["In Process"] = "In Bearbeitung";
-App::$strings["Cancelled"] = "gestrichen";
-App::$strings["guest:"] = "Gast:";
-App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde.";
App::$strings["Help:"] = "Hilfe:";
-App::$strings["%1\$s's bookmarks"] = "%1\$ss Lesezeichen";
-App::$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."] = "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die gelöscht wurde. Es <strong>könnten</strong> von damals noch Elemente (Beiträge, Dateien etc.) vorhanden sein, die allen jetzigen und zukünftigen Mitgliedern dieser Gruppe den Zugriff erlauben. Wenn das nicht Deine Absicht ist, erstelle bitte eine neue Gruppe mit einem anderen Namen.";
-App::$strings["Add new connections to this privacy group"] = "Neue Verbindung zu dieser Gruppe hinzufügen";
-App::$strings["edit"] = "Bearbeiten";
-App::$strings["Privacy Groups"] = "Gruppen";
-App::$strings["Edit group"] = "Gruppe ändern";
-App::$strings["Add privacy group"] = "Gruppe hinzufügen";
-App::$strings["Channels not in any privacy group"] = "Kanäle, die in keiner Gruppe sind";
-App::$strings["add"] = "hinzufügen";
-App::$strings["Item was not found."] = "Beitrag wurde nicht gefunden.";
-App::$strings["No source file."] = "Keine Quelldatei.";
-App::$strings["Cannot locate file to replace"] = "Kann Datei zum Ersetzen nicht finden";
-App::$strings["Cannot locate file to revise/update"] = "Kann Datei zum Prüfen/Aktualisieren nicht finden";
-App::$strings["File exceeds size limit of %d"] = "Datei überschreitet das Größen-Limit von %d";
-App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Die Größe Deiner Datei-Anhänge hat das Maximum von %1$.0f MByte erreicht.";
-App::$strings["File upload failed. Possible system limit or action terminated."] = "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess.";
-App::$strings["Stored file could not be verified. Upload failed."] = "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen.";
-App::$strings["Path not available."] = "Pfad nicht verfügbar.";
-App::$strings["Empty pathname"] = "Leere Pfadangabe";
-App::$strings["duplicate filename or path"] = "doppelter Dateiname oder Pfad";
-App::$strings["Path not found."] = "Pfad nicht gefunden.";
-App::$strings["mkdir failed."] = "mkdir fehlgeschlagen.";
-App::$strings["database storage failed."] = "Speichern in der Datenbank fehlgeschlagen.";
-App::$strings["Empty path"] = "Leere Pfadangabe";
App::$strings["New Page"] = "Neue Seite";
-App::$strings["Title"] = "Titel";
-App::$strings["Attachments:"] = "Anhänge:";
-App::$strings["\$Projectname event notification:"] = "\$Projectname-Terminbenachrichtigung:";
+App::$strings["%d invitation available"] = array(
+ 0 => "%d Einladung verfügbar",
+ 1 => "%d Einladungen verfügbar",
+);
+App::$strings["Find Channels"] = "Finde Kanäle";
+App::$strings["Enter name or interest"] = "Name oder Interessen eingeben";
+App::$strings["Connect/Follow"] = "Verbinden/Folgen";
+App::$strings["Examples: Robert Morgenstein, Fishing"] = "Beispiele: Robert Morgenstein, Angeln";
+App::$strings["Random Profile"] = "Zufallsprofil";
+App::$strings["Invite Friends"] = "Lade Freunde ein";
+App::$strings["Advanced example: name=fred and country=iceland"] = "Fortgeschrittenes Beispiel: name=fred and country=iceland";
+App::$strings["Everything"] = "Alles";
+App::$strings["Categories"] = "Kategorien";
+App::$strings["%d connection in common"] = array(
+ 0 => "%d gemeinsame Verbindung",
+ 1 => "%d gemeinsame Verbindungen",
+);
+App::$strings["show more"] = "mehr zeigen";
App::$strings["Delete this item?"] = "Dieses Element löschen?";
App::$strings["%s show less"] = "%s weniger anzeigen";
App::$strings["%s expand"] = "%s aufklappen";
@@ -1894,18 +2710,7 @@ App::$strings["about a year"] = "ungefähr ein Jahr";
App::$strings["%d years"] = "%d Jahre";
App::$strings[" "] = " ";
App::$strings["timeago.numbers"] = "timeago.numbers";
-App::$strings["January"] = "Januar";
-App::$strings["February"] = "Februar";
-App::$strings["March"] = "März";
-App::$strings["April"] = "April";
App::$strings["__ctx:long__ May"] = "Mai";
-App::$strings["June"] = "Juni";
-App::$strings["July"] = "Juli";
-App::$strings["August"] = "August";
-App::$strings["September"] = "September";
-App::$strings["October"] = "Oktober";
-App::$strings["November"] = "November";
-App::$strings["December"] = "Dezember";
App::$strings["Jan"] = "Jan";
App::$strings["Feb"] = "Feb";
App::$strings["Mar"] = "Mär";
@@ -1918,13 +2723,6 @@ App::$strings["Sep"] = "Sep";
App::$strings["Oct"] = "Okt";
App::$strings["Nov"] = "Nov";
App::$strings["Dec"] = "Dez";
-App::$strings["Sunday"] = "Sonntag";
-App::$strings["Monday"] = "Montag";
-App::$strings["Tuesday"] = "Dienstag";
-App::$strings["Wednesday"] = "Mittwoch";
-App::$strings["Thursday"] = "Donnerstag";
-App::$strings["Friday"] = "Freitag";
-App::$strings["Saturday"] = "Samstag";
App::$strings["Sun"] = "So";
App::$strings["Mon"] = "Mo";
App::$strings["Tue"] = "Di";
@@ -1937,6 +2735,80 @@ App::$strings["__ctx:calendar__ month"] = "Monat";
App::$strings["__ctx:calendar__ week"] = "Woche";
App::$strings["__ctx:calendar__ day"] = "Tag";
App::$strings["__ctx:calendar__ All day"] = "Ganztägig";
+App::$strings["view full size"] = "In Vollbildansicht anschauen";
+App::$strings["No Subject"] = "Kein Betreff";
+App::$strings["OStatus"] = "OStatus";
+App::$strings["GNU-Social"] = "GNU-Social";
+App::$strings["RSS/Atom"] = "RSS/Atom";
+App::$strings["Facebook"] = "Facebook";
+App::$strings["Zot"] = "Zot!";
+App::$strings["LinkedIn"] = "LinkedIn";
+App::$strings["XMPP/IM"] = "XMPP/IM";
+App::$strings["MySpace"] = "MySpace";
+App::$strings["Tags"] = "Schlagwörter";
+App::$strings["Keywords"] = "Schlüsselwörter";
+App::$strings["have"] = "habe";
+App::$strings["has"] = "hat";
+App::$strings["want"] = "will";
+App::$strings["wants"] = "will";
+App::$strings["likes"] = "gefällt";
+App::$strings["dislikes"] = "missfällt";
+App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kann keinen doppelten Kanal-Identifikator auf diesem System erzeugen (Spitzname oder Hash schon belegt). Import fehlgeschlagen.";
+App::$strings["Channel clone failed. Import failed."] = "Klonen des Kanals fehlgeschlagen. Import fehlgeschlagen.";
+App::$strings["Unable to import element \""] = "Element konnte nicht importiert werden.";
+App::$strings["guest:"] = "Gast:";
+App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde.";
+App::$strings["Invalid data packet"] = "Ungültiges Datenpaket";
+App::$strings["Unable to verify channel signature"] = "Konnte die Signatur des Kanals nicht verifizieren";
+App::$strings["Unable to verify site signature for %s"] = "Kann die Signatur der Seite von %s nicht verifizieren";
+App::$strings["invalid target signature"] = "Ungültige Signatur des Ziels";
+App::$strings["(Unknown)"] = "(Unbekannt)";
+App::$strings["Visible to anybody on the internet."] = "Für jeden im Internet sichtbar.";
+App::$strings["Visible to you only."] = "Nur für Dich sichtbar.";
+App::$strings["Visible to anybody in this network."] = "Für jedes \$Projectname-Mitglied sichtbar.";
+App::$strings["Visible to anybody authenticated."] = "Für jeden sichtbar, der angemeldet ist.";
+App::$strings["Visible to anybody on %s."] = "Für jeden auf %s sichtbar.";
+App::$strings["Visible to all connections."] = "Für alle Verbindungen sichtbar.";
+App::$strings["Visible to approved connections."] = "Nur für akzeptierte Verbindungen sichtbar.";
+App::$strings["Visible to specific connections."] = "Sichtbar für bestimmte Verbindungen.";
+App::$strings["Privacy group is empty."] = "Gruppe ist leer.";
+App::$strings["Privacy group: %s"] = "Gruppe: %s";
+App::$strings["Connection not found."] = "Die Verbindung wurde nicht gefunden.";
+App::$strings["profile photo"] = "Profilfoto";
+App::$strings["[Edited %s]"] = "[%s wurde bearbeitet]";
+App::$strings["__ctx:edit_activity__ Post"] = "Beitrag";
+App::$strings["__ctx:edit_activity__ Comment"] = "Kommentar";
+App::$strings["Logged out."] = "Ausgeloggt.";
+App::$strings["Failed authentication"] = "Authentifizierung fehlgeschlagen";
+App::$strings[" and "] = "und";
+App::$strings["public profile"] = "öffentliches Profil";
+App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s hat %2\$s auf &ldquo;%3\$s&rdquo; geändert";
+App::$strings["Visit %1\$s's %2\$s"] = "Besuche %1\$s's %2\$s";
+App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s hat ein aktualisiertes %2\$s, %3\$s wurde verändert.";
+App::$strings["Item was not found."] = "Beitrag wurde nicht gefunden.";
+App::$strings["No source file."] = "Keine Quelldatei.";
+App::$strings["Cannot locate file to replace"] = "Kann Datei zum Ersetzen nicht finden";
+App::$strings["Cannot locate file to revise/update"] = "Kann Datei zum Prüfen/Aktualisieren nicht finden";
+App::$strings["File exceeds size limit of %d"] = "Datei überschreitet das Größen-Limit von %d";
+App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Die Größe Deiner Datei-Anhänge hat das Maximum von %1$.0f MByte erreicht.";
+App::$strings["File upload failed. Possible system limit or action terminated."] = "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess.";
+App::$strings["Stored file could not be verified. Upload failed."] = "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen.";
+App::$strings["Path not available."] = "Pfad nicht verfügbar.";
+App::$strings["Empty pathname"] = "Leere Pfadangabe";
+App::$strings["duplicate filename or path"] = "doppelter Dateiname oder Pfad";
+App::$strings["Path not found."] = "Pfad nicht gefunden.";
+App::$strings["mkdir failed."] = "mkdir fehlgeschlagen.";
+App::$strings["database storage failed."] = "Speichern in der Datenbank fehlgeschlagen.";
+App::$strings["Empty path"] = "Leere Pfadangabe";
+App::$strings["l F d, Y \\@ g:i A"] = "l, d. F Y, H:i";
+App::$strings["Starts:"] = "Beginnt:";
+App::$strings["Finishes:"] = "Endet:";
+App::$strings["This event has been added to your calendar."] = "Dieser Termin wurde zu Deinem Kalender hinzugefügt";
+App::$strings["Not specified"] = "Keine Angabe";
+App::$strings["Needs Action"] = "Aktion erforderlich";
+App::$strings["Completed"] = "Abgeschlossen";
+App::$strings["In Process"] = "In Bearbeitung";
+App::$strings["Cancelled"] = "gestrichen";
App::$strings["Channel is blocked on this site."] = "Der Kanal ist auf dieser Seite blockiert ";
App::$strings["Channel location missing."] = "Adresse des Kanals fehlt.";
App::$strings["Response from remote channel was incomplete."] = "Antwort des entfernten Kanals war unvollständig.";
@@ -1944,83 +2816,102 @@ App::$strings["Channel was deleted and no longer exists."] = "Kanal wurde gelös
App::$strings["Protocol disabled."] = "Protokoll deaktiviert.";
App::$strings["Channel discovery failed."] = "Kanalsuche fehlgeschlagen";
App::$strings["Cannot connect to yourself."] = "Du kannst Dich nicht mit Dir selbst verbinden.";
+App::$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."] = "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die gelöscht wurde. Es <strong>könnten</strong> von damals noch Elemente (Beiträge, Dateien etc.) vorhanden sein, die allen jetzigen und zukünftigen Mitgliedern dieser Gruppe den Zugriff erlauben. Wenn das nicht Deine Absicht ist, erstelle bitte eine neue Gruppe mit einem anderen Namen.";
+App::$strings["Add new connections to this privacy group"] = "Neue Verbindung zu dieser Gruppe hinzufügen";
+App::$strings["edit"] = "Bearbeiten";
+App::$strings["Edit group"] = "Gruppe ändern";
+App::$strings["Add privacy group"] = "Gruppe hinzufügen";
+App::$strings["Channels not in any privacy group"] = "Kanäle, die in keiner Gruppe sind";
+App::$strings["add"] = "hinzufügen";
+App::$strings["Select an alternate language"] = "Wähle eine alternative Sprache";
+App::$strings["Image exceeds website size limit of %lu bytes"] = "Bild überschreitet das Webseitenlimit von %lu Bytes";
+App::$strings["Image file is empty."] = "Bilddatei ist leer.";
+App::$strings["Photo storage failed."] = "Fotospeicherung fehlgeschlagen.";
+App::$strings["a new photo"] = "ein neues Foto";
+App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s hat %2\$s auf %3\$s veröffentlicht";
+App::$strings["Photo Albums"] = "Fotoalben";
+App::$strings["Upload New Photos"] = "Neue Fotos hochladen";
+App::$strings["System"] = "System";
+App::$strings["New App"] = "Neue App";
+App::$strings["Suggestions"] = "Vorschläge";
+App::$strings["See more..."] = "Mehr anzeigen …";
+App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Du bist %1$.0f von maximal %2$.0f erlaubten Verbindungen eingegangen.";
+App::$strings["Add New Connection"] = "Neue Verbindung hinzufügen";
+App::$strings["Enter channel address"] = "Adresse des Kanals eingeben";
+App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Beispiele: bob@beispiel.com, http://beispiel.com/barbara";
+App::$strings["Notes"] = "Notizen";
+App::$strings["Remove term"] = "Eintrag löschen";
+App::$strings["Archives"] = "Archive";
+App::$strings["Refresh"] = "Aktualisieren";
+App::$strings["Account settings"] = "Konto-Einstellungen";
+App::$strings["Channel settings"] = "Kanal-Einstellungen";
+App::$strings["Additional features"] = "Zusätzliche Funktionen";
+App::$strings["Feature/Addon settings"] = "Plugin-Einstellungen";
+App::$strings["Display settings"] = "Anzeige-Einstellungen";
+App::$strings["Manage locations"] = "Klon-Adressen verwalten";
+App::$strings["Export channel"] = "Kanal exportieren";
+App::$strings["Connected apps"] = "Verbundene Apps";
+App::$strings["Premium Channel Settings"] = "Premium-Kanal-Einstellungen";
+App::$strings["Private Mail Menu"] = "Private Nachrichten";
+App::$strings["Combined View"] = "Kombinierte Anzeige";
+App::$strings["Conversations"] = "Konversationen";
+App::$strings["Received Messages"] = "Erhaltene Nachrichten";
+App::$strings["Sent Messages"] = "Gesendete Nachrichten";
+App::$strings["No messages."] = "Keine Nachrichten.";
+App::$strings["Delete conversation"] = "Unterhaltung löschen";
+App::$strings["Events Tools"] = "Kalenderwerkzeuge";
+App::$strings["Export Calendar"] = "Kalender exportieren";
+App::$strings["Import Calendar"] = "Kalender importieren";
+App::$strings["Chatrooms"] = "Chaträume";
+App::$strings["Overview"] = "Übersicht";
+App::$strings["Chat Members"] = "Chatmitglieder";
+App::$strings["Wiki List"] = "Wikiliste";
+App::$strings["Create new wiki"] = "Neues Wiki erstellen";
+App::$strings["Send notification"] = "Benachrichtigung senden";
+App::$strings["Wiki Pages"] = "Wikiseiten";
+App::$strings["Add new page"] = "Neue Seite hinzufügen";
+App::$strings["Page name"] = "Seitenname";
+App::$strings["Bookmarked Chatrooms"] = "Gespeicherte Chatrooms";
+App::$strings["Suggested Chatrooms"] = "Chatraum-Vorschläge";
+App::$strings["photo/image"] = "Foto/Bild";
+App::$strings["Click to show more"] = "Klick, um mehr anzuzeigen";
+App::$strings["Rating Tools"] = "Bewertungswerkzeuge";
+App::$strings["Rate Me"] = "Bewerte mich";
+App::$strings["View Ratings"] = "Bewertungen ansehen";
+App::$strings["Forums"] = "Foren";
+App::$strings["Tasks"] = "Aufgaben";
+App::$strings["Documentation"] = "Dokumentation";
+App::$strings["Member registrations waiting for confirmation"] = "Nutzer-Anmeldungen, die auf Bestätigung warten";
+App::$strings["Inspect queue"] = "Warteschlange kontrollieren";
+App::$strings["DB updates"] = "DB-Aktualisierungen";
+App::$strings["Plugin Features"] = "Plug-In Funktionen";
App::$strings["Who can see this?"] = "Wer kann das sehen?";
App::$strings["Custom selection"] = "Benutzerdefinierte Auswahl";
App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Wähle \"Anzeigen\", um Betrachtung zuzulassen. \"Nicht anzeigen\" überstimmt und limitiert den Aktionsradius von \"Anzeigen\" für Ausnahmen.";
App::$strings["Show"] = "Anzeigen";
App::$strings["Don't show"] = "Nicht anzeigen";
App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Beitragsberechtigungen %s können nicht geändert werden %s, nachdem der Beitrag gesendet wurde.<br />Diese Berechtigungen bestimmen, wer den Beitrag sehen kann.";
-App::$strings["Unable to obtain identity information from database"] = "Kann keine Identitäts-Informationen aus Datenbank beziehen";
-App::$strings["Empty name"] = "Namensfeld leer";
-App::$strings["Name too long"] = "Name ist zu lang";
-App::$strings["No account identifier"] = "Keine Account-Kennung";
-App::$strings["Nickname is required."] = "Spitzname ist erforderlich.";
-App::$strings["Reserved nickname. Please choose another."] = "Reservierter Kurzname. Bitte wähle einen anderen.";
-App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt.";
-App::$strings["Unable to retrieve created identity"] = "Kann die erstellte Identität nicht empfangen";
-App::$strings["Default Profile"] = "Standard-Profil";
-App::$strings["Requested channel is not available."] = "Angeforderte Kanal nicht verfügbar.";
-App::$strings["Create New Profile"] = "Neues Profil erstellen";
-App::$strings["Visible to everybody"] = "Für jeden sichtbar";
-App::$strings["Gender:"] = "Geschlecht:";
-App::$strings["Status:"] = "Status:";
-App::$strings["Homepage:"] = "Homepage:";
-App::$strings["Online Now"] = "gerade online";
-App::$strings["Like this channel"] = "Dieser Kanal gefällt mir";
-App::$strings["j F, Y"] = "j. F Y";
-App::$strings["j F"] = "j. F";
-App::$strings["Birthday:"] = "Geburtstag:";
-App::$strings["for %1\$d %2\$s"] = "seit %1\$d %2\$s";
-App::$strings["Sexual Preference:"] = "Sexuelle Orientierung:";
-App::$strings["Tags:"] = "Schlagworte:";
-App::$strings["Political Views:"] = "Politische Ansichten:";
-App::$strings["Religion:"] = "Religion:";
-App::$strings["Hobbies/Interests:"] = "Hobbys/Interessen:";
-App::$strings["Likes:"] = "Gefällt:";
-App::$strings["Dislikes:"] = "Gefällt nicht:";
-App::$strings["Contact information and Social Networks:"] = "Kontaktinformation und soziale Netzwerke:";
-App::$strings["My other channels:"] = "Meine anderen Kanäle:";
-App::$strings["Musical interests:"] = "Musikalische Interessen:";
-App::$strings["Books, literature:"] = "Bücher, Literatur:";
-App::$strings["Television:"] = "Fernsehen:";
-App::$strings["Film/dance/culture/entertainment:"] = "Film/Tanz/Kultur/Unterhaltung:";
-App::$strings["Love/Romance:"] = "Liebe/Romantik:";
-App::$strings["Work/employment:"] = "Arbeit/Anstellung:";
-App::$strings["School/education:"] = "Schule/Ausbildung:";
-App::$strings["Like this thing"] = "Gefällt mir";
-App::$strings["New window"] = "Neues Fenster";
-App::$strings["Open the selected location in a different window or browser tab"] = "Öffne die markierte Adresse in einem neuen Browserfenster oder Tab";
-App::$strings["User '%s' deleted"] = "Benutzer '%s' gelöscht";
-App::$strings["%d invitation available"] = array(
- 0 => "%d Einladung verfügbar",
- 1 => "%d Einladungen verfügbar",
-);
-App::$strings["Find Channels"] = "Finde Kanäle";
-App::$strings["Enter name or interest"] = "Name oder Interessen eingeben";
-App::$strings["Connect/Follow"] = "Verbinden/Folgen";
-App::$strings["Examples: Robert Morgenstein, Fishing"] = "Beispiele: Robert Morgenstein, Angeln";
-App::$strings["Random Profile"] = "Zufallsprofil";
-App::$strings["Invite Friends"] = "Lade Freunde ein";
-App::$strings["Advanced example: name=fred and country=iceland"] = "Fortgeschrittenes Beispiel: name=fred and country=iceland";
-App::$strings["Saved Folders"] = "Gespeicherte Ordner";
-App::$strings["Everything"] = "Alles";
-App::$strings["Categories"] = "Kategorien";
-App::$strings["%d connection in common"] = array(
- 0 => "%d gemeinsame Verbindung",
- 1 => "%d gemeinsame Verbindungen",
-);
-App::$strings["show more"] = "mehr zeigen";
-App::$strings["Logged out."] = "Ausgeloggt.";
-App::$strings["Failed authentication"] = "Authentifizierung fehlgeschlagen";
-App::$strings["Login failed."] = "Login fehlgeschlagen.";
-App::$strings[" and "] = "und";
-App::$strings["public profile"] = "öffentliches Profil";
-App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s hat %2\$s auf &ldquo;%3\$s&rdquo; geändert";
-App::$strings["Visit %1\$s's %2\$s"] = "Besuche %1\$s's %2\$s";
-App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s hat ein aktualisiertes %2\$s, %3\$s wurde verändert.";
+App::$strings[" by "] = "von";
+App::$strings[" on "] = "am";
+App::$strings["Embedded content"] = "Eingebetteter Inhalt";
+App::$strings["Embedding disabled"] = "Einbetten deaktiviert";
+App::$strings["Attachments:"] = "Anhänge:";
+App::$strings["\$Projectname event notification:"] = "\$Projectname-Terminbenachrichtigung:";
+App::$strings["Can view my normal stream and posts"] = "Kann meine normalen Beiträge sehen";
+App::$strings["Can view my webpages"] = "Kann meine Webseiten sehen";
+App::$strings["Can post on my channel page (\"wall\")"] = "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen";
+App::$strings["Can like/dislike stuff"] = "Kann andere Elemente mögen/nicht mögen";
+App::$strings["Profiles and things other than posts/comments"] = "Profile und alles außer Beiträge und Kommentare";
+App::$strings["Can forward to all my channel contacts via post @mentions"] = "Kann an alle meine Kontakte via @-Erwähnung Nachrichten weiterleiten";
+App::$strings["Advanced - useful for creating group forum channels"] = "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen";
+App::$strings["Can chat with me (when available)"] = "Kann mit mir chatten (wenn verfügbar)";
+App::$strings["Can write to my file storage and photos"] = "Kann in meine Datei- und Bilderordner schreiben";
+App::$strings["Can edit my webpages"] = "Kann meine Webseiten bearbeiten";
+App::$strings["Somewhat advanced - very useful in open communities"] = "Etwas fortgeschritten – sehr nützlich in offenen Gemeinschaften";
+App::$strings["Can administer my channel resources"] = "Kann meine Kanäle administrieren";
+App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Sehr fortgeschritten. Bearbeite das nur, wenn Du genau weißt, was Du tust";
App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s ist jetzt mit %2\$s verbunden";
App::$strings["%1\$s poked %2\$s"] = "%1\$s stupste %2\$s an";
-App::$strings["poked"] = "stupste";
App::$strings["View %s's profile @ %s"] = "%ss Profil auf %s ansehen";
App::$strings["Categories:"] = "Kategorien:";
App::$strings["Filed under:"] = "Gespeichert unter:";
@@ -2080,7 +2971,6 @@ App::$strings["Status Messages and Posts"] = "Statusnachrichten und Beiträge";
App::$strings["About"] = "Über";
App::$strings["Profile Details"] = "Profil-Details";
App::$strings["Files and Storage"] = "Dateien und Speicher";
-App::$strings["Chatrooms"] = "Chaträume";
App::$strings["Saved Bookmarks"] = "Gespeicherte Lesezeichen";
App::$strings["Manage Webpages"] = "Webseiten verwalten";
App::$strings["__ctx:noun__ Attending"] = array(
@@ -2111,215 +3001,14 @@ App::$strings["__ctx:relative_date__ second"] = array(
0 => "Sekunde",
1 => "Sekunden",
);
-App::$strings["Tags"] = "Schlagwörter";
-App::$strings["Keywords"] = "Schlüsselwörter";
-App::$strings["have"] = "habe";
-App::$strings["has"] = "hat";
-App::$strings["want"] = "will";
-App::$strings["wants"] = "will";
-App::$strings["likes"] = "gefällt";
-App::$strings["dislikes"] = "missfällt";
-App::$strings["prev"] = "vorherige";
-App::$strings["first"] = "erste";
-App::$strings["last"] = "letzte";
-App::$strings["next"] = "nächste";
-App::$strings["older"] = "älter";
-App::$strings["newer"] = "neuer";
-App::$strings["No connections"] = "Keine Verbindungen";
-App::$strings["View all %s connections"] = "Alle Verbindungen von %s anzeigen";
-App::$strings["poke"] = "anstupsen";
-App::$strings["ping"] = "anpingen";
-App::$strings["pinged"] = "pingte";
-App::$strings["prod"] = "knuffen";
-App::$strings["prodded"] = "knuffte";
-App::$strings["slap"] = "ohrfeigen";
-App::$strings["slapped"] = "ohrfeigte";
-App::$strings["finger"] = "befummeln";
-App::$strings["fingered"] = "befummelte";
-App::$strings["rebuff"] = "eine Abfuhr erteilen";
-App::$strings["rebuffed"] = "zurückgewiesen";
-App::$strings["happy"] = "glücklich";
-App::$strings["sad"] = "traurig";
-App::$strings["mellow"] = "sanft";
-App::$strings["tired"] = "müde";
-App::$strings["perky"] = "frech";
-App::$strings["angry"] = "sauer";
-App::$strings["stupefied"] = "verblüfft";
-App::$strings["puzzled"] = "verwirrt";
-App::$strings["interested"] = "interessiert";
-App::$strings["bitter"] = "verbittert";
-App::$strings["cheerful"] = "fröhlich";
-App::$strings["alive"] = "lebendig";
-App::$strings["annoyed"] = "verärgert";
-App::$strings["anxious"] = "unruhig";
-App::$strings["cranky"] = "schrullig";
-App::$strings["disturbed"] = "verstört";
-App::$strings["frustrated"] = "frustriert";
-App::$strings["depressed"] = "deprimiert";
-App::$strings["motivated"] = "motiviert";
-App::$strings["relaxed"] = "entspannt";
-App::$strings["surprised"] = "überrascht";
-App::$strings["May"] = "Mai";
-App::$strings["Unknown Attachment"] = "Unbekannter Anhang";
-App::$strings["unknown"] = "unbekannt";
-App::$strings["remove category"] = "Kategorie entfernen";
-App::$strings["remove from file"] = "aus der Datei entfernen";
-App::$strings["default"] = "Standard";
-App::$strings["Page layout"] = "Seiten-Layout";
-App::$strings["You can create your own with the layouts tool"] = "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen";
-App::$strings["Page content type"] = "Art des Seiteninhalts";
-App::$strings["Select an alternate language"] = "Wähle eine alternative Sprache";
-App::$strings["activity"] = "Aktivität";
-App::$strings["Design Tools"] = "Gestaltungswerkzeuge";
-App::$strings["Pages"] = "Seiten";
-App::$strings["Import website..."] = "Webseite importieren...";
-App::$strings["Select folder to import"] = "Ordner zum Importieren auswählen";
-App::$strings["Import from a zipped folder:"] = "Aus einem gezippten Ordner importieren:";
-App::$strings["Import from cloud files:"] = "Aus Cloud-Dateien importieren:";
-App::$strings["/cloud/channel/path/to/folder"] = "/Cloud/Kanal/Pfad/zum/Ordner";
-App::$strings["Enter path to website files"] = "Pfad zu Webseitendateien eingeben";
-App::$strings["Select folder"] = "Ordner auswählen";
-App::$strings["Export website..."] = "Webseite exportieren...";
-App::$strings["Export to a zip file"] = "In eine ZIP-Datei exportieren";
-App::$strings["website.zip"] = "website.zip";
-App::$strings["Enter a name for the zip file."] = "Geben Sie einen für die ZIP-Datei ein.";
-App::$strings["Export to cloud files"] = "In Cloud-Dateien exportieren";
-App::$strings["/path/to/export/folder"] = "/Pfad/zum/exportierenden/Ordner";
-App::$strings["Enter a path to a cloud files destination."] = "Gib den Pfad zu einem Datei-Speicherort in der Cloud ein.";
-App::$strings["Specify folder"] = "Ordner angeben";
-App::$strings["Public Timeline"] = "Öffentliche Zeitleiste";
-App::$strings["Directory Options"] = "Verzeichnisoptionen";
-App::$strings["Safe Mode"] = "Sicherer Modus";
-App::$strings["Public Forums Only"] = "Nur öffentliche Foren";
-App::$strings["This Website Only"] = "Nur dieser Hub";
-App::$strings["No recipient provided."] = "Kein Empfänger angegeben";
-App::$strings["[no subject]"] = "[no subject]";
-App::$strings["Unable to determine sender."] = "Kann Absender nicht bestimmen.";
-App::$strings["Stored post could not be verified."] = "Gespeicherter Beitrag konnten nicht überprüft werden.";
-App::$strings["System"] = "System";
-App::$strings["New App"] = "Neue App";
-App::$strings["Suggestions"] = "Vorschläge";
-App::$strings["See more..."] = "Mehr anzeigen …";
-App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Du bist %1$.0f von maximal %2$.0f erlaubten Verbindungen eingegangen.";
-App::$strings["Add New Connection"] = "Neue Verbindung hinzufügen";
-App::$strings["Enter channel address"] = "Adresse des Kanals eingeben";
-App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Beispiele: bob@beispiel.com, http://beispiel.com/barbara";
-App::$strings["Notes"] = "Notizen";
-App::$strings["Remove term"] = "Eintrag löschen";
-App::$strings["Saved Searches"] = "Gespeicherte Suchanfragen";
-App::$strings["Archives"] = "Archive";
-App::$strings["Refresh"] = "Aktualisieren";
-App::$strings["Account settings"] = "Konto-Einstellungen";
-App::$strings["Channel settings"] = "Kanal-Einstellungen";
-App::$strings["Additional features"] = "Zusätzliche Funktionen";
-App::$strings["Feature/Addon settings"] = "Plugin-Einstellungen";
-App::$strings["Display settings"] = "Anzeige-Einstellungen";
-App::$strings["Manage locations"] = "Klon-Adressen verwalten";
-App::$strings["Export channel"] = "Kanal exportieren";
-App::$strings["Connected apps"] = "Verbundene Apps";
-App::$strings["Premium Channel Settings"] = "Premium-Kanal-Einstellungen";
-App::$strings["Private Mail Menu"] = "Private Nachrichten";
-App::$strings["Combined View"] = "Kombinierte Anzeige";
-App::$strings["Conversations"] = "Konversationen";
-App::$strings["Received Messages"] = "Erhaltene Nachrichten";
-App::$strings["Sent Messages"] = "Gesendete Nachrichten";
-App::$strings["No messages."] = "Keine Nachrichten.";
-App::$strings["Delete conversation"] = "Unterhaltung löschen";
-App::$strings["Events Tools"] = "Kalenderwerkzeuge";
-App::$strings["Export Calendar"] = "Kalender exportieren";
-App::$strings["Import Calendar"] = "Kalender importieren";
-App::$strings["Overview"] = "Übersicht";
-App::$strings["Chat Members"] = "Chatmitglieder";
-App::$strings["Wiki List"] = "Wikiliste";
-App::$strings["Wiki Pages"] = "Wikiseiten";
-App::$strings["Bookmarked Chatrooms"] = "Gespeicherte Chatrooms";
-App::$strings["Suggested Chatrooms"] = "Chatraum-Vorschläge";
-App::$strings["photo/image"] = "Foto/Bild";
-App::$strings["Click to show more"] = "Klick, um mehr anzuzeigen";
-App::$strings["Rating Tools"] = "Bewertungswerkzeuge";
-App::$strings["Rate Me"] = "Bewerte mich";
-App::$strings["View Ratings"] = "Bewertungen ansehen";
-App::$strings["Forums"] = "Foren";
-App::$strings["Tasks"] = "Aufgaben";
-App::$strings["Documentation"] = "Dokumentation";
-App::$strings["Member registrations waiting for confirmation"] = "Nutzer-Anmeldungen, die auf Bestätigung warten";
-App::$strings["Inspect queue"] = "Warteschlange kontrollieren";
-App::$strings["DB updates"] = "DB-Aktualisierungen";
-App::$strings["Plugin Features"] = "Plug-In Funktionen";
-App::$strings["Invalid data packet"] = "Ungültiges Datenpaket";
-App::$strings["Unable to verify channel signature"] = "Konnte die Signatur des Kanals nicht verifizieren";
-App::$strings["Unable to verify site signature for %s"] = "Kann die Signatur der Seite von %s nicht verifizieren";
-App::$strings["invalid target signature"] = "Ungültige Signatur des Ziels";
-App::$strings["General Features"] = "Allgemeine Funktionen";
-App::$strings["Content Expiration"] = "Verfall von Inhalten";
-App::$strings["Remove posts/comments and/or private messages at a future time"] = "Ermöglicht das automatische Löschen von Beiträgen, Kommentaren und/oder privaten Nachrichten zu einem zukünftigen Datum.";
-App::$strings["Multiple Profiles"] = "Mehrfachprofile";
-App::$strings["Ability to create multiple profiles"] = "Ermöglicht das Anlegen mehrerer Profile pro Kanal";
-App::$strings["Advanced Profiles"] = "Erweiterte Profile";
-App::$strings["Additional profile sections and selections"] = "Stellt zusätzliche Bereiche und Felder im Profil zur Verfügung";
-App::$strings["Profile Import/Export"] = "Profil-Import/Export";
-App::$strings["Save and load profile details across sites/channels"] = "Ermöglicht das Speichern von Profilen, um sie in einen anderen Kanal zu importieren";
-App::$strings["Web Pages"] = "Webseiten";
-App::$strings["Provide managed web pages on your channel"] = "Ermöglicht das Erstellen von Webseiten in Deinem Kanal";
-App::$strings["Provide a wiki for your channel"] = "Stelle ein Wiki in Deinem Kanal zur Verfügung";
-App::$strings["Private Notes"] = "Private Notizen";
-App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Aktiviert ein Werkzeug mit dem Notizen und Erinnerungen gespeichert werden können (Hinweis: nicht verschlüsselt)";
-App::$strings["Navigation Channel Select"] = "Kanal-Auswahl in der Navigationsleiste";
-App::$strings["Change channels directly from within the navigation dropdown menu"] = "Ermöglicht den direkten Wechsel zu anderen Kanälen über das Navigationsmenü";
-App::$strings["Photo Location"] = "Aufnahmeort";
-App::$strings["If location data is available on uploaded photos, link this to a map."] = "Verlinkt den Aufnahmeort von Fotos (falls verfügbar) auf einer Karte";
-App::$strings["Access Controlled Chatrooms"] = "Zugriffskontrollierte Chaträume";
-App::$strings["Provide chatrooms and chat services with access control."] = "Bieten Sie Chaträume und Chatdienste mit Zugriffskontrolle an.";
-App::$strings["Smart Birthdays"] = "Smarte Geburtstage";
-App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Stellt für Geburtstage einen Zeitzonenbezug her, falls deine Freunde über den ganzen Planeten verstreut sind.";
-App::$strings["Post Composition Features"] = "Nachbearbeitungsfunktionen";
-App::$strings["Large Photos"] = "Große Fotos";
-App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Große Vorschaubilder (1024px) in Beiträgen anzeigen. Falls nicht aktiviert, werden kleine Vorschaubilder (640px) verwendet.";
-App::$strings["Automatically import channel content from other channels or feeds"] = "Ermöglicht den automatischen Import von Inhalten für diesen Kanal von anderen Kanälen oder Feeds";
-App::$strings["Even More Encryption"] = "Noch mehr Verschlüsselung";
-App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Ermöglicht optional die zusätzliche Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Schlüssel)";
-App::$strings["Enable Voting Tools"] = "Umfragewerkzeuge aktivieren";
-App::$strings["Provide a class of post which others can vote on"] = "Aktiviert die Umfragewerkzeuge, um anderen die Möglichkeit zu geben, einem Beitrag zuzustimmen, ihn abzulehnen oder sich zu enthalten. (Muss im Beitrag selbst noch aktiviert werden.)";
-App::$strings["Disable Comments"] = "Kommentare deaktivieren";
-App::$strings["Provide the option to disable comments for a post"] = "Ermöglicht, die Kommentarfunktion für einzelne Beiträge abzuschalten";
-App::$strings["Delayed Posting"] = "Verzögertes Senden";
-App::$strings["Allow posts to be published at a later date"] = "Ermöglicht es, Beiträge zu einem späteren Zeitpunkt zu veröffentlichen";
-App::$strings["Suppress Duplicate Posts/Comments"] = "Doppelte Beiträge unterdrücken";
-App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Verhindert, dass innerhalb von zwei Minuten Beiträge mit identischem Inhalt veröffentlicht werden.";
-App::$strings["Network and Stream Filtering"] = "Netzwerk- und Stream-Filter";
-App::$strings["Search by Date"] = "Suche nach Datum";
-App::$strings["Ability to select posts by date ranges"] = "Möglichkeit, Beiträge nach Zeiträumen auszuwählen";
-App::$strings["Enable management and selection of privacy groups"] = "Auswahl und Verwaltung von Gruppen für Kanäle aktivieren";
-App::$strings["Save search terms for re-use"] = "Ermöglicht das Abspeichern von Suchbegriffen zur Wiederverwendung";
-App::$strings["Network Personal Tab"] = "Persönlicher Netzwerkreiter";
-App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Aktiviert einen Reiter in der Grid-Ansicht, der nur Netzwerk-Beiträge anzeigt, mit denen Du interagiert hast";
-App::$strings["Network New Tab"] = "Netzwerkreiter Neu";
-App::$strings["Enable tab to display all new Network activity"] = "Aktiviert einen Reiter in der Grid-Ansicht, der alle neuen Netzwerkaktivitäten anzeigt";
-App::$strings["Affinity Tool"] = "Beziehungs-Tool";
-App::$strings["Filter stream activity by depth of relationships"] = "Aktiviert ein Werkzeug in der Grid-Ansicht, das den Stream nach Grad der Beziehung filtern kann";
-App::$strings["Show friend and connection suggestions"] = "Freund- und Verbindungsvorschläge anzeigen";
-App::$strings["Post/Comment Tools"] = "Beitrag-/Kommentar-Tools";
-App::$strings["Community Tagging"] = "Gemeinschaftliches Verschlagworten";
-App::$strings["Ability to tag existing posts"] = "Ermöglicht das Verschlagworten existierender Beiträge";
-App::$strings["Post Categories"] = "Beitrags-Kategorien";
-App::$strings["Add categories to your posts"] = "Aktiviert Kategorien für Beiträge";
-App::$strings["Emoji Reactions"] = "Emoji Reaktionen";
-App::$strings["Add emoji reaction ability to posts"] = "Aktiviert Emoji-Reaktionen für Beiträge";
-App::$strings["Ability to file posts under folders"] = "Möglichkeit, Beiträge in Verzeichnissen zu sammeln";
-App::$strings["Dislike Posts"] = "Gefällt-mir-nicht-Beiträge";
-App::$strings["Ability to dislike posts/comments"] = "Aktiviert die „Gefällt mir nicht“-Schaltfläche";
-App::$strings["Star Posts"] = "Beiträge mit Sternchen versehen";
-App::$strings["Ability to mark special posts with a star indicator"] = "Ermöglicht die lokale Markierung spezieller Beiträge mit einem Sternchen-Symbol";
-App::$strings["Tag Cloud"] = "Schlagwort-Wolke";
-App::$strings["Provide a personal tag cloud on your channel page"] = "Aktiviert die Anzeige einer Schlagwort-Wolke (Tag Cloud) auf Deiner Kanal-Seite";
-App::$strings["Connection Filtering"] = "Filter für Verbindungen";
-App::$strings["Filter incoming posts from connections based on keywords/content"] = "Ermöglicht die Filterung eingehender Beiträge anhand von Schlüsselwörtern (muss an der Verbindung konfiguriert werden)";
-App::$strings["Premium Channel"] = "Premium-Kanal";
-App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Ermöglicht es, Einschränkungen und Bedingungen für Verbindungen dieses Kanals festzulegen";
-App::$strings["Advanced Directory Search"] = "Erweiterte Verzeichnissuche";
-App::$strings["Allows creation of complex directory search queries"] = "Ermöglicht die Erstellung komplexer Verzeichnis-Suchabfragen";
-App::$strings["Advanced Theme and Layout Settings"] = "Erweiterte Design- und Layout-Einstellungen";
-App::$strings["Allows fine tuning of themes and page layouts"] = "Erlaubt die Feineinstellung von Designs und Seitenlayouts";
+App::$strings["Image/photo"] = "Bild/Foto";
+App::$strings["Encrypted content"] = "Verschlüsselter Inhalt";
+App::$strings["Install %s element: "] = "Element %s installieren: ";
+App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Dieser Beitrag beinhaltet ein installierbares %s Element, aber Du hast nicht die nötigen Rechte, um es auf diesem Hub zu installieren.";
+App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schrieb den folgenden %2\$s %3\$s";
+App::$strings["Click to open/close"] = "Klicke zum Öffnen/Schließen";
+App::$strings["spoiler"] = "Spoiler";
+App::$strings["$1 wrote:"] = "$1 schrieb:";
App::$strings["Focus (Hubzilla default)"] = "Focus (Voreinstellung für Hubzilla)";
App::$strings["Theme settings"] = "Theme-Einstellungen";
App::$strings["Narrow navbar"] = "Schmale Navigationsleiste";
diff --git a/view/en-au/hstrings.php b/view/en-au/hstrings.php
new file mode 100644
index 000000000..95f8c4e00
--- /dev/null
+++ b/view/en-au/hstrings.php
@@ -0,0 +1,5 @@
+<?php
+require_once('view/en-gb/strings.php');
+App::$strings['Welcome %s. Remote authentication successful.'] = "G'day %s. Remote authentication successful";
+
+
diff --git a/view/en-gb/hstrings.php b/view/en-gb/hstrings.php
new file mode 100644
index 000000000..e856c1af9
--- /dev/null
+++ b/view/en-gb/hstrings.php
@@ -0,0 +1,31 @@
+<?php
+App::$strings["Set shadow color, default #000"] = "Set shadow colour, default #000";
+App::$strings["Set background color"] = "Set background colour";
+App::$strings["Set section background color"] = "Set section background colour";
+App::$strings["Set color of items - use hex"] = "Set colour of items - use hex";
+App::$strings["Set color of links - use hex"] = "Set colour of links - use hex";
+App::$strings["Set color of fonts - use hex"] = "Set colour of fonts - use hex";
+App::$strings["Navigation bar background color"] = "Navigation bar background colour";
+App::$strings["Navigation bar gradient top color"] = "Navigation bar gradient top colour";
+App::$strings["Navigation bar gradient bottom color"] = "Navigation bar gradient bottom colour";
+App::$strings["Navigation active button gradient top color"] = "Navigation active button gradient top colour";
+App::$strings["Navigation active button gradient bottom color"] = "Navigation active button gradient bottom colour";
+App::$strings["Navigation bar border color "] = "Navigation bar border colour ";
+App::$strings["Navigation bar icon color "] = "Navigation bar icon colour ";
+App::$strings["Navigation bar active icon color "] = "Navigation bar active icon colour ";
+App::$strings["link color"] = "link colour";
+App::$strings["Set font-color for banner"] = "Set font-colour for banner";
+App::$strings["Set the background color"] = "Set the background colour";
+App::$strings["Set the background color of items"] = "Set the background colour of items";
+App::$strings["Set the background color of comments"] = "Set the background colour of comments";
+App::$strings["Set the border color of comments"] = "Set the border colour of comments";
+App::$strings["Set the basic color for item icons"] = "Set the basic colour for item icons";
+App::$strings["Set the hover color for item icons"] = "Set the hover colour for item icons";
+App::$strings["Set font-color for posts and comments"] = "Set font-colour for posts and comments";
+App::$strings["Authorize application connection"] = "Authorise application connection";
+App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Do you want to authorise this application to access your posts and contacts, and/or create new posts for you?";
+App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "If your certificate is not recognised, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues.";
+App::$strings["This is a hub of the Hubzilla - a global cooperative network of decentralized privacy enhanced websites."] = "This is a hub of the Hubzilla - a global cooperative network of decentralised privacy enhanced websites.";
+App::$strings["You are cordially invited to join me and some other close friends on the Hubzilla - a revolutionary new decentralized communication and information tool."] = "You are cordially invited to join me and some other close friends on the Hubzilla - a revolutionary new decentralised communication and information tool.";
+App::$strings["l F d, Y \\@ g:i A"] = "l j F, Y \\@ G:i";
+App::$strings["D, d M Y - g:i A"] = "D, d M Y - G:i";
diff --git a/view/en/htconfig.tpl b/view/en/htconfig.tpl
index a270951b2..042c89797 100644
--- a/view/en/htconfig.tpl
+++ b/view/en/htconfig.tpl
@@ -28,16 +28,17 @@ $db_type = '{{$dbtype}}'; // an integer. 0 or unset for mysql, 1 for postgres
App::$config['system']['timezone'] = '{{$timezone}}';
-// What is your site name? DO NOT ADD A TRAILING SLASH!
+// What is your site url? DO NOT ADD A TRAILING SLASH!
App::$config['system']['baseurl'] = '{{$siteurl}}';
App::$config['system']['sitename'] = "Hubzilla";
App::$config['system']['location_hash'] = '{{$site_id}}';
// Choices are 'basic', 'standard', and 'pro'.
-// basic sets up the sevrer for basic social networking and removes "complicated" features
+// basic sets up the server for basic social networking and removes "complicated" features
// standard provides most desired features except e-commerce
-// pro gives you access to everything
+// pro disables protocol federation plugins and only supports the zot protocol
+// if you are in doubt or are unsure, it is strongly advised that you select 'standard'.
App::$config['system']['server_role'] = '{{$server_role}}';
@@ -109,7 +110,7 @@ App::$config['system']['theme'] = 'redbasic';
// PHP error logging setup
// Before doing this ensure that the webserver has permission
-// to create and write to php.out in the top level Red directory,
+// to create and write to php.out in the top level web directory,
// or change the name (below) to a file/path where this is allowed.
// Uncomment the following 4 lines to turn on PHP error logging.
diff --git a/view/es-es/hmessages.po b/view/es-es/hmessages.po
index 1c926131c..7f90dac96 100644
--- a/view/es-es/hmessages.po
+++ b/view/es-es/hmessages.po
@@ -1,11 +1,11 @@
-# Hubzilla Project
-# Copyright (C) 2012-2014 the Hubzilla Project
-# This file is distributed under the same license as the Red package.
+# hubzilla
+# Copyright (C) 2012-2016 hubzilla
+# This file is distributed under the same license as the hubzilla package.
#
# Translators:
# alfonsomthd <alfonsomthd@tutanota.com>, 2015
# inboxwall <axetransit@gmail.com>, 2015
-# jeroenpraat <jeroenpraat@xs4all.nl>, 2015
+# jeroenpraat <social@jeroenvanrietpaap.nl>, 2015
# Manuel Jiménez Friaza <mjfriaza@openmailbox.org>, 2015-2016
# Rafael, 2015
# tony baldwin <tonybaldwin@gmx.com>, 2014
@@ -13,8 +13,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-09-30 00:02-0700\n"
-"PO-Revision-Date: 2016-10-05 11:10+0000\n"
+"POT-Creation-Date: 2016-12-16 00:04-0800\n"
+"PO-Revision-Date: 2016-12-17 11:37+0000\n"
"Last-Translator: Manuel Jiménez Friaza <mjfriaza@openmailbox.org>\n"
"Language-Team: Spanish (Spain) (http://www.transifex.com/Friendica/red-matrix/language/es_ES/)\n"
"MIME-Version: 1.0\n"
@@ -23,274 +23,294 @@ msgstr ""
"Language: es_ES\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../../Zotlabs/Access/PermissionRoles.php:182
+#: ../../Zotlabs/Access/PermissionRoles.php:227
#: ../../include/permissions.php:945
msgid "Social Networking"
msgstr "Redes sociales"
-#: ../../Zotlabs/Access/PermissionRoles.php:183
+#: ../../Zotlabs/Access/PermissionRoles.php:228
#: ../../include/permissions.php:945
msgid "Social - Mostly Public"
msgstr "Social - Público en su mayor parte"
-#: ../../Zotlabs/Access/PermissionRoles.php:184
+#: ../../Zotlabs/Access/PermissionRoles.php:229
#: ../../include/permissions.php:945
msgid "Social - Restricted"
msgstr "Social - Restringido"
-#: ../../Zotlabs/Access/PermissionRoles.php:185
+#: ../../Zotlabs/Access/PermissionRoles.php:230
#: ../../include/permissions.php:945
msgid "Social - Private"
msgstr "Social - Privado"
-#: ../../Zotlabs/Access/PermissionRoles.php:188
+#: ../../Zotlabs/Access/PermissionRoles.php:233
#: ../../include/permissions.php:946
msgid "Community Forum"
msgstr "Foro de discusión"
-#: ../../Zotlabs/Access/PermissionRoles.php:189
+#: ../../Zotlabs/Access/PermissionRoles.php:234
#: ../../include/permissions.php:946
msgid "Forum - Mostly Public"
msgstr "Foro - Público en su mayor parte"
-#: ../../Zotlabs/Access/PermissionRoles.php:190
+#: ../../Zotlabs/Access/PermissionRoles.php:235
#: ../../include/permissions.php:946
msgid "Forum - Restricted"
msgstr "Foro - Restringido"
-#: ../../Zotlabs/Access/PermissionRoles.php:191
+#: ../../Zotlabs/Access/PermissionRoles.php:236
#: ../../include/permissions.php:946
msgid "Forum - Private"
msgstr "Foro - Privado"
-#: ../../Zotlabs/Access/PermissionRoles.php:194
+#: ../../Zotlabs/Access/PermissionRoles.php:239
#: ../../include/permissions.php:947
msgid "Feed Republish"
msgstr "Republicar un \"feed\""
-#: ../../Zotlabs/Access/PermissionRoles.php:195
+#: ../../Zotlabs/Access/PermissionRoles.php:240
#: ../../include/permissions.php:947
msgid "Feed - Mostly Public"
msgstr "Feed - Público en su mayor parte"
-#: ../../Zotlabs/Access/PermissionRoles.php:196
+#: ../../Zotlabs/Access/PermissionRoles.php:241
#: ../../include/permissions.php:947
msgid "Feed - Restricted"
msgstr "Feed - Restringido"
-#: ../../Zotlabs/Access/PermissionRoles.php:199
+#: ../../Zotlabs/Access/PermissionRoles.php:244
#: ../../include/permissions.php:948
msgid "Special Purpose"
msgstr "Propósito especial"
-#: ../../Zotlabs/Access/PermissionRoles.php:200
+#: ../../Zotlabs/Access/PermissionRoles.php:245
#: ../../include/permissions.php:948
msgid "Special - Celebrity/Soapbox"
msgstr "Especial - Celebridad / Tribuna improvisada"
-#: ../../Zotlabs/Access/PermissionRoles.php:201
+#: ../../Zotlabs/Access/PermissionRoles.php:246
#: ../../include/permissions.php:948
msgid "Special - Group Repository"
msgstr "Especial - Repositorio de grupo"
-#: ../../Zotlabs/Access/PermissionRoles.php:204
-#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Access/PermissionRoles.php:249
#: ../../Zotlabs/Module/Register.php:213
-#: ../../Zotlabs/Module/Settings/Channel.php:442
-#: ../../include/permissions.php:949 ../../include/selectors.php:49
-#: ../../include/selectors.php:66 ../../include/selectors.php:104
-#: ../../include/selectors.php:140
+#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Settings/Channel.php:445
+#: ../../extend/addon/addon/cdav/cdav.php:277
+#: ../../extend/addon/addon/cdav/cdav.php:284
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1148
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+#: ../../include/selectors.php:104 ../../include/selectors.php:140
+#: ../../include/permissions.php:949
msgid "Other"
msgstr "Otro"
-#: ../../Zotlabs/Access/PermissionRoles.php:205
+#: ../../Zotlabs/Access/PermissionRoles.php:250
#: ../../include/permissions.php:949
msgid "Custom/Expert Mode"
msgstr "Modo personalizado/experto"
-#: ../../Zotlabs/Access/Permissions.php:30
+#: ../../Zotlabs/Access/Permissions.php:46
msgid "Can view my channel stream and posts"
msgstr "Pueden verse la actividad y publicaciones de mi canal"
-#: ../../Zotlabs/Access/Permissions.php:31 ../../include/permissions.php:42
+#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
msgid "Can send me their channel stream and posts"
msgstr "Se me pueden enviar entradas y contenido de un canal"
-#: ../../Zotlabs/Access/Permissions.php:32 ../../include/permissions.php:36
+#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
msgid "Can view my default channel profile"
msgstr "Puede verse mi perfil de canal predeterminado."
-#: ../../Zotlabs/Access/Permissions.php:33 ../../include/permissions.php:37
+#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
msgid "Can view my connections"
msgstr "Pueden verse mis conexiones"
-#: ../../Zotlabs/Access/Permissions.php:34 ../../include/permissions.php:38
+#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
msgid "Can view my file storage and photos"
msgstr "Pueden verse mi repositorio de ficheros y mis fotos"
-#: ../../Zotlabs/Access/Permissions.php:35
+#: ../../Zotlabs/Access/Permissions.php:51
msgid "Can upload/modify my file storage and photos"
msgstr "Se pueden subir / modificar elementos en mi repositorio de ficheros y fotos"
-#: ../../Zotlabs/Access/Permissions.php:36
+#: ../../Zotlabs/Access/Permissions.php:52
msgid "Can view my channel webpages"
msgstr "Pueden verse las páginas personales de mi canal"
-#: ../../Zotlabs/Access/Permissions.php:37
+#: ../../Zotlabs/Access/Permissions.php:53
msgid "Can create/edit my channel webpages"
msgstr "Pueden crearse / modificarse páginas personales en mi canal"
-#: ../../Zotlabs/Access/Permissions.php:38
+#: ../../Zotlabs/Access/Permissions.php:54
msgid "Can post on my channel (wall) page"
msgstr "Pueden crearse entradas en mi página de inicio del canal (“muro”)"
-#: ../../Zotlabs/Access/Permissions.php:39 ../../include/permissions.php:44
+#: ../../Zotlabs/Access/Permissions.php:55 ../../include/permissions.php:44
msgid "Can comment on or like my posts"
msgstr "Pueden publicarse comentarios en mis publicaciones o marcar mis entradas con 'me gusta'."
-#: ../../Zotlabs/Access/Permissions.php:40 ../../include/permissions.php:45
+#: ../../Zotlabs/Access/Permissions.php:56 ../../include/permissions.php:45
msgid "Can send me private mail messages"
msgstr "Se me pueden enviar mensajes privados"
-#: ../../Zotlabs/Access/Permissions.php:41
+#: ../../Zotlabs/Access/Permissions.php:57
msgid "Can like/dislike profiles and profile things"
msgstr "Se puede mostrar agrado o desagrado (Me gusta / No me gusta) en mis perfiles y sus distintos apartados"
-#: ../../Zotlabs/Access/Permissions.php:42
+#: ../../Zotlabs/Access/Permissions.php:58
msgid "Can forward to all my channel connections via @+ mentions in posts"
msgstr "Pueden reenviarse publicaciones a todas las conexiones de mi canal a través de @+ menciones en las entradas"
-#: ../../Zotlabs/Access/Permissions.php:43
+#: ../../Zotlabs/Access/Permissions.php:59
msgid "Can chat with me"
msgstr "Se puede chatear conmigo"
-#: ../../Zotlabs/Access/Permissions.php:44 ../../include/permissions.php:53
+#: ../../Zotlabs/Access/Permissions.php:60 ../../include/permissions.php:53
msgid "Can source my public posts in derived channels"
-msgstr "Pueden utilizarse mis publicaciones públicas como origen de contenidos en canales derivados"
+msgstr "Pueden utilizarse mis entradas públicas como origen de contenidos en canales derivados"
-#: ../../Zotlabs/Access/Permissions.php:45
+#: ../../Zotlabs/Access/Permissions.php:61
msgid "Can administer my channel"
msgstr "Se puede administrar mi canal"
-#: ../../Zotlabs/Storage/Browser.php:107 ../../Zotlabs/Storage/Browser.php:238
+#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
msgid "parent"
msgstr "padre"
-#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2711
+#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2682
msgid "Collection"
msgstr "Colección"
-#: ../../Zotlabs/Storage/Browser.php:134
+#: ../../Zotlabs/Storage/Browser.php:133
msgid "Principal"
msgstr "Principal"
-#: ../../Zotlabs/Storage/Browser.php:137
+#: ../../Zotlabs/Storage/Browser.php:136
msgid "Addressbook"
msgstr "Libreta de direcciones"
-#: ../../Zotlabs/Storage/Browser.php:140
+#: ../../Zotlabs/Storage/Browser.php:139
msgid "Calendar"
msgstr "Calendario"
-#: ../../Zotlabs/Storage/Browser.php:143
+#: ../../Zotlabs/Storage/Browser.php:142
msgid "Schedule Inbox"
msgstr "Programar bandeja de entrada"
-#: ../../Zotlabs/Storage/Browser.php:146
+#: ../../Zotlabs/Storage/Browser.php:145
msgid "Schedule Outbox"
msgstr "Programar bandeja de salida"
-#: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Module/Photos.php:789
+#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Module/Photos.php:789
#: ../../Zotlabs/Module/Photos.php:1249
-#: ../../Zotlabs/Module/Embedphotos.php:147 ../../Zotlabs/Lib/Apps.php:490
-#: ../../Zotlabs/Lib/Apps.php:565 ../../include/conversation.php:1031
-#: ../../include/widgets.php:1683
+#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:526
+#: ../../Zotlabs/Lib/Apps.php:603
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
+#: ../../include/widgets.php:1684 ../../include/conversation.php:1029
msgid "Unknown"
msgstr "Desconocido"
-#: ../../Zotlabs/Storage/Browser.php:225 ../../Zotlabs/Module/Fbrowser.php:85
-#: ../../Zotlabs/Lib/Apps.php:217 ../../include/nav.php:96
-#: ../../include/conversation.php:1679
+#: ../../Zotlabs/Storage/Browser.php:224 ../../Zotlabs/Module/Fbrowser.php:85
+#: ../../Zotlabs/Lib/Apps.php:219 ../../include/nav.php:96
+#: ../../include/conversation.php:1681
msgid "Files"
msgstr "Ficheros"
-#: ../../Zotlabs/Storage/Browser.php:226
+#: ../../Zotlabs/Storage/Browser.php:225
msgid "Total"
msgstr "Total"
-#: ../../Zotlabs/Storage/Browser.php:228
+#: ../../Zotlabs/Storage/Browser.php:227
msgid "Shared"
msgstr "Compartido"
-#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:321
+#: ../../Zotlabs/Storage/Browser.php:228 ../../Zotlabs/Storage/Browser.php:321
#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/New_channel.php:147
#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Layouts.php:184
#: ../../Zotlabs/Module/Webpages.php:239
+#: ../../extend/addon/addon/cdav/include/widgets.php:127
+#: ../../extend/addon/addon/cdav/include/widgets.php:164
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1151
msgid "Create"
msgstr "Crear"
-#: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:323
+#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:323
#: ../../Zotlabs/Module/Cover_photo.php:357
#: ../../Zotlabs/Module/Photos.php:816 ../../Zotlabs/Module/Photos.php:1370
-#: ../../Zotlabs/Module/Profile_photo.php:390
-#: ../../Zotlabs/Module/Embedphotos.php:159 ../../include/widgets.php:1696
+#: ../../Zotlabs/Module/Profile_photo.php:410
+#: ../../Zotlabs/Module/Embedphotos.php:157
+#: ../../extend/addon/addon/cdav/include/widgets.php:132
+#: ../../extend/addon/addon/cdav/include/widgets.php:168
+#: ../../include/widgets.php:1697
msgid "Upload"
msgstr "Subir"
-#: ../../Zotlabs/Storage/Browser.php:234
-#: ../../Zotlabs/Module/Admin/Channels.php:163
-#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Chat.php:250
+#: ../../Zotlabs/Storage/Browser.php:233
+#: ../../Zotlabs/Module/Admin/Channels.php:159
+#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Wiki.php:151
#: ../../Zotlabs/Module/Settings/Oauth.php:89
#: ../../Zotlabs/Module/Settings/Oauth.php:115
+#: ../../Zotlabs/Module/Chat.php:250
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1136
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:164
msgid "Name"
msgstr "Nombre"
-#: ../../Zotlabs/Storage/Browser.php:235
+#: ../../Zotlabs/Storage/Browser.php:234 ../../Zotlabs/Module/Wiki.php:152
msgid "Type"
msgstr "Tipo"
-#: ../../Zotlabs/Storage/Browser.php:236
-#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1372
+#: ../../Zotlabs/Storage/Browser.php:235
+#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1390
msgid "Size"
msgstr "Tamaño"
-#: ../../Zotlabs/Storage/Browser.php:237
+#: ../../Zotlabs/Storage/Browser.php:236
#: ../../Zotlabs/Module/Sharedwithme.php:102
msgid "Last Modified"
msgstr "Última modificación"
-#: ../../Zotlabs/Storage/Browser.php:239
-#: ../../Zotlabs/Module/Admin/Profs.php:154
+#: ../../Zotlabs/Storage/Browser.php:238
#: ../../Zotlabs/Module/Connections.php:290
#: ../../Zotlabs/Module/Connections.php:310
-#: ../../Zotlabs/Module/Editblock.php:109
+#: ../../Zotlabs/Module/Admin/Profs.php:154
#: ../../Zotlabs/Module/Editlayout.php:114
#: ../../Zotlabs/Module/Editwebpage.php:145 ../../Zotlabs/Module/Menu.php:112
+#: ../../Zotlabs/Module/Editblock.php:109 ../../Zotlabs/Module/Editpost.php:84
#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:192
-#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Editpost.php:84
-#: ../../Zotlabs/Module/Thing.php:260
+#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Wiki.php:144
+#: ../../Zotlabs/Module/Wiki.php:246
#: ../../Zotlabs/Module/Settings/Oauth.php:149
-#: ../../Zotlabs/Lib/ThreadItem.php:106 ../../Zotlabs/Lib/Apps.php:341
-#: ../../include/channel.php:959 ../../include/channel.php:963
+#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Lib/ThreadItem.php:106
+#: ../../Zotlabs/Lib/Apps.php:346
+#: ../../extend/addon/addon/cdav/include/widgets.php:125
+#: ../../extend/addon/addon/cdav/include/widgets.php:161
+#: ../../include/channel.php:961 ../../include/channel.php:965
#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
#: ../../include/menu.php:113
msgid "Edit"
msgstr "Editar"
-#: ../../Zotlabs/Storage/Browser.php:240
-#: ../../Zotlabs/Module/Admin/Accounts.php:174
-#: ../../Zotlabs/Module/Admin/Channels.php:153
-#: ../../Zotlabs/Module/Admin/Profs.php:155
+#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Module/Connedit.php:635
#: ../../Zotlabs/Module/Connections.php:263
-#: ../../Zotlabs/Module/Connedit.php:607
-#: ../../Zotlabs/Module/Editblock.php:134
+#: ../../Zotlabs/Module/Admin/Profs.php:155
+#: ../../Zotlabs/Module/Admin/Accounts.php:173
+#: ../../Zotlabs/Module/Admin/Channels.php:149
#: ../../Zotlabs/Module/Editlayout.php:137
-#: ../../Zotlabs/Module/Editwebpage.php:170 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Editwebpage.php:170
+#: ../../Zotlabs/Module/Editblock.php:134 ../../Zotlabs/Module/Group.php:177
#: ../../Zotlabs/Module/Photos.php:1179 ../../Zotlabs/Module/Blocks.php:162
-#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Module/Thing.php:261
+#: ../../Zotlabs/Module/Webpages.php:242
#: ../../Zotlabs/Module/Settings/Oauth.php:150
-#: ../../Zotlabs/Lib/ThreadItem.php:126 ../../Zotlabs/Lib/Apps.php:342
-#: ../../include/conversation.php:660
+#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Lib/ThreadItem.php:126
+#: ../../Zotlabs/Lib/Apps.php:347
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:864
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1153
+#: ../../include/conversation.php:656
msgid "Delete"
msgstr "Eliminar"
@@ -320,82 +340,90 @@ msgstr "Subir fichero"
msgid "Drop files here to immediately upload"
msgstr "Arrastre los ficheros aquí para subirlos de forma inmediata"
-#: ../../Zotlabs/Web/Router.php:65 ../../Zotlabs/Web/WebServer.php:128
+#: ../../Zotlabs/Web/Router.php:67 ../../Zotlabs/Web/WebServer.php:128
#: ../../Zotlabs/Module/Achievements.php:34
-#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Channel.php:104
-#: ../../Zotlabs/Module/Channel.php:229 ../../Zotlabs/Module/Channel.php:270
+#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Connedit.php:397
#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Bookmarks.php:61
-#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
-#: ../../Zotlabs/Module/Mail.php:121 ../../Zotlabs/Module/Connections.php:33
+#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Page.php:35
+#: ../../Zotlabs/Module/Page.php:91 ../../Zotlabs/Module/Manage.php:10
+#: ../../Zotlabs/Module/Connections.php:33
#: ../../Zotlabs/Module/Cover_photo.php:277
#: ../../Zotlabs/Module/Cover_photo.php:290
-#: ../../Zotlabs/Module/Connedit.php:395 ../../Zotlabs/Module/Editblock.php:67
#: ../../Zotlabs/Module/Editlayout.php:67
#: ../../Zotlabs/Module/Editlayout.php:90
#: ../../Zotlabs/Module/Editwebpage.php:68
#: ../../Zotlabs/Module/Editwebpage.php:89
#: ../../Zotlabs/Module/Editwebpage.php:104
-#: ../../Zotlabs/Module/Editwebpage.php:126 ../../Zotlabs/Module/Menu.php:78
-#: ../../Zotlabs/Module/Appman.php:75 ../../Zotlabs/Module/Api.php:12
-#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Filestorage.php:23
+#: ../../Zotlabs/Module/Editwebpage.php:126
+#: ../../Zotlabs/Module/Channel.php:107 ../../Zotlabs/Module/Channel.php:237
+#: ../../Zotlabs/Module/Channel.php:277 ../../Zotlabs/Module/Network.php:15
+#: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Appman.php:76
+#: ../../Zotlabs/Module/Filestorage.php:23
#: ../../Zotlabs/Module/Filestorage.php:78
#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Manage.php:10
-#: ../../Zotlabs/Module/Group.php:13 ../../Zotlabs/Module/Block.php:26
-#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Invite.php:17
-#: ../../Zotlabs/Module/Invite.php:91 ../../Zotlabs/Module/Locs.php:87
-#: ../../Zotlabs/Module/Rate.php:113 ../../Zotlabs/Module/Like.php:181
-#: ../../Zotlabs/Module/Profiles.php:203 ../../Zotlabs/Module/Profiles.php:601
+#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Item.php:220
+#: ../../Zotlabs/Module/Item.php:230 ../../Zotlabs/Module/Item.php:1064
+#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Mail.php:163
+#: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76
+#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94
+#: ../../Zotlabs/Module/Editblock.php:67 ../../Zotlabs/Module/Group.php:13
#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Message.php:18
-#: ../../Zotlabs/Module/Setup.php:220 ../../Zotlabs/Module/Mood.php:116
-#: ../../Zotlabs/Module/Photos.php:73 ../../Zotlabs/Module/New_channel.php:77
+#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Photos.php:73
+#: ../../Zotlabs/Module/Setup.php:212 ../../Zotlabs/Module/Editpost.php:17
+#: ../../Zotlabs/Module/New_channel.php:77
#: ../../Zotlabs/Module/New_channel.php:104
-#: ../../Zotlabs/Module/Notifications.php:70 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Profiles.php:197 ../../Zotlabs/Module/Profiles.php:595
#: ../../Zotlabs/Module/Profile.php:68 ../../Zotlabs/Module/Profile.php:76
#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
-#: ../../Zotlabs/Module/Layouts.php:89
-#: ../../Zotlabs/Module/Profile_photo.php:265
-#: ../../Zotlabs/Module/Profile_photo.php:278
-#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Settings.php:59
-#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Regmod.php:21
-#: ../../Zotlabs/Module/Webpages.php:116 ../../Zotlabs/Module/Editpost.php:17
-#: ../../Zotlabs/Module/Events.php:264
+#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Rate.php:113
+#: ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Profile_photo.php:273
+#: ../../Zotlabs/Module/Profile_photo.php:286
+#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Api.php:24
+#: ../../Zotlabs/Module/Regmod.php:21 ../../Zotlabs/Module/Pdledit.php:29
#: ../../Zotlabs/Module/Service_limits.php:11
-#: ../../Zotlabs/Module/Thing.php:274 ../../Zotlabs/Module/Thing.php:294
-#: ../../Zotlabs/Module/Thing.php:335 ../../Zotlabs/Module/Item.php:214
-#: ../../Zotlabs/Module/Item.php:222 ../../Zotlabs/Module/Item.php:1068
-#: ../../Zotlabs/Module/Sharedwithme.php:11
-#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Suggest.php:30
+#: ../../Zotlabs/Module/Webpages.php:116
+#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Wiki.php:189
+#: ../../Zotlabs/Module/Wiki.php:286 ../../Zotlabs/Module/Sources.php:74
+#: ../../Zotlabs/Module/Suggest.php:30 ../../Zotlabs/Module/Thing.php:274
+#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
#: ../../Zotlabs/Module/Viewconnections.php:28
#: ../../Zotlabs/Module/Viewconnections.php:33
#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Chat.php:100
-#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Lib/Chatroom.php:137
-#: ../../include/photos.php:27 ../../include/items.php:3506
-#: ../../include/attach.php:142 ../../include/attach.php:190
-#: ../../include/attach.php:253 ../../include/attach.php:267
-#: ../../include/attach.php:274 ../../include/attach.php:339
-#: ../../include/attach.php:353 ../../include/attach.php:360
-#: ../../include/attach.php:440 ../../include/attach.php:909
-#: ../../include/attach.php:980 ../../include/attach.php:1132
+#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Module/Events.php:267
+#: ../../Zotlabs/Lib/Chatroom.php:137
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:55
+#: ../../extend/addon/addon/keepout/keepout.php:36
+#: ../../extend/addon/addon/pumpio/pumpio.php:40
+#: ../../extend/addon/addon/openid/Mod_Id.php:53
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:58
+#: ../../include/items.php:3422 ../../include/attach.php:142
+#: ../../include/attach.php:189 ../../include/attach.php:253
+#: ../../include/attach.php:267 ../../include/attach.php:274
+#: ../../include/attach.php:341 ../../include/attach.php:355
+#: ../../include/attach.php:362 ../../include/attach.php:439
+#: ../../include/attach.php:906 ../../include/attach.php:977
+#: ../../include/attach.php:1135 ../../include/photos.php:27
msgid "Permission denied."
msgstr "Acceso denegado."
-#: ../../Zotlabs/Web/Router.php:146 ../../include/help.php:56
-msgid "Not Found"
-msgstr "No encontrado"
-
-#: ../../Zotlabs/Web/Router.php:149 ../../Zotlabs/Module/Page.php:94
-#: ../../Zotlabs/Module/Block.php:79 ../../Zotlabs/Module/Display.php:120
-#: ../../include/help.php:59
+#: ../../Zotlabs/Web/Router.php:157 ../../Zotlabs/Module/Page.php:94
+#: ../../Zotlabs/Module/Display.php:120 ../../Zotlabs/Module/Block.php:79
+#: ../../include/help.php:66
msgid "Page not found."
msgstr "Página no encontrada."
-#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Group.php:72
-#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:66
-#: ../../Zotlabs/Module/Import_items.php:114 ../../Zotlabs/Module/Like.php:283
-#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
-#: ../../include/items.php:403
+#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Dreport.php:10
+#: ../../Zotlabs/Module/Dreport.php:68
+#: ../../Zotlabs/Module/Import_items.php:114 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Like.php:283
+#: ../../Zotlabs/Module/Subthread.php:62
+#: ../../extend/addon/addon/frphotos/frphotos.php:81
+#: ../../extend/addon/addon/redfiles/redfiles.php:109
+#: ../../extend/addon/addon/redphotos/redphotos.php:119
+#: ../../include/items.php:327
msgid "Permission denied"
msgstr "Permiso denegado"
@@ -405,19 +433,21 @@ msgid ""
" logout and retry."
msgstr "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo."
-#: ../../Zotlabs/Zot/Auth.php:246
+#: ../../Zotlabs/Zot/Auth.php:250
+#: ../../extend/addon/addon/openid/Mod_Openid.php:76
+#: ../../extend/addon/addon/openid/Mod_Openid.php:183
#, php-format
msgid "Welcome %s. Remote authentication successful."
msgstr "Bienvenido %s. La identificación desde su servidor se ha llevado a cabo correctamente."
#: ../../Zotlabs/Module/Achievements.php:15
-#: ../../Zotlabs/Module/Editblock.php:31
-#: ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editlayout.php:31
#: ../../Zotlabs/Module/Editwebpage.php:32
-#: ../../Zotlabs/Module/Filestorage.php:59 ../../Zotlabs/Module/Connect.php:17
-#: ../../Zotlabs/Module/Hcard.php:12 ../../Zotlabs/Module/Profile.php:20
-#: ../../Zotlabs/Module/Blocks.php:33 ../../Zotlabs/Module/Layouts.php:31
-#: ../../Zotlabs/Module/Webpages.php:33 ../../include/channel.php:859
+#: ../../Zotlabs/Module/Filestorage.php:59
+#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Hcard.php:12
+#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Blocks.php:33
+#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Webpages.php:33
+#: ../../include/channel.php:862
msgid "Requested profile is not available."
msgstr "El perfil solicitado no está disponible."
@@ -433,199 +463,795 @@ msgstr "Ausente"
msgid "Online"
msgstr "Conectado/a"
-#: ../../Zotlabs/Module/Network.php:95
-msgid "No such group"
-msgstr "No se encuentra el grupo"
+#: ../../Zotlabs/Module/Register.php:49
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Se ha superado el límite máximo de inscripciones diarias de este sitio. Por favor, pruebe de nuevo mañana."
-#: ../../Zotlabs/Module/Network.php:135
-msgid "No such channel"
-msgstr "No se encuentra el canal"
+#: ../../Zotlabs/Module/Admin/Accounts.php:168
+#: ../../Zotlabs/Module/Admin/Channels.php:152
+msgid "select all"
+msgstr "seleccionar todo"
-#: ../../Zotlabs/Module/Network.php:140
-msgid "forum"
-msgstr "foro"
+#: ../../Zotlabs/Module/Admin/Accounts.php:169
+msgid "Registrations waiting for confirm"
+msgstr "Inscripciones en espera de confirmación"
-#: ../../Zotlabs/Module/Network.php:152
-msgid "Search Results For:"
-msgstr "Buscar resultados para:"
+#: ../../Zotlabs/Module/Admin/Accounts.php:170
+msgid "Request date"
+msgstr "Fecha de solicitud"
-#: ../../Zotlabs/Module/Network.php:218
-msgid "Privacy group is empty"
-msgstr "El grupo de canales está vacío"
+#: ../../Zotlabs/Module/Admin/Accounts.php:170
+#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/network.php:2212
+msgid "Email"
+msgstr "Correo electrónico"
-#: ../../Zotlabs/Module/Network.php:227
-msgid "Privacy group: "
-msgstr "Grupo de canales: "
+#: ../../Zotlabs/Module/Admin/Accounts.php:171
+msgid "No registrations."
+msgstr "Sin registros."
-#: ../../Zotlabs/Module/Network.php:253
-msgid "Invalid connection."
-msgstr "Conexión no válida."
+#: ../../Zotlabs/Module/Admin/Accounts.php:172
+#: ../../Zotlabs/Module/Connections.php:275
+msgid "Approve"
+msgstr "Aprobar"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:173
+msgid "Deny"
+msgstr "Rechazar"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:175
+#: ../../Zotlabs/Module/Connedit.php:575
+msgid "Block"
+msgstr "Bloquear"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:176
+#: ../../Zotlabs/Module/Connedit.php:575
+msgid "Unblock"
+msgstr "Desbloquear"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:181
+msgid "ID"
+msgstr "ID"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:183 ../../include/group.php:267
+msgid "All Channels"
+msgstr "Todos los canales"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:184
+msgid "Register date"
+msgstr "Fecha de registro"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:185
+msgid "Last login"
+msgstr "Último acceso"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:186
+msgid "Expires"
+msgstr "Caduca"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:187
+msgid "Service Class"
+msgstr "Clase de servicio"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:189
+msgid ""
+"Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
+" on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "¡Las cuentas seleccionadas van a ser eliminadas!\\n\\n¡Todo lo que estas cuentas han publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?"
+
+#: ../../Zotlabs/Module/Register.php:221 ../../Zotlabs/Module/Siteinfo.php:27
+msgid "Terms of Service"
+msgstr "Términos del servicio"
+
+#: ../../Zotlabs/Module/Register.php:227
+#, php-format
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channels censored/uncensored"
+msgstr[0] "%s canales censurados/no censurados"
+msgstr[1] "%s canales censurados/no censurados"
+
+#: ../../Zotlabs/Module/Register.php:229
+#, php-format
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "Tengo más de 13 años de edad y acepto los %s de este sitio"
+
+#: ../../Zotlabs/Module/Register.php:233
+msgid "Your email address"
+msgstr "Su dirección de correo electrónico"
+
+#: ../../Zotlabs/Module/Register.php:234
+msgid "Choose a password"
+msgstr "Elija una contraseña"
+
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Please re-enter your password"
+msgstr "Por favor, vuelva a escribir su contraseña"
+
+#: ../../Zotlabs/Module/Register.php:236
+msgid "Please enter your invitation code"
+msgstr "Por favor, introduzca el código de su invitación"
+
+#: ../../Zotlabs/Module/Register.php:237
+#: ../../Zotlabs/Module/New_channel.php:134
+msgid "Name or caption"
+msgstr "Nombre o descripción"
+
+#: ../../Zotlabs/Module/Register.php:237
+#: ../../Zotlabs/Module/New_channel.php:134
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
+msgstr "Ejemplos: \"Juan García\", \"Luisa y sus caballos\", \"Fútbol\", \"Grupo de aviación\""
+
+#: ../../Zotlabs/Module/Register.php:239
+#: ../../Zotlabs/Module/New_channel.php:136
+msgid "Choose a short nickname"
+msgstr "Elija un alias corto"
+
+#: ../../Zotlabs/Module/Register.php:239
+#: ../../Zotlabs/Module/New_channel.php:136
+#, php-format
+msgid "Channel '%s' code disallowed"
+msgstr "Código no permitido al canal '%s'"
+
+#: ../../Zotlabs/Module/Register.php:240
+#: ../../Zotlabs/Module/New_channel.php:137
+msgid "Channel role and privacy"
+msgstr "Clase de canal y privacidad"
+
+#: ../../Zotlabs/Module/Register.php:240
+#: ../../Zotlabs/Module/New_channel.php:137
+msgid "Select a channel role with your privacy requirements."
+msgstr "Seleccione un tipo de canal con sus requisitos de privacidad"
+
+#: ../../Zotlabs/Module/Register.php:240
+#: ../../Zotlabs/Module/New_channel.php:137
+msgid "Read more about roles"
+msgstr "Leer más sobre los roles"
+
+#: ../../Zotlabs/Module/Register.php:241
+msgid "no"
+msgstr "no"
+
+#: ../../Zotlabs/Module/Register.php:241
+msgid "yes"
+msgstr "sí"
+
+#: ../../Zotlabs/Module/Register.php:253
+#: ../../Zotlabs/Module/Admin/Site.php:261
+msgid "Registration"
+msgstr "Registro"
+
+#: ../../Zotlabs/Module/Register.php:258
+msgid "Membership on this site is by invitation only."
+msgstr "Para registrarse en este sitio es necesaria una invitación."
+
+#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:150
+#: ../../boot.php:1702
+msgid "Register"
+msgstr "Registrarse"
+
+#: ../../Zotlabs/Module/Register.php:271
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Los canales seleccionados se eliminarán!\\n\\nTodo lo publicado por estos canales en este sitio se borrarán definitivamente!\\n\\n¿Está seguro de querer hacerlo?"
#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
#, php-format
msgid "Fetching URL returns error: %1$s"
msgstr "Al intentar obtener la dirección, retorna el error: %1$s"
-#: ../../Zotlabs/Module/Acl.php:313
-msgid "network"
-msgstr "red"
+#: ../../Zotlabs/Module/Match.php:26
+msgid "Profile Match"
+msgstr "Perfil compatible"
-#: ../../Zotlabs/Module/Acl.php:323
-msgid "RSS"
-msgstr "RSS"
+#: ../../Zotlabs/Module/Match.php:35
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "No hay palabras clave en el perfil principal para poder encontrar perfiles compatibles. Por favor, añada palabras clave a su perfil principal."
-#: ../../Zotlabs/Module/Channel.php:28 ../../Zotlabs/Module/Wiki.php:20
-#: ../../Zotlabs/Module/Chat.php:25
-msgid "You must be logged in to see this page."
-msgstr "Debe haber iniciado sesión para poder ver esta página."
+#: ../../Zotlabs/Module/Match.php:67
+msgid "is interested in:"
+msgstr "está interesado en:"
-#: ../../Zotlabs/Module/Channel.php:40
-msgid "Posts and comments"
-msgstr "Publicaciones y comentarios"
+#: ../../Zotlabs/Module/Match.php:68 ../../Zotlabs/Module/Directory.php:328
+#: ../../Zotlabs/Module/Suggest.php:56 ../../include/channel.php:1036
+#: ../../include/connections.php:78 ../../include/widgets.php:147
+#: ../../include/widgets.php:184 ../../include/conversation.php:937
+msgid "Connect"
+msgstr "Conectar"
-#: ../../Zotlabs/Module/Channel.php:41
-msgid "Only posts"
-msgstr "Solo publicaciones"
+#: ../../Zotlabs/Module/Match.php:74
+msgid "No matches"
+msgstr "No se han encontrado perfiles compatibles"
-#: ../../Zotlabs/Module/Channel.php:101
-msgid "Insufficient permissions. Request redirected to profile page."
-msgstr "Permisos insuficientes. Petición redirigida a la página del perfil."
+#: ../../Zotlabs/Module/Connedit.php:82
+msgid "Could not access contact record."
+msgstr "No se ha podido acceder al registro de contacto."
-#: ../../Zotlabs/Module/Import.php:33
-#, php-format
-msgid "Your service plan only allows %d channels."
-msgstr "Su paquete de servicios solo permite %d canales."
+#: ../../Zotlabs/Module/Connedit.php:106
+msgid "Could not locate selected profile."
+msgstr "No se ha podido localizar el perfil seleccionado."
-#: ../../Zotlabs/Module/Import.php:71 ../../Zotlabs/Module/Import_items.php:42
-msgid "Nothing to import."
-msgstr "No hay nada para importar."
+#: ../../Zotlabs/Module/Connedit.php:258
+msgid "Connection updated."
+msgstr "Conexión actualizada."
-#: ../../Zotlabs/Module/Import.php:95 ../../Zotlabs/Module/Import_items.php:66
-msgid "Unable to download data from old server"
-msgstr "No se han podido descargar datos de su antiguo servidor"
+#: ../../Zotlabs/Module/Connedit.php:260
+msgid "Failed to update connection record."
+msgstr "Error al actualizar el registro de la conexión."
-#: ../../Zotlabs/Module/Import.php:101
-#: ../../Zotlabs/Module/Import_items.php:72
-msgid "Imported file is empty."
-msgstr "El fichero importado está vacío."
+#: ../../Zotlabs/Module/Connedit.php:310
+msgid "is now connected to"
+msgstr "ahora está conectado/a"
-#: ../../Zotlabs/Module/Import.php:123
-#: ../../Zotlabs/Module/Import_items.php:88
+#: ../../Zotlabs/Module/Connedit.php:411 ../../Zotlabs/Module/Connedit.php:716
+#: ../../Zotlabs/Module/Admin/Site.php:218 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
+#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653
+#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:97
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:159
+#: ../../Zotlabs/Module/Settings/Channel.php:289
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+#: ../../extend/addon/addon/libertree/libertree.php:69
+#: ../../extend/addon/addon/libertree/libertree.php:81
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+#: ../../extend/addon/addon/nofed/nofed.php:72
+#: ../../extend/addon/addon/nofed/nofed.php:76
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+#: ../../extend/addon/addon/planets/planets.php:153
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+#: ../../extend/addon/addon/redred/redred.php:95
+#: ../../extend/addon/addon/redred/redred.php:99
+#: ../../extend/addon/addon/rtof/rtof.php:81
+#: ../../extend/addon/addon/rtof/rtof.php:85
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../extend/addon/addon/twitter/twitter.php:246
+#: ../../extend/addon/addon/twitter/twitter.php:255
+#: ../../extend/addon/addon/visage/visage.php:166
+#: ../../extend/addon/addon/wppost/wppost.php:82
+#: ../../extend/addon/addon/wppost/wppost.php:105
+#: ../../extend/addon/addon/wppost/wppost.php:109
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+#: ../../extend/addon/addon/cdav/cdav.php:234 ../../include/dir_fns.php:143
+#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
+#: ../../view/theme/redbasic/php/config.php:111
+#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1724
+msgid "No"
+msgstr "No"
+
+#: ../../Zotlabs/Module/Connedit.php:411
+#: ../../Zotlabs/Module/Admin/Site.php:220 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
+#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653
+#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:96
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:159
+#: ../../Zotlabs/Module/Settings/Channel.php:289
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+#: ../../extend/addon/addon/libertree/libertree.php:69
+#: ../../extend/addon/addon/libertree/libertree.php:81
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+#: ../../extend/addon/addon/nofed/nofed.php:72
+#: ../../extend/addon/addon/nofed/nofed.php:76
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+#: ../../extend/addon/addon/planets/planets.php:153
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+#: ../../extend/addon/addon/redred/redred.php:95
+#: ../../extend/addon/addon/redred/redred.php:99
+#: ../../extend/addon/addon/rtof/rtof.php:81
+#: ../../extend/addon/addon/rtof/rtof.php:85
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../extend/addon/addon/twitter/twitter.php:246
+#: ../../extend/addon/addon/twitter/twitter.php:255
+#: ../../extend/addon/addon/visage/visage.php:166
+#: ../../extend/addon/addon/wppost/wppost.php:82
+#: ../../extend/addon/addon/wppost/wppost.php:105
+#: ../../extend/addon/addon/wppost/wppost.php:109
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+#: ../../extend/addon/addon/cdav/cdav.php:234 ../../include/dir_fns.php:143
+#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
+#: ../../view/theme/redbasic/php/config.php:111
+#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1724
+msgid "Yes"
+msgstr "Sí"
+
+#: ../../Zotlabs/Module/Connedit.php:443
+msgid "Could not access address book record."
+msgstr "No se pudo acceder al registro en su libreta de direcciones."
+
+#: ../../Zotlabs/Module/Connedit.php:463
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Recarga fallida - no se puede encontrar el canal en este momento."
+
+#: ../../Zotlabs/Module/Connedit.php:478 ../../Zotlabs/Module/Connedit.php:487
+#: ../../Zotlabs/Module/Connedit.php:496 ../../Zotlabs/Module/Connedit.php:505
+#: ../../Zotlabs/Module/Connedit.php:518
+msgid "Unable to set address book parameters."
+msgstr "No ha sido posible establecer los parámetros de la libreta de direcciones."
+
+#: ../../Zotlabs/Module/Connedit.php:542
+msgid "Connection has been removed."
+msgstr "La conexión ha sido eliminada."
+
+#: ../../Zotlabs/Module/Connedit.php:582 ../../Zotlabs/Lib/Apps.php:223
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
+#: ../../include/nav.php:89 ../../include/conversation.php:935
+msgid "View Profile"
+msgstr "Ver el perfil"
+
+#: ../../Zotlabs/Module/Connedit.php:585
#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
-msgstr "Atención: Las versiones de la base de datos difieren en %1$d actualizaciones."
+msgid "View %s's profile"
+msgstr "Ver el perfil de %s"
-#: ../../Zotlabs/Module/Import.php:153 ../../include/import.php:107
-msgid "Cloned channel not found. Import failed."
-msgstr "No se ha podido importar el canal porque el canal clonado no se ha encontrado."
+#: ../../Zotlabs/Module/Connedit.php:589
+msgid "Refresh Permissions"
+msgstr "Recargar los permisos"
-#: ../../Zotlabs/Module/Import.php:163
-msgid "No channel. Import failed."
-msgstr "No hay canal. La importación ha fallado"
+#: ../../Zotlabs/Module/Connedit.php:592
+msgid "Fetch updated permissions"
+msgstr "Obtener los permisos actualizados"
-#: ../../Zotlabs/Module/Import.php:520
-#: ../../include/Import/import_diaspora.php:142
-msgid "Import completed."
-msgstr "Importación completada."
+#: ../../Zotlabs/Module/Connedit.php:596
+msgid "Recent Activity"
+msgstr "Actividad reciente"
-#: ../../Zotlabs/Module/Import.php:542
-msgid "You must be logged in to use this feature."
-msgstr "Debe estar registrado para poder usar esta funcionalidad."
+#: ../../Zotlabs/Module/Connedit.php:599
+msgid "View recent posts and comments"
+msgstr "Ver publicaciones y comentarios recientes"
-#: ../../Zotlabs/Module/Import.php:547
-msgid "Import Channel"
-msgstr "Importar canal"
+#: ../../Zotlabs/Module/Connedit.php:603
+#: ../../Zotlabs/Module/Admin/Accounts.php:175
+msgid "Unblock"
+msgstr "Desbloquear"
-#: ../../Zotlabs/Module/Import.php:548
-msgid ""
-"Use this form to import an existing channel from a different server/hub. You"
-" may retrieve the channel identity from the old server/hub via the network "
-"or provide an export file."
-msgstr "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación."
+#: ../../Zotlabs/Module/Connedit.php:603
+#: ../../Zotlabs/Module/Admin/Accounts.php:174
+msgid "Block"
+msgstr "Bloquear"
-#: ../../Zotlabs/Module/Import.php:549
-#: ../../Zotlabs/Module/Import_items.php:121
-msgid "File to Upload"
-msgstr "Fichero para subir"
+#: ../../Zotlabs/Module/Connedit.php:606
+msgid "Block (or Unblock) all communications with this connection"
+msgstr "Bloquear (o desbloquear) todas las comunicaciones con esta conexión"
-#: ../../Zotlabs/Module/Import.php:550
-msgid "Or provide the old server/hub details"
-msgstr "O proporcione los detalles de su antiguo servidor/hub"
+#: ../../Zotlabs/Module/Connedit.php:607
+msgid "This connection is blocked!"
+msgstr "¡Esta conexión está bloqueada!"
-#: ../../Zotlabs/Module/Import.php:551
-msgid "Your old identity address (xyz@example.com)"
-msgstr "Su identidad en el antiguo servidor (canal@ejemplo.com)"
+#: ../../Zotlabs/Module/Connedit.php:611
+msgid "Unignore"
+msgstr "Dejar de ignorar"
-#: ../../Zotlabs/Module/Import.php:552
-msgid "Your old login email address"
-msgstr "Su antigua dirección de correo electrónico"
+#: ../../Zotlabs/Module/Connedit.php:611
+#: ../../Zotlabs/Module/Connections.php:277
+msgid "Ignore"
+msgstr "Ignorar"
-#: ../../Zotlabs/Module/Import.php:553
-msgid "Your old login password"
-msgstr "Su antigua contraseña"
+#: ../../Zotlabs/Module/Connedit.php:614
+msgid "Ignore (or Unignore) all inbound communications from this connection"
+msgstr "Ignorar (o dejar de ignorar) todas las comunicaciones entrantes de esta conexión"
-#: ../../Zotlabs/Module/Import.php:554
+#: ../../Zotlabs/Module/Connedit.php:615
+msgid "This connection is ignored!"
+msgstr "¡Esta conexión es ignorada!"
+
+#: ../../Zotlabs/Module/Connedit.php:619
+msgid "Unarchive"
+msgstr "Desarchivar"
+
+#: ../../Zotlabs/Module/Connedit.php:619
+msgid "Archive"
+msgstr "Archivar"
+
+#: ../../Zotlabs/Module/Connedit.php:622
msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be"
-" able to post from either location, but only one can be marked as the "
-"primary location for files, photos, and media."
-msgstr "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos."
+"Archive (or Unarchive) this connection - mark channel dead but keep content"
+msgstr "Archiva (o desarchiva) esta conexión - marca el canal como muerto aunque mantiene sus contenidos"
-#: ../../Zotlabs/Module/Import.php:555
-msgid "Make this hub my primary location"
-msgstr "Convertir este servidor en mi ubicación primaria"
+#: ../../Zotlabs/Module/Connedit.php:623
+msgid "This connection is archived!"
+msgstr "¡Esta conexión esta archivada!"
+
+#: ../../Zotlabs/Module/Connedit.php:627
+msgid "Unhide"
+msgstr "Mostrar"
+
+#: ../../Zotlabs/Module/Connedit.php:627
+msgid "Hide"
+msgstr "Ocultar"
+
+#: ../../Zotlabs/Module/Connedit.php:630
+msgid "Hide or Unhide this connection from your other connections"
+msgstr "Ocultar o mostrar esta conexión a sus otras conexiones"
+
+#: ../../Zotlabs/Module/Connedit.php:631
+msgid "This connection is hidden!"
+msgstr "¡Esta conexión está oculta!"
+
+#: ../../Zotlabs/Module/Connedit.php:638
+msgid "Delete this connection"
+msgstr "Eliminar esta conexión"
+
+#: ../../Zotlabs/Module/Connedit.php:655 ../../include/widgets.php:529
+msgid "Me"
+msgstr "Yo"
+
+#: ../../Zotlabs/Module/Connedit.php:656 ../../include/widgets.php:530
+msgid "Family"
+msgstr "Familia"
+
+#: ../../Zotlabs/Module/Connedit.php:657
+#: ../../Zotlabs/Module/Settings/Channel.php:61
+#: ../../Zotlabs/Module/Settings/Channel.php:65
+#: ../../Zotlabs/Module/Settings/Channel.php:66
+#: ../../Zotlabs/Module/Settings/Channel.php:69
+#: ../../Zotlabs/Module/Settings/Channel.php:80
+#: ../../include/selectors.php:123 ../../include/channel.php:402
+#: ../../include/channel.php:403 ../../include/channel.php:410
+#: ../../include/widgets.php:531
+msgid "Friends"
+msgstr "Amigos/as"
+
+#: ../../Zotlabs/Module/Connedit.php:658 ../../include/widgets.php:532
+msgid "Acquaintances"
+msgstr "Conocidos/as"
+
+#: ../../Zotlabs/Module/Connedit.php:659
+#: ../../Zotlabs/Module/Connections.php:92
+#: ../../Zotlabs/Module/Connections.php:107 ../../include/widgets.php:533
+msgid "All"
+msgstr "Todos/as"
+
+#: ../../Zotlabs/Module/Connedit.php:716
+msgid "Approve this connection"
+msgstr "Aprobar esta conexión"
+
+#: ../../Zotlabs/Module/Connedit.php:716
+msgid "Accept connection to allow communication"
+msgstr "Aceptar la conexión para permitir la comunicación"
+
+#: ../../Zotlabs/Module/Connedit.php:721
+msgid "Set Affinity"
+msgstr "Ajustar la afinidad"
-#: ../../Zotlabs/Module/Import.php:556
+#: ../../Zotlabs/Module/Connedit.php:724
+msgid "Set Profile"
+msgstr "Ajustar el perfil"
+
+#: ../../Zotlabs/Module/Connedit.php:727
+msgid "Set Affinity & Profile"
+msgstr "Ajustar la afinidad y el perfil"
+
+#: ../../Zotlabs/Module/Connedit.php:776
+msgid "none"
+msgstr "-"
+
+#: ../../Zotlabs/Module/Connedit.php:780 ../../include/widgets.php:656
+msgid "Connection Default Permissions"
+msgstr "Permisos predeterminados de conexión"
+
+#: ../../Zotlabs/Module/Connedit.php:780 ../../include/items.php:3909
+#, php-format
+msgid "Connection: %s"
+msgstr "Conexión: %s"
+
+#: ../../Zotlabs/Module/Connedit.php:781
+msgid "Apply these permissions automatically"
+msgstr "Aplicar estos permisos automaticamente"
+
+#: ../../Zotlabs/Module/Connedit.php:781
+msgid "Connection requests will be approved without your interaction"
+msgstr "Las solicitudes de conexión serán aprobadas sin su intervención"
+
+#: ../../Zotlabs/Module/Connedit.php:784
+msgid "This connection's primary address is"
+msgstr "La dirección primaria de esta conexión es"
+
+#: ../../Zotlabs/Module/Connedit.php:785
+msgid "Available locations:"
+msgstr "Ubicaciones disponibles:"
+
+#: ../../Zotlabs/Module/Connedit.php:789
msgid ""
-"Import existing posts if possible (experimental - limited by available "
-"memory"
-msgstr "Importar el contenido publicado si es posible (experimental - limitado por la memoria disponible"
+"The permissions indicated on this page will be applied to all new "
+"connections."
+msgstr "Los permisos indicados en esta página serán aplicados en todas las nuevas conexiones."
+
+#: ../../Zotlabs/Module/Connedit.php:790
+msgid "Connection Tools"
+msgstr "Gestión de las conexiones"
+
+#: ../../Zotlabs/Module/Connedit.php:792
+msgid "Slide to adjust your degree of friendship"
+msgstr "Deslizar para ajustar el grado de amistad"
+
+#: ../../Zotlabs/Module/Connedit.php:793 ../../Zotlabs/Module/Rate.php:155
+#: ../../include/js_strings.php:20
+msgid "Rating"
+msgstr "Valoración"
+
+#: ../../Zotlabs/Module/Connedit.php:794
+msgid "Slide to adjust your rating"
+msgstr "Deslizar para ajustar su valoración"
+
+#: ../../Zotlabs/Module/Connedit.php:795 ../../Zotlabs/Module/Connedit.php:800
+msgid "Optionally explain your rating"
+msgstr "Opcionalmente, puede explicar su valoración"
+
+#: ../../Zotlabs/Module/Connedit.php:797
+msgid "Custom Filter"
+msgstr "Filtro personalizado"
+
+#: ../../Zotlabs/Module/Connedit.php:798
+msgid "Only import posts with this text"
+msgstr "Importar solo entradas que contengan este texto"
-#: ../../Zotlabs/Module/Import.php:557
+#: ../../Zotlabs/Module/Connedit.php:798 ../../Zotlabs/Module/Connedit.php:799
msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
-msgstr "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine."
+"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
+"all posts"
+msgstr "Una sola opción por línea: palabras, #etiquetas, /patrones/ o lang=xx. Dejar en blanco para importarlo todo"
-#: ../../Zotlabs/Module/Import.php:560
-#: ../../Zotlabs/Module/Admin/Accounts.php:167
-#: ../../Zotlabs/Module/Admin/Channels.php:151
+#: ../../Zotlabs/Module/Connedit.php:799
+msgid "Do not import posts with this text"
+msgstr "No importar entradas que contengan este texto"
+
+#: ../../Zotlabs/Module/Connedit.php:801
+msgid "This information is public!"
+msgstr "¡Esta información es pública!"
+
+#: ../../Zotlabs/Module/Connedit.php:806
+msgid "Connection Pending Approval"
+msgstr "Conexión pendiente de aprobación"
+
+#: ../../Zotlabs/Module/Connedit.php:809
+#: ../../Zotlabs/Module/Settings/Tokens.php:163
+msgid "inherited"
+msgstr "heredado"
+
+#: ../../Zotlabs/Module/Connedit.php:810 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Connect.php:98
#: ../../Zotlabs/Module/Admin/Features.php:66
#: ../../Zotlabs/Module/Admin/Logs.php:84
#: ../../Zotlabs/Module/Admin/Plugins.php:429
#: ../../Zotlabs/Module/Admin/Profs.php:157
#: ../../Zotlabs/Module/Admin/Security.php:104
-#: ../../Zotlabs/Module/Admin/Site.php:267
-#: ../../Zotlabs/Module/Admin/Themes.php:156 ../../Zotlabs/Module/Mail.php:370
-#: ../../Zotlabs/Module/Connedit.php:779 ../../Zotlabs/Module/Appman.php:126
-#: ../../Zotlabs/Module/Pdledit.php:74
-#: ../../Zotlabs/Module/Filestorage.php:165
-#: ../../Zotlabs/Module/Connect.php:98 ../../Zotlabs/Module/Group.php:85
+#: ../../Zotlabs/Module/Admin/Themes.php:156
+#: ../../Zotlabs/Module/Admin/Account_edit.php:74
+#: ../../Zotlabs/Module/Admin/Accounts.php:166
+#: ../../Zotlabs/Module/Admin/Channels.php:147
+#: ../../Zotlabs/Module/Admin/Site.php:260 ../../Zotlabs/Module/Appman.php:127
+#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Mail.php:412
#: ../../Zotlabs/Module/Import_items.php:122
-#: ../../Zotlabs/Module/Invite.php:146 ../../Zotlabs/Module/Locs.php:121
-#: ../../Zotlabs/Module/Rate.php:166 ../../Zotlabs/Module/Profiles.php:687
-#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Setup.php:317
-#: ../../Zotlabs/Module/Setup.php:365 ../../Zotlabs/Module/Mood.php:139
+#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Group.php:85
+#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Mood.php:139
#: ../../Zotlabs/Module/Photos.php:668 ../../Zotlabs/Module/Photos.php:1058
#: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1216
-#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Pconfig.php:107
-#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:484
-#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
-#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
-#: ../../Zotlabs/Module/Chat.php:196 ../../Zotlabs/Module/Chat.php:241
-#: ../../Zotlabs/Module/Xchan.php:15
-#: ../../Zotlabs/Module/Settings/Account.php:126
-#: ../../Zotlabs/Module/Settings/Channel.php:452
-#: ../../Zotlabs/Module/Settings/Display.php:194
+#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Pconfig.php:107 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Cal.php:342
+#: ../../Zotlabs/Module/Wiki.php:148 ../../Zotlabs/Module/Sources.php:114
+#: ../../Zotlabs/Module/Sources.php:149
#: ../../Zotlabs/Module/Settings/Features.php:47
#: ../../Zotlabs/Module/Settings/Oauth.php:87
#: ../../Zotlabs/Module/Settings/Tokens.php:167
-#: ../../Zotlabs/Lib/ThreadItem.php:725 ../../include/js_strings.php:22
-#: ../../include/widgets.php:796 ../../view/theme/redbasic/php/config.php:106
+#: ../../Zotlabs/Module/Settings/Account.php:118
+#: ../../Zotlabs/Module/Settings/Channel.php:455
+#: ../../Zotlabs/Module/Settings/Display.php:196
+#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
+#: ../../Zotlabs/Module/Import.php:543 ../../Zotlabs/Module/Chat.php:196
+#: ../../Zotlabs/Module/Chat.php:241 ../../Zotlabs/Module/Xchan.php:15
+#: ../../Zotlabs/Module/Events.php:484 ../../Zotlabs/Lib/ThreadItem.php:729
+#: ../../extend/addon/addon/chords/Mod_Chords.php:60
+#: ../../extend/addon/addon/diaspora/diaspora.php:710
+#: ../../extend/addon/addon/dwpost/dwpost.php:89
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
+#: ../../extend/addon/addon/friendica/friendica.php:128
+#: ../../extend/addon/addon/frphotos/frphotos.php:96
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
+#: ../../extend/addon/addon/hubwall/hubwall.php:95
+#: ../../extend/addon/addon/ijpost/ijpost.php:89
+#: ../../extend/addon/addon/irc/irc.php:53
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
+#: ../../extend/addon/addon/libertree/libertree.php:85
+#: ../../extend/addon/addon/ljpost/ljpost.php:86
+#: ../../extend/addon/addon/logrot/logrot.php:35
+#: ../../extend/addon/addon/mailhost/mailhost.php:40
+#: ../../extend/addon/addon/nofed/nofed.php:80
+#: ../../extend/addon/addon/nsabait/nsabait.php:161
+#: ../../extend/addon/addon/nsfw/nsfw.php:92
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:52
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:168
+#: ../../extend/addon/addon/pageheader/pageheader.php:48
+#: ../../extend/addon/addon/piwik/piwik.php:95
+#: ../../extend/addon/addon/planets/planets.php:157
+#: ../../extend/addon/addon/pumpio/pumpio.php:237
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
+#: ../../extend/addon/addon/redfiles/redfiles.php:124
+#: ../../extend/addon/addon/redphotos/redphotos.php:136
+#: ../../extend/addon/addon/redred/redred.php:119
+#: ../../extend/addon/addon/rtof/rtof.php:101
+#: ../../extend/addon/addon/skeleton/skeleton.php:65
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
+#: ../../extend/addon/addon/startpage/startpage.php:113
+#: ../../extend/addon/addon/statusnet/statusnet.php:322
+#: ../../extend/addon/addon/statusnet/statusnet.php:380
+#: ../../extend/addon/addon/statusnet/statusnet.php:432
+#: ../../extend/addon/addon/statusnet/statusnet.php:899
+#: ../../extend/addon/addon/superblock/superblock.php:118
+#: ../../extend/addon/addon/twitter/twitter.php:217
+#: ../../extend/addon/addon/twitter/twitter.php:259
+#: ../../extend/addon/addon/visage/visage.php:170
+#: ../../extend/addon/addon/wppost/wppost.php:113
+#: ../../extend/addon/addon/xmpp/xmpp.php:69
+#: ../../extend/addon/addon/cdav/cdav.php:246
+#: ../../extend/addon/addon/likebanner/likebanner.php:57
+#: ../../extend/addon/addon/mailtest/mailtest.php:100
+#: ../../include/js_strings.php:22 ../../include/widgets.php:796
+#: ../../view/theme/redbasic/php/config.php:106
msgid "Submit"
msgstr "Enviar"
+#: ../../Zotlabs/Module/Connedit.php:811
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Por favor, escoja el perfil que quiere mostrar a %s cuando esté viendo su perfil de forma segura."
+
+#: ../../Zotlabs/Module/Connedit.php:813
+#: ../../Zotlabs/Module/Settings/Tokens.php:160
+msgid "Their Settings"
+msgstr "Sus ajustes"
+
+#: ../../Zotlabs/Module/Connedit.php:814
+#: ../../Zotlabs/Module/Settings/Tokens.php:161
+msgid "My Settings"
+msgstr "Mis ajustes"
+
+#: ../../Zotlabs/Module/Connedit.php:816
+#: ../../Zotlabs/Module/Settings/Tokens.php:165
+msgid "Individual Permissions"
+msgstr "Permisos individuales"
+
+#: ../../Zotlabs/Module/Connedit.php:817
+#: ../../Zotlabs/Module/Settings/Tokens.php:166
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can <strong>not</strong> change those"
+" settings here."
+msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. <strong>No</strong> puede cambiar estos ajustes aquí."
+
+#: ../../Zotlabs/Module/Connedit.php:818
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can change those settings here but "
+"they wont have any impact unless the inherited setting changes."
+msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados."
+
+#: ../../Zotlabs/Module/Connedit.php:819
+msgid "Last update:"
+msgstr "Última actualización:"
+
+#: ../../Zotlabs/Module/Dreport.php:45
+msgid "Invalid message"
+msgstr "Mensaje no válido"
+
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "no results"
+msgstr "sin resultados"
+
+#: ../../Zotlabs/Module/Dreport.php:93
+msgid "channel sync processed"
+msgstr "se ha realizado la sincronización del canal"
+
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "queued"
+msgstr "encolado"
+
+#: ../../Zotlabs/Module/Dreport.php:101
+msgid "posted"
+msgstr "enviado"
+
+#: ../../Zotlabs/Module/Dreport.php:105
+msgid "accepted for delivery"
+msgstr "aceptado para el envío"
+
+#: ../../Zotlabs/Module/Dreport.php:109
+msgid "updated"
+msgstr "actualizado"
+
+#: ../../Zotlabs/Module/Dreport.php:112
+msgid "update ignored"
+msgstr "actualización ignorada"
+
+#: ../../Zotlabs/Module/Dreport.php:115
+msgid "permission denied"
+msgstr "permiso denegado"
+
+#: ../../Zotlabs/Module/Dreport.php:119
+msgid "recipient not found"
+msgstr "destinatario no encontrado"
+
+#: ../../Zotlabs/Module/Dreport.php:122
+msgid "mail recalled"
+msgstr "mensaje de correo revocado"
+
+#: ../../Zotlabs/Module/Dreport.php:125
+msgid "duplicate mail received"
+msgstr "se ha recibido mensaje duplicado"
+
+#: ../../Zotlabs/Module/Dreport.php:128
+msgid "mail delivered"
+msgstr "correo enviado"
+
+#: ../../Zotlabs/Module/Dreport.php:148
+#, php-format
+msgid "Delivery report for %1$s"
+msgstr "Informe de entrega para %1$s"
+
+#: ../../Zotlabs/Module/Dreport.php:151
+msgid "Options"
+msgstr "Opciones"
+
+#: ../../Zotlabs/Module/Dreport.php:152
+msgid "Redeliver"
+msgstr "Volver a enviar"
+
#: ../../Zotlabs/Module/Bookmarks.php:53
msgid "Bookmark added"
msgstr "Marcador añadido"
@@ -638,269 +1264,456 @@ msgstr "Mis marcadores"
msgid "My Connections Bookmarks"
msgstr "Marcadores de mis conexiones"
-#: ../../Zotlabs/Module/Admin/Accounts.php:36
-#, php-format
-msgid "%s account blocked/unblocked"
-msgid_plural "%s account blocked/unblocked"
-msgstr[0] "%s cuenta bloqueada/desbloqueada"
-msgstr[1] "%s cuenta bloqueada/desbloqueada"
-
-#: ../../Zotlabs/Module/Admin/Accounts.php:43
-#, php-format
-msgid "%s account deleted"
-msgid_plural "%s accounts deleted"
-msgstr[0] "%s cuentas eliminadas"
-msgstr[1] "%s cuentas eliminadas"
+#: ../../Zotlabs/Module/Acl.php:313
+msgid "network"
+msgstr "red"
-#: ../../Zotlabs/Module/Admin/Accounts.php:79
-msgid "Account not found"
-msgstr "Cuenta no encontrada"
+#: ../../Zotlabs/Module/Acl.php:323
+msgid "RSS"
+msgstr "RSS"
-#: ../../Zotlabs/Module/Admin/Accounts.php:90
-#, php-format
-msgid "Account '%s' deleted"
-msgstr "La cuenta '%s' ha sido eliminada"
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
+msgstr "Dirección no encontrada."
-#: ../../Zotlabs/Module/Admin/Accounts.php:98
-#, php-format
-msgid "Account '%s' blocked"
-msgstr "La cuenta '%s' ha sido bloqueada"
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
+msgstr "Ha fallado la búsqueda de la dirección."
-#: ../../Zotlabs/Module/Admin/Accounts.php:106
-#, php-format
-msgid "Account '%s' unblocked"
-msgstr "La cuenta '%s' ha sido desbloqueada"
+#: ../../Zotlabs/Module/Locs.php:66
+msgid ""
+"Please select another location to become primary before removing the primary"
+" location."
+msgstr "Por favor, seleccione una copia de su canal (un clon) para convertirlo en primario antes de eliminar su canal principal."
-#: ../../Zotlabs/Module/Admin/Accounts.php:165
-#: ../../Zotlabs/Module/Admin/Channels.php:149
-#: ../../Zotlabs/Module/Admin/Logs.php:82
-#: ../../Zotlabs/Module/Admin/Plugins.php:336
-#: ../../Zotlabs/Module/Admin/Plugins.php:427
-#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin/Site.php:265
-#: ../../Zotlabs/Module/Admin/Themes.php:120
-#: ../../Zotlabs/Module/Admin/Themes.php:154
-#: ../../Zotlabs/Module/Admin.php:141
-msgid "Administration"
-msgstr "Administración"
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
+msgstr "Sincronizando ubicaciones"
-#: ../../Zotlabs/Module/Admin/Accounts.php:166
-#: ../../Zotlabs/Module/Admin/Accounts.php:179 ../../include/widgets.php:1561
-msgid "Accounts"
-msgstr "Cuentas"
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
+msgstr "No encontrada ninguna dirección."
-#: ../../Zotlabs/Module/Admin/Accounts.php:168
-#: ../../Zotlabs/Module/Admin/Channels.php:152
-msgid "select all"
-msgstr "seleccionar todo"
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
+msgstr "Gestionar las direcciones del canal"
-#: ../../Zotlabs/Module/Admin/Accounts.php:169
-msgid "Registrations waiting for confirm"
-msgstr "Inscripciones en espera de confirmación"
+#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
+#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:692
+#: ../../Zotlabs/Module/Events.php:468
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839
+#: ../../include/js_strings.php:25
+msgid "Location"
+msgstr "Ubicación"
-#: ../../Zotlabs/Module/Admin/Accounts.php:170
-msgid "Request date"
-msgstr "Fecha de solicitud"
+#: ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Profiles.php:464
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143
+msgid "Address"
+msgstr "Dirección"
-#: ../../Zotlabs/Module/Admin/Accounts.php:170
-#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/network.php:2212
-msgid "Email"
-msgstr "Correo electrónico"
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
+msgstr "Primario"
-#: ../../Zotlabs/Module/Admin/Accounts.php:171
-msgid "No registrations."
-msgstr "Sin registros."
+#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
+msgid "Drop"
+msgstr "Eliminar"
-#: ../../Zotlabs/Module/Admin/Accounts.php:172
-#: ../../Zotlabs/Module/Connections.php:275
-msgid "Approve"
-msgstr "Aprobar"
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
+msgstr "Sincronizar ahora"
-#: ../../Zotlabs/Module/Admin/Accounts.php:173
-msgid "Deny"
-msgstr "Rechazar"
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
+msgstr "Por favor, espere algunos minutos entre operaciones consecutivas."
-#: ../../Zotlabs/Module/Admin/Accounts.php:175
-#: ../../Zotlabs/Module/Connedit.php:575
-msgid "Block"
-msgstr "Bloquear"
+#: ../../Zotlabs/Module/Locs.php:124
+msgid ""
+"When possible, drop a location by logging into that website/hub and removing"
+" your channel."
+msgstr "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal."
-#: ../../Zotlabs/Module/Admin/Accounts.php:176
-#: ../../Zotlabs/Module/Connedit.php:575
-msgid "Unblock"
-msgstr "Desbloquear"
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
+msgstr "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo."
-#: ../../Zotlabs/Module/Admin/Accounts.php:181
-msgid "ID"
-msgstr "ID"
+#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
+msgid "Continue"
+msgstr "Continuar"
-#: ../../Zotlabs/Module/Admin/Accounts.php:183 ../../include/group.php:267
-msgid "All Channels"
-msgstr "Todos los canales"
+#: ../../Zotlabs/Module/Connect.php:90
+msgid "Premium Channel Setup"
+msgstr "Configuración del canal premium"
-#: ../../Zotlabs/Module/Admin/Accounts.php:184
-msgid "Register date"
-msgstr "Fecha de registro"
+#: ../../Zotlabs/Module/Connect.php:92
+msgid "Enable premium channel connection restrictions"
+msgstr "Habilitar restricciones de conexión del canal premium"
-#: ../../Zotlabs/Module/Admin/Accounts.php:185
-msgid "Last login"
-msgstr "Último acceso"
+#: ../../Zotlabs/Module/Connect.php:93
+msgid ""
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Por favor introduzca sus restricciones o condiciones, como recibo de paypal, normas de uso, etc."
-#: ../../Zotlabs/Module/Admin/Accounts.php:186
-msgid "Expires"
-msgstr "Caduca"
+#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Este canal puede requerir antes de conectar unos pasos adicionales o el conocimiento de las siguientes condiciones:"
-#: ../../Zotlabs/Module/Admin/Accounts.php:187
-msgid "Service Class"
-msgstr "Clase de servicio"
+#: ../../Zotlabs/Module/Connect.php:96
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Las posibles conexiones verán, por tanto, el siguiente texto antes de proceder:"
-#: ../../Zotlabs/Module/Admin/Accounts.php:189
+#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
msgid ""
-"Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
-" on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "¡Las cuentas seleccionadas van a ser eliminadas!\\n\\n¡Todo lo que estas cuentas han publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?"
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "Al continuar, certifico que he cumplido con todas las instrucciones proporcionadas en esta página."
+
+#: ../../Zotlabs/Module/Connect.php:106
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(No ha sido proporcionada ninguna instrucción específica por el propietario del canal.)"
+
+#: ../../Zotlabs/Module/Connect.php:114
+msgid "Restricted or Premium Channel"
+msgstr "Canal premium o restringido"
+
+#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
+msgid "Invalid item."
+msgstr "Elemento no válido."
-#: ../../Zotlabs/Module/Admin/Accounts.php:190
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Chanview.php:96
+#: ../../Zotlabs/Module/Block.php:43 ../../Zotlabs/Module/Cal.php:62
+#: ../../Zotlabs/Module/Wall_upload.php:31
+msgid "Channel not found."
+msgstr "Canal no encontrado."
+
+#: ../../Zotlabs/Module/Page.php:131
msgid ""
-"The account {0} will be deleted!\\n\\nEverything this account has posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "¡La cuenta {0} va a ser eliminada!\\n\\n¡Todo lo que esta cuenta ha publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?"
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
+" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
+"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-#: ../../Zotlabs/Module/Admin/Channels.php:30
-#, php-format
-msgid "%s channel censored/uncensored"
-msgid_plural "%s channels censored/uncensored"
-msgstr[0] "%s canales censurados/no censurados"
-msgstr[1] "%s canales censurados/no censurados"
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "Save to Folder:"
+msgstr "Guardar en carpeta:"
-#: ../../Zotlabs/Module/Admin/Channels.php:39
-#, php-format
-msgid "%s channel code allowed/disallowed"
-msgid_plural "%s channels code allowed/disallowed"
-msgstr[0] "%s código permitido/no permitido al canal"
-msgstr[1] "%s código permitido/no permitido al canal"
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "- select -"
+msgstr "- seleccionar -"
-#: ../../Zotlabs/Module/Admin/Channels.php:45
+#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin/Profs.php:74
+#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/text.php:987
+#: ../../include/text.php:999 ../../include/widgets.php:201
+msgid "Save"
+msgstr "Guardar"
+
+#: ../../Zotlabs/Module/Manage.php:136
+#: ../../Zotlabs/Module/New_channel.php:121
#, php-format
-msgid "%s channel deleted"
-msgid_plural "%s channels deleted"
-msgstr[0] "%s canales eliminados"
-msgstr[1] "%s canales eliminados"
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Ha creado %1$.0f de %2$.0f canales permitidos."
-#: ../../Zotlabs/Module/Admin/Channels.php:66
-msgid "Channel not found"
-msgstr "Canal no encontrado"
+#: ../../Zotlabs/Module/Manage.php:143
+msgid "Create a new channel"
+msgstr "Crear un nuevo canal"
-#: ../../Zotlabs/Module/Admin/Channels.php:76
-#, php-format
-msgid "Channel '%s' deleted"
-msgstr "Canal '%s' eliminado"
+#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:772
+#: ../../Zotlabs/Module/Wiki.php:147 ../../Zotlabs/Module/Chat.php:255
+msgid "Create New"
+msgstr "Crear"
-#: ../../Zotlabs/Module/Admin/Channels.php:88
-#, php-format
-msgid "Channel '%s' censored"
-msgstr "Canal '%s' censurado"
+#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:216
+#: ../../include/nav.php:209
+msgid "Channel Manager"
+msgstr "Administración de canales"
-#: ../../Zotlabs/Module/Admin/Channels.php:88
-#, php-format
-msgid "Channel '%s' uncensored"
-msgstr "Canal '%s' no censurado"
+#: ../../Zotlabs/Module/Manage.php:165
+msgid "Current Channel"
+msgstr "Canal actual"
+
+#: ../../Zotlabs/Module/Manage.php:167
+msgid "Switch to one of your channels by selecting it."
+msgstr "Cambiar a uno de sus canales seleccionándolo."
+
+#: ../../Zotlabs/Module/Manage.php:168
+msgid "Default Channel"
+msgstr "Canal principal"
-#: ../../Zotlabs/Module/Admin/Channels.php:99
+#: ../../Zotlabs/Module/Manage.php:169
+msgid "Make Default"
+msgstr "Convertir en predeterminado"
+
+#: ../../Zotlabs/Module/Manage.php:172
#, php-format
-msgid "Channel '%s' code allowed"
-msgstr "Código permitido al canal '%s'"
+msgid "%d new messages"
+msgstr "%d mensajes nuevos"
-#: ../../Zotlabs/Module/Admin/Channels.php:99
+#: ../../Zotlabs/Module/Manage.php:173
#, php-format
-msgid "Channel '%s' code disallowed"
-msgstr "Código no permitido al canal '%s'"
+msgid "%d new introductions"
+msgstr "%d nuevas solicitudes de conexión"
-#: ../../Zotlabs/Module/Admin/Channels.php:150 ../../include/widgets.php:1562
-msgid "Channels"
-msgstr "Canales"
+#: ../../Zotlabs/Module/Manage.php:175
+msgid "Delegated Channel"
+msgstr "Canal delegado"
-#: ../../Zotlabs/Module/Admin/Channels.php:154
-msgid "Censor"
-msgstr "Censurar"
+#: ../../Zotlabs/Module/Connections.php:56
+#: ../../Zotlabs/Module/Connections.php:161
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Blocked"
+msgstr "Bloqueadas"
-#: ../../Zotlabs/Module/Admin/Channels.php:155
-msgid "Uncensor"
-msgstr "No censurar"
+#: ../../Zotlabs/Module/Connections.php:61
+#: ../../Zotlabs/Module/Connections.php:168
+#: ../../Zotlabs/Module/Connections.php:241
+msgid "Ignored"
+msgstr "Ignoradas"
-#: ../../Zotlabs/Module/Admin/Channels.php:156
-msgid "Allow Code"
-msgstr "Permitir código"
+#: ../../Zotlabs/Module/Connections.php:66
+#: ../../Zotlabs/Module/Connections.php:182
+#: ../../Zotlabs/Module/Connections.php:240
+msgid "Hidden"
+msgstr "Ocultas"
-#: ../../Zotlabs/Module/Admin/Channels.php:157
-msgid "Disallow Code"
-msgstr "No permitir código"
+#: ../../Zotlabs/Module/Connections.php:71
+#: ../../Zotlabs/Module/Connections.php:175
+#: ../../Zotlabs/Module/Connections.php:239
+msgid "Archived"
+msgstr "Archivadas"
-#: ../../Zotlabs/Module/Admin/Channels.php:158
-#: ../../include/conversation.php:1651
-msgid "Channel"
-msgstr "Canal"
+#: ../../Zotlabs/Module/Connections.php:76
+#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1576
+msgid "New"
+msgstr "Nuevas"
-#: ../../Zotlabs/Module/Admin/Channels.php:162
-msgid "UID"
-msgstr "UID"
+#: ../../Zotlabs/Module/Connections.php:138
+msgid "New Connections"
+msgstr "Nuevas conexiones"
-#: ../../Zotlabs/Module/Admin/Channels.php:164
-#: ../../Zotlabs/Module/Locs.php:118 ../../Zotlabs/Module/Profiles.php:470
-msgid "Address"
-msgstr "Dirección"
+#: ../../Zotlabs/Module/Connections.php:141
+msgid "Show pending (new) connections"
+msgstr "Mostrar conexiones (nuevas) pendientes"
-#: ../../Zotlabs/Module/Admin/Channels.php:166
-msgid ""
-"Selected channels will be deleted!\\n\\nEverything that was posted in these "
-"channels on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Los canales seleccionados se eliminarán!\\n\\nTodo lo publicado por estos canales en este sitio se borrarán definitivamente!\\n\\n¿Está seguro de querer hacerlo?"
+#: ../../Zotlabs/Module/Connections.php:145
+#: ../../Zotlabs/Module/Profperm.php:144
+msgid "All Connections"
+msgstr "Todas las conexiones"
-#: ../../Zotlabs/Module/Admin/Channels.php:167
-msgid ""
-"The channel {0} will be deleted!\\n\\nEverything that was posted in this "
-"channel on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "El canal {0} va a ser eliminado!\\n\\nTodo lo publicado por el canal en este sitio se borrará definitivamente!\\n\\n¿Está seguro de querer hacerlo?"
+#: ../../Zotlabs/Module/Connections.php:148
+msgid "Show all connections"
+msgstr "Mostrar todas las conexiones"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:19
-msgid "Update has been marked successful"
-msgstr "La actualización ha sido marcada como exitosa"
+#: ../../Zotlabs/Module/Connections.php:164
+msgid "Only show blocked connections"
+msgstr "Mostrar solo las conexiones bloqueadas"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:29
+#: ../../Zotlabs/Module/Connections.php:171
+msgid "Only show ignored connections"
+msgstr "Mostrar solo conexiones ignoradas"
+
+#: ../../Zotlabs/Module/Connections.php:178
+msgid "Only show archived connections"
+msgstr "Mostrar solo las conexiones archivadas"
+
+#: ../../Zotlabs/Module/Connections.php:185
+msgid "Only show hidden connections"
+msgstr "Mostrar solo las conexiones ocultas"
+
+#: ../../Zotlabs/Module/Connections.php:238
+msgid "Pending approval"
+msgstr "Pendiente de aprobación"
+
+#: ../../Zotlabs/Module/Connections.php:254
#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr "La ejecución de %s ha fallado. Mirar en los informes del sistema."
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:32
+#: ../../Zotlabs/Module/Connections.php:255
+msgid "Edit connection"
+msgstr "Editar conexión"
+
+#: ../../Zotlabs/Module/Connections.php:256
+msgid "Delete connection"
+msgstr "Eliminar conexión"
+
+#: ../../Zotlabs/Module/Connections.php:265
+msgid "Channel address"
+msgstr "Dirección del canal"
+
+#: ../../Zotlabs/Module/Connections.php:267
+msgid "Network"
+msgstr "Red"
+
+#: ../../Zotlabs/Module/Connections.php:270
+msgid "Status"
+msgstr "Estado"
+
+#: ../../Zotlabs/Module/Connections.php:272
+msgid "Connected"
+msgstr "Conectado/a"
+
+#: ../../Zotlabs/Module/Connections.php:274
+msgid "Approve connection"
+msgstr "Aprobar esta conexión"
+
+#: ../../Zotlabs/Module/Connections.php:275
+#: ../../Zotlabs/Module/Admin/Accounts.php:171
+msgid "Approve"
+msgstr "Aprobar"
+
+#: ../../Zotlabs/Module/Connections.php:276
+msgid "Ignore connection"
+msgstr "Ignorar esta conexión"
+
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Recent activity"
+msgstr "Actividad reciente"
+
+#: ../../Zotlabs/Module/Connections.php:302 ../../Zotlabs/Lib/Apps.php:211
+#: ../../include/nav.php:189 ../../include/text.php:916
+msgid "Connections"
+msgstr "Conexiones"
+
+#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44
+#: ../../Zotlabs/Lib/Apps.php:232 ../../include/nav.php:168
+#: ../../include/text.php:986 ../../include/text.php:998
+#: ../../include/acl_selectors.php:203 ../../include/widgets.php:315
+msgid "Search"
+msgstr "Buscar"
+
+#: ../../Zotlabs/Module/Connections.php:307
+msgid "Search your connections"
+msgstr "Buscar sus conexiones"
+
+#: ../../Zotlabs/Module/Connections.php:308
+msgid "Connections search"
+msgstr "Buscar conexiones"
+
+#: ../../Zotlabs/Module/Connections.php:309
+#: ../../Zotlabs/Module/Directory.php:391
+#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
+msgid "Find"
+msgstr "Encontrar"
+
+#: ../../Zotlabs/Module/Cover_photo.php:58
+#: ../../Zotlabs/Module/Profile_photo.php:61
+msgid "Image uploaded but image cropping failed."
+msgstr "Imagen actualizada, pero el recorte de la imagen ha fallado. "
+
+#: ../../Zotlabs/Module/Cover_photo.php:134
+#: ../../Zotlabs/Module/Cover_photo.php:181
+msgid "Cover Photos"
+msgstr "Imágenes de portada del perfil"
+
+#: ../../Zotlabs/Module/Cover_photo.php:154
+#: ../../Zotlabs/Module/Profile_photo.php:135
+msgid "Image resize failed."
+msgstr "El ajuste del tamaño de la imagen ha fallado."
+
+#: ../../Zotlabs/Module/Cover_photo.php:168
+#: ../../Zotlabs/Module/Profile_photo.php:196 ../../include/photos.php:149
+msgid "Unable to process image"
+msgstr "No ha sido posible procesar la imagen"
+
+#: ../../Zotlabs/Module/Cover_photo.php:192
+#: ../../Zotlabs/Module/Profile_photo.php:231
+msgid "Image upload failed."
+msgstr "La carga de la imagen ha fallado."
+
+#: ../../Zotlabs/Module/Cover_photo.php:210
+#: ../../Zotlabs/Module/Profile_photo.php:250
+msgid "Unable to process image."
+msgstr "No ha sido posible procesar la imagen."
+
+#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4253
+msgid "female"
+msgstr "mujer"
+
+#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4254
#, php-format
-msgid "Update %s was successfully applied."
-msgstr "La actualización de %s se ha realizado exitosamente."
+msgid "%1$s updated her %2$s"
+msgstr "%1$s ha actualizado su %2$s"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:36
+#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4255
+msgid "male"
+msgstr "hombre"
+
+#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4256
#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr "La actualización de %s no ha devuelto ningún estado. No se sabe si ha tenido éxito."
+msgid "%1$s updated his %2$s"
+msgstr "%1$s ha actualizado su %2$s"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:39
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4258
#, php-format
-msgid "Update function %s could not be found."
-msgstr "No se encuentra la función de actualización de %s."
+msgid "%1$s updated their %2$s"
+msgstr "%1$s ha actualizado su %2$s"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:55
-msgid "No failed updates."
-msgstr "No ha fallado ninguna actualización."
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1677
+msgid "cover photo"
+msgstr "Imagen de portada del perfil"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:59
-msgid "Failed Updates"
-msgstr "Han fallado las actualizaciones"
+#: ../../Zotlabs/Module/Cover_photo.php:303
+#: ../../Zotlabs/Module/Cover_photo.php:318
+#: ../../Zotlabs/Module/Profile_photo.php:311
+#: ../../Zotlabs/Module/Profile_photo.php:352
+msgid "Photo not available."
+msgstr "Foto no disponible."
-#: ../../Zotlabs/Module/Admin/Dbsync.php:61
-msgid "Mark success (if update was manually applied)"
-msgstr "Marcar como exitosa (si la actualización se ha hecho manualmente)"
+#: ../../Zotlabs/Module/Cover_photo.php:354
+#: ../../Zotlabs/Module/Profile_photo.php:407
+msgid "Upload File:"
+msgstr "Subir fichero:"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:62
-msgid "Attempt to execute this update step automatically"
-msgstr "Intentar ejecutar este paso de actualización automáticamente"
+#: ../../Zotlabs/Module/Cover_photo.php:355
+#: ../../Zotlabs/Module/Profile_photo.php:408
+msgid "Select a profile:"
+msgstr "Seleccionar un perfil:"
+
+#: ../../Zotlabs/Module/Cover_photo.php:356
+msgid "Upload Cover Photo"
+msgstr "Subir imagen de portada del perfil"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:416
+#: ../../Zotlabs/Module/Settings/Channel.php:399
+msgid "or"
+msgstr "o"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:416
+msgid "skip this step"
+msgstr "Omitir este paso"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:416
+msgid "select a photo from your photo albums"
+msgstr "Seleccione una foto de sus álbumes de fotos"
+
+#: ../../Zotlabs/Module/Cover_photo.php:377
+#: ../../Zotlabs/Module/Profile_photo.php:435
+msgid "Crop Image"
+msgstr "Recortar imagen"
+
+#: ../../Zotlabs/Module/Cover_photo.php:378
+#: ../../Zotlabs/Module/Profile_photo.php:436
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Por favor ajuste el recorte de la imagen para una visión óptima."
+
+#: ../../Zotlabs/Module/Cover_photo.php:380
+#: ../../Zotlabs/Module/Profile_photo.php:438
+msgid "Done Editing"
+msgstr "Edición completada"
#: ../../Zotlabs/Module/Admin/Features.php:55
#: ../../Zotlabs/Module/Admin/Features.php:56
@@ -927,8 +1740,20 @@ msgstr "Gestionar las funcionalidades"
msgid "Log settings updated."
msgstr "Actualizado el informe de configuraciones."
-#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1587
-#: ../../include/widgets.php:1597
+#: ../../Zotlabs/Module/Admin/Logs.php:82
+#: ../../Zotlabs/Module/Admin/Plugins.php:336
+#: ../../Zotlabs/Module/Admin/Plugins.php:427
+#: ../../Zotlabs/Module/Admin/Security.php:86
+#: ../../Zotlabs/Module/Admin/Themes.php:120
+#: ../../Zotlabs/Module/Admin/Themes.php:154
+#: ../../Zotlabs/Module/Admin/Accounts.php:164
+#: ../../Zotlabs/Module/Admin/Channels.php:145
+#: ../../Zotlabs/Module/Admin/Site.php:258 ../../Zotlabs/Module/Admin.php:137
+msgid "Administration"
+msgstr "Administración"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1588
+#: ../../include/widgets.php:1598
msgid "Logs"
msgstr "Informes"
@@ -957,8 +1782,8 @@ msgstr "Nivel de depuración"
#: ../../Zotlabs/Module/Admin/Plugins.php:254
#: ../../Zotlabs/Module/Admin/Themes.php:69
#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Display.php:40
-#: ../../Zotlabs/Module/Admin.php:62 ../../Zotlabs/Module/Thing.php:89
-#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3427
+#: ../../Zotlabs/Module/Admin.php:60 ../../Zotlabs/Module/Thing.php:89
+#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3343
msgid "Item not found."
msgstr "Elemento no encontrado."
@@ -983,7 +1808,7 @@ msgid "Enable"
msgstr "Activar"
#: ../../Zotlabs/Module/Admin/Plugins.php:337
-#: ../../Zotlabs/Module/Admin/Plugins.php:428 ../../include/widgets.php:1565
+#: ../../Zotlabs/Module/Admin/Plugins.php:428 ../../include/widgets.php:1566
msgid "Plugins"
msgstr "Extensiones (plugins)"
@@ -993,8 +1818,8 @@ msgid "Toggle"
msgstr "Cambiar"
#: ../../Zotlabs/Module/Admin/Plugins.php:339
-#: ../../Zotlabs/Module/Admin/Themes.php:123 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/nav.php:213 ../../include/widgets.php:680
+#: ../../Zotlabs/Module/Admin/Themes.php:123 ../../Zotlabs/Lib/Apps.php:218
+#: ../../include/nav.php:211 ../../include/widgets.php:680
msgid "Settings"
msgstr "Ajustes"
@@ -1057,17 +1882,21 @@ msgstr "Descargar el repositorio"
msgid "Install new repo"
msgstr "Instalar un nuevo repositorio"
-#: ../../Zotlabs/Module/Admin/Plugins.php:413 ../../Zotlabs/Lib/Apps.php:334
+#: ../../Zotlabs/Module/Admin/Plugins.php:413 ../../Zotlabs/Lib/Apps.php:339
msgid "Install"
msgstr "Instalar"
#: ../../Zotlabs/Module/Admin/Plugins.php:414
#: ../../Zotlabs/Module/Fbrowser.php:66 ../../Zotlabs/Module/Fbrowser.php:88
-#: ../../Zotlabs/Module/Wiki.php:171 ../../Zotlabs/Module/Wiki.php:211
-#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
+#: ../../Zotlabs/Module/Wiki.php:238 ../../Zotlabs/Module/Wiki.php:261
#: ../../Zotlabs/Module/Settings/Oauth.php:88
#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../include/conversation.php:1248 ../../include/conversation.php:1297
+#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
+#: ../../extend/addon/addon/friendica/dfrn_request.php:879
+#: ../../extend/addon/addon/js_upload/js_upload.php:46
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154
+#: ../../include/conversation.php:1246 ../../include/conversation.php:1295
msgid "Cancel"
msgstr "Cancelar"
@@ -1085,7 +1914,8 @@ msgstr "Instalar un nuevo repositorio de plugins"
#: ../../Zotlabs/Module/Admin/Plugins.php:443
#: ../../Zotlabs/Module/Settings/Oauth.php:42
-#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:334
+#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:339
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152
msgid "Update"
msgstr "Actualizar"
@@ -1095,6 +1925,7 @@ msgstr "Cambiar la rama"
#: ../../Zotlabs/Module/Admin/Plugins.php:445
#: ../../Zotlabs/Module/Photos.php:989 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../extend/addon/addon/superblock/superblock.php:114
msgid "Remove"
msgstr "Eliminar"
@@ -1137,14 +1968,6 @@ msgstr "Texto de ayuda"
msgid "Additional info (optional)"
msgstr "Información adicional (opcional)"
-#: ../../Zotlabs/Module/Admin/Profs.php:74
-#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Filer.php:53
-#: ../../Zotlabs/Module/Rbmark.php:32 ../../Zotlabs/Module/Rbmark.php:104
-#: ../../include/text.php:972 ../../include/text.php:984
-#: ../../include/widgets.php:201
-msgid "Save"
-msgstr "Guardar"
-
#: ../../Zotlabs/Module/Admin/Profs.php:83
msgid "Field definition not found"
msgstr "Definición del campo no encontrada"
@@ -1153,7 +1976,7 @@ msgstr "Definición del campo no encontrada"
msgid "Edit Profile Field"
msgstr "Modificar el campo del perfil"
-#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1568
+#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1569
msgid "Profile Fields"
msgstr "Campos del perfil"
@@ -1233,7 +2056,7 @@ msgid ""
"embedded content from that site is explicitly blocked."
msgstr "El resto del contenido incrustado se filtrará, <strong>excepto</ strong> si el contenido incorporado desde ese sitio está bloqueado de forma explícita."
-#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1563
+#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1564
msgid "Security"
msgstr "Seguridad"
@@ -1321,1162 +2144,732 @@ msgstr "Un sitio por línea. El contenido incorporado se filtra de forma predete
msgid "Block embedded HTML from these domains"
msgstr "Bloquear contenido con HTML incorporado desde estos dominios"
-#: ../../Zotlabs/Module/Admin/Site.php:135
+#: ../../Zotlabs/Module/Admin/Themes.php:18
+msgid "Theme settings updated."
+msgstr "Ajustes del tema actualizados."
+
+#: ../../Zotlabs/Module/Admin/Themes.php:58
+msgid "No themes found."
+msgstr "No se han encontrado temas."
+
+#: ../../Zotlabs/Module/Admin/Themes.php:114
+msgid "Screenshot"
+msgstr "Instantánea de pantalla"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:121
+#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1567
+msgid "Themes"
+msgstr "Temas"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:160
+msgid "[Experimental]"
+msgstr "[Experimental]"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:161
+msgid "[Unsupported]"
+msgstr "[No soportado]"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:29
+#, php-format
+msgid "Password changed for account %d."
+msgstr "Ha cambiado la contraseña para la cuenta %d."
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:46
+msgid "Account settings updated."
+msgstr "Se han actualizado los ajustes de la cuenta."
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:61
+msgid "Account not found."
+msgstr "No se ha encontrado la cuenta."
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:68
+msgid "Account Edit"
+msgstr "Editar la cuenta"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:69
+msgid "New Password"
+msgstr "Nueva contraseña"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:70
+msgid "New Password again"
+msgstr "Nueva contraseña otra vez"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:71
+msgid "Technical skill level"
+msgstr "Nivel de habilidad técnica"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:72
+msgid "Account language (for emails)"
+msgstr "Idioma de la cuenta (para los correos electrónicos)"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:73
+msgid "Service class"
+msgstr "Clase de servicio"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:36
+#, php-format
+msgid "%s account blocked/unblocked"
+msgid_plural "%s account blocked/unblocked"
+msgstr[0] "%s cuenta bloqueada/desbloqueada"
+msgstr[1] "%s cuenta bloqueada/desbloqueada"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:43
+#, php-format
+msgid "%s account deleted"
+msgid_plural "%s accounts deleted"
+msgstr[0] "%s cuentas eliminadas"
+msgstr[1] "%s cuentas eliminadas"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:79
+msgid "Account not found"
+msgstr "Cuenta no encontrada"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:90
+#, php-format
+msgid "Account '%s' deleted"
+msgstr "La cuenta '%s' ha sido eliminada"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:98
+#, php-format
+msgid "Account '%s' blocked"
+msgstr "La cuenta '%s' ha sido bloqueada"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:106
+#, php-format
+msgid "Account '%s' unblocked"
+msgstr "La cuenta '%s' ha sido desbloqueada"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:165
+#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1562
+msgid "Accounts"
+msgstr "Cuentas"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:167
+#: ../../Zotlabs/Module/Admin/Channels.php:148
+msgid "select all"
+msgstr "seleccionar todo"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:168
+msgid "Registrations waiting for confirm"
+msgstr "Inscripciones en espera de confirmación"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:169
+msgid "Request date"
+msgstr "Fecha de solicitud"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:169
+#: ../../Zotlabs/Module/Admin/Accounts.php:181
+#: ../../extend/addon/addon/redred/redred.php:107
+#: ../../extend/addon/addon/rtof/rtof.php:93
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1140
+#: ../../extend/addon/addon/openid/MysqlProvider.php:56
+#: ../../extend/addon/addon/openid/MysqlProvider.php:57
+#: ../../include/network.php:2237
+msgid "Email"
+msgstr "Correo electrónico"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:170
+msgid "No registrations."
+msgstr "Sin registros."
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:172
+msgid "Deny"
+msgstr "Rechazar"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:180
+msgid "ID"
+msgstr "ID"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:267
+msgid "All Channels"
+msgstr "Todos los canales"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:183
+msgid "Register date"
+msgstr "Fecha de registro"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:184
+msgid "Last login"
+msgstr "Último acceso"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:185
+msgid "Expires"
+msgstr "Caduca"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:186
+msgid "Service Class"
+msgstr "Clase de servicio"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:188
+msgid ""
+"Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
+" on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "¡Las cuentas seleccionadas van a ser eliminadas!\\n\\n¡Todo lo que estas cuentas han publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:189
+msgid ""
+"The account {0} will be deleted!\\n\\nEverything this account has posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "¡La cuenta {0} va a ser eliminada!\\n\\n¡Todo lo que esta cuenta ha publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:31
+#, php-format
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channels censored/uncensored"
+msgstr[0] "%s canales censurados/no censurados"
+msgstr[1] "%s canales censurados/no censurados"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:40
+#, php-format
+msgid "%s channel code allowed/disallowed"
+msgid_plural "%s channels code allowed/disallowed"
+msgstr[0] "%s código permitido/no permitido al canal"
+msgstr[1] "%s código permitido/no permitido al canal"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:46
+#, php-format
+msgid "%s channel deleted"
+msgid_plural "%s channels deleted"
+msgstr[0] "%s canales eliminados"
+msgstr[1] "%s canales eliminados"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:65
+msgid "Channel not found"
+msgstr "Canal no encontrado"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:75
+#, php-format
+msgid "Channel '%s' deleted"
+msgstr "Canal '%s' eliminado"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:87
+#, php-format
+msgid "Channel '%s' censored"
+msgstr "Canal '%s' censurado"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:87
+#, php-format
+msgid "Channel '%s' uncensored"
+msgstr "Canal '%s' no censurado"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:98
+#, php-format
+msgid "Channel '%s' code allowed"
+msgstr "Código permitido al canal '%s'"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:98
+#, php-format
+msgid "Channel '%s' code disallowed"
+msgstr "Código no permitido al canal '%s'"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1563
+msgid "Channels"
+msgstr "Canales"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:150
+msgid "Censor"
+msgstr "Censurar"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:151
+msgid "Uncensor"
+msgstr "No censurar"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:152
+msgid "Allow Code"
+msgstr "Permitir código"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:153
+msgid "Disallow Code"
+msgstr "No permitir código"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:154
+#: ../../include/conversation.php:1653
+msgid "Channel"
+msgstr "Canal"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:158
+msgid "UID"
+msgstr "UID"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:162
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Los canales seleccionados se eliminarán!\\n\\nTodo lo publicado por estos canales en este sitio se borrarán definitivamente!\\n\\n¿Está seguro de querer hacerlo?"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:163
+msgid ""
+"The channel {0} will be deleted!\\n\\nEverything that was posted in this "
+"channel on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "El canal {0} va a ser eliminado!\\n\\nTodo lo publicado por el canal en este sitio se borrará definitivamente!\\n\\n¿Está seguro de querer hacerlo?"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:19
+msgid "Update has been marked successful"
+msgstr "La actualización ha sido marcada como exitosa"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:29
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "La ejecución de %s ha fallado. Mirar en los informes del sistema."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:32
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "La actualización de %s se ha realizado exitosamente."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:36
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "La actualización de %s no ha devuelto ningún estado. No se sabe si ha tenido éxito."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:39
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "No se encuentra la función de actualización de %s."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:55
+msgid "No failed updates."
+msgstr "No ha fallado ninguna actualización."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:59
+msgid "Failed Updates"
+msgstr "Han fallado las actualizaciones"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:61
+msgid "Mark success (if update was manually applied)"
+msgstr "Marcar como exitosa (si la actualización se ha hecho manualmente)"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:62
+msgid "Attempt to execute this update step automatically"
+msgstr "Intentar ejecutar este paso de actualización automáticamente"
+
+#: ../../Zotlabs/Module/Admin/Site.php:133
msgid "Site settings updated."
msgstr "Ajustes del sitio actualizados."
-#: ../../Zotlabs/Module/Admin/Site.php:162 ../../include/text.php:2942
+#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2918
msgid "Default"
msgstr "Predeterminado"
-#: ../../Zotlabs/Module/Admin/Site.php:172
-#: ../../Zotlabs/Module/Settings/Display.php:141
+#: ../../Zotlabs/Module/Admin/Site.php:169
+#: ../../Zotlabs/Module/Settings/Display.php:143
msgid "mobile"
msgstr "móvil"
-#: ../../Zotlabs/Module/Admin/Site.php:174
+#: ../../Zotlabs/Module/Admin/Site.php:171
msgid "experimental"
msgstr "experimental"
-#: ../../Zotlabs/Module/Admin/Site.php:176
+#: ../../Zotlabs/Module/Admin/Site.php:173
msgid "unsupported"
msgstr "no soportado"
-#: ../../Zotlabs/Module/Admin/Site.php:221
-#: ../../Zotlabs/Module/Connedit.php:408 ../../Zotlabs/Module/Connedit.php:686
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-#: ../../Zotlabs/Module/Api.php:85 ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168
-#: ../../Zotlabs/Module/Profiles.php:647 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Photos.php:653 ../../Zotlabs/Module/Events.php:462
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:472
-#: ../../Zotlabs/Module/Settings/Channel.php:289
-#: ../../Zotlabs/Module/Settings/Display.php:101 ../../include/dir_fns.php:143
-#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
-#: ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1743
-msgid "No"
-msgstr "No"
-
-#: ../../Zotlabs/Module/Admin/Site.php:222
+#: ../../Zotlabs/Module/Admin/Site.php:219
msgid "Yes - with approval"
msgstr "Sí - con aprobación"
-#: ../../Zotlabs/Module/Admin/Site.php:223
-#: ../../Zotlabs/Module/Connedit.php:408 ../../Zotlabs/Module/Menu.php:100
-#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Api.php:84
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168
-#: ../../Zotlabs/Module/Profiles.php:647 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Photos.php:653 ../../Zotlabs/Module/Events.php:462
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:472
-#: ../../Zotlabs/Module/Settings/Channel.php:289
-#: ../../Zotlabs/Module/Settings/Display.php:101 ../../include/dir_fns.php:143
-#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
-#: ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1743
-msgid "Yes"
-msgstr "Sí"
-
-#: ../../Zotlabs/Module/Admin/Site.php:228
+#: ../../Zotlabs/Module/Admin/Site.php:225
msgid "My site is not a public server"
msgstr "Mi sitio no es un servidor público"
-#: ../../Zotlabs/Module/Admin/Site.php:229
+#: ../../Zotlabs/Module/Admin/Site.php:226
msgid "My site has paid access only"
msgstr "Mi sitio es un servicio de pago"
-#: ../../Zotlabs/Module/Admin/Site.php:230
+#: ../../Zotlabs/Module/Admin/Site.php:227
msgid "My site has free access only"
msgstr "Mi sitio es un servicio gratuito"
-#: ../../Zotlabs/Module/Admin/Site.php:231
+#: ../../Zotlabs/Module/Admin/Site.php:228
msgid "My site offers free accounts with optional paid upgrades"
msgstr "Mi sitio ofrece cuentas gratuitas con opciones extra de pago"
-#: ../../Zotlabs/Module/Admin/Site.php:242 ../../Zotlabs/Module/Setup.php:336
+#: ../../Zotlabs/Module/Admin/Site.php:239 ../../Zotlabs/Module/Setup.php:328
msgid "Basic/Minimal Social Networking"
msgstr "Red social básica o mínima"
-#: ../../Zotlabs/Module/Admin/Site.php:243 ../../Zotlabs/Module/Setup.php:337
+#: ../../Zotlabs/Module/Admin/Site.php:240 ../../Zotlabs/Module/Setup.php:329
msgid "Standard Configuration (default)"
msgstr "Configuración estándar (por defecto)"
-#: ../../Zotlabs/Module/Admin/Site.php:244 ../../Zotlabs/Module/Setup.php:338
+#: ../../Zotlabs/Module/Admin/Site.php:241 ../../Zotlabs/Module/Setup.php:330
msgid "Professional"
msgstr "Profesional"
-#: ../../Zotlabs/Module/Admin/Site.php:249
-#: ../../Zotlabs/Module/Settings/Account.php:105
+#: ../../Zotlabs/Module/Admin/Site.php:245 ../../Zotlabs/Lib/Techlevels.php:10
msgid "Beginner/Basic"
msgstr "Principiante / Básico"
-#: ../../Zotlabs/Module/Admin/Site.php:250
-#: ../../Zotlabs/Module/Settings/Account.php:106
+#: ../../Zotlabs/Module/Admin/Site.php:246 ../../Zotlabs/Lib/Techlevels.php:11
msgid "Novice - not skilled but willing to learn"
msgstr "Novato: no cualificado, pero dispuesto a aprender"
-#: ../../Zotlabs/Module/Admin/Site.php:251
-#: ../../Zotlabs/Module/Settings/Account.php:107
+#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Lib/Techlevels.php:12
msgid "Intermediate - somewhat comfortable"
msgstr "Intermedio: bastante cómodo"
-#: ../../Zotlabs/Module/Admin/Site.php:252
-#: ../../Zotlabs/Module/Settings/Account.php:108
+#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Lib/Techlevels.php:13
msgid "Advanced - very comfortable"
msgstr "Avanzado: muy cómodo"
-#: ../../Zotlabs/Module/Admin/Site.php:253
-#: ../../Zotlabs/Module/Settings/Account.php:109
+#: ../../Zotlabs/Module/Admin/Site.php:249 ../../Zotlabs/Lib/Techlevels.php:14
msgid "Expert - I can write computer code"
msgstr "Experto: puedo escribir código informático"
-#: ../../Zotlabs/Module/Admin/Site.php:254
-#: ../../Zotlabs/Module/Settings/Account.php:110
+#: ../../Zotlabs/Module/Admin/Site.php:250 ../../Zotlabs/Lib/Techlevels.php:15
msgid "Wizard - I probably know more than you do"
msgstr "Asistente: probablemente sé más que tú"
-#: ../../Zotlabs/Module/Admin/Site.php:266 ../../include/widgets.php:1560
+#: ../../Zotlabs/Module/Admin/Site.php:259 ../../include/widgets.php:1561
msgid "Site"
msgstr "Sitio"
-#: ../../Zotlabs/Module/Admin/Site.php:268
-#: ../../Zotlabs/Module/Register.php:253
-msgid "Registration"
-msgstr "Registro"
-
-#: ../../Zotlabs/Module/Admin/Site.php:269
+#: ../../Zotlabs/Module/Admin/Site.php:262
msgid "File upload"
msgstr "Subir fichero"
-#: ../../Zotlabs/Module/Admin/Site.php:270
+#: ../../Zotlabs/Module/Admin/Site.php:263
msgid "Policies"
msgstr "Políticas"
-#: ../../Zotlabs/Module/Admin/Site.php:271
+#: ../../Zotlabs/Module/Admin/Site.php:264
#: ../../include/contact_widgets.php:16
msgid "Advanced"
msgstr "Avanzado"
-#: ../../Zotlabs/Module/Admin/Site.php:275
+#: ../../Zotlabs/Module/Admin/Site.php:268
+#: ../../extend/addon/addon/statusnet/statusnet.php:890
msgid "Site name"
msgstr "Nombre del sitio"
-#: ../../Zotlabs/Module/Admin/Site.php:277 ../../Zotlabs/Module/Setup.php:359
+#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Module/Setup.php:351
msgid "Server Configuration/Role"
msgstr "Configuración del servidor"
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:272
msgid "Site default technical skill level"
msgstr "Nivel de habilidad técnica predeterminado del sitio"
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:272
msgid "Used to provide a member experience matched to technical comfort level"
-msgstr "Se utiliza para proporcionar la experiencia de los miembros adaptada al nivel de comodidad"
+msgstr "Se utiliza para proporcionar una experiencia a los miembros adaptada a su nivel de comodidad técnica"
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:274
msgid "Lock the technical skill level setting"
msgstr "Bloquear el ajuste del nivel de habilidad técnica"
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:274
msgid "Members can set their own technical comfort level by default"
-msgstr "Los miembros pueden configurar por defecto su nivel de comodidad técnica"
+msgstr "Los miembros pueden configurar su nivel de comodidad técnica por defecto"
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:276
msgid "Banner/Logo"
msgstr "Banner/Logo"
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:277
msgid "Administrator Information"
msgstr "Información del Administrador"
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:277
msgid ""
"Contact information for site administrators. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Información de contacto de los administradores del sitio. Visible en la página \"siteinfo\". Se puede usar BBCode"
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Siteinfo.php:23
+msgid "Site Information"
+msgstr "Información sobre el sitio"
+
+#: ../../Zotlabs/Module/Admin/Site.php:278
+msgid ""
+"Publicly visible description of this site. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Descripción pública de este sitio. Visible en la página \"siteinfo\". Se puede usar BBCode"
+
+#: ../../Zotlabs/Module/Admin/Site.php:279
msgid "System language"
msgstr "Idioma del sistema"
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:280
msgid "System theme"
msgstr "Tema gráfico del sistema"
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:280
msgid ""
"Default system theme - may be over-ridden by user profiles - <a href='#' "
"id='cnftheme'>change theme settings</a>"
msgstr "Tema del sistema por defecto - se puede cambiar por cada perfil de usuario - <a href='#' id='cnftheme'>modificar los ajustes del tema</a>"
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Mobile system theme"
msgstr "Tema del sistema para móviles"
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Theme for mobile devices"
msgstr "Tema para dispositivos móviles"
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "Allow Feeds as Connections"
msgstr "Permitir contenidos RSS como conexiones"
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "(Heavy system resource usage)"
msgstr "(Uso intenso de los recursos del sistema)"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:284
msgid "Maximum image size"
msgstr "Tamaño máximo de la imagen"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:284
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr "Tamaño máximo en bytes de la imagen subida. Por defecto, es 0, lo que significa que no hay límites."
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:285
msgid "Does this site allow new member registration?"
msgstr "¿Debe este sitio permitir el registro de nuevos miembros?"
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid "Invitation only"
msgstr "Solo con una invitación"
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid ""
"Only allow new member registrations with an invitation code. Above register "
"policy must be set to Yes."
msgstr "Solo se permiten inscripciones de nuevos miembros con un código de invitación. Además, deben aceptarse los términos del registro marcando \"Sí\"."
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:287
msgid "Which best describes the types of account offered by this hub?"
msgstr "¿Cómo describiría el tipo de servicio ofrecido por este servidor?"
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:288
msgid "Register text"
msgstr "Texto del registro"
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:288
msgid "Will be displayed prominently on the registration page."
msgstr "Se mostrará de forma destacada en la página de registro."
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid "Site homepage to show visitors (default: login box)"
msgstr "Página personal que se mostrará a los visitantes (por defecto: la página de identificación)"
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid ""
"example: 'public' to show public stream, 'page/sys/home' to show a system "
"webpage called 'home' or 'include:home.html' to include a file."
msgstr "ejemplo: 'public' para mostrar contenido público, 'page/sys/home' para mostrar la página web definida como \"home\" o 'include:home.html' para mostrar el contenido de un fichero."
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid "Preserve site homepage URL"
msgstr "Preservar la dirección de la página personal"
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid ""
"Present the site homepage in a frame at the original location instead of "
"redirecting"
msgstr "Presenta la página personal del sitio en un marco en la ubicación original, en vez de redirigirla."
-#: ../../Zotlabs/Module/Admin/Site.php:298
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Accounts abandoned after x days"
msgstr "Cuentas abandonadas después de x días"
-#: ../../Zotlabs/Module/Admin/Site.php:298
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr "Para evitar consumir recursos del sistema intentando poner al día las cuentas abandonadas. Introduzca 0 para no tener límite de tiempo."
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid "Allowed friend domains"
msgstr "Dominios amigos permitidos"
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid ""
"Comma separated list of domains which are allowed to establish friendships "
"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr "Lista separada por comas de dominios a los que está permitido establecer relaciones de amistad con este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio."
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Verify Email Addresses"
msgstr "Verificar las direcciones de correo electrónico"
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid ""
"Check to verify email addresses used in account registration (recommended)."
msgstr "Activar para la verificación de la dirección de correo electrónico en el registro de una cuenta (recomendado)."
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:294
msgid "Force publish"
msgstr "Forzar la publicación"
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:294
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr "Intentar forzar todos los perfiles para que sean listados en el directorio de este sitio."
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid "Import Public Streams"
msgstr "Importar contenido público"
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid ""
"Import and allow access to public content pulled from other sites. Warning: "
"this content is unmoderated."
msgstr "Importar y permitir acceso al contenido público sacado de otros sitios. Advertencia: este contenido no está moderado, por lo que podría encontrar cosas inapropiadas u ofensivas."
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Login on Homepage"
msgstr "Iniciar sesión en la página personal"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid ""
"Present a login box to visitors on the home page if no other content has "
"been configured."
msgstr "Presentar a los visitantes una casilla de identificación en la página de inicio, si no se ha configurado otro tipo de contenido."
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid "Enable context help"
msgstr "Habilitar la ayuda contextual"
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid ""
"Display contextual help for the current page when the help button is "
"pressed."
msgstr "Ver la ayuda contextual para la página actual cuando se pulse el botón de Ayuda."
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "Directory Server URL"
msgstr "URL del servidor de directorio"
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "Default directory server"
msgstr "Servidor de directorio predeterminado"
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:301
msgid "Proxy user"
msgstr "Usuario del proxy"
-#: ../../Zotlabs/Module/Admin/Site.php:309
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "Proxy URL"
msgstr "Dirección del proxy"
-#: ../../Zotlabs/Module/Admin/Site.php:310
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Network timeout"
msgstr "Tiempo de espera de la red"
-#: ../../Zotlabs/Module/Admin/Site.php:310
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr "Valor en segundos. Poner a 0 para que no haya tiempo límite (no recomendado)"
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid "Delivery interval"
msgstr "Intervalo de entrega"
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid ""
"Delay background delivery processes by this many seconds to reduce system "
"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
"for large dedicated servers."
msgstr "Retrasar los procesos de transmisión en segundo plano por esta cantidad de segundos para reducir la carga del sistema. Recomendado: 4-5 para sitios compartidos, 2-3 para servidores virtuales privados, 0-1 para grandes servidores dedicados."
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid "Deliveries per process"
msgstr "Intentos de envío por proceso"
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid ""
"Number of deliveries to attempt in a single operating system process. Adjust"
" if necessary to tune system performance. Recommend: 1-5."
msgstr "Numero de envíos a intentar en un único proceso del sistema operativo. Ajustar si es necesario mejorar el rendimiento. Se recomienda: 1-5."
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid "Poll interval"
msgstr "Intervalo máximo de tiempo entre dos mensajes sucesivos"
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid ""
"Delay background polling processes by this many seconds to reduce system "
"load. If 0, use delivery interval."
msgstr "Retrasar el intervalo de envío en segundo plano, en esta cantidad de segundos, para reducir la carga del sistema. Si es 0, usar el intervalo de entrega."
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Maximum Load Average"
msgstr "Carga media máxima"
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default 50."
msgstr "Carga máxima del sistema antes de que los procesos de entrega y envío se hayan retardado - por defecto, 50."
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "Expiration period in days for imported (grid/network) content"
msgstr "Caducidad del contenido importado de otros sitios (en días)"
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "0 for no expiration of imported content"
msgstr "0 para que no caduque el contenido importado"
-#: ../../Zotlabs/Module/Admin/Themes.php:18
-msgid "Theme settings updated."
-msgstr "Ajustes del tema actualizados."
-
-#: ../../Zotlabs/Module/Admin/Themes.php:58
-msgid "No themes found."
-msgstr "No se han encontrado temas."
-
-#: ../../Zotlabs/Module/Admin/Themes.php:114
-msgid "Screenshot"
-msgstr "Instantánea de pantalla"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:121
-#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1566
-msgid "Themes"
-msgstr "Temas"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:160
-msgid "[Experimental]"
-msgstr "[Experimental]"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:161
-msgid "[Unsupported]"
-msgstr "[No soportado]"
-
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:222
-#: ../../include/nav.php:95 ../../include/conversation.php:1672
-msgid "Photos"
-msgstr "Fotos"
-
-#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
-msgid "Invalid item."
-msgstr "Elemento no válido."
-
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Block.php:43
-#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Wall_upload.php:33
-msgid "Channel not found."
-msgstr "Canal no encontrado."
-
-#: ../../Zotlabs/Module/Page.php:131
-msgid ""
-"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
-"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
-" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
-"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
-"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
-"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "Save to Folder:"
-msgstr "Guardar en carpeta:"
-
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "- select -"
-msgstr "- seleccionar -"
-
-#: ../../Zotlabs/Module/Mail.php:38
-msgid "Unable to lookup recipient."
-msgstr "No se puede asociar a un destinatario."
-
-#: ../../Zotlabs/Module/Mail.php:45
-msgid "Unable to communicate with requested channel."
-msgstr "No se puede establecer la comunicación con el canal solicitado."
-
-#: ../../Zotlabs/Module/Mail.php:52
-msgid "Cannot verify requested channel."
-msgstr "No se puede verificar el canal solicitado."
-
-#: ../../Zotlabs/Module/Mail.php:70
-msgid "Selected channel has private message restrictions. Send failed."
-msgstr "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló."
-
-#: ../../Zotlabs/Module/Mail.php:135
-msgid "Messages"
-msgstr "Mensajes"
-
-#: ../../Zotlabs/Module/Mail.php:170
-msgid "Message recalled."
-msgstr "Mensaje revocado."
-
-#: ../../Zotlabs/Module/Mail.php:183
-msgid "Conversation removed."
-msgstr "Conversación eliminada."
-
-#: ../../Zotlabs/Module/Mail.php:197 ../../Zotlabs/Module/Mail.php:306
-#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1184
-msgid "Please enter a link URL:"
-msgstr "Por favor, introduzca la dirección del enlace:"
-
-#: ../../Zotlabs/Module/Mail.php:198 ../../Zotlabs/Module/Mail.php:307
-msgid "Expires YYYY-MM-DD HH:MM"
-msgstr "Caduca YYYY-MM-DD HH:MM"
-
-#: ../../Zotlabs/Module/Mail.php:226
-msgid "Requested channel is not in this network"
-msgstr "El canal solicitado no existe en esta red"
-
-#: ../../Zotlabs/Module/Mail.php:234
-msgid "Send Private Message"
-msgstr "Enviar un mensaje privado"
-
-#: ../../Zotlabs/Module/Mail.php:235 ../../Zotlabs/Module/Mail.php:360
-msgid "To:"
-msgstr "Para:"
-
-#: ../../Zotlabs/Module/Mail.php:238 ../../Zotlabs/Module/Mail.php:362
-msgid "Subject:"
-msgstr "Asunto:"
-
-#: ../../Zotlabs/Module/Mail.php:241 ../../Zotlabs/Module/Invite.php:135
-msgid "Your message:"
-msgstr "Su mensaje:"
-
-#: ../../Zotlabs/Module/Mail.php:243 ../../Zotlabs/Module/Mail.php:368
-#: ../../include/conversation.php:1244
-msgid "Attach file"
-msgstr "Adjuntar fichero"
-
-#: ../../Zotlabs/Module/Mail.php:244 ../../Zotlabs/Module/Mail.php:369
-#: ../../Zotlabs/Module/Editblock.php:111
-#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Chat.php:207
-#: ../../include/conversation.php:1149
-msgid "Insert web link"
-msgstr "Insertar enlace web"
-
-#: ../../Zotlabs/Module/Mail.php:245
-msgid "Send"
-msgstr "Enviar"
-
-#: ../../Zotlabs/Module/Mail.php:248 ../../Zotlabs/Module/Mail.php:373
-#: ../../include/conversation.php:1289
-msgid "Set expiration date"
-msgstr "Configurar fecha de caducidad"
-
-#: ../../Zotlabs/Module/Mail.php:250 ../../Zotlabs/Module/Mail.php:375
-#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:737
-#: ../../include/conversation.php:1294
-msgid "Encrypt text"
-msgstr "Cifrar texto"
-
-#: ../../Zotlabs/Module/Mail.php:332
-msgid "Delete message"
-msgstr "Borrar mensaje"
-
-#: ../../Zotlabs/Module/Mail.php:333
-msgid "Delivery report"
-msgstr "Informe de transmisión"
-
-#: ../../Zotlabs/Module/Mail.php:334
-msgid "Recall message"
-msgstr "Revocar el mensaje"
-
-#: ../../Zotlabs/Module/Mail.php:336
-msgid "Message has been recalled."
-msgstr "El mensaje ha sido revocado."
-
-#: ../../Zotlabs/Module/Mail.php:353
-msgid "Delete Conversation"
-msgstr "Eliminar conversación"
-
-#: ../../Zotlabs/Module/Mail.php:355
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Comunicación segura no disponible. Pero <strong>puede</strong> responder desde la página del perfil del remitente."
-
-#: ../../Zotlabs/Module/Mail.php:359
-msgid "Send Reply"
-msgstr "Responder"
-
-#: ../../Zotlabs/Module/Mail.php:364
-#, php-format
-msgid "Your message for %s (%s):"
-msgstr "Su mensaje para %s (%s):"
-
-#: ../../Zotlabs/Module/Connections.php:56
-#: ../../Zotlabs/Module/Connections.php:161
-#: ../../Zotlabs/Module/Connections.php:242
-msgid "Blocked"
-msgstr "Bloqueadas"
-
-#: ../../Zotlabs/Module/Connections.php:61
-#: ../../Zotlabs/Module/Connections.php:168
-#: ../../Zotlabs/Module/Connections.php:241
-msgid "Ignored"
-msgstr "Ignoradas"
-
-#: ../../Zotlabs/Module/Connections.php:66
-#: ../../Zotlabs/Module/Connections.php:182
-#: ../../Zotlabs/Module/Connections.php:240
-msgid "Hidden"
-msgstr "Ocultas"
-
-#: ../../Zotlabs/Module/Connections.php:71
-#: ../../Zotlabs/Module/Connections.php:175
-#: ../../Zotlabs/Module/Connections.php:239
-msgid "Archived"
-msgstr "Archivadas"
-
-#: ../../Zotlabs/Module/Connections.php:76
-#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1573
-msgid "New"
-msgstr "Nuevas"
-
-#: ../../Zotlabs/Module/Connections.php:92
-#: ../../Zotlabs/Module/Connections.php:107
-#: ../../Zotlabs/Module/Connedit.php:629 ../../include/widgets.php:533
-msgid "All"
-msgstr "Todos/as"
-
-#: ../../Zotlabs/Module/Connections.php:138
-msgid "New Connections"
-msgstr "Nuevas conexiones"
-
-#: ../../Zotlabs/Module/Connections.php:141
-msgid "Show pending (new) connections"
-msgstr "Mostrar conexiones (nuevas) pendientes"
-
-#: ../../Zotlabs/Module/Connections.php:145
-#: ../../Zotlabs/Module/Profperm.php:144
-msgid "All Connections"
-msgstr "Todas las conexiones"
-
-#: ../../Zotlabs/Module/Connections.php:148
-msgid "Show all connections"
-msgstr "Mostrar todas las conexiones"
-
-#: ../../Zotlabs/Module/Connections.php:164
-msgid "Only show blocked connections"
-msgstr "Mostrar solo las conexiones bloqueadas"
-
-#: ../../Zotlabs/Module/Connections.php:171
-msgid "Only show ignored connections"
-msgstr "Mostrar solo conexiones ignoradas"
-
-#: ../../Zotlabs/Module/Connections.php:178
-msgid "Only show archived connections"
-msgstr "Mostrar solo las conexiones archivadas"
-
-#: ../../Zotlabs/Module/Connections.php:185
-msgid "Only show hidden connections"
-msgstr "Mostrar solo las conexiones ocultas"
-
-#: ../../Zotlabs/Module/Connections.php:238
-msgid "Pending approval"
-msgstr "Pendiente de aprobación"
-
-#: ../../Zotlabs/Module/Connections.php:254
-#, php-format
-msgid "%1$s [%2$s]"
-msgstr "%1$s [%2$s]"
-
-#: ../../Zotlabs/Module/Connections.php:255
-msgid "Edit connection"
-msgstr "Editar conexión"
-
-#: ../../Zotlabs/Module/Connections.php:256
-msgid "Delete connection"
-msgstr "Eliminar conexión"
-
-#: ../../Zotlabs/Module/Connections.php:265
-msgid "Channel address"
-msgstr "Dirección del canal"
-
-#: ../../Zotlabs/Module/Connections.php:267
-msgid "Network"
-msgstr "Red"
-
-#: ../../Zotlabs/Module/Connections.php:270
-msgid "Status"
-msgstr "Estado"
-
-#: ../../Zotlabs/Module/Connections.php:272
-msgid "Connected"
-msgstr "Conectado/a"
-
-#: ../../Zotlabs/Module/Connections.php:274
-msgid "Approve connection"
-msgstr "Aprobar esta conexión"
-
-#: ../../Zotlabs/Module/Connections.php:276
-msgid "Ignore connection"
-msgstr "Ignorar esta conexión"
-
-#: ../../Zotlabs/Module/Connections.php:277
-#: ../../Zotlabs/Module/Connedit.php:583
-#: ../../Zotlabs/Module/Notifications.php:55
-msgid "Ignore"
-msgstr "Ignorar"
-
-#: ../../Zotlabs/Module/Connections.php:278
-msgid "Recent activity"
-msgstr "Actividad reciente"
-
-#: ../../Zotlabs/Module/Connections.php:302 ../../Zotlabs/Lib/Apps.php:209
-#: ../../include/text.php:901 ../../include/nav.php:191
-msgid "Connections"
-msgstr "Conexiones"
-
-#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44
-#: ../../Zotlabs/Lib/Apps.php:230 ../../include/text.php:971
-#: ../../include/text.php:983 ../../include/acl_selectors.php:174
-#: ../../include/nav.php:170 ../../include/widgets.php:315
-msgid "Search"
-msgstr "Buscar"
-
-#: ../../Zotlabs/Module/Connections.php:307
-msgid "Search your connections"
-msgstr "Buscar sus conexiones"
-
-#: ../../Zotlabs/Module/Connections.php:308
-msgid "Connections search"
-msgstr "Buscar conexiones"
-
-#: ../../Zotlabs/Module/Connections.php:309
-#: ../../Zotlabs/Module/Directory.php:388
-#: ../../Zotlabs/Module/Directory.php:393 ../../include/contact_widgets.php:23
-msgid "Find"
-msgstr "Encontrar"
-
-#: ../../Zotlabs/Module/Cover_photo.php:58
-#: ../../Zotlabs/Module/Profile_photo.php:61
-msgid "Image uploaded but image cropping failed."
-msgstr "Imagen actualizada, pero el recorte de la imagen ha fallado. "
-
-#: ../../Zotlabs/Module/Cover_photo.php:134
-#: ../../Zotlabs/Module/Cover_photo.php:181
-msgid "Cover Photos"
-msgstr "Imágenes de portada del perfil"
-
-#: ../../Zotlabs/Module/Cover_photo.php:154
-#: ../../Zotlabs/Module/Profile_photo.php:135
-msgid "Image resize failed."
-msgstr "El ajuste del tamaño de la imagen ha fallado."
-
-#: ../../Zotlabs/Module/Cover_photo.php:168
-#: ../../Zotlabs/Module/Profile_photo.php:196 ../../include/photos.php:148
-msgid "Unable to process image"
-msgstr "No ha sido posible procesar la imagen"
-
-#: ../../Zotlabs/Module/Cover_photo.php:192
-#: ../../Zotlabs/Module/Profile_photo.php:223
-msgid "Image upload failed."
-msgstr "La carga de la imagen ha fallado."
-
-#: ../../Zotlabs/Module/Cover_photo.php:210
-#: ../../Zotlabs/Module/Profile_photo.php:242
-msgid "Unable to process image."
-msgstr "No ha sido posible procesar la imagen."
-
-#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4341
-msgid "female"
-msgstr "mujer"
-
-#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4342
-#, php-format
-msgid "%1$s updated her %2$s"
-msgstr "%1$s ha actualizado su %2$s"
-
-#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4343
-msgid "male"
-msgstr "hombre"
-
-#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4344
-#, php-format
-msgid "%1$s updated his %2$s"
-msgstr "%1$s ha actualizado su %2$s"
-
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4346
-#, php-format
-msgid "%1$s updated their %2$s"
-msgstr "%1$s ha actualizado su %2$s"
-
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1731
-msgid "cover photo"
-msgstr "Imagen de portada del perfil"
-
-#: ../../Zotlabs/Module/Cover_photo.php:303
-#: ../../Zotlabs/Module/Cover_photo.php:318
-#: ../../Zotlabs/Module/Profile_photo.php:300
-#: ../../Zotlabs/Module/Profile_photo.php:341
-msgid "Photo not available."
-msgstr "Foto no disponible."
-
-#: ../../Zotlabs/Module/Cover_photo.php:354
-#: ../../Zotlabs/Module/Profile_photo.php:387
-msgid "Upload File:"
-msgstr "Subir fichero:"
-
-#: ../../Zotlabs/Module/Cover_photo.php:355
-#: ../../Zotlabs/Module/Profile_photo.php:388
-msgid "Select a profile:"
-msgstr "Seleccionar un perfil:"
-
-#: ../../Zotlabs/Module/Cover_photo.php:356
-msgid "Upload Cover Photo"
-msgstr "Subir imagen de portada del perfil"
-
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:396
-#: ../../Zotlabs/Module/Settings/Channel.php:399
-msgid "or"
-msgstr "o"
-
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:396
-msgid "skip this step"
-msgstr "Omitir este paso"
-
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:396
-msgid "select a photo from your photo albums"
-msgstr "Seleccione una foto de sus álbumes de fotos"
-
-#: ../../Zotlabs/Module/Cover_photo.php:377
-#: ../../Zotlabs/Module/Profile_photo.php:415
-msgid "Crop Image"
-msgstr "Recortar imagen"
-
-#: ../../Zotlabs/Module/Cover_photo.php:378
-#: ../../Zotlabs/Module/Profile_photo.php:416
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Por favor ajuste el recorte de la imagen para una visión óptima."
-
-#: ../../Zotlabs/Module/Cover_photo.php:380
-#: ../../Zotlabs/Module/Profile_photo.php:418
-msgid "Done Editing"
-msgstr "Edición completada"
-
-#: ../../Zotlabs/Module/Rpost.php:138 ../../Zotlabs/Module/Editpost.php:106
-msgid "Edit post"
-msgstr "Editar la entrada"
-
-#: ../../Zotlabs/Module/Connedit.php:80
-msgid "Could not access contact record."
-msgstr "No se ha podido acceder al registro de contacto."
-
-#: ../../Zotlabs/Module/Connedit.php:104
-msgid "Could not locate selected profile."
-msgstr "No se ha podido localizar el perfil seleccionado."
-
-#: ../../Zotlabs/Module/Connedit.php:256
-msgid "Connection updated."
-msgstr "Conexión actualizada."
-
-#: ../../Zotlabs/Module/Connedit.php:258
-msgid "Failed to update connection record."
-msgstr "Error al actualizar el registro de la conexión."
-
-#: ../../Zotlabs/Module/Connedit.php:308
-msgid "is now connected to"
-msgstr "ahora está conectado/a"
-
-#: ../../Zotlabs/Module/Connedit.php:440
-msgid "Could not access address book record."
-msgstr "No se pudo acceder al registro en su libreta de direcciones."
-
-#: ../../Zotlabs/Module/Connedit.php:460
-msgid "Refresh failed - channel is currently unavailable."
-msgstr "Recarga fallida - no se puede encontrar el canal en este momento."
-
-#: ../../Zotlabs/Module/Connedit.php:475 ../../Zotlabs/Module/Connedit.php:484
-#: ../../Zotlabs/Module/Connedit.php:493 ../../Zotlabs/Module/Connedit.php:502
-#: ../../Zotlabs/Module/Connedit.php:515
-msgid "Unable to set address book parameters."
-msgstr "No ha sido posible establecer los parámetros de la libreta de direcciones."
-
-#: ../../Zotlabs/Module/Connedit.php:538
-msgid "Connection has been removed."
-msgstr "La conexión ha sido eliminada."
-
-#: ../../Zotlabs/Module/Connedit.php:554 ../../Zotlabs/Lib/Apps.php:221
-#: ../../include/nav.php:89 ../../include/conversation.php:953
-msgid "View Profile"
-msgstr "Ver el perfil"
-
-#: ../../Zotlabs/Module/Connedit.php:557
-#, php-format
-msgid "View %s's profile"
-msgstr "Ver el perfil de %s"
-
-#: ../../Zotlabs/Module/Connedit.php:561
-msgid "Refresh Permissions"
-msgstr "Recargar los permisos"
-
-#: ../../Zotlabs/Module/Connedit.php:564
-msgid "Fetch updated permissions"
-msgstr "Obtener los permisos actualizados"
-
-#: ../../Zotlabs/Module/Connedit.php:568
-msgid "Recent Activity"
-msgstr "Actividad reciente"
-
-#: ../../Zotlabs/Module/Connedit.php:571
-msgid "View recent posts and comments"
-msgstr "Ver publicaciones y comentarios recientes"
-
-#: ../../Zotlabs/Module/Connedit.php:578
-msgid "Block (or Unblock) all communications with this connection"
-msgstr "Bloquear (o desbloquear) todas las comunicaciones con esta conexión"
-
-#: ../../Zotlabs/Module/Connedit.php:579
-msgid "This connection is blocked!"
-msgstr "¡Esta conexión está bloqueada!"
-
-#: ../../Zotlabs/Module/Connedit.php:583
-msgid "Unignore"
-msgstr "Dejar de ignorar"
-
-#: ../../Zotlabs/Module/Connedit.php:586
-msgid "Ignore (or Unignore) all inbound communications from this connection"
-msgstr "Ignorar (o dejar de ignorar) todas las comunicaciones entrantes de esta conexión"
-
-#: ../../Zotlabs/Module/Connedit.php:587
-msgid "This connection is ignored!"
-msgstr "¡Esta conexión es ignorada!"
-
-#: ../../Zotlabs/Module/Connedit.php:591
-msgid "Unarchive"
-msgstr "Desarchivar"
-
-#: ../../Zotlabs/Module/Connedit.php:591
-msgid "Archive"
-msgstr "Archivar"
-
-#: ../../Zotlabs/Module/Connedit.php:594
-msgid ""
-"Archive (or Unarchive) this connection - mark channel dead but keep content"
-msgstr "Archiva (o desarchiva) esta conexión - marca el canal como muerto aunque mantiene sus contenidos"
-
-#: ../../Zotlabs/Module/Connedit.php:595
-msgid "This connection is archived!"
-msgstr "¡Esta conexión esta archivada!"
-
-#: ../../Zotlabs/Module/Connedit.php:599
-msgid "Unhide"
-msgstr "Mostrar"
-
-#: ../../Zotlabs/Module/Connedit.php:599
-msgid "Hide"
-msgstr "Ocultar"
-
-#: ../../Zotlabs/Module/Connedit.php:602
-msgid "Hide or Unhide this connection from your other connections"
-msgstr "Ocultar o mostrar esta conexión a sus otras conexiones"
-
-#: ../../Zotlabs/Module/Connedit.php:603
-msgid "This connection is hidden!"
-msgstr "¡Esta conexión está oculta!"
-
-#: ../../Zotlabs/Module/Connedit.php:610
-msgid "Delete this connection"
-msgstr "Eliminar esta conexión"
-
-#: ../../Zotlabs/Module/Connedit.php:625 ../../include/widgets.php:529
-msgid "Me"
-msgstr "Yo"
-
-#: ../../Zotlabs/Module/Connedit.php:626 ../../include/widgets.php:530
-msgid "Family"
-msgstr "Familia"
-
-#: ../../Zotlabs/Module/Connedit.php:627
-#: ../../Zotlabs/Module/Settings/Channel.php:61
-#: ../../Zotlabs/Module/Settings/Channel.php:65
-#: ../../Zotlabs/Module/Settings/Channel.php:66
-#: ../../Zotlabs/Module/Settings/Channel.php:69
-#: ../../Zotlabs/Module/Settings/Channel.php:80
-#: ../../include/selectors.php:123 ../../include/channel.php:402
-#: ../../include/channel.php:403 ../../include/channel.php:410
-#: ../../include/widgets.php:531
-msgid "Friends"
-msgstr "Amigos/as"
-
-#: ../../Zotlabs/Module/Connedit.php:628 ../../include/widgets.php:532
-msgid "Acquaintances"
-msgstr "Conocidos/as"
-
-#: ../../Zotlabs/Module/Connedit.php:686
-msgid "Approve this connection"
-msgstr "Aprobar esta conexión"
-
-#: ../../Zotlabs/Module/Connedit.php:686
-msgid "Accept connection to allow communication"
-msgstr "Aceptar la conexión para permitir la comunicación"
-
-#: ../../Zotlabs/Module/Connedit.php:691
-msgid "Set Affinity"
-msgstr "Ajustar la afinidad"
-
-#: ../../Zotlabs/Module/Connedit.php:694
-msgid "Set Profile"
-msgstr "Ajustar el perfil"
-
-#: ../../Zotlabs/Module/Connedit.php:697
-msgid "Set Affinity & Profile"
-msgstr "Ajustar la afinidad y el perfil"
-
-#: ../../Zotlabs/Module/Connedit.php:746
-msgid "none"
-msgstr "-"
-
-#: ../../Zotlabs/Module/Connedit.php:750 ../../include/widgets.php:656
-msgid "Connection Default Permissions"
-msgstr "Permisos predeterminados de conexión"
-
-#: ../../Zotlabs/Module/Connedit.php:750 ../../include/items.php:3993
-#, php-format
-msgid "Connection: %s"
-msgstr "Conexión: %s"
-
-#: ../../Zotlabs/Module/Connedit.php:751
-msgid "Apply these permissions automatically"
-msgstr "Aplicar estos permisos automaticamente"
-
-#: ../../Zotlabs/Module/Connedit.php:751
-msgid "Connection requests will be approved without your interaction"
-msgstr "Las solicitudes de conexión serán aprobadas sin su intervención"
-
-#: ../../Zotlabs/Module/Connedit.php:753
-msgid "This connection's primary address is"
-msgstr "La dirección primaria de esta conexión es"
-
-#: ../../Zotlabs/Module/Connedit.php:754
-msgid "Available locations:"
-msgstr "Ubicaciones disponibles:"
-
-#: ../../Zotlabs/Module/Connedit.php:758
-msgid ""
-"The permissions indicated on this page will be applied to all new "
-"connections."
-msgstr "Los permisos indicados en esta página serán aplicados en todas las nuevas conexiones."
-
-#: ../../Zotlabs/Module/Connedit.php:759
-msgid "Connection Tools"
-msgstr "Gestión de las conexiones"
-
-#: ../../Zotlabs/Module/Connedit.php:761
-msgid "Slide to adjust your degree of friendship"
-msgstr "Deslizar para ajustar el grado de amistad"
-
-#: ../../Zotlabs/Module/Connedit.php:762 ../../Zotlabs/Module/Rate.php:155
-#: ../../include/js_strings.php:20
-msgid "Rating"
-msgstr "Valoración"
-
-#: ../../Zotlabs/Module/Connedit.php:763
-msgid "Slide to adjust your rating"
-msgstr "Deslizar para ajustar su valoración"
-
-#: ../../Zotlabs/Module/Connedit.php:764 ../../Zotlabs/Module/Connedit.php:769
-msgid "Optionally explain your rating"
-msgstr "Opcionalmente, puede explicar su valoración"
-
-#: ../../Zotlabs/Module/Connedit.php:766
-msgid "Custom Filter"
-msgstr "Filtro personalizado"
-
-#: ../../Zotlabs/Module/Connedit.php:767
-msgid "Only import posts with this text"
-msgstr "Importar solo entradas que contengan este texto"
+#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1385
+msgid "Public Hubs"
+msgstr "Servidores públicos"
-#: ../../Zotlabs/Module/Connedit.php:767 ../../Zotlabs/Module/Connedit.php:768
+#: ../../Zotlabs/Module/Pubsites.php:27
msgid ""
-"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
-"all posts"
-msgstr "Una sola opción por línea: palabras, #etiquetas, /patrones/ o lang=xx. Dejar en blanco para importarlo todo"
-
-#: ../../Zotlabs/Module/Connedit.php:768
-msgid "Do not import posts with this text"
-msgstr "No importar entradas que contengan este texto"
-
-#: ../../Zotlabs/Module/Connedit.php:770
-msgid "This information is public!"
-msgstr "¡Esta información es pública!"
-
-#: ../../Zotlabs/Module/Connedit.php:775
-msgid "Connection Pending Approval"
-msgstr "Conexión pendiente de aprobación"
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
+msgstr "Los sitios listados permiten el registro público en la red $Projectname. Todos los sitios de la red están vinculados entre sí, por lo que sus miembros, en ninguno de ellos, indican la pertenencia a la red en su conjunto. Algunos sitios pueden requerir suscripción o proporcionar planes de servicio por niveles. Los mismos hubs <strong>pueden</strong> proporcionar detalles adicionales."
-#: ../../Zotlabs/Module/Connedit.php:778
-#: ../../Zotlabs/Module/Settings/Tokens.php:163
-msgid "inherited"
-msgstr "heredado"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Hub URL"
+msgstr "Dirección del hub"
-#: ../../Zotlabs/Module/Connedit.php:780
-#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Por favor, escoja el perfil que quiere mostrar a %s cuando esté viendo su perfil de forma segura."
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Access Type"
+msgstr "Tipo de acceso"
-#: ../../Zotlabs/Module/Connedit.php:782
-#: ../../Zotlabs/Module/Settings/Tokens.php:160
-msgid "Their Settings"
-msgstr "Sus ajustes"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Registration Policy"
+msgstr "Normas de registro"
-#: ../../Zotlabs/Module/Connedit.php:783
-#: ../../Zotlabs/Module/Settings/Tokens.php:161
-msgid "My Settings"
-msgstr "Mis ajustes"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Stats"
+msgstr "Estadísticas"
-#: ../../Zotlabs/Module/Connedit.php:785
-#: ../../Zotlabs/Module/Settings/Tokens.php:165
-msgid "Individual Permissions"
-msgstr "Permisos individuales"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Software"
+msgstr "Software"
-#: ../../Zotlabs/Module/Connedit.php:786
-#: ../../Zotlabs/Module/Settings/Tokens.php:166
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can <strong>not</strong> change those"
-" settings here."
-msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. <strong>No</strong> puede cambiar estos ajustes aquí."
+#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
+#: ../../include/conversation.php:940
+msgid "Ratings"
+msgstr "Valoraciones"
-#: ../../Zotlabs/Module/Connedit.php:787
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can change those settings here but "
-"they wont have any impact unless the inherited setting changes."
-msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados."
+#: ../../Zotlabs/Module/Pubsites.php:48
+msgid "Rate"
+msgstr "Valorar"
-#: ../../Zotlabs/Module/Connedit.php:788
-msgid "Last update:"
-msgstr "Última actualización:"
+#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166
+#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Webpages.php:246
+#: ../../Zotlabs/Module/Wiki.php:146 ../../Zotlabs/Module/Events.php:685
+#: ../../include/page_widgets.php:42
+msgid "View"
+msgstr "Ver"
-#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
#: ../../Zotlabs/Module/Editlayout.php:79
#: ../../Zotlabs/Module/Editwebpage.php:80
+#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
#: ../../Zotlabs/Module/Editpost.php:24
msgid "Item not found"
msgstr "Elemento no encontrado"
-#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
-#: ../../Zotlabs/Module/Blocks.php:155
-msgid "Block Name"
-msgstr "Nombre del bloque"
-
-#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1260
-msgid "Title (optional)"
-msgstr "Título (opcional)"
-
-#: ../../Zotlabs/Module/Editblock.php:133
-msgid "Edit Block"
-msgstr "Modificar este bloque"
-
#: ../../Zotlabs/Module/Editlayout.php:127
#: ../../Zotlabs/Module/Layouts.php:128 ../../Zotlabs/Module/Layouts.php:188
msgid "Layout Name"
@@ -2495,10 +2888,67 @@ msgstr "Modificar la plantilla"
msgid "Page link"
msgstr "Enlace de la página"
+#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:286
+#: ../../Zotlabs/Module/Mail.php:411 ../../Zotlabs/Module/Editblock.php:111
+#: ../../Zotlabs/Module/Chat.php:207 ../../include/conversation.php:1147
+msgid "Insert web link"
+msgstr "Insertar enlace web"
+
#: ../../Zotlabs/Module/Editwebpage.php:169
msgid "Edit Webpage"
msgstr "Editar la página web"
+#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:224
+#: ../../include/nav.php:95 ../../include/conversation.php:1674
+msgid "Photos"
+msgstr "Fotos"
+
+#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Wiki.php:20
+#: ../../Zotlabs/Module/Chat.php:25
+#: ../../extend/addon/addon/chess/chess.php:400
+msgid "You must be logged in to see this page."
+msgstr "Debe haber iniciado sesión para poder ver esta página."
+
+#: ../../Zotlabs/Module/Channel.php:44
+msgid "Posts and comments"
+msgstr "Publicaciones y comentarios"
+
+#: ../../Zotlabs/Module/Channel.php:45
+msgid "Only posts"
+msgstr "Solo publicaciones"
+
+#: ../../Zotlabs/Module/Channel.php:104
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Permisos insuficientes. Petición redirigida a la página del perfil."
+
+#: ../../Zotlabs/Module/Network.php:96
+msgid "No such group"
+msgstr "No se encuentra el grupo"
+
+#: ../../Zotlabs/Module/Network.php:136
+msgid "No such channel"
+msgstr "No se encuentra el canal"
+
+#: ../../Zotlabs/Module/Network.php:141
+msgid "forum"
+msgstr "foro"
+
+#: ../../Zotlabs/Module/Network.php:153
+msgid "Search Results For:"
+msgstr "Buscar resultados para:"
+
+#: ../../Zotlabs/Module/Network.php:221
+msgid "Privacy group is empty"
+msgstr "El grupo de canales está vacío"
+
+#: ../../Zotlabs/Module/Network.php:230
+msgid "Privacy group: "
+msgstr "Grupo de canales: "
+
+#: ../../Zotlabs/Module/Network.php:256
+msgid "Invalid connection."
+msgstr "Conexión no válida."
+
#: ../../Zotlabs/Module/Menu.php:49
msgid "Unable to update menu."
msgstr "No se puede actualizar el menú."
@@ -2535,14 +2985,10 @@ msgstr "El menú se puede usar para guardar marcadores"
msgid "Submit and proceed"
msgstr "Enviar y proceder"
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2309
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2271
msgid "Menus"
msgstr "Menús"
-#: ../../Zotlabs/Module/Menu.php:113 ../../Zotlabs/Module/Locs.php:120
-msgid "Drop"
-msgstr "Eliminar"
-
#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Blocks.php:157
#: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Webpages.php:251
#: ../../include/page_widgets.php:47
@@ -2620,137 +3066,99 @@ msgstr "Aplicación instalada."
msgid "Malformed app."
msgstr "Aplicación con errores"
-#: ../../Zotlabs/Module/Appman.php:104
+#: ../../Zotlabs/Module/Appman.php:105
msgid "Embed code"
msgstr "Código incorporado"
-#: ../../Zotlabs/Module/Appman.php:110 ../../include/widgets.php:107
+#: ../../Zotlabs/Module/Appman.php:111 ../../include/widgets.php:107
msgid "Edit App"
msgstr "Modificar la aplicación"
-#: ../../Zotlabs/Module/Appman.php:110
+#: ../../Zotlabs/Module/Appman.php:111
msgid "Create App"
msgstr "Crear una aplicación"
-#: ../../Zotlabs/Module/Appman.php:115
+#: ../../Zotlabs/Module/Appman.php:116
msgid "Name of app"
msgstr "Nombre de la aplicación"
-#: ../../Zotlabs/Module/Appman.php:115 ../../Zotlabs/Module/Appman.php:116
-#: ../../Zotlabs/Module/Profiles.php:709 ../../Zotlabs/Module/Profiles.php:713
-#: ../../Zotlabs/Module/Events.php:452 ../../Zotlabs/Module/Events.php:457
-#: ../../include/datetime.php:257
+#: ../../Zotlabs/Module/Appman.php:116 ../../Zotlabs/Module/Appman.php:117
+#: ../../Zotlabs/Module/Profiles.php:703 ../../Zotlabs/Module/Profiles.php:707
+#: ../../Zotlabs/Module/Events.php:453 ../../Zotlabs/Module/Events.php:458
+#: ../../include/datetime.php:259
msgid "Required"
msgstr "Obligatorio"
-#: ../../Zotlabs/Module/Appman.php:116
+#: ../../Zotlabs/Module/Appman.php:117
msgid "Location (URL) of app"
msgstr "Dirección (URL) de la aplicación"
-#: ../../Zotlabs/Module/Appman.php:117 ../../Zotlabs/Module/Rbmark.php:101
-#: ../../Zotlabs/Module/Events.php:465
+#: ../../Zotlabs/Module/Appman.php:118 ../../Zotlabs/Module/Rbmark.php:101
+#: ../../Zotlabs/Module/Events.php:466
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:165
msgid "Description"
msgstr "Descripción"
-#: ../../Zotlabs/Module/Appman.php:118
+#: ../../Zotlabs/Module/Appman.php:119
msgid "Photo icon URL"
msgstr "Dirección del icono"
-#: ../../Zotlabs/Module/Appman.php:118
+#: ../../Zotlabs/Module/Appman.php:119
msgid "80 x 80 pixels - optional"
msgstr "80 x 80 pixels - opcional"
-#: ../../Zotlabs/Module/Appman.php:119
+#: ../../Zotlabs/Module/Appman.php:120
msgid "Categories (optional, comma separated list)"
msgstr "Temas (opcional, lista separada por comas)"
-#: ../../Zotlabs/Module/Appman.php:120
+#: ../../Zotlabs/Module/Appman.php:121
msgid "Version ID"
msgstr "Versión"
-#: ../../Zotlabs/Module/Appman.php:121
+#: ../../Zotlabs/Module/Appman.php:122
msgid "Price of app"
msgstr "Precio de la aplicación"
-#: ../../Zotlabs/Module/Appman.php:122
+#: ../../Zotlabs/Module/Appman.php:123
msgid "Location (URL) to purchase app"
msgstr "Dirección (URL) donde adquirir la aplicación"
-#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1392
-msgid "Public Hubs"
-msgstr "Servidores públicos"
-
-#: ../../Zotlabs/Module/Pubsites.php:27
-msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
-msgstr "Los sitios listados permiten el registro público en la red $Projectname. Todos los sitios de la red están vinculados entre sí, por lo que sus miembros, en ninguno de ellos, indican la pertenencia a la red en su conjunto. Algunos sitios pueden requerir suscripción o proporcionar planes de servicio por niveles. Los mismos hubs <strong>pueden</strong> proporcionar detalles adicionales."
-
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Hub URL"
-msgstr "Dirección del hub"
-
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Access Type"
-msgstr "Tipo de acceso"
-
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Registration Policy"
-msgstr "Normas de registro"
-
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Stats"
-msgstr "Estadísticas"
-
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Software"
-msgstr "Software"
-
-#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
-#: ../../include/conversation.php:958
-msgid "Ratings"
-msgstr "Valoraciones"
+#: ../../Zotlabs/Module/Rpost.php:138 ../../Zotlabs/Module/Editpost.php:107
+msgid "Edit post"
+msgstr "Editar la entrada"
-#: ../../Zotlabs/Module/Pubsites.php:48
-msgid "Rate"
-msgstr "Valorar"
+#: ../../Zotlabs/Module/Help.php:23
+msgid "Documentation Search"
+msgstr "Búsqueda de Documentación"
-#: ../../Zotlabs/Module/Pubsites.php:51 ../../Zotlabs/Module/Locs.php:117
-#: ../../Zotlabs/Module/Profiles.php:477 ../../Zotlabs/Module/Profiles.php:698
-#: ../../Zotlabs/Module/Events.php:467 ../../include/js_strings.php:25
-msgid "Location"
-msgstr "Ubicación"
+#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1665
+msgid "About"
+msgstr "Mi perfil"
-#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166
-#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Webpages.php:246
-#: ../../Zotlabs/Module/Events.php:680 ../../include/page_widgets.php:42
-msgid "View"
-msgstr "Ver"
+#: ../../Zotlabs/Module/Help.php:81 ../../Zotlabs/Module/Group.php:197
+msgid "Members"
+msgstr "Miembros"
-#: ../../Zotlabs/Module/Attach.php:13
-msgid "Item not available."
-msgstr "Elemento no disponible"
+#: ../../Zotlabs/Module/Help.php:82
+msgid "Administrators"
+msgstr "Administradores"
-#: ../../Zotlabs/Module/Api.php:60 ../../Zotlabs/Module/Api.php:81
-msgid "Authorize application connection"
-msgstr "Autorizar una conexión de aplicación"
+#: ../../Zotlabs/Module/Help.php:83
+msgid "Developers"
+msgstr "Desarrolladores"
-#: ../../Zotlabs/Module/Api.php:61
-msgid "Return to your app and insert this Security Code:"
-msgstr "Volver a su aplicación e introducir este código de seguridad:"
+#: ../../Zotlabs/Module/Help.php:84
+msgid "Tutorials"
+msgstr "Tutoriales"
-#: ../../Zotlabs/Module/Api.php:71
-msgid "Please login to continue."
-msgstr "Por favor inicie sesión para continuar."
+#: ../../Zotlabs/Module/Help.php:93
+msgid "$Projectname Documentation"
+msgstr "Documentación de $Projectname"
-#: ../../Zotlabs/Module/Api.php:83
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "¿Desea autorizar a esta aplicación a acceder a sus publicaciones y contactos, y/o crear nuevas publicaciones por usted?"
+#: ../../Zotlabs/Module/Help.php:94
+msgid "Contents"
+msgstr "Contenidos"
#: ../../Zotlabs/Module/Ffsapi.php:12
msgid "Share content from Firefox to $Projectname"
@@ -2760,32 +3168,12 @@ msgstr "Compartir contenido desde Firefox a $Projectname"
msgid "Activate the Firefox $Projectname provider"
msgstr "Servicio de compartición de Firefox: activar el proveedor $Projectname "
-#: ../../Zotlabs/Module/Pdledit.php:21
-msgid "Layout updated."
-msgstr "Plantilla actualizada."
-
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:218
-msgid "Feature disabled."
-msgstr "Funcionalidad deshabilitada."
-
-#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
-msgid "Edit System Page Description"
-msgstr "Editor del Sistema de Descripción de Páginas"
-
-#: ../../Zotlabs/Module/Pdledit.php:64
-msgid "Layout not found."
-msgstr "Plantilla no encontrada"
-
-#: ../../Zotlabs/Module/Pdledit.php:70
-msgid "Module Name:"
-msgstr "Nombre del módulo:"
-
-#: ../../Zotlabs/Module/Pdledit.php:71
-msgid "Layout Help"
-msgstr "Ayuda para el diseño de plantillas de página"
+#: ../../Zotlabs/Module/Apps.php:46 ../../include/nav.php:166
+#: ../../include/widgets.php:102
+msgid "Apps"
+msgstr "Aplicaciones (apps)"
#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
-#: ../../Zotlabs/Module/Siteinfo.php:48
msgid "$Projectname"
msgstr "$Projectname"
@@ -2794,14 +3182,6 @@ msgstr "$Projectname"
msgid "Welcome to %s"
msgstr "Bienvenido a %s"
-#: ../../Zotlabs/Module/Lockview.php:75
-msgid "Remote privacy information not available."
-msgstr "La información privada remota no está disponible."
-
-#: ../../Zotlabs/Module/Lockview.php:96
-msgid "Visible to:"
-msgstr "Visible para:"
-
#: ../../Zotlabs/Module/Filestorage.php:87
msgid "Permission Denied."
msgstr "Permiso denegado"
@@ -2817,7 +3197,7 @@ msgstr "Modificar los permisos del fichero"
#: ../../Zotlabs/Module/Filestorage.php:152
#: ../../Zotlabs/Module/Photos.php:658 ../../Zotlabs/Module/Photos.php:1047
#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
-#: ../../Zotlabs/Module/Chat.php:234 ../../include/acl_selectors.php:179
+#: ../../Zotlabs/Module/Chat.php:234 ../../include/acl_selectors.php:208
msgid "Permissions"
msgstr "Permisos"
@@ -2853,230 +3233,287 @@ msgstr "Mostrar la dirección de este fichero"
msgid "Notify your contacts about this file"
msgstr "Avisar a sus contactos sobre este fichero"
-#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
-msgid "Continue"
-msgstr "Continuar"
+#: ../../Zotlabs/Module/Directory.php:64 ../../Zotlabs/Module/Display.php:17
+#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Photos.php:509
+#: ../../Zotlabs/Module/Search.php:17
+#: ../../Zotlabs/Module/Viewconnections.php:23
+#: ../../extend/addon/addon/friendica/dfrn_request.php:794
+msgid "Public access denied."
+msgstr "Acceso público denegado."
-#: ../../Zotlabs/Module/Connect.php:90
-msgid "Premium Channel Setup"
-msgstr "Configuración del canal premium"
+#: ../../Zotlabs/Module/Directory.php:245
+#, php-format
+msgid "%d rating"
+msgid_plural "%d ratings"
+msgstr[0] "%d valoración"
+msgstr[1] "%d valoraciones"
-#: ../../Zotlabs/Module/Connect.php:92
-msgid "Enable premium channel connection restrictions"
-msgstr "Habilitar restricciones de conexión del canal premium"
+#: ../../Zotlabs/Module/Directory.php:256
+msgid "Gender: "
+msgstr "Género:"
-#: ../../Zotlabs/Module/Connect.php:93
-msgid ""
-"Please enter your restrictions or conditions, such as paypal receipt, usage "
-"guidelines, etc."
-msgstr "Por favor introduzca sus restricciones o condiciones, como recibo de paypal, normas de uso, etc."
+#: ../../Zotlabs/Module/Directory.php:258
+msgid "Status: "
+msgstr "Estado:"
-#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
-msgid ""
-"This channel may require additional steps or acknowledgement of the "
-"following conditions prior to connecting:"
-msgstr "Este canal puede requerir antes de conectar unos pasos adicionales o el conocimiento de las siguientes condiciones:"
+#: ../../Zotlabs/Module/Directory.php:260
+msgid "Homepage: "
+msgstr "Página personal:"
-#: ../../Zotlabs/Module/Connect.php:96
-msgid ""
-"Potential connections will then see the following text before proceeding:"
-msgstr "Las posibles conexiones verán, por tanto, el siguiente texto antes de proceder:"
+#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1215
+msgid "Age:"
+msgstr "Edad:"
-#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
-msgid ""
-"By continuing, I certify that I have complied with any instructions provided"
-" on this page."
-msgstr "Al continuar, certifico que he cumplido con todas las instrucciones proporcionadas en esta página."
+#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1051
+#: ../../include/bb2diaspora.php:521 ../../include/event.php:52
+#: ../../include/event.php:84
+msgid "Location:"
+msgstr "Ubicación:"
-#: ../../Zotlabs/Module/Connect.php:106
-msgid "(No specific instructions have been provided by the channel owner.)"
-msgstr "(No ha sido proporcionada ninguna instrucción específica por el propietario del canal.)"
+#: ../../Zotlabs/Module/Directory.php:320
+msgid "Description:"
+msgstr "Descripción:"
-#: ../../Zotlabs/Module/Connect.php:114
-msgid "Restricted or Premium Channel"
-msgstr "Canal premium o restringido"
+#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1231
+msgid "Hometown:"
+msgstr "Lugar de nacimiento:"
-#: ../../Zotlabs/Module/Manage.php:136
-#: ../../Zotlabs/Module/New_channel.php:121
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
-msgstr "Ha creado %1$.0f de %2$.0f canales permitidos."
+#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1239
+msgid "About:"
+msgstr "Sobre mí:"
-#: ../../Zotlabs/Module/Manage.php:143
-msgid "Create a new channel"
-msgstr "Crear un nuevo canal"
+#: ../../Zotlabs/Module/Directory.php:329
+msgid "Public Forum:"
+msgstr "Foro público:"
-#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:778
-#: ../../Zotlabs/Module/Chat.php:255
-msgid "Create New"
-msgstr "Crear"
+#: ../../Zotlabs/Module/Directory.php:332
+msgid "Keywords: "
+msgstr "Palabras clave:"
-#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:214
-#: ../../include/nav.php:211
-msgid "Channel Manager"
-msgstr "Administración de canales"
+#: ../../Zotlabs/Module/Directory.php:335
+msgid "Don't suggest"
+msgstr "No sugerir:"
-#: ../../Zotlabs/Module/Manage.php:165
-msgid "Current Channel"
-msgstr "Canal actual"
+#: ../../Zotlabs/Module/Directory.php:337
+msgid "Common connections:"
+msgstr "Conexiones comunes:"
-#: ../../Zotlabs/Module/Manage.php:167
-msgid "Switch to one of your channels by selecting it."
-msgstr "Cambiar a uno de sus canales seleccionándolo."
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Global Directory"
+msgstr "Directorio global:"
-#: ../../Zotlabs/Module/Manage.php:168
-msgid "Default Channel"
-msgstr "Canal principal"
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Local Directory"
+msgstr "Directorio local:"
-#: ../../Zotlabs/Module/Manage.php:169
-msgid "Make Default"
-msgstr "Convertir en predeterminado"
+#: ../../Zotlabs/Module/Directory.php:392
+msgid "Finding:"
+msgstr "Encontrar:"
-#: ../../Zotlabs/Module/Manage.php:172
+#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:64
+#: ../../include/contact_widgets.php:24
+msgid "Channel Suggestions"
+msgstr "Sugerencias de canales"
+
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "next page"
+msgstr "siguiente página"
+
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "previous page"
+msgstr "página anterior"
+
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "Sort options"
+msgstr "Ordenar opciones"
+
+#: ../../Zotlabs/Module/Directory.php:399
+msgid "Alphabetic"
+msgstr "Alfabético"
+
+#: ../../Zotlabs/Module/Directory.php:400
+msgid "Reverse Alphabetic"
+msgstr "Alfabético inverso"
+
+#: ../../Zotlabs/Module/Directory.php:401
+msgid "Newest to Oldest"
+msgstr "De más nuevo a más antiguo"
+
+#: ../../Zotlabs/Module/Directory.php:402
+msgid "Oldest to Newest"
+msgstr "De más antiguo a más nuevo"
+
+#: ../../Zotlabs/Module/Directory.php:419
+msgid "No entries (some entries may be hidden)."
+msgstr "Sin entradas (algunas entradas pueden estar ocultas)."
+
+#: ../../Zotlabs/Module/Item.php:184
+msgid "Unable to locate original post."
+msgstr "No ha sido posible encontrar la entrada original."
+
+#: ../../Zotlabs/Module/Item.php:447
+msgid "Empty post discarded."
+msgstr "La entrada vacía ha sido desechada."
+
+#: ../../Zotlabs/Module/Item.php:489
+msgid "Executable content type not permitted to this channel."
+msgstr "Contenido de tipo ejecutable no permitido en este canal."
+
+#: ../../Zotlabs/Module/Item.php:837
+msgid "Duplicate post suppressed."
+msgstr "Se ha suprimido la entrada duplicada."
+
+#: ../../Zotlabs/Module/Item.php:979
+msgid "System error. Post not saved."
+msgstr "Error del sistema. La entrada no se ha podido salvar."
+
+#: ../../Zotlabs/Module/Item.php:1111
+msgid "Unable to obtain post information from database."
+msgstr "No ha sido posible obtener información de la entrada en la base de datos."
+
+#: ../../Zotlabs/Module/Item.php:1118
#, php-format
-msgid "%d new messages"
-msgstr "%d mensajes nuevos"
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Ha alcanzado su límite de %1$.0f entradas en la página principal."
-#: ../../Zotlabs/Module/Manage.php:173
+#: ../../Zotlabs/Module/Item.php:1125
#, php-format
-msgid "%d new introductions"
-msgstr "%d nuevas isolicitudes de conexión"
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Ha alcanzado su límite de %1$.0f páginas web."
-#: ../../Zotlabs/Module/Manage.php:175
-msgid "Delegated Channel"
-msgstr "Canal delegado"
+#: ../../Zotlabs/Module/Chanview.php:134
+msgid "toggle full screen mode"
+msgstr "cambiar al modo de pantalla completa"
-#: ../../Zotlabs/Module/Group.php:24
-msgid "Privacy group created."
-msgstr "El grupo de canales ha sido creado."
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
+msgstr "Canal añadido."
-#: ../../Zotlabs/Module/Group.php:30
-msgid "Could not create privacy group."
-msgstr "No se puede crear el grupo de canales"
+#: ../../Zotlabs/Module/Mail.php:66
+msgid "Unable to lookup recipient."
+msgstr "No se puede asociar a un destinatario."
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3960
-msgid "Privacy group not found."
-msgstr "Grupo de canales no encontrado."
+#: ../../Zotlabs/Module/Mail.php:73
+msgid "Unable to communicate with requested channel."
+msgstr "No se puede establecer la comunicación con el canal solicitado."
-#: ../../Zotlabs/Module/Group.php:58
-msgid "Privacy group updated."
-msgstr "Grupo de canales actualizado."
+#: ../../Zotlabs/Module/Mail.php:80
+msgid "Cannot verify requested channel."
+msgstr "No se puede verificar el canal solicitado."
-#: ../../Zotlabs/Module/Group.php:90
-msgid "Create a group of channels."
-msgstr "Crear un grupo de canales."
+#: ../../Zotlabs/Module/Mail.php:98
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló."
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
-msgid "Privacy group name: "
-msgstr "Nombre del grupo de canales:"
+#: ../../Zotlabs/Module/Mail.php:177
+msgid "Messages"
+msgstr "Mensajes"
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
-msgid "Members are visible to other channels"
-msgstr "Los miembros son visibles para otros canales"
+#: ../../Zotlabs/Module/Mail.php:212
+msgid "Message recalled."
+msgstr "Mensaje revocado."
-#: ../../Zotlabs/Module/Group.php:111
-msgid "Privacy group removed."
-msgstr "Grupo de canales eliminado."
+#: ../../Zotlabs/Module/Mail.php:225
+msgid "Conversation removed."
+msgstr "Conversación eliminada."
-#: ../../Zotlabs/Module/Group.php:113
-msgid "Unable to remove privacy group."
-msgstr "No se puede eliminar el grupo de canales."
+#: ../../Zotlabs/Module/Mail.php:239 ../../Zotlabs/Module/Mail.php:348
+#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1182
+msgid "Please enter a link URL:"
+msgstr "Por favor, introduzca la dirección del enlace:"
-#: ../../Zotlabs/Module/Group.php:183
-msgid "Privacy group editor"
-msgstr "Editor de grupos de canales"
+#: ../../Zotlabs/Module/Mail.php:240 ../../Zotlabs/Module/Mail.php:349
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Caduca YYYY-MM-DD HH:MM"
-#: ../../Zotlabs/Module/Group.php:197
-msgid "Members"
-msgstr "Miembros"
+#: ../../Zotlabs/Module/Mail.php:268
+msgid "Requested channel is not in this network"
+msgstr "El canal solicitado no existe en esta red"
-#: ../../Zotlabs/Module/Group.php:199
-msgid "All Connected Channels"
-msgstr "Todos los canales conectados"
+#: ../../Zotlabs/Module/Mail.php:276
+msgid "Send Private Message"
+msgstr "Enviar un mensaje privado"
-#: ../../Zotlabs/Module/Group.php:231
-msgid "Click on a channel to add or remove."
-msgstr "Haga clic en un canal para agregarlo o quitarlo."
+#: ../../Zotlabs/Module/Mail.php:277 ../../Zotlabs/Module/Mail.php:402
+msgid "To:"
+msgstr "Para:"
-#: ../../Zotlabs/Module/Dreport.php:44
-msgid "Invalid message"
-msgstr "Mensaje no válido"
+#: ../../Zotlabs/Module/Mail.php:280 ../../Zotlabs/Module/Mail.php:404
+msgid "Subject:"
+msgstr "Asunto:"
-#: ../../Zotlabs/Module/Dreport.php:76
-msgid "no results"
-msgstr "sin resultados"
+#: ../../Zotlabs/Module/Mail.php:283 ../../Zotlabs/Module/Invite.php:138
+msgid "Your message:"
+msgstr "Su mensaje:"
-#: ../../Zotlabs/Module/Dreport.php:91
-msgid "channel sync processed"
-msgstr "se ha realizado la sincronización del canal"
+#: ../../Zotlabs/Module/Mail.php:285 ../../Zotlabs/Module/Mail.php:410
+#: ../../include/conversation.php:1242
+msgid "Attach file"
+msgstr "Adjuntar fichero"
-#: ../../Zotlabs/Module/Dreport.php:95
-msgid "queued"
-msgstr "encolado"
+#: ../../Zotlabs/Module/Mail.php:287
+msgid "Send"
+msgstr "Enviar"
-#: ../../Zotlabs/Module/Dreport.php:99
-msgid "posted"
-msgstr "enviado"
+#: ../../Zotlabs/Module/Mail.php:290 ../../Zotlabs/Module/Mail.php:415
+#: ../../include/conversation.php:1287
+msgid "Set expiration date"
+msgstr "Configurar fecha de caducidad"
-#: ../../Zotlabs/Module/Dreport.php:103
-msgid "accepted for delivery"
-msgstr "aceptado para el envío"
+#: ../../Zotlabs/Module/Mail.php:292 ../../Zotlabs/Module/Mail.php:417
+#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:741
+#: ../../include/conversation.php:1292
+msgid "Encrypt text"
+msgstr "Cifrar texto"
-#: ../../Zotlabs/Module/Dreport.php:107
-msgid "updated"
-msgstr "actualizado"
+#: ../../Zotlabs/Module/Mail.php:374
+msgid "Delete message"
+msgstr "Borrar mensaje"
-#: ../../Zotlabs/Module/Dreport.php:110
-msgid "update ignored"
-msgstr "actualización ignorada"
+#: ../../Zotlabs/Module/Mail.php:375
+msgid "Delivery report"
+msgstr "Informe de transmisión"
-#: ../../Zotlabs/Module/Dreport.php:113
-msgid "permission denied"
-msgstr "permiso denegado"
+#: ../../Zotlabs/Module/Mail.php:376
+msgid "Recall message"
+msgstr "Revocar el mensaje"
-#: ../../Zotlabs/Module/Dreport.php:117
-msgid "recipient not found"
-msgstr "destinatario no encontrado"
+#: ../../Zotlabs/Module/Mail.php:378
+msgid "Message has been recalled."
+msgstr "El mensaje ha sido revocado."
-#: ../../Zotlabs/Module/Dreport.php:120
-msgid "mail recalled"
-msgstr "mensaje de correo revocado"
+#: ../../Zotlabs/Module/Mail.php:395
+msgid "Delete Conversation"
+msgstr "Eliminar conversación"
-#: ../../Zotlabs/Module/Dreport.php:123
-msgid "duplicate mail received"
-msgstr "se ha recibido mensaje duplicado"
+#: ../../Zotlabs/Module/Mail.php:397
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Comunicación segura no disponible. Pero <strong>puede</strong> responder desde la página del perfil del remitente."
-#: ../../Zotlabs/Module/Dreport.php:126
-msgid "mail delivered"
-msgstr "correo enviado"
+#: ../../Zotlabs/Module/Mail.php:401
+msgid "Send Reply"
+msgstr "Responder"
-#: ../../Zotlabs/Module/Dreport.php:146
+#: ../../Zotlabs/Module/Mail.php:406
#, php-format
-msgid "Delivery report for %1$s"
-msgstr "Informe de entrega para %1$s"
-
-#: ../../Zotlabs/Module/Dreport.php:149
-msgid "Options"
-msgstr "Opciones"
-
-#: ../../Zotlabs/Module/Dreport.php:150
-msgid "Redeliver"
-msgstr "Volver a enviar"
+msgid "Your message for %s (%s):"
+msgstr "Su mensaje para %s (%s):"
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:192
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
msgid "webpage"
msgstr "página web"
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:198
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
msgid "block"
msgstr "bloque"
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:195
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
msgid "layout"
msgstr "plantilla"
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:201
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
msgid "menu"
msgstr "menú"
@@ -3090,6 +3527,26 @@ msgstr "%s elemento instalado"
msgid "%s element installation failed"
msgstr "Elemento con instalación fallida: %s"
+#: ../../Zotlabs/Module/Import_items.php:42 ../../Zotlabs/Module/Import.php:71
+msgid "Nothing to import."
+msgstr "No hay nada para importar."
+
+#: ../../Zotlabs/Module/Import_items.php:66 ../../Zotlabs/Module/Import.php:83
+#: ../../Zotlabs/Module/Import.php:98
+msgid "Unable to download data from old server"
+msgstr "No se han podido descargar datos de su antiguo servidor"
+
+#: ../../Zotlabs/Module/Import_items.php:72
+#: ../../Zotlabs/Module/Import.php:105
+msgid "Imported file is empty."
+msgstr "El fichero importado está vacío."
+
+#: ../../Zotlabs/Module/Import_items.php:88
+#: ../../Zotlabs/Module/Import.php:127
+#, php-format
+msgid "Warning: Database versions differ by %1$d updates."
+msgstr "Atención: Las versiones de la base de datos difieren en %1$d actualizaciones."
+
#: ../../Zotlabs/Module/Import_items.php:104
msgid "Import completed"
msgstr "Importación completada"
@@ -3103,6 +3560,11 @@ msgid ""
"Use this form to import existing posts and content from an export file."
msgstr "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación."
+#: ../../Zotlabs/Module/Import_items.php:121
+#: ../../Zotlabs/Module/Import.php:532
+msgid "File to Upload"
+msgstr "Fichero para subir"
+
#: ../../Zotlabs/Module/Invite.php:29
msgid "Total invitation limit exceeded."
msgstr "Se ha superado el límite máximo de invitaciones."
@@ -3112,522 +3574,167 @@ msgstr "Se ha superado el límite máximo de invitaciones."
msgid "%s : Not a valid email address."
msgstr "%s : No es una dirección de correo electrónico válida. "
-#: ../../Zotlabs/Module/Invite.php:63
+#: ../../Zotlabs/Module/Invite.php:67
msgid "Please join us on $Projectname"
msgstr "Únase a nosotros en $Projectname"
-#: ../../Zotlabs/Module/Invite.php:74
+#: ../../Zotlabs/Module/Invite.php:77
msgid "Invitation limit exceeded. Please contact your site administrator."
msgstr "Excedido el límite de invitaciones. Por favor, contacte con el Administrador de su sitio."
-#: ../../Zotlabs/Module/Invite.php:79
+#: ../../Zotlabs/Module/Invite.php:82
#, php-format
msgid "%s : Message delivery failed."
msgstr "%s : Falló el envío del mensaje."
-#: ../../Zotlabs/Module/Invite.php:83
+#: ../../Zotlabs/Module/Invite.php:86
#, php-format
msgid "%d message sent."
msgid_plural "%d messages sent."
msgstr[0] "%d mensajes enviados."
msgstr[1] "%d mensajes enviados."
-#: ../../Zotlabs/Module/Invite.php:102
+#: ../../Zotlabs/Module/Invite.php:105
msgid "You have no more invitations available"
msgstr "No tiene más invitaciones disponibles"
-#: ../../Zotlabs/Module/Invite.php:133
+#: ../../Zotlabs/Module/Invite.php:136
msgid "Send invitations"
msgstr "Enviar invitaciones"
-#: ../../Zotlabs/Module/Invite.php:134
+#: ../../Zotlabs/Module/Invite.php:137
msgid "Enter email addresses, one per line:"
msgstr "Introduzca las direcciones de correo electrónico, una por línea:"
-#: ../../Zotlabs/Module/Invite.php:136
+#: ../../Zotlabs/Module/Invite.php:139
msgid "Please join my community on $Projectname."
msgstr "Por favor, únase a mi comunidad en $Projectname."
-#: ../../Zotlabs/Module/Invite.php:138
+#: ../../Zotlabs/Module/Invite.php:141
msgid "You will need to supply this invitation code:"
msgstr "Tendrá que suministrar este código de invitación:"
-#: ../../Zotlabs/Module/Invite.php:139
+#: ../../Zotlabs/Module/Invite.php:142
msgid ""
"1. Register at any $Projectname location (they are all inter-connected)"
msgstr "1. Regístrese en cualquier sitio de $Projectname (están todos interconectados)"
-#: ../../Zotlabs/Module/Invite.php:141
+#: ../../Zotlabs/Module/Invite.php:144
msgid "2. Enter my $Projectname network address into the site searchbar."
msgstr "2. Introduzca mi dirección $Projectname en la caja de búsqueda del sitio."
-#: ../../Zotlabs/Module/Invite.php:142
+#: ../../Zotlabs/Module/Invite.php:145
msgid "or visit"
msgstr "o visitar"
-#: ../../Zotlabs/Module/Invite.php:144
+#: ../../Zotlabs/Module/Invite.php:147
msgid "3. Click [Connect]"
msgstr "3. Pulse [conectar]"
-#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
-msgid "Location not found."
-msgstr "Dirección no encontrada."
-
-#: ../../Zotlabs/Module/Locs.php:62
-msgid "Location lookup failed."
-msgstr "Ha fallado la búsqueda de la dirección."
-
-#: ../../Zotlabs/Module/Locs.php:66
-msgid ""
-"Please select another location to become primary before removing the primary"
-" location."
-msgstr "Por favor, seleccione una copia de su canal (un clon) para convertirlo en primario antes de eliminar su canal principal."
-
-#: ../../Zotlabs/Module/Locs.php:95
-msgid "Syncing locations"
-msgstr "Sincronizando ubicaciones"
-
-#: ../../Zotlabs/Module/Locs.php:105
-msgid "No locations found."
-msgstr "No encontrada ninguna dirección."
-
-#: ../../Zotlabs/Module/Locs.php:116
-msgid "Manage Channel Locations"
-msgstr "Gestionar las direcciones del canal"
-
-#: ../../Zotlabs/Module/Locs.php:119
-msgid "Primary"
-msgstr "Primario"
-
-#: ../../Zotlabs/Module/Locs.php:122
-msgid "Sync Now"
-msgstr "Sincronizar ahora"
-
-#: ../../Zotlabs/Module/Locs.php:123
-msgid "Please wait several minutes between consecutive operations."
-msgstr "Por favor, espere algunos minutos entre operaciones consecutivas."
-
-#: ../../Zotlabs/Module/Locs.php:124
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing"
-" your channel."
-msgstr "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal."
-
-#: ../../Zotlabs/Module/Locs.php:125
-msgid "Use this form to drop the location if the hub is no longer operating."
-msgstr "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo."
-
-#: ../../Zotlabs/Module/Rate.php:156
-msgid "Website:"
-msgstr "Sitio web:"
-
-#: ../../Zotlabs/Module/Rate.php:159
-#, php-format
-msgid "Remote Channel [%s] (not yet known on this site)"
-msgstr "Canal remoto [%s] (aún no es conocido en este sitio)"
-
-#: ../../Zotlabs/Module/Rate.php:160
-msgid "Rating (this information is public)"
-msgstr "Valoración (esta información es pública)"
-
-#: ../../Zotlabs/Module/Rate.php:161
-msgid "Optionally explain your rating (this information is public)"
-msgstr "Opcionalmente puede explicar su valoración (esta información es pública)"
-
-#: ../../Zotlabs/Module/Like.php:19
-msgid "Like/Dislike"
-msgstr "Me gusta/No me gusta"
-
-#: ../../Zotlabs/Module/Like.php:24
-msgid "This action is restricted to members."
-msgstr "Esta acción está restringida solo para miembros."
-
-#: ../../Zotlabs/Module/Like.php:25
-msgid ""
-"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
-"href=\"register\">register as a new $Projectname member</a> to continue."
-msgstr "Por favor, <a href=\"rmagic\">identifíquese con su $Projectname ID</a> o <a href=\"register\">rregístrese como un nuevo $Projectname member</a> para continuar."
-
-#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
-#: ../../Zotlabs/Module/Like.php:169
-msgid "Invalid request."
-msgstr "Solicitud incorrecta."
-
-#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
-msgid "channel"
-msgstr "el canal"
-
-#: ../../Zotlabs/Module/Like.php:146
-msgid "thing"
-msgstr "elemento"
-
-#: ../../Zotlabs/Module/Like.php:192
-msgid "Channel unavailable."
-msgstr "Canal no disponible."
-
-#: ../../Zotlabs/Module/Like.php:240
-msgid "Previous action reversed."
-msgstr "Acción anterior revocada."
-
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../Zotlabs/Module/Tagger.php:47 ../../include/text.php:1991
-#: ../../include/conversation.php:120
-msgid "photo"
-msgstr "foto"
-
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../include/text.php:1997 ../../include/conversation.php:148
-msgid "status"
-msgstr "el mensaje de estado"
-
-#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Events.php:253
-#: ../../Zotlabs/Module/Tagger.php:51 ../../include/text.php:1994
-#: ../../include/conversation.php:123 ../../include/event.php:961
-msgid "event"
-msgstr "evento"
-
-#: ../../Zotlabs/Module/Like.php:419 ../../include/conversation.php:164
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "A %1$s le gusta %3$s de %2$s"
-
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "A %1$s no le gusta %3$s de %2$s"
-
-#: ../../Zotlabs/Module/Like.php:423
-#, php-format
-msgid "%1$s agrees with %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s está de acuerdo"
-
-#: ../../Zotlabs/Module/Like.php:425
-#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s no está de acuerdo"
-
-#: ../../Zotlabs/Module/Like.php:427
-#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s se abstiene"
-
-#: ../../Zotlabs/Module/Like.php:429
-#, php-format
-msgid "%1$s is attending %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s participa"
-
-#: ../../Zotlabs/Module/Like.php:431
-#, php-format
-msgid "%1$s is not attending %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s no participa"
-
-#: ../../Zotlabs/Module/Like.php:433
-#, php-format
-msgid "%1$s may attend %2$s's %3$s"
-msgstr "%3$s de %2$s: %1$s quizá participe"
-
-#: ../../Zotlabs/Module/Like.php:538
-msgid "Action completed."
-msgstr "Acción completada."
-
-#: ../../Zotlabs/Module/Like.php:539
-msgid "Thank you."
-msgstr "Gracias."
-
-#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:189
-#: ../../Zotlabs/Module/Profiles.php:246 ../../Zotlabs/Module/Profiles.php:625
-msgid "Profile not found."
-msgstr "Perfil no encontrado."
-
-#: ../../Zotlabs/Module/Profiles.php:44
-msgid "Profile deleted."
-msgstr "Perfil eliminado."
-
-#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:104
-msgid "Profile-"
-msgstr "Perfil-"
-
-#: ../../Zotlabs/Module/Profiles.php:89 ../../Zotlabs/Module/Profiles.php:132
-msgid "New profile created."
-msgstr "El nuevo perfil ha sido creado."
-
-#: ../../Zotlabs/Module/Profiles.php:110
-msgid "Profile unavailable to clone."
-msgstr "Perfil no disponible para clonar."
-
-#: ../../Zotlabs/Module/Profiles.php:151
-msgid "Profile unavailable to export."
-msgstr "Perfil no disponible para exportar."
-
-#: ../../Zotlabs/Module/Profiles.php:256
-msgid "Profile Name is required."
-msgstr "Se necesita el nombre del perfil."
-
-#: ../../Zotlabs/Module/Profiles.php:427
-msgid "Marital Status"
-msgstr "Estado civil"
-
-#: ../../Zotlabs/Module/Profiles.php:431
-msgid "Romantic Partner"
-msgstr "Pareja sentimental"
-
-#: ../../Zotlabs/Module/Profiles.php:435 ../../Zotlabs/Module/Profiles.php:736
-msgid "Likes"
-msgstr "Me gusta"
-
-#: ../../Zotlabs/Module/Profiles.php:439 ../../Zotlabs/Module/Profiles.php:737
-msgid "Dislikes"
-msgstr "No me gusta"
-
-#: ../../Zotlabs/Module/Profiles.php:443 ../../Zotlabs/Module/Profiles.php:744
-msgid "Work/Employment"
-msgstr "Trabajo:"
-
-#: ../../Zotlabs/Module/Profiles.php:446
-msgid "Religion"
-msgstr "Religión"
-
-#: ../../Zotlabs/Module/Profiles.php:450
-msgid "Political Views"
-msgstr "Ideas políticas"
-
-#: ../../Zotlabs/Module/Profiles.php:454
-msgid "Gender"
-msgstr "Género"
-
-#: ../../Zotlabs/Module/Profiles.php:458
-msgid "Sexual Preference"
-msgstr "Preferencia sexual"
-
-#: ../../Zotlabs/Module/Profiles.php:462
-msgid "Homepage"
-msgstr "Página personal"
-
-#: ../../Zotlabs/Module/Profiles.php:466
-msgid "Interests"
-msgstr "Intereses"
-
-#: ../../Zotlabs/Module/Profiles.php:560
-msgid "Profile updated."
-msgstr "Perfil actualizado."
-
-#: ../../Zotlabs/Module/Profiles.php:644
-msgid "Hide your connections list from viewers of this profile"
-msgstr "Ocultar la lista de conexiones a los visitantes del perfil"
-
-#: ../../Zotlabs/Module/Profiles.php:686
-msgid "Edit Profile Details"
-msgstr "Modificar los detalles de este perfil"
-
-#: ../../Zotlabs/Module/Profiles.php:688
-msgid "View this profile"
-msgstr "Ver este perfil"
-
-#: ../../Zotlabs/Module/Profiles.php:689 ../../Zotlabs/Module/Profiles.php:771
-#: ../../include/channel.php:981
-msgid "Edit visibility"
-msgstr "Editar visibilidad"
-
-#: ../../Zotlabs/Module/Profiles.php:690
-msgid "Profile Tools"
-msgstr "Gestión del perfil"
-
-#: ../../Zotlabs/Module/Profiles.php:691
-msgid "Change cover photo"
-msgstr "Cambiar la imagen de portada del perfil"
-
-#: ../../Zotlabs/Module/Profiles.php:692 ../../include/channel.php:952
-msgid "Change profile photo"
-msgstr "Cambiar la foto del perfil"
-
-#: ../../Zotlabs/Module/Profiles.php:693
-msgid "Create a new profile using these settings"
-msgstr "Crear un nuevo perfil usando estos ajustes"
-
-#: ../../Zotlabs/Module/Profiles.php:694
-msgid "Clone this profile"
-msgstr "Clonar este perfil"
-
-#: ../../Zotlabs/Module/Profiles.php:695
-msgid "Delete this profile"
-msgstr "Eliminar este perfil"
-
-#: ../../Zotlabs/Module/Profiles.php:696
-msgid "Add profile things"
-msgstr "Añadir cosas al perfil"
-
-#: ../../Zotlabs/Module/Profiles.php:697 ../../include/conversation.php:1564
-#: ../../include/widgets.php:105
-msgid "Personal"
-msgstr "Personales"
-
-#: ../../Zotlabs/Module/Profiles.php:699
-msgid "Relation"
-msgstr "Relación"
-
-#: ../../Zotlabs/Module/Profiles.php:700 ../../include/datetime.php:55
-msgid "Miscellaneous"
-msgstr "Varios"
-
-#: ../../Zotlabs/Module/Profiles.php:702
-msgid "Import profile from file"
-msgstr "Importar perfil desde un fichero"
-
-#: ../../Zotlabs/Module/Profiles.php:703
-msgid "Export profile to file"
-msgstr "Exportar perfil a un fichero"
-
-#: ../../Zotlabs/Module/Profiles.php:704
-msgid "Your gender"
-msgstr "Género"
-
-#: ../../Zotlabs/Module/Profiles.php:705
-msgid "Marital status"
-msgstr "Estado civil"
-
-#: ../../Zotlabs/Module/Profiles.php:706
-msgid "Sexual preference"
-msgstr "Preferencia sexual"
-
-#: ../../Zotlabs/Module/Profiles.php:709
-msgid "Profile name"
-msgstr "Nombre del perfil"
-
-#: ../../Zotlabs/Module/Profiles.php:711
-msgid "This is your default profile."
-msgstr "Este es su perfil principal."
-
-#: ../../Zotlabs/Module/Profiles.php:713
-msgid "Your full name"
-msgstr "Nombre completo"
-
-#: ../../Zotlabs/Module/Profiles.php:714
-msgid "Title/Description"
-msgstr "Título o descripción"
-
-#: ../../Zotlabs/Module/Profiles.php:717
-msgid "Street address"
-msgstr "Dirección"
-
-#: ../../Zotlabs/Module/Profiles.php:718
-msgid "Locality/City"
-msgstr "Ciudad"
-
-#: ../../Zotlabs/Module/Profiles.php:719
-msgid "Region/State"
-msgstr "Región o Estado"
-
-#: ../../Zotlabs/Module/Profiles.php:720
-msgid "Postal/Zip code"
-msgstr "Código postal"
-
-#: ../../Zotlabs/Module/Profiles.php:721
-msgid "Country"
-msgstr "País"
-
-#: ../../Zotlabs/Module/Profiles.php:726
-msgid "Who (if applicable)"
-msgstr "Quién (si es pertinente)"
+#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
+#: ../../Zotlabs/Module/Blocks.php:155
+msgid "Block Name"
+msgstr "Nombre del bloque"
-#: ../../Zotlabs/Module/Profiles.php:726
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Por ejemplo: ana123, María González, sara@ejemplo.com"
+#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1258
+msgid "Title (optional)"
+msgstr "Título (opcional)"
-#: ../../Zotlabs/Module/Profiles.php:727
-msgid "Since (date)"
-msgstr "Desde (fecha)"
+#: ../../Zotlabs/Module/Editblock.php:133
+msgid "Edit Block"
+msgstr "Modificar este bloque"
-#: ../../Zotlabs/Module/Profiles.php:730
-msgid "Tell us about yourself"
-msgstr "Háblenos de usted"
+#: ../../Zotlabs/Module/Group.php:24
+msgid "Privacy group created."
+msgstr "El grupo de canales ha sido creado."
-#: ../../Zotlabs/Module/Profiles.php:731
-msgid "Homepage URL"
-msgstr "Dirección de la página personal"
+#: ../../Zotlabs/Module/Group.php:30
+msgid "Could not create privacy group."
+msgstr "No se puede crear el grupo de canales"
-#: ../../Zotlabs/Module/Profiles.php:732
-msgid "Hometown"
-msgstr "Lugar de nacimiento"
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
+#: ../../include/items.php:3876
+msgid "Privacy group not found."
+msgstr "Grupo de canales no encontrado."
-#: ../../Zotlabs/Module/Profiles.php:733
-msgid "Political views"
-msgstr "Ideas políticas"
+#: ../../Zotlabs/Module/Group.php:58
+msgid "Privacy group updated."
+msgstr "Grupo de canales actualizado."
-#: ../../Zotlabs/Module/Profiles.php:734
-msgid "Religious views"
-msgstr "Creencias religiosas"
+#: ../../Zotlabs/Module/Group.php:90
+msgid "Create a group of channels."
+msgstr "Crear un grupo de canales."
-#: ../../Zotlabs/Module/Profiles.php:735
-msgid "Keywords used in directory listings"
-msgstr "Palabras clave utilizadas en los listados de directorios"
+#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+msgid "Privacy group name: "
+msgstr "Nombre del grupo de canales:"
-#: ../../Zotlabs/Module/Profiles.php:735
-msgid "Example: fishing photography software"
-msgstr "Por ejemplo: software de fotografía submarina"
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+msgid "Members are visible to other channels"
+msgstr "Los miembros son visibles para otros canales"
-#: ../../Zotlabs/Module/Profiles.php:738
-msgid "Musical interests"
-msgstr "Preferencias musicales"
+#: ../../Zotlabs/Module/Group.php:111
+msgid "Privacy group removed."
+msgstr "Grupo de canales eliminado."
-#: ../../Zotlabs/Module/Profiles.php:739
-msgid "Books, literature"
-msgstr "Libros, literatura"
+#: ../../Zotlabs/Module/Group.php:113
+msgid "Unable to remove privacy group."
+msgstr "No se puede eliminar el grupo de canales."
-#: ../../Zotlabs/Module/Profiles.php:740
-msgid "Television"
-msgstr "Televisión"
+#: ../../Zotlabs/Module/Group.php:183
+msgid "Privacy group editor"
+msgstr "Editor de grupos de canales"
-#: ../../Zotlabs/Module/Profiles.php:741
-msgid "Film/Dance/Culture/Entertainment"
-msgstr "Cine, danza, cultura, entretenimiento"
+#: ../../Zotlabs/Module/Group.php:199
+msgid "All Connected Channels"
+msgstr "Todos los canales conectados"
-#: ../../Zotlabs/Module/Profiles.php:742
-msgid "Hobbies/Interests"
-msgstr "Aficiones o intereses"
+#: ../../Zotlabs/Module/Group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Haga clic en un canal para agregarlo o quitarlo."
-#: ../../Zotlabs/Module/Profiles.php:743
-msgid "Love/Romance"
-msgstr "Vida sentimental o amorosa"
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
+msgstr "Identificador del perfil no válido"
-#: ../../Zotlabs/Module/Profiles.php:745
-msgid "School/Education"
-msgstr "Estudios"
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Profile Visibility Editor"
+msgstr "Editor de visibilidad del perfil"
-#: ../../Zotlabs/Module/Profiles.php:746
-msgid "Contact information and social networks"
-msgstr "Información de contacto y redes sociales"
+#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1282
+msgid "Profile"
+msgstr "Perfil"
-#: ../../Zotlabs/Module/Profiles.php:747
-msgid "My other channels"
-msgstr "Mis otros canales"
+#: ../../Zotlabs/Module/Profperm.php:119
+msgid "Click on a contact to add or remove."
+msgstr "Pulsar en un contacto para añadirlo o eliminarlo."
-#: ../../Zotlabs/Module/Profiles.php:767 ../../include/channel.php:977
-msgid "Profile Image"
-msgstr "Imagen del perfil"
+#: ../../Zotlabs/Module/Profperm.php:128
+msgid "Visible To"
+msgstr "Visible para"
-#: ../../Zotlabs/Module/Profiles.php:777 ../../include/channel.php:959
-#: ../../include/nav.php:91
-msgid "Edit Profiles"
-msgstr "Editar perfiles"
+#: ../../Zotlabs/Module/Magic.php:71
+msgid "Hub not found."
+msgstr "Servidor no encontrado"
#: ../../Zotlabs/Module/Mitem.php:52
msgid "Unable to create element."
msgstr "No se puede crear el elemento."
-#: ../../Zotlabs/Module/Setup.php:530
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Error: el módulo PHP mb_string es necesario, pero no está instalado."
+#: ../../Zotlabs/Module/Mitem.php:76
+msgid "Unable to update menu element."
+msgstr "No es posible actualizar el elemento del menú."
-#: ../../Zotlabs/Module/Setup.php:534
-msgid "Error: xml PHP module required for DAV but not installed."
-msgstr "Error: el módulo PHP xml es necesario para DAV, pero no está instalado."
+#: ../../Zotlabs/Module/Mitem.php:92
+msgid "Unable to add menu element."
+msgstr "No es posible añadir el elemento al menú"
#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
msgid "Menu Item Permissions"
msgstr "Permisos del elemento del menú"
#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:489
msgid "(click to open/close)"
msgstr "(pulsar para abrir o cerrar)"
@@ -3727,1035 +3834,1129 @@ msgstr "Editar elemento del menú"
msgid "Link text"
msgstr "Texto del enlace"
-#: ../../Zotlabs/Module/Setup.php:184
+#: ../../Zotlabs/Module/Ratings.php:70
+msgid "No ratings"
+msgstr "Ninguna valoración"
+
+#: ../../Zotlabs/Module/Ratings.php:98
+msgid "Rating: "
+msgstr "Valoración:"
+
+#: ../../Zotlabs/Module/Ratings.php:99
+msgid "Website: "
+msgstr "Sitio web:"
+
+#: ../../Zotlabs/Module/Ratings.php:101
+msgid "Description: "
+msgstr "Descripción:"
+
+#: ../../Zotlabs/Module/Attach.php:13
+msgid "Item not available."
+msgstr "Elemento no disponible"
+
+#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
+#, php-format
+msgctxt "mood"
+msgid "%1$s is %2$s"
+msgstr "%1$s está %2$s"
+
+#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:229
+msgid "Mood"
+msgstr "Estado de ánimo"
+
+#: ../../Zotlabs/Module/Mood.php:136
+msgid "Set your current mood and tell your friends"
+msgstr "Describir su estado de ánimo para comunicárselo a sus amigos"
+
+#: ../../Zotlabs/Module/Notify.php:57
+#: ../../Zotlabs/Module/Notifications.php:35
+msgid "No more system notifications."
+msgstr "No hay más notificaciones del sistema"
+
+#: ../../Zotlabs/Module/Notify.php:61
+#: ../../Zotlabs/Module/Notifications.php:39
+msgid "System Notifications"
+msgstr "Notificaciones del sistema"
+
+#: ../../Zotlabs/Module/Photos.php:82
+msgid "Page owner information could not be retrieved."
+msgstr "La información del propietario de la página no pudo ser recuperada."
+
+#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:734
+#: ../../Zotlabs/Module/Profile_photo.php:115
+#: ../../Zotlabs/Module/Profile_photo.php:219
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:225
+#: ../../include/photo/photo_driver.php:728
+msgid "Profile Photos"
+msgstr "Fotos del perfil"
+
+#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
+msgid "Album not found."
+msgstr "Álbum no encontrado."
+
+#: ../../Zotlabs/Module/Photos.php:112
+msgid "Delete Album"
+msgstr "Borrar álbum"
+
+#: ../../Zotlabs/Module/Photos.php:133
+msgid ""
+"Multiple storage folders exist with this album name, but within different "
+"directories. Please remove the desired folder or folders using the Files "
+"manager"
+msgstr "Hay varias carpetas con este nombre de álbum, pero dentro de diferentes directorios. Por favor, elimine la carpeta o carpetas que desee utilizando el administrador de ficheros"
+
+#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1059
+msgid "Delete Photo"
+msgstr "Borrar foto"
+
+#: ../../Zotlabs/Module/Photos.php:520
+msgid "No photos selected"
+msgstr "No hay fotos seleccionadas"
+
+#: ../../Zotlabs/Module/Photos.php:569
+msgid "Access to this item is restricted."
+msgstr "El acceso a este elemento está restringido."
+
+#: ../../Zotlabs/Module/Photos.php:608
+#, php-format
+msgid "%1$.2f MB of %2$.2f MB photo storage used."
+msgstr "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado."
+
+#: ../../Zotlabs/Module/Photos.php:611
+#, php-format
+msgid "%1$.2f MB photo storage used."
+msgstr "%1$.2f MB de almacenamiento de fotos utilizado."
+
+#: ../../Zotlabs/Module/Photos.php:647
+msgid "Upload Photos"
+msgstr "Subir fotos"
+
+#: ../../Zotlabs/Module/Photos.php:651
+msgid "Enter an album name"
+msgstr "Introducir un nombre de álbum"
+
+#: ../../Zotlabs/Module/Photos.php:652
+msgid "or select an existing album (doubleclick)"
+msgstr "o seleccionar uno existente (doble click)"
+
+#: ../../Zotlabs/Module/Photos.php:653
+msgid "Create a status post for this upload"
+msgstr "Crear un mensaje de estado para esta subida"
+
+#: ../../Zotlabs/Module/Photos.php:654
+msgid "Caption (optional):"
+msgstr "Título (opcional):"
+
+#: ../../Zotlabs/Module/Photos.php:655
+msgid "Description (optional):"
+msgstr "Descripción (opcional):"
+
+#: ../../Zotlabs/Module/Photos.php:686
+msgid "Album name could not be decoded"
+msgstr "El nombre del álbum no ha podido ser descifrado"
+
+#: ../../Zotlabs/Module/Photos.php:734
+msgid "Contact Photos"
+msgstr "Fotos de contacto"
+
+#: ../../Zotlabs/Module/Photos.php:757
+msgid "Show Newest First"
+msgstr "Mostrar lo más reciente primero"
+
+#: ../../Zotlabs/Module/Photos.php:759
+msgid "Show Oldest First"
+msgstr "Mostrar lo más antiguo primero"
+
+#: ../../Zotlabs/Module/Photos.php:783 ../../Zotlabs/Module/Photos.php:1337
+#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1678
+msgid "View Photo"
+msgstr "Ver foto"
+
+#: ../../Zotlabs/Module/Photos.php:814
+#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1695
+msgid "Edit Album"
+msgstr "Editar álbum"
+
+#: ../../Zotlabs/Module/Photos.php:861
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Permiso denegado. El acceso a este elemento puede estar restringido."
+
+#: ../../Zotlabs/Module/Photos.php:863
+msgid "Photo not available"
+msgstr "Foto no disponible"
+
+#: ../../Zotlabs/Module/Photos.php:921
+msgid "Use as profile photo"
+msgstr "Usar como foto del perfil"
+
+#: ../../Zotlabs/Module/Photos.php:922
+msgid "Use as cover photo"
+msgstr "Usar como imagen de portada del perfil"
+
+#: ../../Zotlabs/Module/Photos.php:929
+msgid "Private Photo"
+msgstr "Foto privada"
+
+#: ../../Zotlabs/Module/Photos.php:940 ../../Zotlabs/Module/Cal.php:336
+#: ../../Zotlabs/Module/Cal.php:343 ../../Zotlabs/Module/Events.php:680
+#: ../../Zotlabs/Module/Events.php:689
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846
+msgid "Previous"
+msgstr "Anterior"
+
+#: ../../Zotlabs/Module/Photos.php:944
+msgid "View Full Size"
+msgstr "Ver tamaño completo"
+
+#: ../../Zotlabs/Module/Photos.php:949 ../../Zotlabs/Module/Setup.php:264
+#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
+#: ../../Zotlabs/Module/Events.php:681 ../../Zotlabs/Module/Events.php:690
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847
+msgid "Next"
+msgstr "Siguiente"
+
+#: ../../Zotlabs/Module/Photos.php:1033
+msgid "Edit photo"
+msgstr "Editar foto"
+
+#: ../../Zotlabs/Module/Photos.php:1035
+msgid "Rotate CW (right)"
+msgstr "Girar CW (a la derecha)"
+
+#: ../../Zotlabs/Module/Photos.php:1036
+msgid "Rotate CCW (left)"
+msgstr "Girar CCW (a la izquierda)"
+
+#: ../../Zotlabs/Module/Photos.php:1039
+msgid "Move photo to album"
+msgstr "Mover la foto a un álbum"
+
+#: ../../Zotlabs/Module/Photos.php:1040
+msgid "Enter a new album name"
+msgstr "Introducir un nuevo nombre de álbum"
+
+#: ../../Zotlabs/Module/Photos.php:1041
+msgid "or select an existing one (doubleclick)"
+msgstr "o seleccionar uno (doble click) existente"
+
+#: ../../Zotlabs/Module/Photos.php:1044
+msgid "Caption"
+msgstr "Título"
+
+#: ../../Zotlabs/Module/Photos.php:1046
+msgid "Add a Tag"
+msgstr "Añadir una etiqueta"
+
+#: ../../Zotlabs/Module/Photos.php:1054
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
+msgstr "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com"
+
+#: ../../Zotlabs/Module/Photos.php:1057
+msgid "Flag as adult in album view"
+msgstr "Marcar como \"solo para adultos\" en el álbum"
+
+#: ../../Zotlabs/Module/Photos.php:1076 ../../Zotlabs/Lib/ThreadItem.php:268
+msgid "I like this (toggle)"
+msgstr "Me gusta (cambiar)"
+
+#: ../../Zotlabs/Module/Photos.php:1077 ../../Zotlabs/Lib/ThreadItem.php:269
+msgid "I don't like this (toggle)"
+msgstr "No me gusta esto (cambiar)"
+
+#: ../../Zotlabs/Module/Photos.php:1078 ../../Zotlabs/Module/Blocks.php:161
+#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Webpages.php:241
+#: ../../extend/addon/addon/cdav/include/widgets.php:123
+#: ../../include/conversation.php:1230
+msgid "Share"
+msgstr "Compartir"
+
+#: ../../Zotlabs/Module/Photos.php:1079 ../../Zotlabs/Lib/ThreadItem.php:409
+#: ../../include/conversation.php:737
+msgid "Please wait"
+msgstr "Espere por favor"
+
+#: ../../Zotlabs/Module/Photos.php:1095 ../../Zotlabs/Module/Photos.php:1213
+#: ../../Zotlabs/Lib/ThreadItem.php:726
+msgid "This is you"
+msgstr "Este es usted"
+
+#: ../../Zotlabs/Module/Photos.php:1097 ../../Zotlabs/Module/Photos.php:1215
+#: ../../Zotlabs/Lib/ThreadItem.php:728 ../../include/js_strings.php:6
+msgid "Comment"
+msgstr "Comentar"
+
+#: ../../Zotlabs/Module/Photos.php:1099 ../../Zotlabs/Module/Webpages.php:247
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Lib/ThreadItem.php:738
+#: ../../include/page_widgets.php:43 ../../include/conversation.php:1199
+msgid "Preview"
+msgstr "Previsualizar"
+
+#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
+msgctxt "title"
+msgid "Likes"
+msgstr "Me gusta"
+
+#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
+msgctxt "title"
+msgid "Dislikes"
+msgstr "No me gusta"
+
+#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
+msgctxt "title"
+msgid "Agree"
+msgstr "De acuerdo"
+
+#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
+msgctxt "title"
+msgid "Disagree"
+msgstr "En desacuerdo"
+
+#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
+msgctxt "title"
+msgid "Abstain"
+msgstr "Abstención"
+
+#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
+msgctxt "title"
+msgid "Attending"
+msgstr "Participaré"
+
+#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
+msgctxt "title"
+msgid "Not attending"
+msgstr "No participaré"
+
+#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
+msgctxt "title"
+msgid "Might attend"
+msgstr "Quizá participe"
+
+#: ../../Zotlabs/Module/Photos.php:1132 ../../Zotlabs/Module/Photos.php:1144
+#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
+#: ../../include/conversation.php:1765
+msgid "View all"
+msgstr "Ver todo"
+
+#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:190
+#: ../../include/channel.php:1190 ../../include/taxonomy.php:403
+#: ../../include/conversation.php:1789
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] "Me gusta"
+msgstr[1] "Me gusta"
+
+#: ../../Zotlabs/Module/Photos.php:1141 ../../Zotlabs/Lib/ThreadItem.php:195
+#: ../../include/conversation.php:1792
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] "No me gusta"
+msgstr[1] "No me gusta"
+
+#: ../../Zotlabs/Module/Photos.php:1241
+msgid "Photo Tools"
+msgstr "Gestión de las fotos"
+
+#: ../../Zotlabs/Module/Photos.php:1250
+msgid "In This Photo:"
+msgstr "En esta foto:"
+
+#: ../../Zotlabs/Module/Photos.php:1255
+msgid "Map"
+msgstr "Mapa"
+
+#: ../../Zotlabs/Module/Photos.php:1263 ../../Zotlabs/Lib/ThreadItem.php:398
+msgctxt "noun"
+msgid "Likes"
+msgstr "Me gusta"
+
+#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:399
+msgctxt "noun"
+msgid "Dislikes"
+msgstr "No me gusta"
+
+#: ../../Zotlabs/Module/Photos.php:1269 ../../Zotlabs/Lib/ThreadItem.php:404
+#: ../../include/acl_selectors.php:210
+msgid "Close"
+msgstr "Cerrar"
+
+#: ../../Zotlabs/Module/Photos.php:1343
+msgid "View Album"
+msgstr "Ver álbum"
+
+#: ../../Zotlabs/Module/Photos.php:1354 ../../Zotlabs/Module/Photos.php:1367
+#: ../../Zotlabs/Module/Photos.php:1368
+msgid "Recent Photos"
+msgstr "Fotos recientes"
+
+#: ../../Zotlabs/Module/Setup.php:176
msgid "$Projectname Server - Setup"
msgstr "Servidor $Projectname - Instalación"
-#: ../../Zotlabs/Module/Setup.php:188
+#: ../../Zotlabs/Module/Setup.php:180
msgid "Could not connect to database."
msgstr "No se ha podido conectar a la base de datos."
-#: ../../Zotlabs/Module/Setup.php:192
+#: ../../Zotlabs/Module/Setup.php:184
msgid ""
"Could not connect to specified site URL. Possible SSL certificate or DNS "
"issue."
msgstr "No se puede conectar con la dirección del sitio indicada. Podría tratarse de un problema de SSL o DNS."
-#: ../../Zotlabs/Module/Setup.php:199
+#: ../../Zotlabs/Module/Setup.php:191
msgid "Could not create table."
msgstr "No se puede crear la tabla."
-#: ../../Zotlabs/Module/Setup.php:204
+#: ../../Zotlabs/Module/Setup.php:196
msgid "Your site database has been installed."
msgstr "La base de datos del sitio ha sido instalada."
-#: ../../Zotlabs/Module/Setup.php:208
+#: ../../Zotlabs/Module/Setup.php:200
msgid ""
"You may need to import the file \"install/schema_xxx.sql\" manually using a "
"database client."
msgstr "Podría tener que importar manualmente el fichero \"install/schema_xxx.sql\" usando un cliente de base de datos."
-#: ../../Zotlabs/Module/Setup.php:209 ../../Zotlabs/Module/Setup.php:271
-#: ../../Zotlabs/Module/Setup.php:734
+#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Setup.php:745
msgid "Please see the file \"install/INSTALL.txt\"."
msgstr "Por favor, lea el fichero \"install/INSTALL.txt\"."
-#: ../../Zotlabs/Module/Setup.php:268
+#: ../../Zotlabs/Module/Setup.php:260
msgid "System check"
msgstr "Verificación del sistema"
-#: ../../Zotlabs/Module/Setup.php:272 ../../Zotlabs/Module/Photos.php:949
-#: ../../Zotlabs/Module/Cal.php:333 ../../Zotlabs/Module/Cal.php:340
-#: ../../Zotlabs/Module/Events.php:676 ../../Zotlabs/Module/Events.php:685
-msgid "Next"
-msgstr "Siguiente"
-
-#: ../../Zotlabs/Module/Setup.php:273
+#: ../../Zotlabs/Module/Setup.php:265
msgid "Check again"
msgstr "Verificar de nuevo"
-#: ../../Zotlabs/Module/Setup.php:295
+#: ../../Zotlabs/Module/Setup.php:287
msgid "Database connection"
msgstr "Conexión a la base de datos"
-#: ../../Zotlabs/Module/Setup.php:296
+#: ../../Zotlabs/Module/Setup.php:288
msgid ""
"In order to install $Projectname we need to know how to connect to your "
"database."
msgstr "Para instalar $Projectname es necesario saber cómo conectar con su base de datos."
-#: ../../Zotlabs/Module/Setup.php:297
+#: ../../Zotlabs/Module/Setup.php:289
msgid ""
"Please contact your hosting provider or site administrator if you have "
"questions about these settings."
msgstr "Por favor, contacte con el proveedor de servicios o el administrador del sitio si tiene dudas sobre estos ajustes."
-#: ../../Zotlabs/Module/Setup.php:298
+#: ../../Zotlabs/Module/Setup.php:290
msgid ""
"The database you specify below should already exist. If it does not, please "
"create it before continuing."
msgstr "La base de datos que especifique a continuación debe existir ya. Si no es así, por favor, créela antes de seguir."
-#: ../../Zotlabs/Module/Setup.php:302
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Database Server Name"
msgstr "Nombre del servidor de base de datos"
-#: ../../Zotlabs/Module/Setup.php:302
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Default is 127.0.0.1"
msgstr "De forma predeterminada es 127.0.0.1"
-#: ../../Zotlabs/Module/Setup.php:303
+#: ../../Zotlabs/Module/Setup.php:295
msgid "Database Port"
msgstr "Puerto de la base de datos"
-#: ../../Zotlabs/Module/Setup.php:303
+#: ../../Zotlabs/Module/Setup.php:295
msgid "Communication port number - use 0 for default"
msgstr "Número del puerto de comunicaciones - use 0 como valor por defecto"
-#: ../../Zotlabs/Module/Setup.php:304
+#: ../../Zotlabs/Module/Setup.php:296
msgid "Database Login Name"
msgstr "Usuario de la base de datos"
-#: ../../Zotlabs/Module/Setup.php:305
+#: ../../Zotlabs/Module/Setup.php:297
msgid "Database Login Password"
msgstr "Contraseña de acceso a la base de datos"
-#: ../../Zotlabs/Module/Setup.php:306
+#: ../../Zotlabs/Module/Setup.php:298
msgid "Database Name"
msgstr "Nombre de la base de datos"
-#: ../../Zotlabs/Module/Setup.php:307
+#: ../../Zotlabs/Module/Setup.php:299
msgid "Database Type"
msgstr "Tipo de base de datos"
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:355
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
msgid "Site administrator email address"
msgstr "Dirección de correo electrónico del administrador del sitio"
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:355
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
msgid ""
"Your account email address must match this in order to use the web admin "
"panel."
msgstr "Su cuenta deberá usar la misma dirección de correo electrónico para poder utilizar el panel de administración web."
-#: ../../Zotlabs/Module/Setup.php:310 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
msgid "Website URL"
msgstr "Dirección del sitio web"
-#: ../../Zotlabs/Module/Setup.php:310 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
msgid "Please use SSL (https) URL if available."
msgstr "Por favor, use SSL (https) si está disponible."
-#: ../../Zotlabs/Module/Setup.php:311 ../../Zotlabs/Module/Setup.php:361
+#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
msgid "Please select a default timezone for your website"
msgstr "Por favor, selecciones el huso horario por defecto de su sitio web"
-#: ../../Zotlabs/Module/Setup.php:344
+#: ../../Zotlabs/Module/Setup.php:336
msgid "Site settings"
msgstr "Ajustes del sitio"
-#: ../../Zotlabs/Module/Setup.php:400
+#: ../../Zotlabs/Module/Setup.php:392
msgid "PHP version 5.5 or greater is required."
msgstr "Se requiere la versión 5.5, o superior, de PHP."
-#: ../../Zotlabs/Module/Setup.php:401
+#: ../../Zotlabs/Module/Setup.php:393
msgid "PHP version"
msgstr "Versión de PHP"
-#: ../../Zotlabs/Module/Setup.php:416
+#: ../../Zotlabs/Module/Setup.php:409
msgid "Could not find a command line version of PHP in the web server PATH."
msgstr "No se puede encontrar una versión en línea de comandos de PHP en la ruta del servidor web."
-#: ../../Zotlabs/Module/Setup.php:417
+#: ../../Zotlabs/Module/Setup.php:410
msgid ""
"If you don't have a command line version of PHP installed on server, you "
"will not be able to run background polling via cron."
msgstr "Si no tiene instalada la versión de línea de comandos de PHP en su servidor, no podrá realizar envíos en segundo plano mediante cron."
-#: ../../Zotlabs/Module/Setup.php:421
+#: ../../Zotlabs/Module/Setup.php:414
msgid "PHP executable path"
msgstr "Ruta del ejecutable PHP"
-#: ../../Zotlabs/Module/Setup.php:421
+#: ../../Zotlabs/Module/Setup.php:414
msgid ""
"Enter full path to php executable. You can leave this blank to continue the "
"installation."
msgstr "Introducir la ruta completa del ejecutable PHP. Puede dejar la línea en blanco para continuar la instalación."
-#: ../../Zotlabs/Module/Setup.php:426
+#: ../../Zotlabs/Module/Setup.php:419
msgid "Command line PHP"
msgstr "PHP en línea de comandos"
-#: ../../Zotlabs/Module/Setup.php:435
+#: ../../Zotlabs/Module/Setup.php:429
+msgid ""
+"Unable to check command line PHP, as shell_exec() is disabled. This is "
+"required."
+msgstr "No se puede comprobar la línea de comandos PHP, ya que shell_exec() está deshabilitado. Es necesario que esté activado."
+
+#: ../../Zotlabs/Module/Setup.php:432
msgid ""
"The command line version of PHP on your system does not have "
"\"register_argc_argv\" enabled."
msgstr "La línea de comandos PHP de su sistema no tiene activado \"register_argc_argv\"."
-#: ../../Zotlabs/Module/Setup.php:436
+#: ../../Zotlabs/Module/Setup.php:433
msgid "This is required for message delivery to work."
msgstr "Esto es necesario para que funcione la transmisión de mensajes."
-#: ../../Zotlabs/Module/Setup.php:439
+#: ../../Zotlabs/Module/Setup.php:436
msgid "PHP register_argc_argv"
msgstr "PHP register_argc_argv"
-#: ../../Zotlabs/Module/Setup.php:457
+#: ../../Zotlabs/Module/Setup.php:454
#, php-format
msgid ""
"Your max allowed total upload size is set to %s. Maximum size of one file to"
" upload is set to %s. You are allowed to upload up to %d files at once."
msgstr "La carga máxima que se le permite subir está establecida en %s. El tamaño máximo de un fichero está establecido en %s. Está permitido subir hasta un máximo de %d ficheros de una sola vez."
-#: ../../Zotlabs/Module/Setup.php:462
-msgid "You can adjust these settings in the servers php.ini."
+#: ../../Zotlabs/Module/Setup.php:459
+msgid "You can adjust these settings in the server php.ini file."
msgstr "Puede ajustar estos valores en el fichero php.ini de su servidor."
-#: ../../Zotlabs/Module/Setup.php:464
+#: ../../Zotlabs/Module/Setup.php:461
msgid "PHP upload limits"
msgstr "Límites PHP de subida"
-#: ../../Zotlabs/Module/Setup.php:487
+#: ../../Zotlabs/Module/Setup.php:484
msgid ""
"Error: the \"openssl_pkey_new\" function on this system is not able to "
"generate encryption keys"
msgstr "Error: La función \"openssl_pkey_new\" en este sistema no es capaz de general claves de cifrado."
-#: ../../Zotlabs/Module/Setup.php:488
+#: ../../Zotlabs/Module/Setup.php:485
msgid ""
"If running under Windows, please see "
"\"http://www.php.net/manual/en/openssl.installation.php\"."
msgstr "Si está en un servidor Windows, por favor, lea \"http://www.php.net/manual/en/openssl.installation.php\"."
-#: ../../Zotlabs/Module/Setup.php:491
+#: ../../Zotlabs/Module/Setup.php:488
msgid "Generate encryption keys"
msgstr "Generar claves de cifrado"
-#: ../../Zotlabs/Module/Setup.php:503
+#: ../../Zotlabs/Module/Setup.php:500
msgid "libCurl PHP module"
msgstr "módulo libCurl PHP"
-#: ../../Zotlabs/Module/Setup.php:504
+#: ../../Zotlabs/Module/Setup.php:501
msgid "GD graphics PHP module"
msgstr "módulo PHP GD graphics"
-#: ../../Zotlabs/Module/Setup.php:505
+#: ../../Zotlabs/Module/Setup.php:502
msgid "OpenSSL PHP module"
msgstr "módulo PHP OpenSSL"
-#: ../../Zotlabs/Module/Setup.php:506
-msgid "mysqli or postgres PHP module"
-msgstr "módulo PHP mysqli o postgres"
+#: ../../Zotlabs/Module/Setup.php:503
+msgid "PDO database PHP module"
+msgstr "Módulo PHP de la base de datos PDO "
-#: ../../Zotlabs/Module/Setup.php:507
+#: ../../Zotlabs/Module/Setup.php:504
msgid "mb_string PHP module"
msgstr "módulo PHP mb_string"
-#: ../../Zotlabs/Module/Setup.php:508
+#: ../../Zotlabs/Module/Setup.php:505
msgid "xml PHP module"
msgstr "módulo PHP xml"
-#: ../../Zotlabs/Module/Setup.php:512 ../../Zotlabs/Module/Setup.php:514
+#: ../../Zotlabs/Module/Setup.php:509 ../../Zotlabs/Module/Setup.php:511
msgid "Apache mod_rewrite module"
msgstr "módulo Apache mod_rewrite "
-#: ../../Zotlabs/Module/Setup.php:512
+#: ../../Zotlabs/Module/Setup.php:509
msgid ""
"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr "Error: se necesita el módulo del servidor web Apache mod-rewrite pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:518 ../../Zotlabs/Module/Setup.php:521
-msgid "proc_open"
-msgstr "proc_open"
+#: ../../Zotlabs/Module/Setup.php:515 ../../Zotlabs/Module/Setup.php:518
+msgid "exec"
+msgstr "ejecutable"
+
+#: ../../Zotlabs/Module/Setup.php:515
+msgid ""
+"Error: exec is required but is either not installed or has been disabled in "
+"php.ini"
+msgstr "Error: se necesita un ejecutable pero o no se instaló o está deshabilitado en php.ini"
+
+#: ../../Zotlabs/Module/Setup.php:521 ../../Zotlabs/Module/Setup.php:524
+msgid "shell_exec"
+msgstr "shell_exec"
-#: ../../Zotlabs/Module/Setup.php:518
+#: ../../Zotlabs/Module/Setup.php:521
msgid ""
-"Error: proc_open is required but is either not installed or has been "
+"Error: shell_exec is required but is either not installed or has been "
"disabled in php.ini"
-msgstr "Error: se necesita proc_open pero o no está instalado o ha sido desactivado en el fichero php.ini"
+msgstr "Error: se necesita shell_exec pero o no se instaló o está deshabilitado en php.ini"
-#: ../../Zotlabs/Module/Setup.php:526
+#: ../../Zotlabs/Module/Setup.php:529
msgid "Error: libCURL PHP module required but not installed."
msgstr "Error: se necesita el módulo PHP libCURL pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:530
+#: ../../Zotlabs/Module/Setup.php:533
msgid ""
"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr "Error: el módulo PHP GD graphics es necesario, pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:534
+#: ../../Zotlabs/Module/Setup.php:537
msgid "Error: openssl PHP module required but not installed."
msgstr "Error: el módulo PHP openssl es necesario, pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:538
-msgid ""
-"Error: mysqli or postgres PHP module required but neither are installed."
-msgstr "Error: el módulo PHP mysqli o postgres es necesario pero ninguno de los dos está instalado."
+#: ../../Zotlabs/Module/Setup.php:541
+msgid "Error: PDO database PHP module required but not installed."
+msgstr "Error: se necesita el módulo PHP de la base de datos PDO, pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:542
+#: ../../Zotlabs/Module/Setup.php:545
msgid "Error: mb_string PHP module required but not installed."
msgstr "Error: el módulo PHP mb_string es necesario, pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:546
+#: ../../Zotlabs/Module/Setup.php:549
msgid "Error: xml PHP module required for DAV but not installed."
msgstr "Error: el módulo PHP xml es necesario para DAV, pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:564
+#: ../../Zotlabs/Module/Setup.php:567
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 "El instalador web no ha podido crear un fichero llamado “.htconfig.php” en la carpeta base de su servidor."
-#: ../../Zotlabs/Module/Setup.php:565
+#: ../../Zotlabs/Module/Setup.php:568
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 "Esto está generalmente ligado a un problema de permisos, a causa del cual el servidor web tiene prohibido modificar ficheros en su carpeta - incluso si usted mismo tiene esos permisos."
-#: ../../Zotlabs/Module/Setup.php:566
+#: ../../Zotlabs/Module/Setup.php:569
msgid ""
"At the end of this procedure, we will give you a text to save in a file "
"named .htconfig.php in your Red top folder."
msgstr "Al término de este procedimiento, podemos crear un fichero de texto para guardar con el nombre .htconfig.php en el directorio raíz de su instalación de Hubzilla."
-#: ../../Zotlabs/Module/Setup.php:567
+#: ../../Zotlabs/Module/Setup.php:570
msgid ""
"You can alternatively skip this procedure and perform a manual installation."
" Please see the file \"install/INSTALL.txt\" for instructions."
msgstr "Como alternativa, puede dejar este procedimiento e intentar realizar una instalación manual. Lea, por favor, el fichero\"install/INSTALL.txt\" para las instrucciones."
-#: ../../Zotlabs/Module/Setup.php:570
+#: ../../Zotlabs/Module/Setup.php:573
msgid ".htconfig.php is writable"
msgstr ".htconfig.php tiene permisos de escritura"
-#: ../../Zotlabs/Module/Setup.php:584
+#: ../../Zotlabs/Module/Setup.php:587
msgid ""
-"Red uses the Smarty3 template engine to render its web views. Smarty3 "
-"compiles templates to PHP to speed up rendering."
-msgstr "Hubzilla hace uso del motor de plantillas Smarty3 para diseñar sus plantillas gráficas. Smarty3 es más rápido porque compila las plantillas de páginas directamente en PHP."
+"This software uses the Smarty3 template engine to render its web views. "
+"Smarty3 compiles templates to PHP to speed up rendering."
+msgstr "Este software hace uso del motor de plantillas Smarty3 para diseñar sus plantillas gráficas. Smarty3 compila las plantillas a PHP para acelerar la renderización."
-#: ../../Zotlabs/Module/Setup.php:585
+#: ../../Zotlabs/Module/Setup.php:588
#, php-format
msgid ""
"In order to store these compiled templates, the web server needs to have "
"write access to the directory %s under the top level web folder."
msgstr "Para poder guardar las plantillas compiladas, el servidor web necesita permisos para acceder al directorio %s en la carpeta web principal."
-#: ../../Zotlabs/Module/Setup.php:586 ../../Zotlabs/Module/Setup.php:607
+#: ../../Zotlabs/Module/Setup.php:589 ../../Zotlabs/Module/Setup.php:610
msgid ""
"Please ensure that the user that your web server runs as (e.g. www-data) has"
" write access to this folder."
msgstr "Por favor, asegúrese de que el servidor web está siendo ejecutado por un usuario que tenga permisos de escritura sobre esta carpeta (por ejemplo, www-data)."
-#: ../../Zotlabs/Module/Setup.php:587
+#: ../../Zotlabs/Module/Setup.php:590
#, php-format
msgid ""
"Note: as a security measure, you should give the web server write access to "
"%s only--not the template files (.tpl) that it contains."
msgstr "Nota: como medida de seguridad, debe dar al servidor web permisos de escritura solo sobre %s - no sobre el fichero de plantilla (.tpl) que contiene."
-#: ../../Zotlabs/Module/Setup.php:590
+#: ../../Zotlabs/Module/Setup.php:593
#, php-format
msgid "%s is writable"
msgstr "%s tiene permisos de escritura"
-#: ../../Zotlabs/Module/Setup.php:606
+#: ../../Zotlabs/Module/Setup.php:609
msgid ""
"This software uses the store directory to save uploaded files. The web "
-"server needs to have write access to the store directory under the Red top "
-"level folder"
-msgstr "Este software utiliza el directorio de almacenamiento para guardar los archivos subidos. El servidor web debe tener acceso de escritura al directorio de almacenamiento en la carpeta de nivel superior"
+"server needs to have write access to the store directory under the top level"
+" web folder"
+msgstr "Este software utiliza el directorio de almacenamiento para guardar los ficheros subidos. El servidor web debe tener acceso de escritura a este directorio en la carpeta de nivel superior"
-#: ../../Zotlabs/Module/Setup.php:610
+#: ../../Zotlabs/Module/Setup.php:613
msgid "store is writable"
msgstr "\"store\" tiene permisos de escritura"
-#: ../../Zotlabs/Module/Setup.php:643
+#: ../../Zotlabs/Module/Setup.php:646
msgid ""
-"SSL certificate cannot be validated. Fix certificate or disable https access"
-" to this site."
-msgstr "El certificado SSL no ha podido ser validado. Corrija este problema o desactive el acceso https a este sitio."
+"Check to verify email addresses used in account registration (recommended)."
+msgstr "Activar para la verificación de la dirección de correo electrónico en el registro de una cuenta (recomendado)."
-#: ../../Zotlabs/Module/Setup.php:644
+#: ../../Zotlabs/Module/Setup.php:647
msgid ""
"If you have https access to your website or allow connections to TCP port "
"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
"NOT use self-signed certificates!"
msgstr "Si su servidor soporta conexiones cifradas SSL o si permite conexiones al puerto TCP 443 (el puerto usado por el protocolo https), debe utilizar un certificado válido. No debe usar un certificado firmado por usted mismo."
-#: ../../Zotlabs/Module/Setup.php:645
+#: ../../Zotlabs/Module/Setup.php:648
msgid ""
"This restriction is incorporated because public posts from you may for "
"example contain references to images on your own hub."
-msgstr "Se ha incorporado esta restricción para evitar que sus publicaciones públicas hagan referencia a imágenes en su propio servidor."
+msgstr "Se ha incorporado esta restricción para evitar que sus entradas públicas hagan referencia a imágenes en su propio servidor."
-#: ../../Zotlabs/Module/Setup.php:646
+#: ../../Zotlabs/Module/Setup.php:649
msgid ""
"If your certificate is not recognized, members of other sites (who may "
"themselves have valid certificates) will get a warning message on their own "
"site complaining about security issues."
msgstr "Si su certificado no ha sido reconocido, los miembros de otros sitios (con certificados válidos) recibirán mensajes de aviso en sus propios sitios web."
-#: ../../Zotlabs/Module/Setup.php:647
+#: ../../Zotlabs/Module/Setup.php:650
msgid ""
"This can cause usability issues elsewhere (not just on your own site) so we "
"must insist on this requirement."
msgstr "Por razones de compatibilidad (sobre el conjunto de la red, no solo sobre su propio sitio), debemos insistir en estos requisitos."
-#: ../../Zotlabs/Module/Setup.php:648
+#: ../../Zotlabs/Module/Setup.php:651
msgid ""
"Providers are available that issue free certificates which are browser-"
"valid."
msgstr "Existen varias Autoridades de Certificación que le pueden proporcionar certificados válidos."
-#: ../../Zotlabs/Module/Setup.php:650
+#: ../../Zotlabs/Module/Setup.php:653
msgid ""
-"If you are confident that the certificate is valid and signed by a trusted "
-"authority, check to see if you have failed to install an intermediate cert. "
-"These are not normally required by browsers, but are required for server-to-"
-"server communications."
-msgstr "Si se tiene la certeza de que el certificado es válido y está firmado por una autoridad de confianza, comprobar para ver si hubo un error al instalar un certificado intermedio. Estos no son normalmente requeridos por los navegadores, pero son necesarios para las comunicaciones de servidor a servidor."
+"Import and allow access to public content pulled from other sites. Warning: "
+"this content is unmoderated."
+msgstr "Importar y permitir acceso al contenido público sacado de otros sitios. Advertencia: este contenido no está moderado, por lo que podría encontrar cosas inapropiadas u ofensivas."
-#: ../../Zotlabs/Module/Setup.php:653
+#: ../../Zotlabs/Module/Setup.php:655
msgid "SSL certificate validation"
msgstr "validación del certificado SSL"
-#: ../../Zotlabs/Module/Setup.php:659
+#: ../../Zotlabs/Module/Setup.php:661
msgid ""
-"Url rewrite in .htaccess is not working. Check your server "
-"configuration.Test: "
-msgstr "No se pueden reescribir las direcciones web en .htaccess. Compruebe la configuración de su servidor:"
+"Present a login box to visitors on the home page if no other content has "
+"been configured."
+msgstr "Presentar a los visitantes una casilla de identificación en la página de inicio, si no se ha configurado otro tipo de contenido."
-#: ../../Zotlabs/Module/Setup.php:662
+#: ../../Zotlabs/Module/Setup.php:664
msgid "Url rewrite is working"
msgstr "La reescritura de las direcciones funciona correctamente"
-#: ../../Zotlabs/Module/Setup.php:671
+#: ../../Zotlabs/Module/Setup.php:678
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 "El fichero de configuración de la base de datos .htconfig.php no se ha podido modificar. Por favor, copie el texto generado en un fichero con ese nombre en el directorio raíz de su servidor."
+"Display contextual help for the current page when the help button is "
+"pressed."
+msgstr "Ver la ayuda contextual para la página actual cuando se pulse el botón de Ayuda."
-#: ../../Zotlabs/Module/Setup.php:695
+#: ../../Zotlabs/Module/Setup.php:702
+#: ../../extend/addon/addon/cdav/cdav.php:41
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:385
msgid "Errors encountered creating database tables."
msgstr "Se han encontrado errores al crear las tablas de la base de datos."
-#: ../../Zotlabs/Module/Setup.php:732
+#: ../../Zotlabs/Module/Setup.php:743
msgid "<h1>What next</h1>"
msgstr "<h1>Siguiente paso</h1>"
-#: ../../Zotlabs/Module/Setup.php:733
+#: ../../Zotlabs/Module/Setup.php:744
msgid ""
"IMPORTANT: You will need to [manually] setup a scheduled task for the "
"poller."
msgstr "IMPORTANTE: Debe crear [manualmente] una tarea programada para el \"poller\"."
-#: ../../Zotlabs/Module/Lostpass.php:19
-msgid "No valid account found."
-msgstr "No se ha encontrado una cuenta válida."
-
-#: ../../Zotlabs/Module/Lostpass.php:33
-msgid "Password reset request issued. Check your email."
-msgstr "Se ha recibido una solicitud de restablecimiento de contraseña. Consulte su correo electrónico."
-
-#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:107
-#, php-format
-msgid "Site Member (%s)"
-msgstr "Usuario del sitio (%s)"
-
-#: ../../Zotlabs/Module/Lostpass.php:44
-#, php-format
-msgid "Password reset requested at %s"
-msgstr "Se ha solicitado restablecer la contraseña en %s"
-
-#: ../../Zotlabs/Module/Lostpass.php:67
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado."
-
-#: ../../Zotlabs/Module/Lostpass.php:90 ../../boot.php:1747
-msgid "Password Reset"
-msgstr "Restablecer la contraseña"
-
-#: ../../Zotlabs/Module/Lostpass.php:91
-msgid "Your password has been reset as requested."
-msgstr "Su contraseña ha sido restablecida según lo solicitó."
-
-#: ../../Zotlabs/Module/Lostpass.php:92
-msgid "Your new password is"
-msgstr "Su nueva contraseña es"
-
-#: ../../Zotlabs/Module/Lostpass.php:93
-msgid "Save or copy your new password - and then"
-msgstr "Guarde o copie su nueva contraseña - y después"
-
-#: ../../Zotlabs/Module/Lostpass.php:94
-msgid "click here to login"
-msgstr "pulse aquí para conectarse"
-
-#: ../../Zotlabs/Module/Lostpass.php:95
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Puede cambiar la contraseña en la página <em>Ajustes</em> una vez iniciada la sesión."
-
-#: ../../Zotlabs/Module/Lostpass.php:112
-#, php-format
-msgid "Your password has changed at %s"
-msgstr "Su contraseña en %s ha sido cambiada"
-
-#: ../../Zotlabs/Module/Lostpass.php:127
-msgid "Forgot your Password?"
-msgstr "¿Ha olvidado su contraseña?"
-
-#: ../../Zotlabs/Module/Lostpass.php:128
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones."
-
-#: ../../Zotlabs/Module/Lostpass.php:129
-msgid "Email Address"
-msgstr "Dirección de correo electrónico"
-
-#: ../../Zotlabs/Module/Lostpass.php:130
-msgid "Reset"
-msgstr "Reiniciar"
-
-#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
-#, php-format
-msgctxt "mood"
-msgid "%1$s is %2$s"
-msgstr "%1$s está %2$s"
-
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:227
-msgid "Mood"
-msgstr "Estado de ánimo"
-
-#: ../../Zotlabs/Module/Mood.php:136
-msgid "Set your current mood and tell your friends"
-msgstr "Describir su estado de ánimo para comunicárselo a sus amigos"
-
-#: ../../Zotlabs/Module/Removeme.php:35
-msgid ""
-"Channel removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "La eliminación de canales no está permitida hasta pasadas 48 horas desde el último cambio de contraseña."
-
-#: ../../Zotlabs/Module/Removeme.php:60
-msgid "Remove This Channel"
-msgstr "Eliminar este canal"
-
-#: ../../Zotlabs/Module/Removeme.php:61
-#: ../../Zotlabs/Module/Removeaccount.php:58
-msgid "WARNING: "
-msgstr "ATENCIÓN:"
-
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This channel will be completely removed from the network. "
-msgstr "Este canal va a ser completamente eliminado de la red. "
-
-#: ../../Zotlabs/Module/Removeme.php:61
-#: ../../Zotlabs/Module/Removeaccount.php:58
-msgid "This action is permanent and can not be undone!"
-msgstr "¡Esta acción tiene carácter definitivo y no se puede deshacer!"
-
-#: ../../Zotlabs/Module/Removeme.php:62
-#: ../../Zotlabs/Module/Removeaccount.php:59
-msgid "Please enter your password for verification:"
-msgstr "Por favor, introduzca su contraseña para su verificación:"
-
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid "Remove this channel and all its clones from the network"
-msgstr "Eliminar este canal y todos sus clones de la red"
-
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid ""
-"By default only the instance of the channel located on this hub will be "
-"removed from the network"
-msgstr "Por defecto, solo la instancia del canal alojado en este servidor será eliminado de la red"
-
-#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:544
-msgid "Remove Channel"
-msgstr "Eliminar el canal"
-
-#: ../../Zotlabs/Module/Notify.php:57
-#: ../../Zotlabs/Module/Notifications.php:98
-msgid "No more system notifications."
-msgstr "No hay más notificaciones del sistema"
-
-#: ../../Zotlabs/Module/Notify.php:61
-#: ../../Zotlabs/Module/Notifications.php:102
-msgid "System Notifications"
-msgstr "Notificaciones del sistema"
-
-#: ../../Zotlabs/Module/Match.php:26
-msgid "Profile Match"
-msgstr "Perfil compatible"
-
-#: ../../Zotlabs/Module/Match.php:35
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "No hay palabras clave en el perfil principal para poder encontrar perfiles compatibles. Por favor, añada palabras clave a su perfil principal."
-
-#: ../../Zotlabs/Module/Match.php:67
-msgid "is interested in:"
-msgstr "está interesado en:"
-
-#: ../../Zotlabs/Module/Match.php:68 ../../Zotlabs/Module/Suggest.php:56
-#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1034
-#: ../../include/connections.php:78 ../../include/conversation.php:955
-#: ../../include/widgets.php:147 ../../include/widgets.php:184
-msgid "Connect"
-msgstr "Conectar"
-
-#: ../../Zotlabs/Module/Match.php:74
-msgid "No matches"
-msgstr "No se han encontrado perfiles compatibles"
+#: ../../Zotlabs/Module/Editpost.php:35
+msgid "Item is not editable"
+msgstr "El elemento no es editable"
-#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49
+#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
msgid "This site is not a directory server"
msgstr "Este sitio no es un servidor de directorio"
-#: ../../Zotlabs/Module/Dirsearch.php:33
-msgid "This directory server requires an access token"
-msgstr "El servidor de este directorio necesita un \"token\" de acceso"
-
-#: ../../Zotlabs/Module/Magic.php:71
-msgid "Hub not found."
-msgstr "Servidor no encontrado"
-
-#: ../../Zotlabs/Module/Photos.php:82
-msgid "Page owner information could not be retrieved."
-msgstr "La información del propietario de la página no pudo ser recuperada."
-
-#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:734
-#: ../../Zotlabs/Module/Profile_photo.php:115
-#: ../../Zotlabs/Module/Profile_photo.php:212
-#: ../../Zotlabs/Module/Profile_photo.php:311
-#: ../../include/photo/photo_driver.php:728
-msgid "Profile Photos"
-msgstr "Fotos del perfil"
-
-#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
-msgid "Album not found."
-msgstr "Álbum no encontrado."
-
-#: ../../Zotlabs/Module/Photos.php:112
-msgid "Delete Album"
-msgstr "Borrar álbum"
+#: ../../Zotlabs/Module/New_channel.php:140
+msgid "Create Channel"
+msgstr "Crear un canal"
-#: ../../Zotlabs/Module/Photos.php:133
+#: ../../Zotlabs/Module/New_channel.php:141
msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
-msgstr "Hay varias carpetas con este nombre de álbum, pero dentro de diferentes directorios. Por favor, elimine la carpeta o carpetas que desee utilizando el administrador de ficheros"
-
-#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1059
-msgid "Delete Photo"
-msgstr "Borrar foto"
-
-#: ../../Zotlabs/Module/Photos.php:509 ../../Zotlabs/Module/Display.php:17
-#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Search.php:17
-#: ../../Zotlabs/Module/Viewconnections.php:23
-#: ../../Zotlabs/Module/Directory.php:63
-msgid "Public access denied."
-msgstr "Acceso público denegado."
-
-#: ../../Zotlabs/Module/Photos.php:520
-msgid "No photos selected"
-msgstr "No hay fotos seleccionadas"
-
-#: ../../Zotlabs/Module/Photos.php:569
-msgid "Access to this item is restricted."
-msgstr "El acceso a este elemento está restringido."
-
-#: ../../Zotlabs/Module/Photos.php:608
-#, php-format
-msgid "%1$.2f MB of %2$.2f MB photo storage used."
-msgstr "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado."
-
-#: ../../Zotlabs/Module/Photos.php:611
-#, php-format
-msgid "%1$.2f MB photo storage used."
-msgstr "%1$.2f MB de almacenamiento de fotos utilizado."
-
-#: ../../Zotlabs/Module/Photos.php:647
-msgid "Upload Photos"
-msgstr "Subir fotos"
-
-#: ../../Zotlabs/Module/Photos.php:651
-msgid "Enter an album name"
-msgstr "Introducir un nombre de álbum"
-
-#: ../../Zotlabs/Module/Photos.php:652
-msgid "or select an existing album (doubleclick)"
-msgstr "o seleccionar uno existente (doble click)"
-
-#: ../../Zotlabs/Module/Photos.php:653
-msgid "Create a status post for this upload"
-msgstr "Crear un mensaje de estado para esta subida"
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
+msgstr "Un canal es su identidad en esta red. Puede representar a una persona, un blog o un foro, por nombrar unos pocos ejemplos. Los canales se pueden conectar con otros canales para compartir información con una gama de permisos extremadamente detallada."
-#: ../../Zotlabs/Module/Photos.php:654
-msgid "Caption (optional):"
-msgstr "Título (opcional):"
+#: ../../Zotlabs/Module/New_channel.php:142
+msgid ""
+"or <a href=\"import\">import an existing channel</a> from another location."
+msgstr "O <a href=\"import\">importar un canal existente</a> desde otro lugar."
-#: ../../Zotlabs/Module/Photos.php:655
-msgid "Description (optional):"
-msgstr "Descripción (opcional):"
+#: ../../Zotlabs/Module/Notifications.php:40 ../../include/nav.php:194
+msgid "Mark all system notifications seen"
+msgstr "Marcar todas las notificaciones de sistema como leídas"
-#: ../../Zotlabs/Module/Photos.php:686
-msgid "Album name could not be decoded"
-msgstr "El nombre del álbum no ha podido ser descifrado"
+#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:230
+#: ../../include/conversation.php:941
+msgid "Poke"
+msgstr "Toques y otras cosas"
-#: ../../Zotlabs/Module/Photos.php:734
-msgid "Contact Photos"
-msgstr "Fotos de contacto"
+#: ../../Zotlabs/Module/Poke.php:169
+msgid "Poke somebody"
+msgstr "Dar un toque a alguien"
-#: ../../Zotlabs/Module/Photos.php:757
-msgid "Show Newest First"
-msgstr "Mostrar lo más reciente primero"
+#: ../../Zotlabs/Module/Poke.php:172
+msgid "Poke/Prod"
+msgstr "Toque/Incitación"
-#: ../../Zotlabs/Module/Photos.php:759
-msgid "Show Oldest First"
-msgstr "Mostrar lo más antiguo primero"
+#: ../../Zotlabs/Module/Poke.php:173
+msgid "Poke, prod or do other things to somebody"
+msgstr "Dar un toque, incitar o hacer otras cosas a alguien"
-#: ../../Zotlabs/Module/Photos.php:783 ../../Zotlabs/Module/Photos.php:1337
-#: ../../Zotlabs/Module/Embedphotos.php:141 ../../include/widgets.php:1677
-msgid "View Photo"
-msgstr "Ver foto"
+#: ../../Zotlabs/Module/Poke.php:180
+msgid "Recipient"
+msgstr "Destinatario"
-#: ../../Zotlabs/Module/Photos.php:814
-#: ../../Zotlabs/Module/Embedphotos.php:157 ../../include/widgets.php:1694
-msgid "Edit Album"
-msgstr "Editar álbum"
+#: ../../Zotlabs/Module/Poke.php:181
+msgid "Choose what you wish to do to recipient"
+msgstr "Elegir qué desea enviar al destinatario"
-#: ../../Zotlabs/Module/Photos.php:861
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Permiso denegado. El acceso a este elemento puede estar restringido."
+#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+msgid "Make this post private"
+msgstr "Convertir en privado este envío"
-#: ../../Zotlabs/Module/Photos.php:863
-msgid "Photo not available"
-msgstr "Foto no disponible"
+#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:183
+#: ../../Zotlabs/Module/Profiles.php:240 ../../Zotlabs/Module/Profiles.php:619
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62
+msgid "Profile not found."
+msgstr "Perfil no encontrado."
-#: ../../Zotlabs/Module/Photos.php:921
-msgid "Use as profile photo"
-msgstr "Usar como foto del perfil"
+#: ../../Zotlabs/Module/Profiles.php:44
+msgid "Profile deleted."
+msgstr "Perfil eliminado."
-#: ../../Zotlabs/Module/Photos.php:922
-msgid "Use as cover photo"
-msgstr "Usar como imagen de portada del perfil"
+#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:104
+msgid "Profile-"
+msgstr "Perfil-"
-#: ../../Zotlabs/Module/Photos.php:929
-msgid "Private Photo"
-msgstr "Foto privada"
+#: ../../Zotlabs/Module/Profiles.php:89 ../../Zotlabs/Module/Profiles.php:126
+msgid "New profile created."
+msgstr "El nuevo perfil ha sido creado."
-#: ../../Zotlabs/Module/Photos.php:940 ../../Zotlabs/Module/Cal.php:332
-#: ../../Zotlabs/Module/Cal.php:339 ../../Zotlabs/Module/Events.php:675
-#: ../../Zotlabs/Module/Events.php:684
-msgid "Previous"
-msgstr "Anterior"
+#: ../../Zotlabs/Module/Profiles.php:110
+msgid "Profile unavailable to clone."
+msgstr "Perfil no disponible para clonar."
-#: ../../Zotlabs/Module/Photos.php:944
-msgid "View Full Size"
-msgstr "Ver tamaño completo"
+#: ../../Zotlabs/Module/Profiles.php:145
+msgid "Profile unavailable to export."
+msgstr "Perfil no disponible para exportar."
-#: ../../Zotlabs/Module/Photos.php:1033
-msgid "Edit photo"
-msgstr "Editar foto"
+#: ../../Zotlabs/Module/Profiles.php:250
+msgid "Profile Name is required."
+msgstr "Se necesita el nombre del perfil."
-#: ../../Zotlabs/Module/Photos.php:1035
-msgid "Rotate CW (right)"
-msgstr "Girar CW (a la derecha)"
+#: ../../Zotlabs/Module/Profiles.php:421
+msgid "Marital Status"
+msgstr "Estado civil"
-#: ../../Zotlabs/Module/Photos.php:1036
-msgid "Rotate CCW (left)"
-msgstr "Girar CCW (a la izquierda)"
+#: ../../Zotlabs/Module/Profiles.php:425
+msgid "Romantic Partner"
+msgstr "Pareja sentimental"
-#: ../../Zotlabs/Module/Photos.php:1039
-msgid "Move photo to album"
-msgstr "Mover la foto a un álbum"
+#: ../../Zotlabs/Module/Profiles.php:429 ../../Zotlabs/Module/Profiles.php:730
+msgid "Likes"
+msgstr "Me gusta"
-#: ../../Zotlabs/Module/Photos.php:1040
-msgid "Enter a new album name"
-msgstr "Introducir un nuevo nombre de álbum"
+#: ../../Zotlabs/Module/Profiles.php:433 ../../Zotlabs/Module/Profiles.php:731
+msgid "Dislikes"
+msgstr "No me gusta"
-#: ../../Zotlabs/Module/Photos.php:1041
-msgid "or select an existing one (doubleclick)"
-msgstr "o seleccionar uno (doble click) existente"
+#: ../../Zotlabs/Module/Profiles.php:437 ../../Zotlabs/Module/Profiles.php:738
+msgid "Work/Employment"
+msgstr "Trabajo:"
-#: ../../Zotlabs/Module/Photos.php:1044
-msgid "Caption"
-msgstr "Título"
+#: ../../Zotlabs/Module/Profiles.php:440
+msgid "Religion"
+msgstr "Religión"
-#: ../../Zotlabs/Module/Photos.php:1046
-msgid "Add a Tag"
-msgstr "Añadir una etiqueta"
+#: ../../Zotlabs/Module/Profiles.php:444
+msgid "Political Views"
+msgstr "Ideas políticas"
-#: ../../Zotlabs/Module/Photos.php:1054
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
-msgstr "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com"
+#: ../../Zotlabs/Module/Profiles.php:448
+#: ../../extend/addon/addon/openid/MysqlProvider.php:74
+msgid "Gender"
+msgstr "Género"
-#: ../../Zotlabs/Module/Photos.php:1057
-msgid "Flag as adult in album view"
-msgstr "Marcar como \"solo para adultos\" en el álbum"
+#: ../../Zotlabs/Module/Profiles.php:452
+msgid "Sexual Preference"
+msgstr "Preferencia sexual"
-#: ../../Zotlabs/Module/Photos.php:1076 ../../Zotlabs/Lib/ThreadItem.php:268
-msgid "I like this (toggle)"
-msgstr "Me gusta (cambiar)"
+#: ../../Zotlabs/Module/Profiles.php:456
+msgid "Homepage"
+msgstr "Página personal"
-#: ../../Zotlabs/Module/Photos.php:1077 ../../Zotlabs/Lib/ThreadItem.php:269
-msgid "I don't like this (toggle)"
-msgstr "No me gusta esto (cambiar)"
+#: ../../Zotlabs/Module/Profiles.php:460
+msgid "Interests"
+msgstr "Intereses"
-#: ../../Zotlabs/Module/Photos.php:1078 ../../Zotlabs/Module/Blocks.php:161
-#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Webpages.php:241
-#: ../../include/conversation.php:1232
-msgid "Share"
-msgstr "Compartir"
+#: ../../Zotlabs/Module/Profiles.php:554
+msgid "Profile updated."
+msgstr "Perfil actualizado."
-#: ../../Zotlabs/Module/Photos.php:1079 ../../Zotlabs/Lib/ThreadItem.php:405
-#: ../../include/conversation.php:741
-msgid "Please wait"
-msgstr "Espere por favor"
+#: ../../Zotlabs/Module/Profiles.php:638
+msgid "Hide your connections list from viewers of this profile"
+msgstr "Ocultar la lista de conexiones a los visitantes del perfil"
-#: ../../Zotlabs/Module/Photos.php:1095 ../../Zotlabs/Module/Photos.php:1213
-#: ../../Zotlabs/Lib/ThreadItem.php:722
-msgid "This is you"
-msgstr "Este es usted"
+#: ../../Zotlabs/Module/Profiles.php:680
+msgid "Edit Profile Details"
+msgstr "Modificar los detalles de este perfil"
-#: ../../Zotlabs/Module/Photos.php:1097 ../../Zotlabs/Module/Photos.php:1215
-#: ../../Zotlabs/Lib/ThreadItem.php:724 ../../include/js_strings.php:6
-msgid "Comment"
-msgstr "Comentar"
+#: ../../Zotlabs/Module/Profiles.php:682
+msgid "View this profile"
+msgstr "Ver este perfil"
-#: ../../Zotlabs/Module/Photos.php:1099 ../../Zotlabs/Module/Webpages.php:247
-#: ../../Zotlabs/Module/Events.php:473 ../../Zotlabs/Lib/ThreadItem.php:734
-#: ../../include/page_widgets.php:43 ../../include/conversation.php:1201
-msgid "Preview"
-msgstr "Previsualizar"
+#: ../../Zotlabs/Module/Profiles.php:683 ../../Zotlabs/Module/Profiles.php:765
+#: ../../include/channel.php:983
+msgid "Edit visibility"
+msgstr "Editar visibilidad"
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Likes"
-msgstr "Me gusta"
+#: ../../Zotlabs/Module/Profiles.php:684
+msgid "Profile Tools"
+msgstr "Gestión del perfil"
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Dislikes"
-msgstr "No me gusta"
+#: ../../Zotlabs/Module/Profiles.php:685
+msgid "Change cover photo"
+msgstr "Cambiar la imagen de portada del perfil"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Agree"
-msgstr "De acuerdo"
+#: ../../Zotlabs/Module/Profiles.php:686 ../../include/channel.php:954
+msgid "Change profile photo"
+msgstr "Cambiar la foto del perfil"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Disagree"
-msgstr "En desacuerdo"
+#: ../../Zotlabs/Module/Profiles.php:687
+msgid "Create a new profile using these settings"
+msgstr "Crear un nuevo perfil usando estos ajustes"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Abstain"
-msgstr "Abstención"
+#: ../../Zotlabs/Module/Profiles.php:688
+msgid "Clone this profile"
+msgstr "Clonar este perfil"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Attending"
-msgstr "Participaré"
+#: ../../Zotlabs/Module/Profiles.php:689
+msgid "Delete this profile"
+msgstr "Eliminar este perfil"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Not attending"
-msgstr "No participaré"
+#: ../../Zotlabs/Module/Profiles.php:690
+msgid "Add profile things"
+msgstr "Añadir cosas al perfil"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Might attend"
-msgstr "Quizá participe"
+#: ../../Zotlabs/Module/Profiles.php:691 ../../include/widgets.php:105
+#: ../../include/conversation.php:1567
+msgid "Personal"
+msgstr "Personales"
-#: ../../Zotlabs/Module/Photos.php:1132 ../../Zotlabs/Module/Photos.php:1144
-#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
-#: ../../include/conversation.php:1763
-msgid "View all"
-msgstr "Ver todo"
+#: ../../Zotlabs/Module/Profiles.php:693
+msgid "Relation"
+msgstr "Relación"
-#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:190
-#: ../../include/channel.php:1182 ../../include/conversation.php:1787
-#: ../../include/taxonomy.php:403
-msgctxt "noun"
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] "Me gusta"
-msgstr[1] "Me gusta"
+#: ../../Zotlabs/Module/Profiles.php:694 ../../include/datetime.php:55
+msgid "Miscellaneous"
+msgstr "Varios"
-#: ../../Zotlabs/Module/Photos.php:1141 ../../Zotlabs/Lib/ThreadItem.php:195
-#: ../../include/conversation.php:1790
-msgctxt "noun"
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] "No me gusta"
-msgstr[1] "No me gusta"
+#: ../../Zotlabs/Module/Profiles.php:696
+msgid "Import profile from file"
+msgstr "Importar perfil desde un fichero"
-#: ../../Zotlabs/Module/Photos.php:1241
-msgid "Photo Tools"
-msgstr "Gestión de las fotos"
+#: ../../Zotlabs/Module/Profiles.php:697
+msgid "Export profile to file"
+msgstr "Exportar perfil a un fichero"
-#: ../../Zotlabs/Module/Photos.php:1250
-msgid "In This Photo:"
-msgstr "En esta foto:"
+#: ../../Zotlabs/Module/Profiles.php:698
+msgid "Your gender"
+msgstr "Género"
-#: ../../Zotlabs/Module/Photos.php:1255
-msgid "Map"
-msgstr "Mapa"
+#: ../../Zotlabs/Module/Profiles.php:699
+msgid "Marital status"
+msgstr "Estado civil"
-#: ../../Zotlabs/Module/Photos.php:1263 ../../Zotlabs/Lib/ThreadItem.php:394
-msgctxt "noun"
-msgid "Likes"
-msgstr "Me gusta"
+#: ../../Zotlabs/Module/Profiles.php:700
+msgid "Sexual preference"
+msgstr "Preferencia sexual"
-#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:395
-msgctxt "noun"
-msgid "Dislikes"
-msgstr "No me gusta"
+#: ../../Zotlabs/Module/Profiles.php:703
+msgid "Profile name"
+msgstr "Nombre del perfil"
-#: ../../Zotlabs/Module/Photos.php:1269 ../../Zotlabs/Lib/ThreadItem.php:400
-#: ../../include/acl_selectors.php:181
-msgid "Close"
-msgstr "Cerrar"
+#: ../../Zotlabs/Module/Profiles.php:705
+msgid "This is your default profile."
+msgstr "Este es su perfil principal."
-#: ../../Zotlabs/Module/Photos.php:1343
-msgid "View Album"
-msgstr "Ver álbum"
+#: ../../Zotlabs/Module/Profiles.php:707
+msgid "Your full name"
+msgstr "Nombre completo"
-#: ../../Zotlabs/Module/Photos.php:1354 ../../Zotlabs/Module/Photos.php:1367
-#: ../../Zotlabs/Module/Photos.php:1368
-msgid "Recent Photos"
-msgstr "Fotos recientes"
+#: ../../Zotlabs/Module/Profiles.php:708
+msgid "Title/Description"
+msgstr "Título o descripción"
-#: ../../Zotlabs/Module/New_channel.php:134
-#: ../../Zotlabs/Module/Register.php:237
-msgid "Name or caption"
-msgstr "Nombre o descripción"
+#: ../../Zotlabs/Module/Profiles.php:711
+msgid "Street address"
+msgstr "Dirección"
-#: ../../Zotlabs/Module/New_channel.php:134
-#: ../../Zotlabs/Module/Register.php:237
-msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
-msgstr "Ejemplos: \"Juan García\", \"Luisa y sus caballos\", \"Fútbol\", \"Grupo de aviación\""
+#: ../../Zotlabs/Module/Profiles.php:712
+msgid "Locality/City"
+msgstr "Ciudad"
-#: ../../Zotlabs/Module/New_channel.php:136
-#: ../../Zotlabs/Module/Register.php:239
-msgid "Choose a short nickname"
-msgstr "Elija un alias corto"
+#: ../../Zotlabs/Module/Profiles.php:713
+msgid "Region/State"
+msgstr "Región o Estado"
-#: ../../Zotlabs/Module/New_channel.php:136
-#: ../../Zotlabs/Module/Register.php:239
-#, php-format
-msgid ""
-"Your nickname will be used to create an easy to remember channel address "
-"e.g. nickname%s"
-msgstr "Su alias se usará para crear una dirección de canal fácil de recordar, p. ej.: alias%s"
+#: ../../Zotlabs/Module/Profiles.php:714
+msgid "Postal/Zip code"
+msgstr "Código postal"
-#: ../../Zotlabs/Module/New_channel.php:137
-#: ../../Zotlabs/Module/Register.php:240
-msgid "Channel role and privacy"
-msgstr "Clase de canal y privacidad"
+#: ../../Zotlabs/Module/Profiles.php:715
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161
+msgid "Country"
+msgstr "País"
-#: ../../Zotlabs/Module/New_channel.php:137
-#: ../../Zotlabs/Module/Register.php:240
-msgid "Select a channel role with your privacy requirements."
-msgstr "Seleccione un tipo de canal con sus requisitos de privacidad"
+#: ../../Zotlabs/Module/Profiles.php:720
+msgid "Who (if applicable)"
+msgstr "Quién (si es pertinente)"
-#: ../../Zotlabs/Module/New_channel.php:137
-#: ../../Zotlabs/Module/Register.php:240
-msgid "Read more about roles"
-msgstr "Leer más sobre los roles"
+#: ../../Zotlabs/Module/Profiles.php:720
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Por ejemplo: ana123, María González, sara@ejemplo.com"
-#: ../../Zotlabs/Module/New_channel.php:140
-msgid "Create Channel"
-msgstr "Crear un canal"
+#: ../../Zotlabs/Module/Profiles.php:721
+msgid "Since (date)"
+msgstr "Desde (fecha)"
-#: ../../Zotlabs/Module/New_channel.php:141
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
-msgstr "Un canal es su identidad en esta red. Puede representar a una persona, un blog o un foro, por nombrar unos pocos ejemplos. Los canales se pueden conectar con otros canales para compartir información con una gama de permisos extremadamente detallada."
+#: ../../Zotlabs/Module/Profiles.php:724
+msgid "Tell us about yourself"
+msgstr "Háblenos de usted"
-#: ../../Zotlabs/Module/New_channel.php:142
-msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
-msgstr "O <a href=\"import\">importar un canal existente</a> desde otro lugar."
+#: ../../Zotlabs/Module/Profiles.php:725
+#: ../../extend/addon/addon/openid/MysqlProvider.php:68
+msgid "Homepage URL"
+msgstr "Dirección de la página personal"
-#: ../../Zotlabs/Module/Ping.php:265
-msgid "sent you a private message"
-msgstr "le ha enviado un mensaje privado"
+#: ../../Zotlabs/Module/Profiles.php:726
+msgid "Hometown"
+msgstr "Lugar de nacimiento"
-#: ../../Zotlabs/Module/Ping.php:313
-msgid "added your channel"
-msgstr "añadió este canal a sus conexiones"
+#: ../../Zotlabs/Module/Profiles.php:727
+msgid "Political views"
+msgstr "Ideas políticas"
-#: ../../Zotlabs/Module/Ping.php:323
-msgid "g A l F d"
-msgstr "g A l d F"
+#: ../../Zotlabs/Module/Profiles.php:728
+msgid "Religious views"
+msgstr "Creencias religiosas"
-#: ../../Zotlabs/Module/Ping.php:346
-msgid "[today]"
-msgstr "[hoy]"
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Keywords used in directory listings"
+msgstr "Palabras clave utilizadas en los listados de directorios"
-#: ../../Zotlabs/Module/Ping.php:355
-msgid "posted an event"
-msgstr "publicó un evento"
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Example: fishing photography software"
+msgstr "Por ejemplo: software de fotografía submarina"
-#: ../../Zotlabs/Module/Notifications.php:30
-msgid "Invalid request identifier."
-msgstr "Petición inválida del identificador."
+#: ../../Zotlabs/Module/Profiles.php:732
+msgid "Musical interests"
+msgstr "Preferencias musicales"
-#: ../../Zotlabs/Module/Notifications.php:39
-msgid "Discard"
-msgstr "Descartar"
+#: ../../Zotlabs/Module/Profiles.php:733
+msgid "Books, literature"
+msgstr "Libros, literatura"
-#: ../../Zotlabs/Module/Notifications.php:103 ../../include/nav.php:196
-msgid "Mark all system notifications seen"
-msgstr "Marcar todas las notificaciones de sistema como leídas"
+#: ../../Zotlabs/Module/Profiles.php:734
+msgid "Television"
+msgstr "Televisión"
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:228
-#: ../../include/conversation.php:959
-msgid "Poke"
-msgstr "Toques y otras cosas"
+#: ../../Zotlabs/Module/Profiles.php:735
+msgid "Film/Dance/Culture/Entertainment"
+msgstr "Cine, danza, cultura, entretenimiento"
-#: ../../Zotlabs/Module/Poke.php:169
-msgid "Poke somebody"
-msgstr "Dar un toque a alguien"
+#: ../../Zotlabs/Module/Profiles.php:736
+msgid "Hobbies/Interests"
+msgstr "Aficiones o intereses"
-#: ../../Zotlabs/Module/Poke.php:172
-msgid "Poke/Prod"
-msgstr "Toque/Incitación"
+#: ../../Zotlabs/Module/Profiles.php:737
+msgid "Love/Romance"
+msgstr "Vida sentimental o amorosa"
-#: ../../Zotlabs/Module/Poke.php:173
-msgid "Poke, prod or do other things to somebody"
-msgstr "Dar un toque, incitar o hacer otras cosas a alguien"
+#: ../../Zotlabs/Module/Profiles.php:739
+msgid "School/Education"
+msgstr "Estudios"
-#: ../../Zotlabs/Module/Poke.php:180
-msgid "Recipient"
-msgstr "Destinatario"
+#: ../../Zotlabs/Module/Profiles.php:740
+msgid "Contact information and social networks"
+msgstr "Información de contacto y redes sociales"
-#: ../../Zotlabs/Module/Poke.php:181
-msgid "Choose what you wish to do to recipient"
-msgstr "Elegir qué desea enviar al destinatario"
+#: ../../Zotlabs/Module/Profiles.php:741
+msgid "My other channels"
+msgstr "Mis otros canales"
-#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
-msgid "Make this post private"
-msgstr "Convertir en privado este envío"
+#: ../../Zotlabs/Module/Profiles.php:761 ../../include/channel.php:979
+msgid "Profile Image"
+msgstr "Imagen del perfil"
-#: ../../Zotlabs/Module/Apps.php:46 ../../include/nav.php:168
-#: ../../include/widgets.php:102
-msgid "Apps"
-msgstr "Aplicaciones (apps)"
+#: ../../Zotlabs/Module/Profiles.php:771 ../../include/channel.php:961
+#: ../../include/nav.php:91
+msgid "Edit Profiles"
+msgstr "Editar perfiles"
#: ../../Zotlabs/Module/Oexchange.php:27
msgid "Unable to find your hub."
@@ -4765,26 +4966,6 @@ msgstr "No se puede encontrar su servidor."
msgid "Post successful."
msgstr "Enviado con éxito."
-#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
-msgid "Invalid profile identifier."
-msgstr "Identificador del perfil no válido"
-
-#: ../../Zotlabs/Module/Profperm.php:115
-msgid "Profile Visibility Editor"
-msgstr "Editor de visibilidad del perfil"
-
-#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1274
-msgid "Profile"
-msgstr "Perfil"
-
-#: ../../Zotlabs/Module/Profperm.php:119
-msgid "Click on a contact to add or remove."
-msgstr "Pulsar en un contacto para añadirlo o eliminarlo."
-
-#: ../../Zotlabs/Module/Profperm.php:128
-msgid "Visible To"
-msgstr "Visible para"
-
#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
msgid "This setting requires special processing and editing has been blocked."
msgstr "Este ajuste necesita de un proceso especial y la edición ha sido bloqueada."
@@ -4800,85 +4981,7 @@ msgid ""
" to correctly use this feature."
msgstr "Atención: El cambio de algunos ajustes puede volver inutilizable su canal. Por favor, abandone la página excepto que esté seguro y sepa cómo usar correctamente esta característica."
-#: ../../Zotlabs/Module/Api.php:60 ../../Zotlabs/Module/Api.php:81
-msgid "Authorize application connection"
-msgstr "Autorizar una conexión de aplicación"
-
-#: ../../Zotlabs/Module/Api.php:61
-msgid "Return to your app and insert this Security Code:"
-msgstr "Volver a su aplicación e introducir este código de seguridad:"
-
-#: ../../Zotlabs/Module/Api.php:71
-msgid "Please login to continue."
-msgstr "Por favor inicie sesión para continuar."
-
-#: ../../Zotlabs/Module/Api.php:83
-msgid ""
-"Warning: Changing some settings could render your channel inoperable. Please"
-" leave this page unless you are comfortable with and knowledgeable about how"
-" to correctly use this feature."
-msgstr "Atención: El cambio de algunos ajustes puede volver inutilizable su canal. Por favor, abandone la página excepto que esté seguro y sepa cómo usar correctamente esta característica."
-
-#: ../../Zotlabs/Module/Siteinfo.php:19
-#, php-format
-msgid "Version %s"
-msgstr "Versión %s"
-
-#: ../../Zotlabs/Module/Siteinfo.php:34
-msgid "Installed plugins/addons/apps:"
-msgstr "Extensiones (plugins), complementos o aplicaciones (apps) instaladas:"
-
-#: ../../Zotlabs/Module/Siteinfo.php:36
-msgid "No installed plugins/addons/apps"
-msgstr "No hay instalada ninguna extensión (plugin), complemento o aplicación (app)"
-
-#: ../../Zotlabs/Module/Siteinfo.php:49
-msgid ""
-"This is a hub of $Projectname - a global cooperative network of "
-"decentralized privacy enhanced websites."
-msgstr "Este es un sitio integrado en $Projectname - una red cooperativa mundial de sitios web descentralizados de privacidad mejorada."
-
-#: ../../Zotlabs/Module/Siteinfo.php:51
-msgid "Tag: "
-msgstr "Etiqueta:"
-
-#: ../../Zotlabs/Module/Siteinfo.php:53
-msgid "Last background fetch: "
-msgstr "Última actualización en segundo plano:"
-
-#: ../../Zotlabs/Module/Siteinfo.php:55
-msgid "Current load average: "
-msgstr "Carga media actual:"
-
-#: ../../Zotlabs/Module/Siteinfo.php:58
-msgid "Running at web location"
-msgstr "Corriendo en el sitio web"
-
-#: ../../Zotlabs/Module/Siteinfo.php:59
-msgid ""
-"Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more "
-"about $Projectname."
-msgstr "Por favor, visite <a href=\"http://hubzilla.org\">hubzilla.org</a> para más información sobre $Projectname."
-
-#: ../../Zotlabs/Module/Siteinfo.php:60
-msgid "Bug reports and issues: please visit"
-msgstr "Informes de errores e incidencias: por favor visite"
-
-#: ../../Zotlabs/Module/Siteinfo.php:62
-msgid "$projectname issues"
-msgstr "Problemas en $projectname"
-
-#: ../../Zotlabs/Module/Siteinfo.php:63
-msgid ""
-"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
-"com"
-msgstr "Sugerencias, elogios, etc - por favor, un correo electrónico a \"redmatrix\" en librelist - punto com"
-
-#: ../../Zotlabs/Module/Siteinfo.php:65
-msgid "Site Administrators"
-msgstr "Administradores del sitio"
-
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2308
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2270
msgid "Blocks"
msgstr "Bloques"
@@ -4886,13 +4989,13 @@ msgstr "Bloques"
msgid "Block Title"
msgstr "Título del bloque"
-#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2310
+#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2272
msgid "Layouts"
msgstr "Plantillas"
-#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:225
-#: ../../include/help.php:47 ../../include/help.php:52
-#: ../../include/nav.php:164
+#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:227
+#: ../../include/nav.php:162 ../../include/help.php:53
+#: ../../include/help.php:59
msgid "Help"
msgstr "Ayuda"
@@ -4908,99 +5011,158 @@ msgstr "Descripción de la plantilla"
msgid "Download PDL file"
msgstr "Descargar el fichero PDL"
-#: ../../Zotlabs/Module/Admin.php:97
-msgid "# Accounts"
-msgstr "# Cuentas"
+#: ../../Zotlabs/Module/Rate.php:156
+msgid "Website:"
+msgstr "Sitio web:"
-#: ../../Zotlabs/Module/Admin.php:98
-msgid "# blocked accounts"
-msgstr "# cuentas bloqueadas"
+#: ../../Zotlabs/Module/Rate.php:159
+#, php-format
+msgid "Remote Channel [%s] (not yet known on this site)"
+msgstr "Canal remoto [%s] (aún no es conocido en este sitio)"
-#: ../../Zotlabs/Module/Admin.php:99
-msgid "# expired accounts"
-msgstr "# cuentas caducadas"
+#: ../../Zotlabs/Module/Rate.php:160
+msgid "Rating (this information is public)"
+msgstr "Valoración (esta información es pública)"
-#: ../../Zotlabs/Module/Admin.php:100
-msgid "# expiring accounts"
-msgstr "# cuentas que caducan"
+#: ../../Zotlabs/Module/Rate.php:161
+msgid "Optionally explain your rating (this information is public)"
+msgstr "Opcionalmente puede explicar su valoración (esta información es pública)"
-#: ../../Zotlabs/Module/Admin.php:111
-msgid "# Channels"
-msgstr "# Canales"
+#: ../../Zotlabs/Module/Like.php:19
+msgid "Like/Dislike"
+msgstr "Me gusta/No me gusta"
-#: ../../Zotlabs/Module/Admin.php:112
-msgid "# primary"
-msgstr "# primario"
+#: ../../Zotlabs/Module/Like.php:24
+msgid "This action is restricted to members."
+msgstr "Esta acción está restringida solo para miembros."
-#: ../../Zotlabs/Module/Admin.php:113
-msgid "# clones"
-msgstr "# clones"
+#: ../../Zotlabs/Module/Like.php:25
+msgid ""
+"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
+"href=\"register\">register as a new $Projectname member</a> to continue."
+msgstr "Por favor, <a href=\"rmagic\">identifíquese con su $Projectname ID</a> o <a href=\"register\">rregístrese como un nuevo $Projectname member</a> para continuar."
-#: ../../Zotlabs/Module/Admin.php:119
-msgid "Message queues"
-msgstr "Mensajes en cola"
+#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
+#: ../../Zotlabs/Module/Like.php:169
+msgid "Invalid request."
+msgstr "Solicitud incorrecta."
-#: ../../Zotlabs/Module/Admin.php:136
-msgid "Your software should be updated"
-msgstr "Debe actualizar su software"
+#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
+msgid "channel"
+msgstr "el canal"
-#: ../../Zotlabs/Module/Admin.php:142
-msgid "Summary"
-msgstr "Sumario"
+#: ../../Zotlabs/Module/Like.php:146
+msgid "thing"
+msgstr "elemento"
-#: ../../Zotlabs/Module/Admin.php:145
-msgid "Registered accounts"
-msgstr "Cuentas registradas"
+#: ../../Zotlabs/Module/Like.php:192
+msgid "Channel unavailable."
+msgstr "Canal no disponible."
-#: ../../Zotlabs/Module/Admin.php:146
-msgid "Pending registrations"
-msgstr "Registros pendientes"
+#: ../../Zotlabs/Module/Like.php:240
+msgid "Previous action reversed."
+msgstr "Acción anterior revocada."
-#: ../../Zotlabs/Module/Admin.php:147
-msgid "Registered channels"
-msgstr "Canales registrados"
+#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
+#: ../../Zotlabs/Module/Tagger.php:47
+#: ../../extend/addon/addon/diaspora/inbound.php:1794
+#: ../../extend/addon/addon/redphotos/redphotohelper.php:74
+#: ../../include/text.php:1940 ../../include/conversation.php:120
+msgid "photo"
+msgstr "foto"
-#: ../../Zotlabs/Module/Admin.php:148
-msgid "Active plugins"
-msgstr "Extensiones (plugins) activas"
+#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
+#: ../../extend/addon/addon/diaspora/inbound.php:1794
+#: ../../include/text.php:1946 ../../include/conversation.php:148
+msgid "status"
+msgstr "el mensaje de estado"
-#: ../../Zotlabs/Module/Admin.php:149
-msgid "Version"
-msgstr "Versión"
+#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Tagger.php:51
+#: ../../Zotlabs/Module/Events.php:256 ../../include/text.php:1943
+#: ../../include/event.php:961 ../../include/conversation.php:123
+msgid "event"
+msgstr "evento"
-#: ../../Zotlabs/Module/Admin.php:150
-msgid "Repository version (master)"
-msgstr "Versión del repositorio (master)"
+#: ../../Zotlabs/Module/Like.php:419
+#: ../../extend/addon/addon/diaspora/inbound.php:1823
+#: ../../include/conversation.php:164
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "A %1$s le gusta %3$s de %2$s"
-#: ../../Zotlabs/Module/Admin.php:151
-msgid "Repository version (dev)"
-msgstr "Versión del repositorio (dev)"
+#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "A %1$s no le gusta %3$s de %2$s"
-#: ../../Zotlabs/Module/Profile_photo.php:115
-#: ../../Zotlabs/Module/Profile_photo.php:212
-#: ../../Zotlabs/Module/Profile_photo.php:311
-#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:745
-#: ../../include/photo/photo_driver.php:718
-msgid "Profile Photos"
-msgstr "Fotos del perfil"
+#: ../../Zotlabs/Module/Like.php:423
+#, php-format
+msgid "%1$s agrees with %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s está de acuerdo"
+
+#: ../../Zotlabs/Module/Like.php:425
+#, php-format
+msgid "%1$s doesn't agree with %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s no está de acuerdo"
+
+#: ../../Zotlabs/Module/Like.php:427
+#, php-format
+msgid "%1$s abstains from a decision on %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s se abstiene"
+
+#: ../../Zotlabs/Module/Like.php:429
+#, php-format
+msgid "%1$s is attending %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s participa"
+
+#: ../../Zotlabs/Module/Like.php:431
+#, php-format
+msgid "%1$s is not attending %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s no participa"
+
+#: ../../Zotlabs/Module/Like.php:433
+#, php-format
+msgid "%1$s may attend %2$s's %3$s"
+msgstr "%3$s de %2$s: %1$s quizá participe"
+
+#: ../../Zotlabs/Module/Like.php:538
+msgid "Action completed."
+msgstr "Acción completada."
+
+#: ../../Zotlabs/Module/Like.php:539
+msgid "Thank you."
+msgstr "Gracias."
#: ../../Zotlabs/Module/Profile_photo.php:186
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:293
msgid ""
"Shift-reload the page or clear browser cache if the new photo does not "
"display immediately."
msgstr "Recargue la página o limpie el caché del navegador si la nueva foto no se muestra inmediatamente."
-#: ../../Zotlabs/Module/Profile_photo.php:389
+#: ../../Zotlabs/Module/Profile_photo.php:409
+msgid "Use Photo for Profile"
+msgstr "Usar la fotografía para el perfil"
+
+#: ../../Zotlabs/Module/Profile_photo.php:409
msgid "Upload Profile Photo"
msgstr "Subir foto de perfil"
-#: ../../Zotlabs/Module/Cal.php:69
-msgid "Permissions denied."
-msgstr "Permisos denegados."
+#: ../../Zotlabs/Module/Profile_photo.php:410
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:181
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:193
+msgid "Use"
+msgstr "Usar"
-#: ../../Zotlabs/Module/Cal.php:337 ../../include/text.php:2286
-msgid "Import"
-msgstr "Importar"
+#: ../../Zotlabs/Module/Search.php:223
+#, php-format
+msgid "Items tagged with: %s"
+msgstr "elementos etiquetados con: %s"
+
+#: ../../Zotlabs/Module/Search.php:225
+#, php-format
+msgid "Search results for: %s"
+msgstr "Resultados de la búsqueda para: %s"
#: ../../Zotlabs/Module/Common.php:14
msgid "No channel."
@@ -5014,369 +5176,154 @@ msgstr "Conexiones comunes"
msgid "No connections in common."
msgstr "Ninguna conexión en común."
-#: ../../Zotlabs/Module/Rmagic.php:35
-msgid "Authentication failed."
-msgstr "Falló la autenticación."
-
-#: ../../Zotlabs/Module/Rmagic.php:75
-msgid "Remote Authentication"
-msgstr "Acceso desde su servidor"
-
-#: ../../Zotlabs/Module/Rmagic.php:76
-msgid "Enter your channel address (e.g. channel@example.com)"
-msgstr "Introduzca la dirección del canal (p.ej. canal@ejemplo.com)"
-
-#: ../../Zotlabs/Module/Rmagic.php:77
-msgid "Authenticate"
-msgstr "Acceder"
-
-#: ../../Zotlabs/Module/Ratings.php:73
-msgid "No ratings"
-msgstr "Ninguna valoración"
-
-#: ../../Zotlabs/Module/Ratings.php:104
-msgid "Rating: "
-msgstr "Valoración:"
-
-#: ../../Zotlabs/Module/Ratings.php:105
-msgid "Website: "
-msgstr "Sitio web:"
-
-#: ../../Zotlabs/Module/Ratings.php:107
-msgid "Description: "
-msgstr "Descripción:"
-
-#: ../../Zotlabs/Module/Apps.php:47 ../../include/widgets.php:102
-#: ../../include/nav.php:167
-msgid "Apps"
-msgstr "Aplicaciones (apps)"
-
-#: ../../Zotlabs/Module/Network.php:94
-msgid "No such group"
-msgstr "No se encuentra el grupo"
-
-#: ../../Zotlabs/Module/Network.php:134
-msgid "No such channel"
-msgstr "No se encuentra el canal"
-
-#: ../../Zotlabs/Module/Network.php:139
-msgid "forum"
-msgstr "foro"
-
-#: ../../Zotlabs/Module/Network.php:151
-msgid "Search Results For:"
-msgstr "Buscar resultados para:"
-
-#: ../../Zotlabs/Module/Network.php:216
-msgid "Privacy group is empty"
-msgstr "El grupo de canales está vacío"
-
-#: ../../Zotlabs/Module/Network.php:225
-msgid "Privacy group: "
-msgstr "Grupo de canales: "
-
-#: ../../Zotlabs/Module/Network.php:251
-msgid "Invalid connection."
-msgstr "Conexión no válida."
-
-#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
-msgid "Continue"
-msgstr "Continuar"
-
-#: ../../Zotlabs/Module/Connect.php:90
-msgid "Premium Channel Setup"
-msgstr "Configuración del canal premium"
-
-#: ../../Zotlabs/Module/Connect.php:92
-msgid "Enable premium channel connection restrictions"
-msgstr "Habilitar restricciones de conexión del canal premium"
+#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
+msgid "Authorize application connection"
+msgstr "Autorizar una conexión de aplicación"
-#: ../../Zotlabs/Module/Connect.php:93
-msgid ""
-"Please enter your restrictions or conditions, such as paypal receipt, usage "
-"guidelines, etc."
-msgstr "Por favor introduzca sus restricciones o condiciones, como recibo de paypal, normas de uso, etc."
+#: ../../Zotlabs/Module/Api.php:73
+msgid "Return to your app and insert this Security Code:"
+msgstr "Vuelva a su aplicación e introduzca este código de seguridad: "
-#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
-msgid ""
-"This channel may require additional steps or acknowledgement of the "
-"following conditions prior to connecting:"
-msgstr "Este canal puede requerir antes de conectar unos pasos adicionales o el conocimiento de las siguientes condiciones:"
+#: ../../Zotlabs/Module/Api.php:83
+msgid "Please login to continue."
+msgstr "Por favor inicie sesión para continuar."
-#: ../../Zotlabs/Module/Connect.php:96
+#: ../../Zotlabs/Module/Api.php:95
msgid ""
-"Potential connections will then see the following text before proceeding:"
-msgstr "Las posibles conexiones verán, por tanto, el siguiente texto antes de proceder:"
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "¿Desea autorizar a esta aplicación a acceder a sus publicaciones y contactos, y/o crear nuevas publicaciones por usted?"
-#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
-msgid ""
-"By continuing, I certify that I have complied with any instructions provided"
-" on this page."
-msgstr "Al continuar, certifico que he cumplido con todas las instrucciones proporcionadas en esta página."
+#: ../../Zotlabs/Module/Ping.php:254
+msgid "sent you a private message"
+msgstr "le ha enviado un mensaje privado"
-#: ../../Zotlabs/Module/Connect.php:106
-msgid "(No specific instructions have been provided by the channel owner.)"
-msgstr "(No ha sido proporcionada ninguna instrucción específica por el propietario del canal.)"
+#: ../../Zotlabs/Module/Ping.php:302
+msgid "added your channel"
+msgstr "añadió este canal a sus conexiones"
-#: ../../Zotlabs/Module/Connect.php:114
-msgid "Restricted or Premium Channel"
-msgstr "Canal premium o restringido"
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "g A l F d"
+msgstr "g A l d F"
-#: ../../Zotlabs/Module/Rbmark.php:94
-msgid "Select a bookmark folder"
-msgstr "Seleccionar una carpeta de marcadores"
+#: ../../Zotlabs/Module/Ping.php:330
+msgid "[today]"
+msgstr "[hoy]"
-#: ../../Zotlabs/Module/Rbmark.php:99
-msgid "Save Bookmark"
-msgstr "Guardar marcador"
+#: ../../Zotlabs/Module/Ping.php:339
+msgid "posted an event"
+msgstr "publicó un evento"
-#: ../../Zotlabs/Module/Rbmark.php:100
-msgid "URL of bookmark"
-msgstr "Dirección del marcador"
+#: ../../Zotlabs/Module/Siteinfo.php:20
+msgid "About this site"
+msgstr "Acerca de este sitio"
-#: ../../Zotlabs/Module/Rbmark.php:105
-msgid "Or enter new bookmark folder name"
-msgstr "O introduzca un nuevo nombre para la carpeta de marcadores"
+#: ../../Zotlabs/Module/Siteinfo.php:21
+msgid "Site Name"
+msgstr "Nombre del sitio"
-#: ../../Zotlabs/Module/Photos.php:82
-msgid "Page owner information could not be retrieved."
-msgstr "La información del propietario de la página no pudo ser recuperada."
+#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1962
+msgid "Administrator"
+msgstr "Administrador"
-#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:147
-msgid "Album not found."
-msgstr "Álbum no encontrado."
+#: ../../Zotlabs/Module/Siteinfo.php:28
+msgid "Software and Project information"
+msgstr "Información sobre el software y el proyecto"
-#: ../../Zotlabs/Module/Photos.php:130
-msgid "Delete Album"
-msgstr "Borrar álbum"
+#: ../../Zotlabs/Module/Siteinfo.php:29
+msgid "This site is powered by $Projectname"
+msgstr "Este sitio funciona con $Projectname"
-#: ../../Zotlabs/Module/Photos.php:151
+#: ../../Zotlabs/Module/Siteinfo.php:30
msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
-msgstr "Hay varias carpetas con este nombre de álbum, pero dentro de diferentes directorios. Por favor, elimine la carpeta o carpetas que desee utilizando el administrador de ficheros"
-
-#: ../../Zotlabs/Module/Photos.php:208 ../../Zotlabs/Module/Photos.php:1059
-msgid "Delete Photo"
-msgstr "Borrar foto"
+"Federated and decentralised networking and identity services provided by Zot"
+msgstr "Servicios federados y descentralizados de identidad y redes proporcionados por Zot"
-#: ../../Zotlabs/Module/Photos.php:531
-msgid "No photos selected"
-msgstr "No hay fotos seleccionadas"
-
-#: ../../Zotlabs/Module/Photos.php:580
-msgid "Access to this item is restricted."
-msgstr "El acceso a este elemento está restringido."
-
-#: ../../Zotlabs/Module/Photos.php:619
+#: ../../Zotlabs/Module/Siteinfo.php:32
#, php-format
-msgid "%1$.2f MB of %2$.2f MB photo storage used."
-msgstr "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado."
-
-#: ../../Zotlabs/Module/Photos.php:622
-#, php-format
-msgid "%1$.2f MB photo storage used."
-msgstr "%1$.2f MB de almacenamiento de fotos utilizado."
-
-#: ../../Zotlabs/Module/Photos.php:658
-msgid "Upload Photos"
-msgstr "Subir fotos"
-
-#: ../../Zotlabs/Module/Photos.php:662
-msgid "Enter an album name"
-msgstr "Introducir un nombre de álbum"
-
-#: ../../Zotlabs/Module/Photos.php:663
-msgid "or select an existing album (doubleclick)"
-msgstr "o seleccionar uno existente (doble click)"
-
-#: ../../Zotlabs/Module/Photos.php:664
-msgid "Create a status post for this upload"
-msgstr "Crear un mensaje de estado para esta subida"
-
-#: ../../Zotlabs/Module/Photos.php:665
-msgid "Caption (optional):"
-msgstr "Título (opcional):"
-
-#: ../../Zotlabs/Module/Photos.php:666
-msgid "Description (optional):"
-msgstr "Descripción (opcional):"
-
-#: ../../Zotlabs/Module/Photos.php:697
-msgid "Album name could not be decoded"
-msgstr "El nombre del álbum no ha podido ser descifrado"
-
-#: ../../Zotlabs/Module/Cal.php:69
-msgid "Permissions denied."
-msgstr "Permisos denegados."
-
-#: ../../Zotlabs/Module/Cal.php:259 ../../Zotlabs/Module/Events.php:597
-msgid "l, F j"
-msgstr "l j F"
-
-#: ../../Zotlabs/Module/Cal.php:308 ../../Zotlabs/Module/Events.php:646
-#: ../../include/text.php:1762
-msgid "Link to Source"
-msgstr "Enlazar con la entrada en su ubicación original"
-
-#: ../../Zotlabs/Module/Cal.php:331 ../../Zotlabs/Module/Events.php:674
-msgid "Edit Event"
-msgstr "Editar el evento"
-
-#: ../../Zotlabs/Module/Cal.php:331 ../../Zotlabs/Module/Events.php:674
-msgid "Create Event"
-msgstr "Crear un evento"
-
-#: ../../Zotlabs/Module/Cal.php:334 ../../Zotlabs/Module/Events.php:677
-msgid "Export"
-msgstr "Exportar"
-
-#: ../../Zotlabs/Module/Cal.php:337 ../../include/text.php:2332
-msgid "Import"
-msgstr "Importar"
-
-#: ../../Zotlabs/Module/Cal.php:341 ../../Zotlabs/Module/Events.php:686
-msgid "Today"
-msgstr "Hoy"
-
-#: ../../Zotlabs/Module/Photos.php:1040
-msgid "Enter a new album name"
-msgstr "Introducir un nuevo nombre de álbum"
-
-#: ../../Zotlabs/Module/Photos.php:1041
-msgid "or select an existing one (doubleclick)"
-msgstr "o seleccionar uno (doble click) existente"
-
-#: ../../Zotlabs/Module/Photos.php:1044
-msgid "Caption"
-msgstr "Título"
-
-#: ../../Zotlabs/Module/Ratings.php:70
-msgid "No ratings"
-msgstr "Ninguna valoración"
-
-#: ../../Zotlabs/Module/Ratings.php:98
-msgid "Rating: "
-msgstr "Valoración:"
-
-#: ../../Zotlabs/Module/Ratings.php:99
-msgid "Website: "
-msgstr "Sitio web:"
-
-#: ../../Zotlabs/Module/Ratings.php:101
-msgid "Description: "
-msgstr "Descripción:"
-
-#: ../../Zotlabs/Module/Photos.php:1077 ../../Zotlabs/Lib/ThreadItem.php:263
-msgid "I don't like this (toggle)"
-msgstr "No me gusta esto (cambiar)"
-
-#: ../../Zotlabs/Module/Photos.php:1079 ../../Zotlabs/Lib/ThreadItem.php:398
-#: ../../include/conversation.php:743
-msgid "Please wait"
-msgstr "Espere por favor"
-
-#: ../../Zotlabs/Module/Photos.php:1095 ../../Zotlabs/Module/Photos.php:1213
-#: ../../Zotlabs/Lib/ThreadItem.php:708
-msgid "This is you"
-msgstr "Este es usted"
-
-#: ../../Zotlabs/Module/Photos.php:1097 ../../Zotlabs/Module/Photos.php:1215
-#: ../../Zotlabs/Lib/ThreadItem.php:710 ../../include/js_strings.php:6
-msgid "Comment"
-msgstr "Comentar"
-
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Likes"
-msgstr "Me gusta"
-
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Dislikes"
-msgstr "No me gusta"
-
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Agree"
-msgstr "De acuerdo"
+msgid "Version %s"
+msgstr "Versión %s"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Disagree"
-msgstr "En desacuerdo"
+#: ../../Zotlabs/Module/Siteinfo.php:33
+msgid "Project homepage"
+msgstr "Página principal del proyecto"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Abstain"
-msgstr "Abstención"
+#: ../../Zotlabs/Module/Siteinfo.php:34
+msgid "Developer homepage"
+msgstr "Página principal del desarrollador"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Attending"
-msgstr "Participaré"
+#: ../../Zotlabs/Module/Lostpass.php:19
+msgid "No valid account found."
+msgstr "No se ha encontrado una cuenta válida."
-#: ../../Zotlabs/Module/Register.php:221
-msgid "Terms of Service"
-msgstr "Términos del servicio"
+#: ../../Zotlabs/Module/Lostpass.php:33
+msgid "Password reset request issued. Check your email."
+msgstr "Se ha recibido una solicitud de restablecimiento de contraseña. Consulte su correo electrónico."
-#: ../../Zotlabs/Module/Register.php:227
+#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
#, php-format
-msgid "I accept the %s for this website"
-msgstr "Acepto los %s de este sitio"
+msgid "Site Member (%s)"
+msgstr "Usuario del sitio (%s)"
-#: ../../Zotlabs/Module/Register.php:229
+#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
#, php-format
-msgid "I am over 13 years of age and accept the %s for this website"
-msgstr "Tengo más de 13 años de edad y acepto los %s de este sitio"
+msgid "Password reset requested at %s"
+msgstr "Se ha solicitado restablecer la contraseña en %s"
-#: ../../Zotlabs/Module/Register.php:233
-msgid "Your email address"
-msgstr "Su dirección de correo electrónico"
+#: ../../Zotlabs/Module/Lostpass.php:68
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado."
-#: ../../Zotlabs/Module/Register.php:234
-msgid "Choose a password"
-msgstr "Elija una contraseña"
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1728
+msgid "Password Reset"
+msgstr "Restablecer la contraseña"
-#: ../../Zotlabs/Module/Register.php:235
-msgid "Please re-enter your password"
-msgstr "Por favor, vuelva a escribir su contraseña"
+#: ../../Zotlabs/Module/Lostpass.php:92
+msgid "Your password has been reset as requested."
+msgstr "Su contraseña ha sido restablecida según lo solicitó."
-#: ../../Zotlabs/Module/Register.php:236
-msgid "Please enter your invitation code"
-msgstr "Por favor, introduzca el código de su invitación"
+#: ../../Zotlabs/Module/Lostpass.php:93
+msgid "Your new password is"
+msgstr "Su nueva contraseña es"
-#: ../../Zotlabs/Module/Register.php:241
-msgid "no"
-msgstr "no"
+#: ../../Zotlabs/Module/Lostpass.php:94
+msgid "Save or copy your new password - and then"
+msgstr "Guarde o copie su nueva contraseña - y después"
-#: ../../Zotlabs/Module/Register.php:241
-msgid "yes"
-msgstr "sí"
+#: ../../Zotlabs/Module/Lostpass.php:95
+msgid "click here to login"
+msgstr "pulse aquí para conectarse"
-#: ../../Zotlabs/Module/Register.php:258
-msgid "Membership on this site is by invitation only."
-msgstr "Para registrarse en este sitio es necesaria una invitación."
+#: ../../Zotlabs/Module/Lostpass.php:96
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Puede cambiar la contraseña en la página <em>Ajustes</em> una vez iniciada la sesión."
-#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:152
-#: ../../boot.php:1721
-msgid "Register"
-msgstr "Registrarse"
+#: ../../Zotlabs/Module/Lostpass.php:117
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Su contraseña en %s ha sido cambiada"
-#: ../../Zotlabs/Module/Register.php:271
+#: ../../Zotlabs/Module/Lostpass.php:130
+msgid "Forgot your Password?"
+msgstr "¿Ha olvidado su contraseña?"
+
+#: ../../Zotlabs/Module/Lostpass.php:131
msgid ""
-"This site may require email verification after submitting this form. If you "
-"are returned to a login page, please check your email for instructions."
-msgstr "Este sitio puede requerir una verificación de correo electrónico después de enviar este formulario. Si es devuelto a una página de inicio de sesión, compruebe su email para recibir y leer las instrucciones."
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones."
-#: ../../Zotlabs/Module/Help.php:27
-msgid "Documentation Search"
-msgstr "Búsqueda de Documentación"
+#: ../../Zotlabs/Module/Lostpass.php:132
+msgid "Email Address"
+msgstr "Dirección de correo electrónico"
-#: ../../Zotlabs/Module/Help.php:57
-msgid "$Projectname Documentation"
-msgstr "Documentación de $Projectname"
+#: ../../Zotlabs/Module/Lostpass.php:133
+msgid "Reset"
+msgstr "Reiniciar"
#: ../../Zotlabs/Module/Rbmark.php:94
msgid "Select a bookmark folder"
@@ -5394,6 +5341,10 @@ msgstr "Dirección del marcador"
msgid "Or enter new bookmark folder name"
msgstr "O introduzca un nuevo nombre para la carpeta de marcadores"
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
+msgstr "El servidor de este directorio necesita un \"token\" de acceso"
+
#: ../../Zotlabs/Module/Rmagic.php:35
msgid "Authentication failed."
msgstr "Falló la autenticación."
@@ -5425,11 +5376,26 @@ msgid "Remove This Account"
msgstr "Eliminar esta cuenta"
#: ../../Zotlabs/Module/Removeaccount.php:58
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "WARNING: "
+msgstr "ATENCIÓN:"
+
+#: ../../Zotlabs/Module/Removeaccount.php:58
msgid ""
"This account and all its channels will be completely removed from the "
"network. "
msgstr "Esta cuenta y todos sus canales van a ser eliminados de la red."
+#: ../../Zotlabs/Module/Removeaccount.php:58
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "This action is permanent and can not be undone!"
+msgstr "¡Esta acción tiene carácter definitivo y no se puede deshacer!"
+
+#: ../../Zotlabs/Module/Removeaccount.php:59
+#: ../../Zotlabs/Module/Removeme.php:62
+msgid "Please enter your password for verification:"
+msgstr "Por favor, introduzca su contraseña para su verificación:"
+
#: ../../Zotlabs/Module/Removeaccount.php:60
msgid ""
"Remove this account, all its channels and all its channel clones from the "
@@ -5443,62 +5409,33 @@ msgid ""
msgstr "Por defecto, solo las instancias de los canales ubicados en este servidor serán eliminados de la red"
#: ../../Zotlabs/Module/Removeaccount.php:61
-#: ../../Zotlabs/Module/Settings/Account.php:128
+#: ../../Zotlabs/Module/Settings/Account.php:120
msgid "Remove Account"
msgstr "Eliminar cuenta"
-#: ../../Zotlabs/Module/Webpages.php:52
-msgid "Import Webpage Elements"
-msgstr "Importar elementos de una página web"
-
-#: ../../Zotlabs/Module/Webpages.php:53
-msgid "Import selected"
-msgstr "Importar elementos seleccionados"
-
-#: ../../Zotlabs/Module/Webpages.php:76
-msgid "Export Webpage Elements"
-msgstr "Exportar elementos de una página web"
-
-#: ../../Zotlabs/Module/Webpages.php:77
-msgid "Export selected"
-msgstr "Exportar elementos seleccionados"
-
-#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:218
-#: ../../include/nav.php:109 ../../include/conversation.php:1725
-msgid "Webpages"
-msgstr "Páginas web"
-
-#: ../../Zotlabs/Module/Webpages.php:248 ../../include/page_widgets.php:44
-msgid "Actions"
-msgstr "Acciones"
-
-#: ../../Zotlabs/Module/Webpages.php:249 ../../include/page_widgets.php:45
-msgid "Page Link"
-msgstr "Vínculo de la página"
-
-#: ../../Zotlabs/Module/Webpages.php:250
-msgid "Page Title"
-msgstr "Título de página"
+#: ../../Zotlabs/Module/Pdledit.php:21
+msgid "Layout updated."
+msgstr "Plantilla actualizada."
-#: ../../Zotlabs/Module/Webpages.php:280
-msgid "Invalid file type."
-msgstr "Tipo de fichero no válido."
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:218
+msgid "Feature disabled."
+msgstr "Funcionalidad deshabilitada."
-#: ../../Zotlabs/Module/Webpages.php:292
-msgid "Error opening zip file"
-msgstr "Error al abrir el fichero comprimido zip"
+#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
+msgid "Edit System Page Description"
+msgstr "Editor del Sistema de Descripción de Páginas"
-#: ../../Zotlabs/Module/Webpages.php:303
-msgid "Invalid folder path."
-msgstr "La ruta de la carpeta no es válida."
+#: ../../Zotlabs/Module/Pdledit.php:64
+msgid "Layout not found."
+msgstr "Plantilla no encontrada"
-#: ../../Zotlabs/Module/Webpages.php:330
-msgid "No webpage elements detected."
-msgstr "No se han detectado elementos de ninguna página web."
+#: ../../Zotlabs/Module/Pdledit.php:70
+msgid "Module Name:"
+msgstr "Nombre del módulo:"
-#: ../../Zotlabs/Module/Webpages.php:405
-msgid "Import complete."
-msgstr "Importación completada."
+#: ../../Zotlabs/Module/Pdledit.php:71
+msgid "Layout Help"
+msgstr "Ayuda para el diseño de plantillas de página"
#: ../../Zotlabs/Module/Uexport.php:55 ../../Zotlabs/Module/Uexport.php:56
msgid "Export Channel"
@@ -5558,241 +5495,201 @@ msgid ""
" please import or restore these in date order (oldest first)."
msgstr "Estos ficheros pueden ser importados o restaurados visitando <a href=\"%1$s\">%2$s</a> o cualquier sitio que contenga su canal. Para obtener los mejores resultados, por favor, importar o restaurar estos ficheros en orden de fecha (la más antigua primero)."
-#: ../../Zotlabs/Module/Editpost.php:35
-msgid "Item is not editable"
-msgstr "El elemento no es editable"
-
-#: ../../Zotlabs/Module/Search.php:216
-#, php-format
-msgid "Items tagged with: %s"
-msgstr "elementos etiquetados con: %s"
-
-#: ../../Zotlabs/Module/Search.php:218
-#, php-format
-msgid "Search results for: %s"
-msgstr "Resultados de la búsqueda para: %s"
-
-#: ../../Zotlabs/Module/Events.php:25
-msgid "Calendar entries imported."
-msgstr "Entradas de calendario importadas."
-
-#: ../../Zotlabs/Module/Events.php:27
-msgid "No calendar entries found."
-msgstr "No se han encontrado entradas de calendario."
-
-#: ../../Zotlabs/Module/Events.php:104
-msgid "Event can not end before it has started."
-msgstr "Un evento no puede terminar antes de que haya comenzado."
-
-#: ../../Zotlabs/Module/Events.php:106 ../../Zotlabs/Module/Events.php:115
-#: ../../Zotlabs/Module/Events.php:135
-msgid "Unable to generate preview."
-msgstr "No se puede crear la vista previa."
-
-#: ../../Zotlabs/Module/Events.php:113
-msgid "Event title and start time are required."
-msgstr "Se requieren el título del evento y su hora de inicio."
+#: ../../Zotlabs/Module/Cal.php:69
+msgid "Permissions denied."
+msgstr "Permisos denegados."
-#: ../../Zotlabs/Module/Events.php:133 ../../Zotlabs/Module/Events.php:258
-msgid "Event not found."
-msgstr "Evento no encontrado."
+#: ../../Zotlabs/Module/Cal.php:263 ../../Zotlabs/Module/Events.php:596
+msgid "l, F j"
+msgstr "l j F"
-#: ../../Zotlabs/Module/Events.php:452
-msgid "Edit event title"
-msgstr "Editar el título del evento"
+#: ../../Zotlabs/Module/Cal.php:312 ../../Zotlabs/Module/Events.php:651
+#: ../../include/text.php:1748
+msgid "Link to Source"
+msgstr "Enlazar con la entrada en su ubicación original"
-#: ../../Zotlabs/Module/Events.php:452
-msgid "Event title"
-msgstr "Título del evento"
+#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679
+msgid "Edit Event"
+msgstr "Editar el evento"
-#: ../../Zotlabs/Module/Events.php:454
-msgid "Categories (comma-separated list)"
-msgstr "Temas (lista separada por comas)"
+#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679
+msgid "Create Event"
+msgstr "Crear un evento"
-#: ../../Zotlabs/Module/Events.php:455
-msgid "Edit Category"
-msgstr "Modificar el tema"
+#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:682
+msgid "Export"
+msgstr "Exportar"
-#: ../../Zotlabs/Module/Events.php:455
-msgid "Category"
-msgstr "Tema"
+#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2294
+msgid "Import"
+msgstr "Importar"
-#: ../../Zotlabs/Module/Events.php:458
-msgid "Edit start date and time"
-msgstr "Modificar la fecha y hora de comienzo"
+#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Events.php:691
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848
+msgid "Today"
+msgstr "Hoy"
-#: ../../Zotlabs/Module/Events.php:458
-msgid "Start date and time"
-msgstr "Fecha y hora de comienzo"
+#: ../../Zotlabs/Module/Admin.php:94
+msgid "# Accounts"
+msgstr "# Cuentas"
-#: ../../Zotlabs/Module/Events.php:459 ../../Zotlabs/Module/Events.php:462
-msgid "Finish date and time are not known or not relevant"
-msgstr "La fecha y hora de terminación no se conocen o no son relevantes"
+#: ../../Zotlabs/Module/Admin.php:95
+msgid "# blocked accounts"
+msgstr "# cuentas bloqueadas"
-#: ../../Zotlabs/Module/Events.php:461
-msgid "Edit finish date and time"
-msgstr "Modificar la fecha y hora de terminación"
+#: ../../Zotlabs/Module/Admin.php:96
+msgid "# expired accounts"
+msgstr "# cuentas caducadas"
-#: ../../Zotlabs/Module/Events.php:461
-msgid "Finish date and time"
-msgstr "Fecha y hora de terminación"
+#: ../../Zotlabs/Module/Admin.php:97
+msgid "# expiring accounts"
+msgstr "# cuentas que caducan"
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
-msgid "Adjust for viewer timezone"
-msgstr "Ajustar para obtener el visor de los husos horarios"
+#: ../../Zotlabs/Module/Admin.php:108
+msgid "# Channels"
+msgstr "# Canales"
-#: ../../Zotlabs/Module/Events.php:463
-msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
-msgstr "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales."
+#: ../../Zotlabs/Module/Admin.php:109
+msgid "# primary"
+msgstr "# primario"
-#: ../../Zotlabs/Module/Events.php:465
-msgid "Edit Description"
-msgstr "Editar la descripción"
+#: ../../Zotlabs/Module/Admin.php:110
+msgid "# clones"
+msgstr "# clones"
-#: ../../Zotlabs/Module/Events.php:467
-msgid "Edit Location"
-msgstr "Modificar la dirección"
+#: ../../Zotlabs/Module/Admin.php:116
+msgid "Message queues"
+msgstr "Mensajes en cola"
-#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:472
-msgid "Share this event"
-msgstr "Compartir este evento"
+#: ../../Zotlabs/Module/Admin.php:133
+msgid "Your software should be updated"
+msgstr "Debe actualizar su software"
-#: ../../Zotlabs/Module/Events.php:474 ../../include/conversation.php:1264
-msgid "Permission settings"
-msgstr "Configuración de permisos"
+#: ../../Zotlabs/Module/Admin.php:138
+msgid "Summary"
+msgstr "Sumario"
-#: ../../Zotlabs/Module/Events.php:485
-msgid "Advanced Options"
-msgstr "Opciones avanzadas"
+#: ../../Zotlabs/Module/Admin.php:141
+msgid "Registered accounts"
+msgstr "Cuentas registradas"
-#: ../../Zotlabs/Module/Events.php:619
-msgid "Edit event"
-msgstr "Editar evento"
+#: ../../Zotlabs/Module/Admin.php:142
+msgid "Pending registrations"
+msgstr "Registros pendientes"
-#: ../../Zotlabs/Module/Events.php:621
-msgid "Delete event"
-msgstr "Borrar evento"
+#: ../../Zotlabs/Module/Admin.php:143
+msgid "Registered channels"
+msgstr "Canales registrados"
-#: ../../Zotlabs/Module/Events.php:655
-msgid "calendar"
-msgstr "calendario"
+#: ../../Zotlabs/Module/Admin.php:144
+msgid "Active plugins"
+msgstr "Extensiones (plugins) activas"
-#: ../../Zotlabs/Module/Events.php:681
-msgid "Month"
-msgstr "Mes"
+#: ../../Zotlabs/Module/Admin.php:145
+msgid "Version"
+msgstr "Versión"
-#: ../../Zotlabs/Module/Events.php:682
-msgid "Week"
-msgstr "Semana"
+#: ../../Zotlabs/Module/Admin.php:146
+msgid "Repository version (master)"
+msgstr "Versión del repositorio (master)"
-#: ../../Zotlabs/Module/Events.php:683
-msgid "Day"
-msgstr "Día"
+#: ../../Zotlabs/Module/Admin.php:147
+msgid "Repository version (dev)"
+msgstr "Versión del repositorio (dev)"
-#: ../../Zotlabs/Module/Events.php:717
-msgid "Event removed"
-msgstr "Evento borrado"
+#: ../../Zotlabs/Module/Lockview.php:75
+msgid "Remote privacy information not available."
+msgstr "La información privada remota no está disponible."
-#: ../../Zotlabs/Module/Events.php:720
-msgid "Failed to remove event"
-msgstr "Error al eliminar el evento"
+#: ../../Zotlabs/Module/Lockview.php:96
+msgid "Visible to:"
+msgstr "Visible para:"
#: ../../Zotlabs/Module/Service_limits.php:23
msgid "No service class restrictions found."
msgstr "No se han encontrado restricciones sobre esta clase de servicio."
-#: ../../Zotlabs/Module/Thing.php:114
-msgid "Thing updated"
-msgstr "Elemento actualizado."
-
-#: ../../Zotlabs/Module/Thing.php:166
-msgid "Object store: failed"
-msgstr "Guardar objeto: ha fallado"
-
-#: ../../Zotlabs/Module/Thing.php:170
-msgid "Thing added"
-msgstr "Elemento añadido"
-
-#: ../../Zotlabs/Module/Thing.php:196
-#, php-format
-msgid "OBJ: %1$s %2$s %3$s"
-msgstr "OBJ: %1$s %2$s %3$s"
+#: ../../Zotlabs/Module/Webpages.php:52
+msgid "Import Webpage Elements"
+msgstr "Importar elementos de una página web"
-#: ../../Zotlabs/Module/Thing.php:259
-msgid "Show Thing"
-msgstr "Mostrar elemento"
+#: ../../Zotlabs/Module/Webpages.php:53
+msgid "Import selected"
+msgstr "Importar elementos seleccionados"
-#: ../../Zotlabs/Module/Thing.php:266
-msgid "item not found."
-msgstr "elemento no encontrado."
+#: ../../Zotlabs/Module/Webpages.php:76
+msgid "Export Webpage Elements"
+msgstr "Exportar elementos de una página web"
-#: ../../Zotlabs/Module/Thing.php:299
-msgid "Edit Thing"
-msgstr "Editar elemento"
+#: ../../Zotlabs/Module/Webpages.php:77
+msgid "Export selected"
+msgstr "Exportar los elementos seleccionados"
-#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
-msgid "Select a profile"
-msgstr "Seleccionar un perfil"
+#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:220
+#: ../../include/nav.php:109 ../../include/conversation.php:1727
+msgid "Webpages"
+msgstr "Páginas web"
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Post an activity"
-msgstr "Publicar una actividad"
+#: ../../Zotlabs/Module/Webpages.php:248 ../../include/page_widgets.php:44
+msgid "Actions"
+msgstr "Acciones"
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Only sends to viewers of the applicable profile"
-msgstr "Sólo enviar a espectadores del perfil pertinente."
+#: ../../Zotlabs/Module/Webpages.php:249 ../../include/page_widgets.php:45
+msgid "Page Link"
+msgstr "Vínculo de la página"
-#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
-msgid "Name of thing e.g. something"
-msgstr "Nombre del elemento, p. ej.:. \"algo\""
+#: ../../Zotlabs/Module/Webpages.php:250
+msgid "Page Title"
+msgstr "Título de página"
-#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
-msgid "URL of thing (optional)"
-msgstr "Dirección del elemento (opcional)"
+#: ../../Zotlabs/Module/Webpages.php:280
+msgid "Invalid file type."
+msgstr "Tipo de fichero no válido."
-#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
-msgid "URL for photo of thing (optional)"
-msgstr "Dirección para la foto o elemento (opcional)"
+#: ../../Zotlabs/Module/Webpages.php:292
+msgid "Error opening zip file"
+msgstr "Error al abrir el fichero comprimido zip"
-#: ../../Zotlabs/Module/Thing.php:353
-msgid "Add Thing to your Profile"
-msgstr "Añadir alguna cosa a su perfil"
+#: ../../Zotlabs/Module/Webpages.php:303
+msgid "Invalid folder path."
+msgstr "La ruta de la carpeta no es válida."
-#: ../../Zotlabs/Module/Item.php:180
-msgid "Unable to locate original post."
-msgstr "No ha sido posible encontrar la entrada original."
+#: ../../Zotlabs/Module/Webpages.php:330
+msgid "No webpage elements detected."
+msgstr "No se han detectado elementos de ninguna página web."
-#: ../../Zotlabs/Module/Item.php:433
-msgid "Empty post discarded."
-msgstr "La entrada vacía ha sido desechada."
+#: ../../Zotlabs/Module/Webpages.php:405
+msgid "Import complete."
+msgstr "Importación completada."
-#: ../../Zotlabs/Module/Item.php:473
-msgid "Executable content type not permitted to this channel."
-msgstr "Contenido de tipo ejecutable no permitido en este canal."
+#: ../../Zotlabs/Module/Removeme.php:35
+msgid ""
+"Channel removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "La eliminación de canales no está permitida hasta pasadas 48 horas desde el último cambio de contraseña."
-#: ../../Zotlabs/Module/Item.php:851
-msgid "Duplicate post suppressed."
-msgstr "Se ha suprimido la entrada duplicada."
+#: ../../Zotlabs/Module/Removeme.php:60
+msgid "Remove This Channel"
+msgstr "Eliminar este canal"
-#: ../../Zotlabs/Module/Item.php:986
-msgid "System error. Post not saved."
-msgstr "Error del sistema. La entrada no se ha podido salvar."
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "This channel will be completely removed from the network. "
+msgstr "Este canal va a ser completamente eliminado de la red. "
-#: ../../Zotlabs/Module/Item.php:1107
-msgid "Unable to obtain post information from database."
-msgstr "No ha sido posible obtener información de la entrada en la base de datos."
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid "Remove this channel and all its clones from the network"
+msgstr "Eliminar este canal y todos sus clones de la red"
-#: ../../Zotlabs/Module/Item.php:1114
-#, php-format
-msgid "You have reached your limit of %1$.0f top level posts."
-msgstr "Ha alcanzado su límite de %1$.0f entradas en la página principal."
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Por defecto, solo la instancia del canal alojado en este servidor será eliminado de la red"
-#: ../../Zotlabs/Module/Item.php:1121
-#, php-format
-msgid "You have reached your limit of %1$.0f webpages."
-msgstr "Ha alcanzado su límite de %1$.0f páginas web."
+#: ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings/Channel.php:549
+msgid "Remove Channel"
+msgstr "Eliminar el canal"
#: ../../Zotlabs/Module/Sharedwithme.php:98
msgid "Files: shared with me"
@@ -5814,79 +5711,124 @@ msgstr "Eliminar este fichero"
msgid "Not found"
msgstr "No encontrado"
-#: ../../Zotlabs/Module/Wiki.php:97 ../../Zotlabs/Lib/Apps.php:219
-#: ../../include/features.php:99 ../../include/nav.php:111
-#: ../../include/conversation.php:1735 ../../include/conversation.php:1738
-msgid "Wiki"
-msgstr "Wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:98
-msgid "Sandbox"
-msgstr "Entorno de edición"
+#: ../../Zotlabs/Module/Wiki.php:55
+msgid "Invalid channel"
+msgstr "Canal no válido"
#: ../../Zotlabs/Module/Wiki.php:100
-msgid ""
-"\"# Wiki Sandbox\\n\\nContent you **edit** and **preview** here *will not be"
-" saved*.\""
-msgstr "\"# Entorno de edición del Wiki\\n\\nEl contenido que se **edite** y **previsualizce** aquí *no se guardará*.\""
+msgid "Error retrieving wiki"
+msgstr "Error al recuperar el wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:107
+msgid "Error creating zip file export folder"
+msgstr "Error al crear el fichero comprimido zip de la carpeta a exportar"
-#: ../../Zotlabs/Module/Wiki.php:169
+#: ../../Zotlabs/Module/Wiki.php:125
+msgid "Error downloading wiki: "
+msgstr "Error al descargar el wiki: "
+
+#: ../../Zotlabs/Module/Wiki.php:139 ../../include/nav.php:111
+#: ../../include/conversation.php:1737
+msgid "Wikis"
+msgstr "Wikis"
+
+#: ../../Zotlabs/Module/Wiki.php:145
+msgid "Download"
+msgstr "Descargar"
+
+#: ../../Zotlabs/Module/Wiki.php:149
+msgid "Wiki name"
+msgstr "Nombre del wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:150
+msgid "Content type"
+msgstr "Tipo de contenido"
+
+#: ../../Zotlabs/Module/Wiki.php:159
+msgid "Create a status post for this wiki"
+msgstr "Crear un mensaje de estado para este wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:178
+msgid "Wiki not found"
+msgstr "Wiki no encontrado"
+
+#: ../../Zotlabs/Module/Wiki.php:203
+msgid "Rename page"
+msgstr "Renombrar la página"
+
+#: ../../Zotlabs/Module/Wiki.php:207
+msgid "Error retrieving page content"
+msgstr "Error al recuperar el contenido de la página"
+
+#: ../../Zotlabs/Module/Wiki.php:236
msgid "Revision Comparison"
msgstr "Comparación de revisiones"
-#: ../../Zotlabs/Module/Wiki.php:170
+#: ../../Zotlabs/Module/Wiki.php:237
msgid "Revert"
msgstr "Revertir"
-#: ../../Zotlabs/Module/Wiki.php:201
-msgid "Enter the name of your new wiki:"
-msgstr "Nombre de su nuevo wiki:"
-
-#: ../../Zotlabs/Module/Wiki.php:202
-msgid "Enter the name of the new page:"
-msgstr "Nombre de la nueva página:"
+#: ../../Zotlabs/Module/Wiki.php:246
+msgid "Source"
+msgstr "Fuente"
-#: ../../Zotlabs/Module/Wiki.php:203
-msgid "Enter the new name:"
-msgstr "Nuevo nombre:"
+#: ../../Zotlabs/Module/Wiki.php:254
+msgid "New page name"
+msgstr "Nombre de la nueva página"
-#: ../../Zotlabs/Module/Wiki.php:209 ../../include/conversation.php:1153
+#: ../../Zotlabs/Module/Wiki.php:259 ../../include/conversation.php:1151
msgid "Embed image from photo albums"
msgstr "Incluir una imagen de los álbumes de fotos"
-#: ../../Zotlabs/Module/Wiki.php:210 ../../include/conversation.php:1247
+#: ../../Zotlabs/Module/Wiki.php:260 ../../include/conversation.php:1245
msgid "Embed an image from your albums"
msgstr "Incluir una imagen de sus álbumes"
-#: ../../Zotlabs/Module/Wiki.php:212 ../../include/conversation.php:1249
-#: ../../include/conversation.php:1296
+#: ../../Zotlabs/Module/Wiki.php:262 ../../include/conversation.php:1247
+#: ../../include/conversation.php:1294
msgid "OK"
msgstr "OK"
-#: ../../Zotlabs/Module/Wiki.php:213 ../../include/conversation.php:1189
+#: ../../Zotlabs/Module/Wiki.php:263 ../../include/conversation.php:1187
msgid "Choose images to embed"
msgstr "Elegir imágenes para incluir"
-#: ../../Zotlabs/Module/Wiki.php:214 ../../include/conversation.php:1190
+#: ../../Zotlabs/Module/Wiki.php:264 ../../include/conversation.php:1188
msgid "Choose an album"
msgstr "Elegir un álbum"
-#: ../../Zotlabs/Module/Wiki.php:215 ../../include/conversation.php:1191
-msgid "Choose a different album..."
+#: ../../Zotlabs/Module/Wiki.php:265
+msgid "Choose a different album"
msgstr "Elegir un álbum diferente..."
-#: ../../Zotlabs/Module/Wiki.php:216 ../../include/conversation.php:1192
+#: ../../Zotlabs/Module/Wiki.php:266 ../../include/conversation.php:1190
msgid "Error getting album list"
msgstr "Error al obtener la lista de álbumes"
-#: ../../Zotlabs/Module/Wiki.php:217 ../../include/conversation.php:1193
+#: ../../Zotlabs/Module/Wiki.php:267 ../../include/conversation.php:1191
msgid "Error getting photo link"
msgstr "Error al obtener el enlace de la foto"
-#: ../../Zotlabs/Module/Wiki.php:218 ../../include/conversation.php:1194
+#: ../../Zotlabs/Module/Wiki.php:268 ../../include/conversation.php:1192
msgid "Error getting album"
msgstr "Error al obtener el álbum"
+#: ../../Zotlabs/Module/Wiki.php:332
+msgid "Error creating wiki. Invalid name."
+msgstr "Error al crear el wiki: el nombre no es válido."
+
+#: ../../Zotlabs/Module/Wiki.php:343
+msgid "Wiki created, but error creating Home page."
+msgstr "Se ha creado el wiki, pero se ha producido un error al crear la página de inicio."
+
+#: ../../Zotlabs/Module/Wiki.php:348
+msgid "Error creating wiki"
+msgstr "Error al crear el wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:394
+msgid "New page created"
+msgstr "Se ha creado la nueva página"
+
#: ../../Zotlabs/Module/Sources.php:37
msgid "Failed to create source. No channel selected."
msgstr "No se ha podido crear el origen de los contenidos. No ha sido seleccionado ningún canal."
@@ -5985,16 +5927,11 @@ msgstr "No hay sugerencias disponibles. Si es un sitio nuevo, espere 24 horas y
msgid "Ignore/Hide"
msgstr "Ignorar/Ocultar"
-#: ../../Zotlabs/Module/Suggest.php:64 ../../Zotlabs/Module/Directory.php:392
-#: ../../include/contact_widgets.php:24
-msgid "Channel Suggestions"
-msgstr "Sugerencias de canales"
-
-#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:263
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
msgid "post"
msgstr "la entrada"
-#: ../../Zotlabs/Module/Tagger.php:57 ../../include/text.php:1999
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/text.php:1948
#: ../../include/conversation.php:150
msgid "comment"
msgstr "el comentario"
@@ -6004,200 +5941,125 @@ msgstr "el comentario"
msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr "%1$s ha etiquetado %3$s de %2$s con %4$s"
-#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
-msgid "Tag removed"
-msgstr "Etiqueta eliminada."
-
-#: ../../Zotlabs/Module/Tagrm.php:123
-msgid "Remove Item Tag"
-msgstr "Eliminar etiqueta del elemento."
-
-#: ../../Zotlabs/Module/Tagrm.php:125
-msgid "Select a tag to remove: "
-msgstr "Seleccionar una etiqueta para eliminar:"
-
-#: ../../Zotlabs/Module/Follow.php:34
-msgid "Channel added."
-msgstr "Canal añadido."
-
-#: ../../Zotlabs/Module/Viewconnections.php:65
-msgid "No connections."
-msgstr "Sin conexiones."
-
-#: ../../Zotlabs/Module/Viewconnections.php:78
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Visitar el perfil de %s [%s]"
-
-#: ../../Zotlabs/Module/Viewconnections.php:107
-msgid "View Connections"
-msgstr "Ver conexiones"
-
-#: ../../Zotlabs/Module/Viewsrc.php:44
-msgid "Source of Item"
-msgstr "Origen del elemento"
+#: ../../Zotlabs/Module/Settings/Features.php:45
+msgid "Additional Features"
+msgstr "Funcionalidades"
-#: ../../Zotlabs/Module/Chat.php:181
-msgid "Room not found"
-msgstr "Sala no encontrada"
+#: ../../Zotlabs/Module/Settings/Oauth.php:34
+msgid "Name is required"
+msgstr "El nombre es obligatorio"
-#: ../../Zotlabs/Module/Chat.php:197
-msgid "Leave Room"
-msgstr "Abandonar la sala"
+#: ../../Zotlabs/Module/Settings/Oauth.php:38
+msgid "Key and Secret are required"
+msgstr "\"Key\" y \"Secret\" son obligatorios"
-#: ../../Zotlabs/Module/Chat.php:198
-msgid "Delete Room"
-msgstr "Eliminar esta sala"
+#: ../../Zotlabs/Module/Settings/Oauth.php:86
+#: ../../Zotlabs/Module/Settings/Oauth.php:112
+#: ../../Zotlabs/Module/Settings/Oauth.php:148
+msgid "Add application"
+msgstr "Añadir aplicación"
-#: ../../Zotlabs/Module/Chat.php:199
-msgid "I am away right now"
-msgstr "Estoy ausente momentáneamente"
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+msgid "Name of application"
+msgstr "Nombre de la aplicación"
-#: ../../Zotlabs/Module/Chat.php:200
-msgid "I am online"
-msgstr "Estoy conectado/a"
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:116
+#: ../../extend/addon/addon/statusnet/statusnet.php:893
+#: ../../extend/addon/addon/twitter/twitter.php:775
+msgid "Consumer Key"
+msgstr "Consumer Key"
-#: ../../Zotlabs/Module/Chat.php:202
-msgid "Bookmark this room"
-msgstr "Añadir esta sala a Marcadores"
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Generado automáticamente - si lo desea, cámbielo. Longitud máxima: 20"
-#: ../../Zotlabs/Module/Chat.php:231
-msgid "New Chatroom"
-msgstr "Nueva sala de chat"
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+#: ../../Zotlabs/Module/Settings/Oauth.php:117
+#: ../../extend/addon/addon/statusnet/statusnet.php:892
+#: ../../extend/addon/addon/twitter/twitter.php:776
+msgid "Consumer Secret"
+msgstr "Consumer Secret"
-#: ../../Zotlabs/Module/Chat.php:232
-msgid "Chatroom name"
-msgstr "Nombre de la sala de chat"
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+#: ../../Zotlabs/Module/Settings/Oauth.php:118
+msgid "Redirect"
+msgstr "Redirigir"
-#: ../../Zotlabs/Module/Chat.php:233
-msgid "Expiration of chats (minutes)"
-msgstr "Caducidad de los mensajes en los chats (en minutos)"
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "URI de redirección - dejar en blanco a menos que su aplicación específicamente lo requiera"
-#: ../../Zotlabs/Module/Chat.php:249
-#, php-format
-msgid "%1$s's Chatrooms"
-msgstr "Salas de chat de %1$s"
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Settings/Oauth.php:119
+msgid "Icon url"
+msgstr "Dirección del icono"
-#: ../../Zotlabs/Module/Chat.php:254
-msgid "No chatrooms available"
-msgstr "No hay salas de chat disponibles"
+#: ../../Zotlabs/Module/Settings/Oauth.php:104
+msgid "Application not found."
+msgstr "Aplicación no encontrada."
-#: ../../Zotlabs/Module/Chat.php:258
-msgid "Expiration"
-msgstr "Caducidad"
+#: ../../Zotlabs/Module/Settings/Oauth.php:147
+msgid "Connected Apps"
+msgstr "Aplicaciones (apps) conectadas"
-#: ../../Zotlabs/Module/Chat.php:259
-msgid "min"
-msgstr "min"
+#: ../../Zotlabs/Module/Settings/Oauth.php:151
+msgid "Client key starts with"
+msgstr "La \"client key\" empieza por"
-#: ../../Zotlabs/Module/Xchan.php:10
-msgid "Xchan Lookup"
-msgstr "Búsqueda de canales"
+#: ../../Zotlabs/Module/Settings/Oauth.php:152
+msgid "No name"
+msgstr "Sin nombre"
-#: ../../Zotlabs/Module/Xchan.php:13
-msgid "Lookup xchan beginning with (or webbie): "
-msgstr "Buscar un canal (o un \"webbie\") que comience por:"
+#: ../../Zotlabs/Module/Settings/Oauth.php:153
+msgid "Remove authorization"
+msgstr "Eliminar autorización"
-#: ../../Zotlabs/Module/Directory.php:243
+#: ../../Zotlabs/Module/Settings/Tokens.php:31
#, php-format
-msgid "%d rating"
-msgid_plural "%d ratings"
-msgstr[0] "%d valoración"
-msgstr[1] "%d valoraciones"
-
-#: ../../Zotlabs/Module/Directory.php:254
-msgid "Gender: "
-msgstr "Género:"
-
-#: ../../Zotlabs/Module/Directory.php:256
-msgid "Status: "
-msgstr "Estado:"
-
-#: ../../Zotlabs/Module/Directory.php:258
-msgid "Homepage: "
-msgstr "Página personal:"
-
-#: ../../Zotlabs/Module/Directory.php:306 ../../include/channel.php:1207
-msgid "Age:"
-msgstr "Edad:"
-
-#: ../../Zotlabs/Module/Directory.php:311 ../../include/channel.php:1049
-#: ../../include/bb2diaspora.php:507 ../../include/event.php:52
-#: ../../include/event.php:84
-msgid "Location:"
-msgstr "Ubicación:"
-
-#: ../../Zotlabs/Module/Directory.php:317
-msgid "Description:"
-msgstr "Descripción:"
-
-#: ../../Zotlabs/Module/Directory.php:322 ../../include/channel.php:1223
-msgid "Hometown:"
-msgstr "Lugar de nacimiento:"
-
-#: ../../Zotlabs/Module/Directory.php:324 ../../include/channel.php:1231
-msgid "About:"
-msgstr "Sobre mí:"
-
-#: ../../Zotlabs/Module/Directory.php:326
-msgid "Public Forum:"
-msgstr "Foro público:"
-
-#: ../../Zotlabs/Module/Directory.php:329
-msgid "Keywords: "
-msgstr "Palabras clave:"
-
-#: ../../Zotlabs/Module/Directory.php:332
-msgid "Don't suggest"
-msgstr "No sugerir:"
-
-#: ../../Zotlabs/Module/Directory.php:334
-msgid "Common connections:"
-msgstr "Conexiones comunes:"
-
-#: ../../Zotlabs/Module/Directory.php:383
-msgid "Global Directory"
-msgstr "Directorio global:"
-
-#: ../../Zotlabs/Module/Directory.php:383
-msgid "Local Directory"
-msgstr "Directorio local:"
-
-#: ../../Zotlabs/Module/Directory.php:389
-msgid "Finding:"
-msgstr "Encontrar:"
+msgid "This channel is limited to %d tokens"
+msgstr "Este canal tiene un límite de %d tokens"
-#: ../../Zotlabs/Module/Directory.php:394
-msgid "next page"
-msgstr "siguiente página"
+#: ../../Zotlabs/Module/Settings/Tokens.php:37
+msgid "Name and Password are required."
+msgstr "Se requiere el nombre y la contraseña."
-#: ../../Zotlabs/Module/Directory.php:394
-msgid "previous page"
-msgstr "página anterior"
+#: ../../Zotlabs/Module/Settings/Tokens.php:77
+msgid "Token saved."
+msgstr "Token salvado."
-#: ../../Zotlabs/Module/Directory.php:395
-msgid "Sort options"
-msgstr "Ordenar opciones"
+#: ../../Zotlabs/Module/Settings/Tokens.php:113
+msgid ""
+"Use this form to create temporary access identifiers to share things with "
+"non-members. These identities may be used in Access Control Lists and "
+"visitors may login using these credentials to access private content."
+msgstr "Utilice este formulario para crear identificadores de acceso temporal para compartir cosas con los no miembros de Hubzilla. Estas identidades se pueden usar en las Listas de control de acceso (ACL) y así los visitantes pueden iniciar sesión, utilizando estas credenciales, para acceder a su contenido privado."
-#: ../../Zotlabs/Module/Directory.php:396
-msgid "Alphabetic"
-msgstr "Alfabético"
+#: ../../Zotlabs/Module/Settings/Tokens.php:115
+msgid ""
+"You may also provide <em>dropbox</em> style access links to friends and "
+"associates by adding the Login Password to any specific site URL as shown. "
+"Examples:"
+msgstr "También puede proporcionar, con el estilo <em>dropbox</em>, enlaces de acceso a sus amigos y asociados añadiendo la contraseña de inicio de sesión a cualquier dirección URL, como se muestra. Ejemplos: "
-#: ../../Zotlabs/Module/Directory.php:397
-msgid "Reverse Alphabetic"
-msgstr "Alfabético inverso"
+#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:647
+msgid "Guest Access Tokens"
+msgstr "Tokens de acceso para invitados"
-#: ../../Zotlabs/Module/Directory.php:398
-msgid "Newest to Oldest"
-msgstr "De más nuevo a más antiguo"
+#: ../../Zotlabs/Module/Settings/Tokens.php:157
+msgid "Login Name"
+msgstr "Nombre de inicio de sesión"
-#: ../../Zotlabs/Module/Directory.php:399
-msgid "Oldest to Newest"
-msgstr "De más antiguo a más nuevo"
+#: ../../Zotlabs/Module/Settings/Tokens.php:158
+msgid "Login Password"
+msgstr "Contraseña de inicio de sesión"
-#: ../../Zotlabs/Module/Directory.php:416
-msgid "No entries (some entries may be hidden)."
-msgstr "Sin entradas (algunas entradas pueden estar ocultas)."
+#: ../../Zotlabs/Module/Settings/Tokens.php:159
+msgid "Expires (yyyy-mm-dd)"
+msgstr "Expira (aaaa-mm-dd)"
#: ../../Zotlabs/Module/Settings/Account.php:20
msgid "Not valid email."
@@ -6213,7 +6075,7 @@ msgstr "Fallo de sistema al guardar el nuevo correo electrónico. Por favor, int
#: ../../Zotlabs/Module/Settings/Account.php:40
msgid "Technical skill level updated"
-msgstr "Nivel de habilidad técnica actualizado"
+msgstr "Se ha actualizado el nivel de habilidad técnica"
#: ../../Zotlabs/Module/Settings/Account.php:56
msgid "Password verification failed."
@@ -6235,44 +6097,51 @@ msgstr "Contraseña cambiada."
msgid "Password update failed. Please try again."
msgstr "La actualización de la contraseña ha fallado. Por favor, inténtalo de nuevo."
-#: ../../Zotlabs/Module/Settings/Account.php:120
+#: ../../Zotlabs/Module/Settings/Account.php:112
msgid "Account Settings"
msgstr "Configuración de la cuenta"
-#: ../../Zotlabs/Module/Settings/Account.php:121
+#: ../../Zotlabs/Module/Settings/Account.php:113
msgid "Current Password"
msgstr "Contraseña actual"
-#: ../../Zotlabs/Module/Settings/Account.php:122
+#: ../../Zotlabs/Module/Settings/Account.php:114
msgid "Enter New Password"
msgstr "Escribir una nueva contraseña"
-#: ../../Zotlabs/Module/Settings/Account.php:123
+#: ../../Zotlabs/Module/Settings/Account.php:115
msgid "Confirm New Password"
msgstr "Confirmar la nueva contraseña"
-#: ../../Zotlabs/Module/Settings/Account.php:123
+#: ../../Zotlabs/Module/Settings/Account.php:115
msgid "Leave password fields blank unless changing"
msgstr "Dejar en blanco la contraseña a menos que desee cambiarla."
-#: ../../Zotlabs/Module/Settings/Account.php:124
+#: ../../Zotlabs/Module/Settings/Account.php:116
msgid "Your technical skill level"
msgstr "Su nivel de habilidad técnica"
-#: ../../Zotlabs/Module/Settings/Account.php:124
+#: ../../Zotlabs/Module/Settings/Account.php:116
msgid "Used to provide a member experience matched to your comfort level"
msgstr "Se utiliza para proporcionar la experiencia de los miembros adaptada a su nivel de comodidad"
-#: ../../Zotlabs/Module/Settings/Account.php:127
-#: ../../Zotlabs/Module/Settings/Channel.php:459
+#: ../../Zotlabs/Module/Settings/Account.php:119
+#: ../../Zotlabs/Module/Settings/Channel.php:462
msgid "Email Address:"
msgstr "Dirección de correo electrónico:"
-#: ../../Zotlabs/Module/Settings/Account.php:129
+#: ../../Zotlabs/Module/Settings/Account.php:121
msgid "Remove this account including all its channels"
msgstr "Eliminar esta cuenta incluyendo todos sus canales"
#: ../../Zotlabs/Module/Settings/Channel.php:246
+#: ../../extend/addon/addon/logrot/logrot.php:54
+#: ../../extend/addon/addon/msgfooter/msgfooter.php:54
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:184
+#: ../../extend/addon/addon/piwik/piwik.php:116
+#: ../../extend/addon/addon/twitter/twitter.php:766
+#: ../../extend/addon/addon/xmpp/xmpp.php:102
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:82
msgid "Settings updated."
msgstr "Ajustes actualizados."
@@ -6320,417 +6189,434 @@ msgstr "¿Nos permite sugerirle como amigo potencial a los nuevos miembros?"
msgid "Your channel address is"
msgstr "Su dirección de canal es"
-#: ../../Zotlabs/Module/Settings/Channel.php:450
+#: ../../Zotlabs/Module/Settings/Channel.php:407
+msgid "Your files/photos are accessible via WebDAV at"
+msgstr "Sus archivos y fotos son accesibles a través de WebDAV en "
+
+#: ../../Zotlabs/Module/Settings/Channel.php:453
msgid "Channel Settings"
msgstr "Ajustes del canal"
-#: ../../Zotlabs/Module/Settings/Channel.php:457
+#: ../../Zotlabs/Module/Settings/Channel.php:460
msgid "Basic Settings"
msgstr "Configuración básica"
-#: ../../Zotlabs/Module/Settings/Channel.php:458
-#: ../../include/channel.php:1164
+#: ../../Zotlabs/Module/Settings/Channel.php:461
+#: ../../include/channel.php:1172
msgid "Full Name:"
msgstr "Nombre completo:"
-#: ../../Zotlabs/Module/Settings/Channel.php:460
+#: ../../Zotlabs/Module/Settings/Channel.php:463
msgid "Your Timezone:"
msgstr "Su huso horario:"
-#: ../../Zotlabs/Module/Settings/Channel.php:461
+#: ../../Zotlabs/Module/Settings/Channel.php:464
msgid "Default Post Location:"
msgstr "Localización geográfica predeterminada para sus publicaciones:"
-#: ../../Zotlabs/Module/Settings/Channel.php:461
+#: ../../Zotlabs/Module/Settings/Channel.php:464
msgid "Geographical location to display on your posts"
msgstr "Localización geográfica que debe mostrarse en sus publicaciones"
-#: ../../Zotlabs/Module/Settings/Channel.php:462
+#: ../../Zotlabs/Module/Settings/Channel.php:465
msgid "Use Browser Location:"
msgstr "Usar la localización geográfica del navegador:"
-#: ../../Zotlabs/Module/Settings/Channel.php:464
+#: ../../Zotlabs/Module/Settings/Channel.php:467
msgid "Adult Content"
msgstr "Contenido solo para adultos"
-#: ../../Zotlabs/Module/Settings/Channel.php:464
+#: ../../Zotlabs/Module/Settings/Channel.php:467
msgid ""
"This channel frequently or regularly publishes adult content. (Please tag "
"any adult material and/or nudity with #NSFW)"
msgstr "Este canal publica contenido solo para adultos con frecuencia o regularmente. (Por favor etiquete cualquier material para adultos con la etiqueta #NSFW)"
-#: ../../Zotlabs/Module/Settings/Channel.php:466
+#: ../../Zotlabs/Module/Settings/Channel.php:469
msgid "Security and Privacy Settings"
msgstr "Configuración de seguridad y privacidad"
-#: ../../Zotlabs/Module/Settings/Channel.php:469
+#: ../../Zotlabs/Module/Settings/Channel.php:472
msgid "Your permissions are already configured. Click to view/adjust"
msgstr "Sus permisos ya están configurados. Pulse para ver/ajustar"
-#: ../../Zotlabs/Module/Settings/Channel.php:471
+#: ../../Zotlabs/Module/Settings/Channel.php:474
msgid "Hide my online presence"
msgstr "Ocultar mi presencia en línea"
-#: ../../Zotlabs/Module/Settings/Channel.php:471
+#: ../../Zotlabs/Module/Settings/Channel.php:474
msgid "Prevents displaying in your profile that you are online"
msgstr "Evitar mostrar en su perfil que está en línea"
-#: ../../Zotlabs/Module/Settings/Channel.php:473
+#: ../../Zotlabs/Module/Settings/Channel.php:476
msgid "Simple Privacy Settings:"
msgstr "Configuración de privacidad sencilla:"
-#: ../../Zotlabs/Module/Settings/Channel.php:474
+#: ../../Zotlabs/Module/Settings/Channel.php:477
msgid ""
"Very Public - <em>extremely permissive (should be used with caution)</em>"
msgstr "Muy Público - <em>extremadamente permisivo (debería ser usado con precaución)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:475
+#: ../../Zotlabs/Module/Settings/Channel.php:478
msgid ""
"Typical - <em>default public, privacy when desired (similar to social "
"network permissions but with improved privacy)</em>"
msgstr "Típico - <em>por defecto público, privado cuando se desee (similar a los permisos de una red social pero con privacidad mejorada)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Channel.php:479
msgid "Private - <em>default private, never open or public</em>"
msgstr "Privado - <em>por defecto, privado, nunca abierto o público</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:477
+#: ../../Zotlabs/Module/Settings/Channel.php:480
msgid "Blocked - <em>default blocked to/from everybody</em>"
msgstr "Bloqueado - <em>por defecto, bloqueado/a para cualquiera</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:479
+#: ../../Zotlabs/Module/Settings/Channel.php:482
msgid "Allow others to tag your posts"
msgstr "Permitir a otros etiquetar sus publicaciones"
-#: ../../Zotlabs/Module/Settings/Channel.php:479
+#: ../../Zotlabs/Module/Settings/Channel.php:482
msgid ""
"Often used by the community to retro-actively flag inappropriate content"
msgstr "A menudo usado por la comunidad para marcar contenido inapropiado de forma retroactiva."
-#: ../../Zotlabs/Module/Settings/Channel.php:481
+#: ../../Zotlabs/Module/Settings/Channel.php:484
msgid "Channel Permission Limits"
msgstr "Límites de los permisos del canal"
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "Expire other channel content after this many days"
msgstr "Caducar contenido de otros canales después de este número de días"
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "0 or blank to use the website limit."
msgstr "0 o en blanco para usar el límite del sitio web."
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
#, php-format
msgid "This website expires after %d days."
msgstr "Este sitio web caduca después de %d días."
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "This website does not expire imported content."
msgstr "Este sitio web no caduca el contenido importado."
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "The website limit takes precedence if lower than your limit."
msgstr "El límite del sitio web tiene prioridad si es inferior a su propio límite."
-#: ../../Zotlabs/Module/Settings/Channel.php:484
+#: ../../Zotlabs/Module/Settings/Channel.php:487
msgid "Maximum Friend Requests/Day:"
msgstr "Máximo de solicitudes de amistad por día:"
-#: ../../Zotlabs/Module/Settings/Channel.php:484
+#: ../../Zotlabs/Module/Settings/Channel.php:487
msgid "May reduce spam activity"
msgstr "Podría reducir la actividad de spam"
-#: ../../Zotlabs/Module/Settings/Channel.php:485
+#: ../../Zotlabs/Module/Settings/Channel.php:488
msgid "Default Access Control List (ACL)"
msgstr "Lista de control de acceso (ACL) por defecto"
-#: ../../Zotlabs/Module/Settings/Channel.php:487
+#: ../../Zotlabs/Module/Settings/Channel.php:490
msgid "Use my default audience setting for the type of object published"
msgstr "Usar los ajustes de mi audiencia predeterminada para el tipo de publicación"
-#: ../../Zotlabs/Module/Settings/Channel.php:494
+#: ../../Zotlabs/Module/Settings/Channel.php:497
msgid "Channel permissions category:"
msgstr "Categoría de los permisos del canal:"
-#: ../../Zotlabs/Module/Settings/Channel.php:500
+#: ../../Zotlabs/Module/Settings/Channel.php:503
msgid "Maximum private messages per day from unknown people:"
msgstr "Máximo de mensajes privados por día de gente desconocida:"
-#: ../../Zotlabs/Module/Settings/Channel.php:500
+#: ../../Zotlabs/Module/Settings/Channel.php:503
msgid "Useful to reduce spamming"
msgstr "Útil para reducir el envío de correo no deseado"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Settings/Channel.php:506
msgid "Notification Settings"
msgstr "Configuración de las notificaciones"
-#: ../../Zotlabs/Module/Settings/Channel.php:504
+#: ../../Zotlabs/Module/Settings/Channel.php:507
msgid "By default post a status message when:"
msgstr "Por defecto, enviar un mensaje de estado cuando:"
-#: ../../Zotlabs/Module/Settings/Channel.php:505
+#: ../../Zotlabs/Module/Settings/Channel.php:508
msgid "accepting a friend request"
msgstr "Acepte una solicitud de amistad"
-#: ../../Zotlabs/Module/Settings/Channel.php:506
+#: ../../Zotlabs/Module/Settings/Channel.php:509
msgid "joining a forum/community"
msgstr "al unirse a un foro o comunidad"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:510
msgid "making an <em>interesting</em> profile change"
msgstr "Realice un cambio <em>interesante</em> en su perfil"
-#: ../../Zotlabs/Module/Settings/Channel.php:508
+#: ../../Zotlabs/Module/Settings/Channel.php:511
msgid "Send a notification email when:"
msgstr "Enviar una notificación por correo electrónico cuando:"
-#: ../../Zotlabs/Module/Settings/Channel.php:509
+#: ../../Zotlabs/Module/Settings/Channel.php:512
msgid "You receive a connection request"
msgstr "Reciba una solicitud de conexión"
-#: ../../Zotlabs/Module/Settings/Channel.php:510
+#: ../../Zotlabs/Module/Settings/Channel.php:513
msgid "Your connections are confirmed"
msgstr "Sus conexiones hayan sido confirmadas"
-#: ../../Zotlabs/Module/Settings/Channel.php:511
+#: ../../Zotlabs/Module/Settings/Channel.php:514
msgid "Someone writes on your profile wall"
msgstr "Alguien escriba en la página de su perfil (\"muro\")"
-#: ../../Zotlabs/Module/Settings/Channel.php:512
+#: ../../Zotlabs/Module/Settings/Channel.php:515
msgid "Someone writes a followup comment"
msgstr "Alguien escriba un comentario sobre sus publicaciones"
-#: ../../Zotlabs/Module/Settings/Channel.php:513
+#: ../../Zotlabs/Module/Settings/Channel.php:516
msgid "You receive a private message"
msgstr "Reciba un mensaje privado"
-#: ../../Zotlabs/Module/Settings/Channel.php:514
+#: ../../Zotlabs/Module/Settings/Channel.php:517
msgid "You receive a friend suggestion"
msgstr "Reciba una sugerencia de amistad"
-#: ../../Zotlabs/Module/Settings/Channel.php:515
+#: ../../Zotlabs/Module/Settings/Channel.php:518
msgid "You are tagged in a post"
msgstr "Usted sea etiquetado en una publicación"
-#: ../../Zotlabs/Module/Settings/Channel.php:516
+#: ../../Zotlabs/Module/Settings/Channel.php:519
msgid "You are poked/prodded/etc. in a post"
msgstr "Reciba un toque o incitación en una publicación"
-#: ../../Zotlabs/Module/Settings/Channel.php:519
+#: ../../Zotlabs/Module/Settings/Channel.php:521
+msgid "Someone likes your post/comment"
+msgstr "Alguien muestre agrado por su entrada o comentario"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:524
msgid "Show visual notifications including:"
msgstr "Mostrar notificaciones visuales que incluyan:"
-#: ../../Zotlabs/Module/Settings/Channel.php:521
+#: ../../Zotlabs/Module/Settings/Channel.php:526
msgid "Unseen grid activity"
msgstr "Nueva actividad en la red"
-#: ../../Zotlabs/Module/Settings/Channel.php:522
+#: ../../Zotlabs/Module/Settings/Channel.php:527
msgid "Unseen channel activity"
msgstr "Actividad no vista en el canal"
-#: ../../Zotlabs/Module/Settings/Channel.php:523
+#: ../../Zotlabs/Module/Settings/Channel.php:528
msgid "Unseen private messages"
msgstr "Mensajes privados no leídos"
-#: ../../Zotlabs/Module/Settings/Channel.php:523
#: ../../Zotlabs/Module/Settings/Channel.php:528
-#: ../../Zotlabs/Module/Settings/Channel.php:529
-#: ../../Zotlabs/Module/Settings/Channel.php:530
+#: ../../Zotlabs/Module/Settings/Channel.php:533
+#: ../../Zotlabs/Module/Settings/Channel.php:534
+#: ../../Zotlabs/Module/Settings/Channel.php:535
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
msgid "Recommended"
msgstr "Recomendado"
-#: ../../Zotlabs/Module/Settings/Channel.php:524
+#: ../../Zotlabs/Module/Settings/Channel.php:529
msgid "Upcoming events"
msgstr "Próximos eventos"
-#: ../../Zotlabs/Module/Settings/Channel.php:525
+#: ../../Zotlabs/Module/Settings/Channel.php:530
msgid "Events today"
msgstr "Eventos de hoy"
-#: ../../Zotlabs/Module/Settings/Channel.php:526
+#: ../../Zotlabs/Module/Settings/Channel.php:531
msgid "Upcoming birthdays"
msgstr "Próximos cumpleaños"
-#: ../../Zotlabs/Module/Settings/Channel.php:526
+#: ../../Zotlabs/Module/Settings/Channel.php:531
msgid "Not available in all themes"
msgstr "No disponible en todos los temas"
-#: ../../Zotlabs/Module/Settings/Channel.php:527
+#: ../../Zotlabs/Module/Settings/Channel.php:532
msgid "System (personal) notifications"
msgstr "Notificaciones del sistema (personales)"
-#: ../../Zotlabs/Module/Settings/Channel.php:528
+#: ../../Zotlabs/Module/Settings/Channel.php:533
msgid "System info messages"
msgstr "Mensajes de información del sistema"
-#: ../../Zotlabs/Module/Settings/Channel.php:529
+#: ../../Zotlabs/Module/Settings/Channel.php:534
msgid "System critical alerts"
msgstr "Alertas críticas del sistema"
-#: ../../Zotlabs/Module/Settings/Channel.php:530
+#: ../../Zotlabs/Module/Settings/Channel.php:535
msgid "New connections"
msgstr "Nuevas conexiones"
-#: ../../Zotlabs/Module/Settings/Channel.php:531
+#: ../../Zotlabs/Module/Settings/Channel.php:536
msgid "System Registrations"
msgstr "Registros del sistema"
-#: ../../Zotlabs/Module/Settings/Channel.php:532
+#: ../../Zotlabs/Module/Settings/Channel.php:537
msgid ""
"Also show new wall posts, private messages and connections under Notices"
msgstr "Mostrar también en Avisos las nuevas publicaciones, los mensajes privados y las conexiones"
-#: ../../Zotlabs/Module/Settings/Channel.php:534
+#: ../../Zotlabs/Module/Settings/Channel.php:539
msgid "Notify me of events this many days in advance"
msgstr "Avisarme de los eventos con algunos días de antelación"
-#: ../../Zotlabs/Module/Settings/Channel.php:534
+#: ../../Zotlabs/Module/Settings/Channel.php:539
msgid "Must be greater than 0"
msgstr "Debe ser mayor que 0"
-#: ../../Zotlabs/Module/Settings/Channel.php:536
+#: ../../Zotlabs/Module/Settings/Channel.php:541
msgid "Advanced Account/Page Type Settings"
msgstr "Ajustes avanzados de la cuenta y de los tipos de página"
-#: ../../Zotlabs/Module/Settings/Channel.php:537
+#: ../../Zotlabs/Module/Settings/Channel.php:542
msgid "Change the behaviour of this account for special situations"
msgstr "Cambiar el comportamiento de esta cuenta en situaciones especiales"
-#: ../../Zotlabs/Module/Settings/Channel.php:539
+#: ../../Zotlabs/Module/Settings/Channel.php:544
msgid "Miscellaneous Settings"
msgstr "Ajustes diversos"
-#: ../../Zotlabs/Module/Settings/Channel.php:540
+#: ../../Zotlabs/Module/Settings/Channel.php:545
msgid "Default photo upload folder"
msgstr "Carpeta por defecto de las fotos subidas"
-#: ../../Zotlabs/Module/Settings/Channel.php:540
-#: ../../Zotlabs/Module/Settings/Channel.php:541
+#: ../../Zotlabs/Module/Settings/Channel.php:545
+#: ../../Zotlabs/Module/Settings/Channel.php:546
msgid "%Y - current year, %m - current month"
msgstr "%Y - año en curso, %m - mes actual"
-#: ../../Zotlabs/Module/Settings/Channel.php:541
+#: ../../Zotlabs/Module/Settings/Channel.php:546
msgid "Default file upload folder"
-msgstr "Carpeta por defecto de los archivos subidos"
+msgstr "Carpeta por defecto de los ficheros subidos"
-#: ../../Zotlabs/Module/Settings/Channel.php:543
+#: ../../Zotlabs/Module/Settings/Channel.php:548
msgid "Personal menu to display in your channel pages"
msgstr "Menú personal que debe mostrarse en las páginas de su canal"
-#: ../../Zotlabs/Module/Settings/Channel.php:545
+#: ../../Zotlabs/Module/Settings/Channel.php:550
msgid "Remove this channel."
msgstr "Eliminar este canal."
-#: ../../Zotlabs/Module/Settings/Channel.php:546
+#: ../../Zotlabs/Module/Settings/Channel.php:551
msgid "Firefox Share $Projectname provider"
msgstr "Servicio de compartición de Firefox: proveedor $Projectname"
-#: ../../Zotlabs/Module/Settings/Channel.php:547
+#: ../../Zotlabs/Module/Settings/Channel.php:552
msgid "Start calendar week on monday"
msgstr "Comenzar el calendario semanal por el lunes"
-#: ../../Zotlabs/Module/Settings/Display.php:135
+#: ../../Zotlabs/Module/Settings/Display.php:137
msgid "No special theme for mobile devices"
msgstr "Sin tema especial para dispositivos móviles"
-#: ../../Zotlabs/Module/Settings/Display.php:138
+#: ../../Zotlabs/Module/Settings/Display.php:140
#, php-format
msgid "%s - (Experimental)"
msgstr "%s - (Experimental)"
-#: ../../Zotlabs/Module/Settings/Display.php:189
+#: ../../Zotlabs/Module/Settings/Display.php:191
msgid "Display Settings"
msgstr "Ajustes de visualización"
-#: ../../Zotlabs/Module/Settings/Display.php:190
+#: ../../Zotlabs/Module/Settings/Display.php:192
msgid "Theme Settings"
msgstr "Ajustes del tema"
-#: ../../Zotlabs/Module/Settings/Display.php:191
+#: ../../Zotlabs/Module/Settings/Display.php:193
msgid "Custom Theme Settings"
msgstr "Ajustes personalizados del tema"
-#: ../../Zotlabs/Module/Settings/Display.php:192
+#: ../../Zotlabs/Module/Settings/Display.php:194
msgid "Content Settings"
msgstr "Ajustes del contenido"
-#: ../../Zotlabs/Module/Settings/Display.php:198
+#: ../../Zotlabs/Module/Settings/Display.php:200
msgid "Display Theme:"
msgstr "Tema gráfico del perfil:"
-#: ../../Zotlabs/Module/Settings/Display.php:199
+#: ../../Zotlabs/Module/Settings/Display.php:201
msgid "Select scheme"
msgstr "Elegir un esquema"
-#: ../../Zotlabs/Module/Settings/Display.php:201
+#: ../../Zotlabs/Module/Settings/Display.php:203
msgid "Mobile Theme:"
msgstr "Tema para el móvil:"
-#: ../../Zotlabs/Module/Settings/Display.php:202
+#: ../../Zotlabs/Module/Settings/Display.php:204
msgid "Preload images before rendering the page"
msgstr "Carga previa de las imágenes antes de generar la página"
-#: ../../Zotlabs/Module/Settings/Display.php:202
+#: ../../Zotlabs/Module/Settings/Display.php:204
msgid ""
"The subjective page load time will be longer but the page will be ready when"
" displayed"
msgstr "El tiempo subjetivo de carga de la página será más largo, pero la página estará lista cuando se muestre."
-#: ../../Zotlabs/Module/Settings/Display.php:203
+#: ../../Zotlabs/Module/Settings/Display.php:205
msgid "Enable user zoom on mobile devices"
msgstr "Habilitar zoom de usuario en dispositivos móviles"
-#: ../../Zotlabs/Module/Settings/Display.php:204
+#: ../../Zotlabs/Module/Settings/Display.php:206
msgid "Update browser every xx seconds"
msgstr "Actualizar navegador cada xx segundos"
-#: ../../Zotlabs/Module/Settings/Display.php:204
+#: ../../Zotlabs/Module/Settings/Display.php:206
msgid "Minimum of 10 seconds, no maximum"
msgstr "Mínimo de 10 segundos, sin máximo"
-#: ../../Zotlabs/Module/Settings/Display.php:205
+#: ../../Zotlabs/Module/Settings/Display.php:207
msgid "Maximum number of conversations to load at any time:"
msgstr "Máximo número de conversaciones a cargar en cualquier momento:"
-#: ../../Zotlabs/Module/Settings/Display.php:205
+#: ../../Zotlabs/Module/Settings/Display.php:207
msgid "Maximum of 100 items"
msgstr "Máximo de 100 elementos"
-#: ../../Zotlabs/Module/Settings/Display.php:206
+#: ../../Zotlabs/Module/Settings/Display.php:208
msgid "Show emoticons (smilies) as images"
msgstr "Mostrar emoticonos (smilies) como imágenes"
-#: ../../Zotlabs/Module/Settings/Display.php:207
+#: ../../Zotlabs/Module/Settings/Display.php:209
+msgid "Manual conversation updates"
+msgstr "Actualizaciones manuales de la conversación"
+
+#: ../../Zotlabs/Module/Settings/Display.php:209
+msgid "Default is automatic, which may increase screen jumping"
+msgstr "El valor predeterminado es automático, lo que puede aumentar el salto de pantalla"
+
+#: ../../Zotlabs/Module/Settings/Display.php:210
msgid "Link post titles to source"
msgstr "Enlazar título de la publicación a la fuente original"
-#: ../../Zotlabs/Module/Settings/Display.php:208
+#: ../../Zotlabs/Module/Settings/Display.php:211
msgid "System Page Layout Editor - (advanced)"
msgstr "Editor de plantilla de página del sistema - (avanzado)"
-#: ../../Zotlabs/Module/Settings/Display.php:211
+#: ../../Zotlabs/Module/Settings/Display.php:214
msgid "Use blog/list mode on channel page"
msgstr "Usar modo blog/lista en la página de inicio del canal"
-#: ../../Zotlabs/Module/Settings/Display.php:211
-#: ../../Zotlabs/Module/Settings/Display.php:212
+#: ../../Zotlabs/Module/Settings/Display.php:214
+#: ../../Zotlabs/Module/Settings/Display.php:215
msgid "(comments displayed separately)"
msgstr "(comentarios mostrados de forma separada)"
-#: ../../Zotlabs/Module/Settings/Display.php:212
+#: ../../Zotlabs/Module/Settings/Display.php:215
msgid "Use blog/list mode on grid page"
msgstr "Mostrar mi red en modo blog"
-#: ../../Zotlabs/Module/Settings/Display.php:213
+#: ../../Zotlabs/Module/Settings/Display.php:216
msgid "Channel page max height of content (in pixels)"
msgstr "Altura máxima del contenido de la página del canal (en píxeles)"
-#: ../../Zotlabs/Module/Settings/Display.php:213
-#: ../../Zotlabs/Module/Settings/Display.php:214
+#: ../../Zotlabs/Module/Settings/Display.php:216
+#: ../../Zotlabs/Module/Settings/Display.php:217
msgid "click to expand content exceeding this height"
msgstr "Pulsar para expandir el contenido que exceda de esta altura"
-#: ../../Zotlabs/Module/Settings/Display.php:214
+#: ../../Zotlabs/Module/Settings/Display.php:217
msgid "Grid page max height of content (in pixels)"
msgstr "Altura máxima del contenido de mi red (en píxeles)"
@@ -6742,352 +6628,442 @@ msgstr "No se ha establecido la configuración de los complementos"
msgid "Feature/Addon Settings"
msgstr "Ajustes de los complementos"
-#: ../../Zotlabs/Module/Settings/Features.php:45
-msgid "Additional Features"
-msgstr "Funcionalidades"
+#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
+msgid "Tag removed"
+msgstr "Etiqueta eliminada."
-#: ../../Zotlabs/Module/Settings/Oauth.php:34
-msgid "Name is required"
-msgstr "El nombre es obligatorio"
+#: ../../Zotlabs/Module/Tagrm.php:123
+msgid "Remove Item Tag"
+msgstr "Eliminar etiqueta del elemento."
-#: ../../Zotlabs/Module/Settings/Oauth.php:38
-msgid "Key and Secret are required"
-msgstr "\"Key\" y \"Secret\" son obligatorios"
+#: ../../Zotlabs/Module/Tagrm.php:125
+msgid "Select a tag to remove: "
+msgstr "Seleccionar una etiqueta para eliminar:"
-#: ../../Zotlabs/Module/Settings/Oauth.php:86
-#: ../../Zotlabs/Module/Settings/Oauth.php:112
-#: ../../Zotlabs/Module/Settings/Oauth.php:148
-msgid "Add application"
-msgstr "Añadir aplicación"
+#: ../../Zotlabs/Module/Thing.php:114
+msgid "Thing updated"
+msgstr "Elemento actualizado."
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-msgid "Name of application"
-msgstr "Nombre de la aplicación"
+#: ../../Zotlabs/Module/Thing.php:166
+msgid "Object store: failed"
+msgstr "Guardar objeto: ha fallado"
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:116
-msgid "Consumer Key"
-msgstr "Consumer Key"
+#: ../../Zotlabs/Module/Thing.php:170
+msgid "Thing added"
+msgstr "Elemento añadido"
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-msgid "Automatically generated - change if desired. Max length 20"
-msgstr "Generado automáticamente - si lo desea, cámbielo. Longitud máxima: 20"
+#: ../../Zotlabs/Module/Thing.php:196
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-#: ../../Zotlabs/Module/Settings/Oauth.php:117
-msgid "Consumer Secret"
-msgstr "Consumer Secret"
+#: ../../Zotlabs/Module/Thing.php:259
+msgid "Show Thing"
+msgstr "Mostrar elemento"
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-#: ../../Zotlabs/Module/Settings/Oauth.php:118
-msgid "Redirect"
-msgstr "Redirigir"
+#: ../../Zotlabs/Module/Thing.php:266
+msgid "item not found."
+msgstr "elemento no encontrado."
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-msgid ""
-"Redirect URI - leave blank unless your application specifically requires "
-"this"
-msgstr "URI de redirección - dejar en blanco a menos que su aplicación específicamente lo requiera"
+#: ../../Zotlabs/Module/Thing.php:299
+msgid "Edit Thing"
+msgstr "Editar elemento"
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-#: ../../Zotlabs/Module/Settings/Oauth.php:119
-msgid "Icon url"
-msgstr "Dirección del icono"
+#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
+msgid "Select a profile"
+msgstr "Seleccionar un perfil"
-#: ../../Zotlabs/Module/Settings/Oauth.php:104
-msgid "Application not found."
-msgstr "Aplicación no encontrada."
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Post an activity"
+msgstr "Publicar una actividad"
-#: ../../Zotlabs/Module/Settings/Oauth.php:147
-msgid "Connected Apps"
-msgstr "Aplicaciones (apps) conectadas"
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Sólo enviar a espectadores del perfil pertinente."
-#: ../../Zotlabs/Module/Settings/Oauth.php:151
-msgid "Client key starts with"
-msgstr "La \"client key\" empieza por"
+#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
+msgid "Name of thing e.g. something"
+msgstr "Nombre del elemento, p. ej.:. \"algo\""
-#: ../../Zotlabs/Module/Settings/Oauth.php:152
-msgid "No name"
-msgstr "Sin nombre"
+#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
+msgid "URL of thing (optional)"
+msgstr "Dirección del elemento (opcional)"
-#: ../../Zotlabs/Module/Settings/Oauth.php:153
-msgid "Remove authorization"
-msgstr "Eliminar autorización"
+#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
+msgid "URL for photo of thing (optional)"
+msgstr "Dirección para la foto o elemento (opcional)"
-#: ../../Zotlabs/Module/Settings/Tokens.php:31
+#: ../../Zotlabs/Module/Thing.php:353
+msgid "Add Thing to your Profile"
+msgstr "Añadir alguna cosa a su perfil"
+
+#: ../../Zotlabs/Module/Import.php:33
#, php-format
-msgid "This channel is limited to %d tokens"
-msgstr "Este canal tiene un límite de %d tokens"
+msgid "Your service plan only allows %d channels."
+msgstr "Su paquete de servicios solo permite %d canales."
-#: ../../Zotlabs/Module/Settings/Tokens.php:37
-msgid "Name and Password are required."
-msgstr "Se requiere el nombre y la contraseña."
+#: ../../Zotlabs/Module/Import.php:157 ../../include/import.php:100
+msgid "Cloned channel not found. Import failed."
+msgstr "No se ha podido importar el canal porque el canal clonado no se ha encontrado."
-#: ../../Zotlabs/Module/Settings/Tokens.php:77
-msgid "Token saved."
-msgstr "Token salvado."
+#: ../../Zotlabs/Module/Import.php:167
+msgid "No channel. Import failed."
+msgstr "No hay canal. La importación ha fallado"
-#: ../../Zotlabs/Module/Settings/Tokens.php:113
+#: ../../Zotlabs/Module/Import.php:503
+#: ../../include/Import/import_diaspora.php:142
+msgid "Import completed."
+msgstr "Importación completada."
+
+#: ../../Zotlabs/Module/Import.php:525
+msgid "You must be logged in to use this feature."
+msgstr "Debe estar registrado para poder usar esta funcionalidad."
+
+#: ../../Zotlabs/Module/Import.php:530
+msgid "Import Channel"
+msgstr "Importar canal"
+
+#: ../../Zotlabs/Module/Import.php:531
msgid ""
-"Use this form to create temporary access identifiers to share things with "
-"non-members. These identities may be used in Access Control Lists and "
-"visitors may login using these credentials to access private content."
-msgstr "Utilice este formulario para crear identificadores de acceso temporal para compartir cosas con los no miembros de Hubzilla. Estas identidades se pueden usar en las Listas de control de acceso (ACL) y así los visitantes pueden iniciar sesión, utilizando estas credenciales, para acceder a su contenido privado."
+"Use this form to import an existing channel from a different server/hub. You"
+" may retrieve the channel identity from the old server/hub via the network "
+"or provide an export file."
+msgstr "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación."
-#: ../../Zotlabs/Module/Settings/Tokens.php:115
+#: ../../Zotlabs/Module/Import.php:533
+msgid "Or provide the old server/hub details"
+msgstr "O proporcione los detalles de su antiguo servidor/hub"
+
+#: ../../Zotlabs/Module/Import.php:534
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Su identidad en el antiguo servidor (canal@ejemplo.com)"
+
+#: ../../Zotlabs/Module/Import.php:535
+msgid "Your old login email address"
+msgstr "Su antigua dirección de correo electrónico"
+
+#: ../../Zotlabs/Module/Import.php:536
+msgid "Your old login password"
+msgstr "Su antigua contraseña"
+
+#: ../../Zotlabs/Module/Import.php:537
msgid ""
-"You may also provide <em>dropbox</em> style access links to friends and "
-"associates by adding the Login Password to any specific site URL as shown. "
-"Examples:"
-msgstr "También puede proporcionar, con el estilo <em>dropbox</em>, enlaces de acceso a sus amigos y asociados añadiendo la contraseña de inicio de sesión a cualquier dirección URL, como se muestra. Ejemplos: "
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be"
+" able to post from either location, but only one can be marked as the "
+"primary location for files, photos, and media."
+msgstr "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos."
-#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:647
-msgid "Guest Access Tokens"
-msgstr "Tokens de acceso para invitados"
+#: ../../Zotlabs/Module/Import.php:538
+msgid "Make this hub my primary location"
+msgstr "Convertir este servidor en mi ubicación primaria"
-#: ../../Zotlabs/Module/Settings/Tokens.php:157
-msgid "Login Name"
-msgstr "Nombre de inicio de sesión"
+#: ../../Zotlabs/Module/Import.php:539
+msgid ""
+"Import existing posts if possible (experimental - limited by available "
+"memory"
+msgstr "Importar el contenido publicado si es posible (experimental - limitado por la memoria disponible"
-#: ../../Zotlabs/Module/Settings/Tokens.php:158
-msgid "Login Password"
-msgstr "Contraseña de inicio de sesión"
+#: ../../Zotlabs/Module/Import.php:540
+msgid ""
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
+msgstr "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine."
-#: ../../Zotlabs/Module/Settings/Tokens.php:159
-msgid "Expires (yyyy-mm-dd)"
-msgstr "Expira (aaaa-mm-dd)"
+#: ../../Zotlabs/Module/Viewconnections.php:65
+msgid "No connections."
+msgstr "Sin conexiones."
-#: ../../Zotlabs/Lib/Chatroom.php:27
-msgid "Missing room name"
-msgstr "Sala de chat sin nombre"
+#: ../../Zotlabs/Module/Viewconnections.php:78
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Visitar el perfil de %s [%s]"
-#: ../../Zotlabs/Lib/Chatroom.php:36
-msgid "Duplicate room name"
-msgstr "Nombre de sala duplicado."
+#: ../../Zotlabs/Module/Viewconnections.php:107
+msgid "View Connections"
+msgstr "Ver conexiones"
-#: ../../Zotlabs/Lib/Chatroom.php:86 ../../Zotlabs/Lib/Chatroom.php:94
-msgid "Invalid room specifier."
-msgstr "Especificador de sala no válido."
+#: ../../Zotlabs/Module/Viewsrc.php:44
+msgid "Source of Item"
+msgstr "Origen del elemento"
-#: ../../Zotlabs/Lib/Chatroom.php:126
-msgid "Room not found."
-msgstr "Sala no encontrada."
+#: ../../Zotlabs/Module/Chat.php:181
+msgid "Room not found"
+msgstr "Sala no encontrada"
-#: ../../Zotlabs/Lib/Chatroom.php:147
-msgid "Room is full"
-msgstr "La sala está llena."
+#: ../../Zotlabs/Module/Chat.php:197
+msgid "Leave Room"
+msgstr "Abandonar la sala"
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1889
-msgid "$Projectname Notification"
-msgstr "Notificación de $Projectname"
+#: ../../Zotlabs/Module/Chat.php:198
+msgid "Delete Room"
+msgstr "Eliminar esta sala"
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../include/network.php:1890
-msgid "$projectname"
-msgstr "$projectname"
+#: ../../Zotlabs/Module/Chat.php:199
+msgid "I am away right now"
+msgstr "Estoy ausente momentáneamente"
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1892
-msgid "Thank You,"
-msgstr "Gracias,"
+#: ../../Zotlabs/Module/Chat.php:200
+msgid "I am online"
+msgstr "Estoy conectado/a"
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1894
-#, php-format
-msgid "%s Administrator"
-msgstr "%s Administrador"
+#: ../../Zotlabs/Module/Chat.php:202
+msgid "Bookmark this room"
+msgstr "Añadir esta sala a Marcadores"
-#: ../../Zotlabs/Lib/Enotify.php:103
-#, php-format
-msgid "%s <!item_type!>"
-msgstr "%s <!item_type!>"
+#: ../../Zotlabs/Module/Chat.php:231
+msgid "New Chatroom"
+msgstr "Nueva sala de chat"
-#: ../../Zotlabs/Lib/Enotify.php:107
-#, php-format
-msgid "[$Projectname:Notify] New mail received at %s"
-msgstr "[$Projectname:Aviso] Nuevo correo recibido en %s"
+#: ../../Zotlabs/Module/Chat.php:232
+msgid "Chatroom name"
+msgstr "Nombre de la sala de chat"
-#: ../../Zotlabs/Lib/Enotify.php:109
-#, php-format
-msgid "%1$s, %2$s sent you a new private message at %3$s."
-msgstr "%1$s, %2$s le ha enviado un nuevo mensaje privado en %3$s."
+#: ../../Zotlabs/Module/Chat.php:233
+msgid "Expiration of chats (minutes)"
+msgstr "Caducidad de los mensajes en los chats (en minutos)"
-#: ../../Zotlabs/Lib/Enotify.php:110
+#: ../../Zotlabs/Module/Chat.php:249
#, php-format
-msgid "%1$s sent you %2$s."
-msgstr "%1$s le ha enviado %2$s."
+msgid "%1$s's Chatrooms"
+msgstr "Salas de chat de %1$s"
-#: ../../Zotlabs/Lib/Enotify.php:110
-msgid "a private message"
-msgstr "un mensaje privado"
+#: ../../Zotlabs/Module/Chat.php:254
+msgid "No chatrooms available"
+msgstr "No hay salas de chat disponibles"
-#: ../../Zotlabs/Lib/Enotify.php:111
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr "Por favor visite %s para ver y/o responder a su mensaje privado."
+#: ../../Zotlabs/Module/Chat.php:258
+msgid "Expiration"
+msgstr "Caducidad"
-#: ../../Zotlabs/Lib/Enotify.php:170
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
-msgstr "%1$s, %2$s ha comentado [zrl=%3$s]%4$s[/zrl]"
+#: ../../Zotlabs/Module/Chat.php:259
+msgid "min"
+msgstr "min"
-#: ../../Zotlabs/Lib/Enotify.php:178
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
-msgstr "%1$s, %2$s ha comentado [zrl=%3$s]%5$s de %4$s[/zrl] "
+#: ../../Zotlabs/Module/Xchan.php:10
+msgid "Xchan Lookup"
+msgstr "Búsqueda de canales"
-#: ../../Zotlabs/Lib/Enotify.php:187
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
-msgstr "%1$s, %2$s ha comentado [zrl=%3$s]%4$s creado por usted[/zrl]"
+#: ../../Zotlabs/Module/Xchan.php:13
+msgid "Lookup xchan beginning with (or webbie): "
+msgstr "Buscar un canal (o un \"webbie\") que comience por:"
-#: ../../Zotlabs/Lib/Enotify.php:198
-#, php-format
-msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
-msgstr "[$Projectname:Aviso] Nuevo comentario de %2$s en la conversación #%1$d"
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
+msgstr "Entradas de calendario importadas."
-#: ../../Zotlabs/Lib/Enotify.php:199
-#, php-format
-msgid "%1$s, %2$s commented on an item/conversation you have been following."
-msgstr "%1$s, %2$s ha comentado un elemento/conversación que ha estado siguiendo."
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
+msgstr "No se han encontrado entradas de calendario."
-#: ../../Zotlabs/Lib/Enotify.php:202 ../../Zotlabs/Lib/Enotify.php:217
-#: ../../Zotlabs/Lib/Enotify.php:243 ../../Zotlabs/Lib/Enotify.php:261
-#: ../../Zotlabs/Lib/Enotify.php:275
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr "Para ver o comentar la conversación, visite %s"
+#: ../../Zotlabs/Module/Events.php:106
+msgid "Event can not end before it has started."
+msgstr "Un evento no puede terminar antes de que haya comenzado."
-#: ../../Zotlabs/Lib/Enotify.php:208
-#, php-format
-msgid "[$Projectname:Notify] %s posted to your profile wall"
-msgstr "[$Projectname:Aviso] %s ha publicado una entrada en su página de inicio del perfil (\"muro\")"
+#: ../../Zotlabs/Module/Events.php:108 ../../Zotlabs/Module/Events.php:117
+#: ../../Zotlabs/Module/Events.php:139
+msgid "Unable to generate preview."
+msgstr "No se puede crear la vista previa."
-#: ../../Zotlabs/Lib/Enotify.php:210
-#, php-format
-msgid "%1$s, %2$s posted to your profile wall at %3$s"
-msgstr "%1$s, %2$s ha publicado en su página del perfil en %3$s"
+#: ../../Zotlabs/Module/Events.php:115
+msgid "Event title and start time are required."
+msgstr "Se requieren el título del evento y su hora de inicio."
-#: ../../Zotlabs/Lib/Enotify.php:212
-#, php-format
-msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
-msgstr "%1$s, %2$s ha publicado en [zrl=%3$s]su página del perfil[/zrl]"
+#: ../../Zotlabs/Module/Events.php:137 ../../Zotlabs/Module/Events.php:261
+msgid "Event not found."
+msgstr "Evento no encontrado."
-#: ../../Zotlabs/Lib/Enotify.php:236
-#, php-format
-msgid "[$Projectname:Notify] %s tagged you"
-msgstr "[$Projectname:Aviso] %s le ha etiquetado"
+#: ../../Zotlabs/Module/Events.php:453
+msgid "Edit event title"
+msgstr "Editar el título del evento"
-#: ../../Zotlabs/Lib/Enotify.php:237
-#, php-format
-msgid "%1$s, %2$s tagged you at %3$s"
-msgstr "%1$s, %2$s le ha etiquetado en %3$s"
+#: ../../Zotlabs/Module/Events.php:453
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835
+msgid "Event title"
+msgstr "Título del evento"
-#: ../../Zotlabs/Lib/Enotify.php:238
-#, php-format
-msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
-msgstr "%1$s, %2$s [zrl=%3$s]le etiquetó[/zrl]."
+#: ../../Zotlabs/Module/Events.php:455
+msgid "Categories (comma-separated list)"
+msgstr "Temas (lista separada por comas)"
-#: ../../Zotlabs/Lib/Enotify.php:250
-#, php-format
-msgid "[$Projectname:Notify] %1$s poked you"
-msgstr "[$Projectname:Aviso] %1$s le ha dado un toque"
+#: ../../Zotlabs/Module/Events.php:456
+msgid "Edit Category"
+msgstr "Modificar el tema"
-#: ../../Zotlabs/Lib/Enotify.php:251
-#, php-format
-msgid "%1$s, %2$s poked you at %3$s"
-msgstr "%1$s, %2$s le ha dado un toque en %3$s"
+#: ../../Zotlabs/Module/Events.php:456
+msgid "Category"
+msgstr "Tema"
-#: ../../Zotlabs/Lib/Enotify.php:252
-#, php-format
-msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
-msgstr "%1$s, %2$s [zrl=%2$s]le ha dado un toque[/zrl]."
+#: ../../Zotlabs/Module/Events.php:459
+msgid "Edit start date and time"
+msgstr "Modificar la fecha y hora de comienzo"
-#: ../../Zotlabs/Lib/Enotify.php:268
-#, php-format
-msgid "[$Projectname:Notify] %s tagged your post"
-msgstr "[$Projectname:Aviso] %s ha etiquetado su entrada"
+#: ../../Zotlabs/Module/Events.php:459
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
+msgid "Start date and time"
+msgstr "Fecha y hora de comienzo"
-#: ../../Zotlabs/Lib/Enotify.php:269
-#, php-format
-msgid "%1$s, %2$s tagged your post at %3$s"
-msgstr "%1$s, %2$s ha etiquetado su publicación en %3$s"
+#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:463
+msgid "Finish date and time are not known or not relevant"
+msgstr "La fecha y hora de terminación no se conocen o no son relevantes"
-#: ../../Zotlabs/Lib/Enotify.php:270
-#, php-format
-msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
-msgstr "%1$s, %2$s ha etiquetado [zrl=%3$s]su publicación[/zrl]"
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Edit finish date and time"
+msgstr "Modificar la fecha y hora de terminación"
-#: ../../Zotlabs/Lib/Enotify.php:282
-msgid "[$Projectname:Notify] Introduction received"
-msgstr "[$Projectname:Aviso] Ha recibido una solicitud de conexión"
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Finish date and time"
+msgstr "Fecha y hora de terminación"
-#: ../../Zotlabs/Lib/Enotify.php:283
-#, php-format
-msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
-msgstr "%1$s, ha recibido una nueva solicitud de conexión de '%2$s' en %3$s"
+#: ../../Zotlabs/Module/Events.php:464 ../../Zotlabs/Module/Events.php:465
+msgid "Adjust for viewer timezone"
+msgstr "Ajustar para obtener el visor de los husos horarios"
-#: ../../Zotlabs/Lib/Enotify.php:284
-#, php-format
+#: ../../Zotlabs/Module/Events.php:464
msgid ""
-"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
-msgstr "%1$s, ha recibido [zrl=%2$s]una nueva solicitud de conexión[/zrl] de %3$s."
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
+msgstr "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales."
-#: ../../Zotlabs/Lib/Enotify.php:288 ../../Zotlabs/Lib/Enotify.php:307
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Puede visitar su perfil en %s"
+#: ../../Zotlabs/Module/Events.php:466
+msgid "Edit Description"
+msgstr "Editar la descripción"
-#: ../../Zotlabs/Lib/Enotify.php:290
-#, php-format
-msgid "Please visit %s to approve or reject the connection request."
-msgstr "Por favor, visite %s para permitir o rechazar la solicitad de conexión."
+#: ../../Zotlabs/Module/Events.php:468
+msgid "Edit Location"
+msgstr "Modificar la dirección"
-#: ../../Zotlabs/Lib/Enotify.php:297
-msgid "[$Projectname:Notify] Friend suggestion received"
-msgstr "[$Projectname:Aviso] Ha recibido una sugerencia de conexión"
+#: ../../Zotlabs/Module/Events.php:472 ../../include/conversation.php:1262
+msgid "Permission settings"
+msgstr "Configuración de permisos"
-#: ../../Zotlabs/Lib/Enotify.php:298
-#, php-format
-msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
-msgstr "%1$s, ha recibido una sugerencia de conexión de '%2$s' en %3$s"
+#: ../../Zotlabs/Module/Events.php:485
+msgid "Advanced Options"
+msgstr "Opciones avanzadas"
-#: ../../Zotlabs/Lib/Enotify.php:299
-#, php-format
-msgid ""
-"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
-"%4$s."
-msgstr "%1$s, ha recibido [zrl=%2$s]una sugerencia de conexión[/zrl] para %3$s de %4$s."
+#: ../../Zotlabs/Module/Events.php:624
+msgid "Edit event"
+msgstr "Editar evento"
-#: ../../Zotlabs/Lib/Enotify.php:305
-msgid "Name:"
-msgstr "Nombre:"
+#: ../../Zotlabs/Module/Events.php:626
+msgid "Delete event"
+msgstr "Borrar evento"
-#: ../../Zotlabs/Lib/Enotify.php:306
-msgid "Photo:"
-msgstr "Foto:"
+#: ../../Zotlabs/Module/Events.php:660
+msgid "calendar"
+msgstr "calendario"
-#: ../../Zotlabs/Lib/Enotify.php:309
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Por favor, visite %s para aprobar o rechazar la sugerencia."
+#: ../../Zotlabs/Module/Events.php:686
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849
+msgid "Month"
+msgstr "Mes"
-#: ../../Zotlabs/Lib/Enotify.php:527
-msgid "[$Projectname:Notify]"
-msgstr "[$Projectname:Aviso]"
+#: ../../Zotlabs/Module/Events.php:687
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850
+msgid "Week"
+msgstr "Semana"
-#: ../../Zotlabs/Lib/Enotify.php:687
-msgid "created a new post"
-msgstr "ha creado una nueva entrada"
+#: ../../Zotlabs/Module/Events.php:688
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851
+msgid "Day"
+msgstr "Día"
+
+#: ../../Zotlabs/Module/Events.php:722
+msgid "Event removed"
+msgstr "Evento borrado"
+
+#: ../../Zotlabs/Module/Events.php:725
+msgid "Failed to remove event"
+msgstr "Error al eliminar el evento"
+
+#: ../../Zotlabs/Lib/Chatroom.php:27
+msgid "Missing room name"
+msgstr "Sala de chat sin nombre"
+
+#: ../../Zotlabs/Lib/Chatroom.php:36
+msgid "Duplicate room name"
+msgstr "Nombre de sala duplicado."
+
+#: ../../Zotlabs/Lib/Chatroom.php:86 ../../Zotlabs/Lib/Chatroom.php:94
+msgid "Invalid room specifier."
+msgstr "Especificador de sala no válido."
-#: ../../Zotlabs/Lib/Enotify.php:688
+#: ../../Zotlabs/Lib/Chatroom.php:126
+msgid "Room not found."
+msgstr "Sala no encontrada."
+
+#: ../../Zotlabs/Lib/Chatroom.php:147
+msgid "Room is full"
+msgstr "La sala está llena."
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:34
+#: ../../include/acl_selectors.php:128
+msgid "Visible to your default audience"
+msgstr "Visible para su público predeterminado."
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:107
+#: ../../include/acl_selectors.php:191
+msgid "Only me"
+msgstr "Sólo yo"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:108
+msgid "Public"
+msgstr "Público"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:109
+msgid "Anybody in the $Projectname network"
+msgstr "Cualquiera en la red $Projectname"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:110
#, php-format
-msgid "commented on %s's post"
-msgstr "ha comentado la entrada de %s"
+msgid "Any account on %s"
+msgstr "Cualquier cuenta en %s"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:111
+msgid "Any of my connections"
+msgstr "Cualquiera de mis conexiones"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:112
+msgid "Only connections I specifically allow"
+msgstr "Sólo las conexiones que yo permita de forma explícita"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:113
+msgid "Anybody authenticated (could include visitors from other networks)"
+msgstr "Cualquiera que esté autenticado (podría incluir a los visitantes de otras redes)"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:114
+msgid "Any connections including those who haven't yet been approved"
+msgstr "Cualquier conexión incluyendo aquellas que aún no han sido aprobadas"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:150
+msgid ""
+"This is your default setting for the audience of your normal stream, and "
+"posts."
+msgstr "Esta es la configuración predeterminada para su flujo (stream) habitual de publicaciones."
-#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:667
+#: ../../Zotlabs/Lib/PermissionDescription.php:151
+msgid ""
+"This is your default setting for who can view your default channel profile"
+msgstr "Esta es su configuración por defecto para establecer quién puede ver su perfil del canal predeterminado"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:152
+msgid "This is your default setting for who can view your connections"
+msgstr "Este es su ajuste predeterminado para establecer quién puede ver sus conexiones"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:153
+msgid ""
+"This is your default setting for who can view your file storage and photos"
+msgstr "Este es su ajuste predeterminado para establecer quién puede ver su repositorio de ficheros y sus fotos"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:154
+msgid "This is your default setting for the audience of your webpages"
+msgstr "Este es el ajuste predeterminado para establecer la audiencia de sus páginas web"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:663
msgid "Private Message"
msgstr "Mensaje Privado"
-#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:659
+#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:655
msgid "Select"
msgstr "Seleccionar"
@@ -7135,11 +7111,11 @@ msgstr "Activar o desactivar el estado de entrada preferida"
msgid "starred"
msgstr "preferidas"
-#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:674
+#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:670
msgid "Message signature validated"
msgstr "Firma de mensaje validada"
-#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:675
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:671
msgid "Message signature incorrect"
msgstr "Firma de mensaje incorrecta"
@@ -7195,1004 +7171,3376 @@ msgstr "De página del perfil a página del perfil (de \"muro\" a \"muro\")"
msgid "via Wall-To-Wall:"
msgstr "Mediante el procedimiento página del perfil a página del perfil (de \"muro\" a \"muro\")"
-#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:720
+#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:716
#, php-format
msgid "from %s"
msgstr "desde %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:723
+#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:719
#, php-format
msgid "last edited: %s"
msgstr "último cambio: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:724
+#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:720
#, php-format
msgid "Expires: %s"
msgstr "Caduca: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:377
+#: ../../Zotlabs/Lib/ThreadItem.php:358
+msgid "Attend"
+msgstr "Participar o asistir"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:359
+msgid "Attendance Options"
+msgstr "Opciones de participación o asistencia"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:360
+msgid "Vote"
+msgstr "Votar"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:361
+msgid "Voting Options"
+msgstr "Opciones de votación"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:381
+#: ../../extend/addon/addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr "Guardar en Marcadores"
-#: ../../Zotlabs/Lib/ThreadItem.php:378
+#: ../../Zotlabs/Lib/ThreadItem.php:382
msgid "Add to Calendar"
msgstr "Añadir al calendario"
-#: ../../Zotlabs/Lib/ThreadItem.php:387
+#: ../../Zotlabs/Lib/ThreadItem.php:391
msgid "Mark all seen"
msgstr "Marcar todo como visto"
-#: ../../Zotlabs/Lib/ThreadItem.php:436 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:440 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr "%s mostrar todo"
-#: ../../Zotlabs/Lib/ThreadItem.php:726 ../../include/conversation.php:1239
+#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/conversation.php:1237
msgid "Bold"
msgstr "Negrita"
-#: ../../Zotlabs/Lib/ThreadItem.php:727 ../../include/conversation.php:1240
+#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/conversation.php:1238
msgid "Italic"
msgstr "Itálico "
-#: ../../Zotlabs/Lib/ThreadItem.php:728 ../../include/conversation.php:1241
+#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1239
msgid "Underline"
msgstr "Subrayar"
-#: ../../Zotlabs/Lib/ThreadItem.php:729 ../../include/conversation.php:1242
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1240
msgid "Quote"
msgstr "Citar"
-#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/conversation.php:1243
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1241
msgid "Code"
msgstr "Código"
-#: ../../Zotlabs/Lib/ThreadItem.php:731
+#: ../../Zotlabs/Lib/ThreadItem.php:735
msgid "Image"
msgstr "Imagen"
-#: ../../Zotlabs/Lib/ThreadItem.php:732
+#: ../../Zotlabs/Lib/ThreadItem.php:736
msgid "Insert Link"
msgstr "Insertar enlace"
-#: ../../Zotlabs/Lib/ThreadItem.php:733
+#: ../../Zotlabs/Lib/ThreadItem.php:737
msgid "Video"
msgstr "Vídeo"
-#: ../../Zotlabs/Lib/PermissionDescription.php:31
-#: ../../include/acl_selectors.php:124
-msgid "Visible to your default audience"
-msgstr "Visible para su público predeterminado."
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:106
-#: ../../include/acl_selectors.php:165
-msgid "Only me"
-msgstr "Sólo yo"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:107
-msgid "Public"
-msgstr "Público"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:108
-msgid "Anybody in the $Projectname network"
-msgstr "Cualquiera en la red $Projectname"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:109
-#, php-format
-msgid "Any account on %s"
-msgstr "Cualquier cuenta en %s"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:110
-msgid "Any of my connections"
-msgstr "Cualquiera de mis conexiones"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:111
-msgid "Only connections I specifically allow"
-msgstr "Sólo las conexiones que yo permita de forma explícita"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:112
-msgid "Anybody authenticated (could include visitors from other networks)"
-msgstr "Cualquiera que esté autenticado (podría incluir a los visitantes de otras redes)"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:113
-msgid "Any connections including those who haven't yet been approved"
-msgstr "Cualquier conexión incluyendo aquellas que aún no han sido aprobadas"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:152
-msgid ""
-"This is your default setting for the audience of your normal stream, and "
-"posts."
-msgstr "Esta es la configuración predeterminada para su flujo (stream) habitual de publicaciones."
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:153
-msgid ""
-"This is your default setting for who can view your default channel profile"
-msgstr "Esta es su configuración por defecto para establecer quién puede ver su perfil del canal predeterminado"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:154
-msgid "This is your default setting for who can view your connections"
-msgstr "Este es su ajuste predeterminado para establecer quién puede ver sus conexiones"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:155
-msgid ""
-"This is your default setting for who can view your file storage and photos"
-msgstr "Este es su ajuste predeterminado para establecer quién puede ver su repositorio de ficheros y sus fotos"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:156
-msgid "This is your default setting for the audience of your webpages"
-msgstr "Este es el ajuste predeterminado para establecer la audiencia de sus páginas web"
-
-#: ../../Zotlabs/Lib/Apps.php:205
+#: ../../Zotlabs/Lib/Apps.php:207
msgid "Site Admin"
msgstr "Administrador del sitio"
-#: ../../Zotlabs/Lib/Apps.php:206
-msgid "Bug Report"
+#: ../../Zotlabs/Lib/Apps.php:208
+#: ../../extend/addon/addon/buglink/buglink.php:16
+msgid "Report Bug"
msgstr "Informe de errores"
-#: ../../Zotlabs/Lib/Apps.php:207
+#: ../../Zotlabs/Lib/Apps.php:209
msgid "View Bookmarks"
msgstr "Ver los marcadores"
-#: ../../Zotlabs/Lib/Apps.php:208
+#: ../../Zotlabs/Lib/Apps.php:210
msgid "My Chatrooms"
msgstr "Mis salas de chat"
-#: ../../Zotlabs/Lib/Apps.php:210
+#: ../../Zotlabs/Lib/Apps.php:212
msgid "Firefox Share"
msgstr "Servicio de compartición de Firefox"
-#: ../../Zotlabs/Lib/Apps.php:211
+#: ../../Zotlabs/Lib/Apps.php:213
msgid "Remote Diagnostics"
msgstr "Diagnóstico remoto"
-#: ../../Zotlabs/Lib/Apps.php:212 ../../include/features.php:319
+#: ../../Zotlabs/Lib/Apps.php:214 ../../include/features.php:319
msgid "Suggest Channels"
msgstr "Sugerir canales"
-#: ../../Zotlabs/Lib/Apps.php:213 ../../include/nav.php:115
-#: ../../boot.php:1739
+#: ../../Zotlabs/Lib/Apps.php:215 ../../include/nav.php:115
+#: ../../boot.php:1720
msgid "Login"
msgstr "Iniciar sesión"
-#: ../../Zotlabs/Lib/Apps.php:215 ../../include/nav.php:184
+#: ../../Zotlabs/Lib/Apps.php:217 ../../include/nav.php:182
msgid "Grid"
msgstr "Red"
-#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:187
+#: ../../Zotlabs/Lib/Apps.php:221 ../../include/features.php:99
+#: ../../include/conversation.php:1740
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:185
msgid "Channel Home"
msgstr "Mi canal"
-#: ../../Zotlabs/Lib/Apps.php:223 ../../include/nav.php:206
-#: ../../include/conversation.php:1689 ../../include/conversation.php:1692
+#: ../../Zotlabs/Lib/Apps.php:225 ../../include/nav.php:204
+#: ../../include/conversation.php:1691 ../../include/conversation.php:1694
msgid "Events"
msgstr "Eventos"
-#: ../../Zotlabs/Lib/Apps.php:224 ../../include/nav.php:172
+#: ../../Zotlabs/Lib/Apps.php:226 ../../include/nav.php:170
msgid "Directory"
msgstr "Directorio"
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/nav.php:198
+#: ../../Zotlabs/Lib/Apps.php:228 ../../include/nav.php:196
msgid "Mail"
msgstr "Correo"
-#: ../../Zotlabs/Lib/Apps.php:229 ../../include/nav.php:99
+#: ../../Zotlabs/Lib/Apps.php:231 ../../include/nav.php:99
msgid "Chat"
msgstr "Chat"
-#: ../../Zotlabs/Lib/Apps.php:231
+#: ../../Zotlabs/Lib/Apps.php:233
msgid "Probe"
msgstr "Probar"
-#: ../../Zotlabs/Lib/Apps.php:232
+#: ../../Zotlabs/Lib/Apps.php:234
msgid "Suggest"
msgstr "Sugerir"
-#: ../../Zotlabs/Lib/Apps.php:233
+#: ../../Zotlabs/Lib/Apps.php:235
msgid "Random Channel"
msgstr "Canal aleatorio"
-#: ../../Zotlabs/Lib/Apps.php:234
+#: ../../Zotlabs/Lib/Apps.php:236
msgid "Invite"
msgstr "Invitar"
-#: ../../Zotlabs/Lib/Apps.php:235 ../../include/widgets.php:1564
+#: ../../Zotlabs/Lib/Apps.php:237 ../../include/widgets.php:1565
msgid "Features"
msgstr "Funcionalidades"
-#: ../../Zotlabs/Lib/Apps.php:236
+#: ../../Zotlabs/Lib/Apps.php:238
+#: ../../extend/addon/addon/openid/MysqlProvider.php:69
msgid "Language"
msgstr "Idioma"
-#: ../../Zotlabs/Lib/Apps.php:237
+#: ../../Zotlabs/Lib/Apps.php:239
msgid "Post"
msgstr "Publicación"
-#: ../../Zotlabs/Lib/Apps.php:238
+#: ../../Zotlabs/Lib/Apps.php:240
+#: ../../extend/addon/addon/openid/MysqlProvider.php:58
+#: ../../extend/addon/addon/openid/MysqlProvider.php:59
+#: ../../extend/addon/addon/openid/MysqlProvider.php:60
msgid "Profile Photo"
msgstr "Foto del perfil"
-#: ../../Zotlabs/Lib/Apps.php:339
+#: ../../Zotlabs/Lib/Apps.php:344
msgid "Purchase"
msgstr "Comprar"
-#: ../../include/Import/import_diaspora.php:16
-msgid "No username found in import file."
-msgstr "No se ha encontrado el nombre de usuario en el fichero importado."
+#: ../../Zotlabs/Lib/Apps.php:348
+msgid "Undelete"
+msgstr "Recuperar"
-#: ../../include/Import/import_diaspora.php:41 ../../include/import.php:51
-msgid "Unable to create a unique channel address. Import failed."
-msgstr "No se ha podido crear una dirección de canal única. Ha fallado la importación."
+#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1914
+msgid "$Projectname Notification"
+msgstr "Notificación de $Projectname"
+
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../extend/addon/addon/diaspora/p.php:46
+#: ../../extend/addon/addon/diaspora/util.php:218
+#: ../../extend/addon/addon/diaspora/util.php:231
+#: ../../include/network.php:1915
+msgid "$projectname"
+msgstr "$projectname"
-#: ../../include/dba/dba_driver.php:173
+#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1917
+msgid "Thank You,"
+msgstr "Gracias,"
+
+#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1919
#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "No se ha podido localizar información de DNS para el servidor de base de datos “%s”"
+msgid "%s Administrator"
+msgstr "%s Administrador"
-#: ../../include/permissions.php:35
-msgid "Can view my normal stream and posts"
-msgstr "Pueden verse mi actividad y publicaciones normales"
+#: ../../Zotlabs/Lib/Enotify.php:116
+#, php-format
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../include/permissions.php:39
-msgid "Can view my webpages"
-msgstr "Pueden verse mis páginas web"
+#: ../../Zotlabs/Lib/Enotify.php:120
+#, php-format
+msgid "[$Projectname:Notify] New mail received at %s"
+msgstr "[$Projectname:Aviso] Nuevo correo recibido en %s"
-#: ../../include/permissions.php:43
-msgid "Can post on my channel page (\"wall\")"
-msgstr "Pueden crearse entradas en mi página de inicio del canal (“muro”)"
+#: ../../Zotlabs/Lib/Enotify.php:122
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, %2$s le ha enviado un nuevo mensaje privado en %3$s."
-#: ../../include/permissions.php:46
-msgid "Can like/dislike stuff"
-msgstr "Puede marcarse contenido como me gusta/no me gusta"
+#: ../../Zotlabs/Lib/Enotify.php:123
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s le ha enviado %2$s."
-#: ../../include/permissions.php:46
-msgid "Profiles and things other than posts/comments"
-msgstr "Perfiles y otras cosas aparte de publicaciones/comentarios"
+#: ../../Zotlabs/Lib/Enotify.php:123
+msgid "a private message"
+msgstr "un mensaje privado"
-#: ../../include/permissions.php:48
-msgid "Can forward to all my channel contacts via post @mentions"
-msgstr "Puede enviarse una entrada a todos mis contactos del canal mediante una @mención"
+#: ../../Zotlabs/Lib/Enotify.php:124
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Por favor visite %s para ver y/o responder a su mensaje privado."
-#: ../../include/permissions.php:48
-msgid "Advanced - useful for creating group forum channels"
-msgstr "Avanzado - útil para crear canales de foros de discusión o grupos"
+#: ../../Zotlabs/Lib/Enotify.php:183
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s ha comentado [zrl=%3$s]%4$s[/zrl]"
-#: ../../include/permissions.php:49
-msgid "Can chat with me (when available)"
-msgstr "Se puede charlar conmigo (cuando esté disponible)"
+#: ../../Zotlabs/Lib/Enotify.php:191
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s ha comentado [zrl=%3$s]%5$s de %4$s[/zrl] "
-#: ../../include/permissions.php:50
-msgid "Can write to my file storage and photos"
-msgstr "Puede escribirse en mi repositorio de ficheros y fotos"
+#: ../../Zotlabs/Lib/Enotify.php:200
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s ha comentado [zrl=%3$s]%4$s creado por usted[/zrl]"
-#: ../../include/permissions.php:51
-msgid "Can edit my webpages"
-msgstr "Pueden editarse mis páginas web"
+#: ../../Zotlabs/Lib/Enotify.php:211
+#, php-format
+msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[$Projectname:Aviso] Nuevo comentario de %2$s en la conversación #%1$d"
-#: ../../include/permissions.php:53
-msgid "Somewhat advanced - very useful in open communities"
-msgstr "Algo avanzado - muy útil en comunidades abiertas"
+#: ../../Zotlabs/Lib/Enotify.php:212
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s ha comentado un elemento/conversación que ha estado siguiendo."
-#: ../../include/permissions.php:55
-msgid "Can administer my channel resources"
-msgstr "Pueden administrarse mis recursos del canal"
+#: ../../Zotlabs/Lib/Enotify.php:215 ../../Zotlabs/Lib/Enotify.php:292
+#: ../../Zotlabs/Lib/Enotify.php:309 ../../Zotlabs/Lib/Enotify.php:335
+#: ../../Zotlabs/Lib/Enotify.php:353 ../../Zotlabs/Lib/Enotify.php:367
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Para ver o comentar la conversación, visite %s"
-#: ../../include/permissions.php:55
+#: ../../Zotlabs/Lib/Enotify.php:273
+#, php-format
+msgid "%1$s, %2$s liked [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s ha mostrado su agrado por [zrl=%3$s]%4$s creado por usted[/zrl]"
+
+#: ../../Zotlabs/Lib/Enotify.php:288
+#, php-format
+msgid "[$Projectname:Notify] Like received to conversation #%1$d by %2$s"
+msgstr "[$Projectname:Aviso] \"Me gusta\" de %2$s en la conversación #%1$d"
+
+#: ../../Zotlabs/Lib/Enotify.php:289
+#, php-format
+msgid "%1$s, %2$s liked an item/conversation you created."
+msgstr "%1$s, %2$s ha mostrado su agrado por un elemento o conversación que ha creado usted."
+
+#: ../../Zotlabs/Lib/Enotify.php:300
+#, php-format
+msgid "[$Projectname:Notify] %s posted to your profile wall"
+msgstr "[$Projectname:Aviso] %s ha publicado una entrada en su página de inicio del perfil (\"muro\")"
+
+#: ../../Zotlabs/Lib/Enotify.php:302
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s ha publicado en su página del perfil en %3$s"
+
+#: ../../Zotlabs/Lib/Enotify.php:304
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s ha publicado en [zrl=%3$s]su página del perfil[/zrl]"
+
+#: ../../Zotlabs/Lib/Enotify.php:328
+#, php-format
+msgid "[$Projectname:Notify] %s tagged you"
+msgstr "[$Projectname:Aviso] %s le ha etiquetado"
+
+#: ../../Zotlabs/Lib/Enotify.php:329
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, %2$s le ha etiquetado en %3$s"
+
+#: ../../Zotlabs/Lib/Enotify.php:330
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]le etiquetó[/zrl]."
+
+#: ../../Zotlabs/Lib/Enotify.php:342
+#, php-format
+msgid "[$Projectname:Notify] %1$s poked you"
+msgstr "[$Projectname:Aviso] %1$s le ha dado un toque"
+
+#: ../../Zotlabs/Lib/Enotify.php:343
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s le ha dado un toque en %3$s"
+
+#: ../../Zotlabs/Lib/Enotify.php:344
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]le ha dado un toque[/zrl]."
+
+#: ../../Zotlabs/Lib/Enotify.php:360
+#, php-format
+msgid "[$Projectname:Notify] %s tagged your post"
+msgstr "[$Projectname:Aviso] %s ha etiquetado su entrada"
+
+#: ../../Zotlabs/Lib/Enotify.php:361
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s ha etiquetado su publicación en %3$s"
+
+#: ../../Zotlabs/Lib/Enotify.php:362
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s ha etiquetado [zrl=%3$s]su publicación[/zrl]"
+
+#: ../../Zotlabs/Lib/Enotify.php:374
+msgid "[$Projectname:Notify] Introduction received"
+msgstr "[$Projectname:Aviso] Ha recibido una solicitud de conexión"
+
+#: ../../Zotlabs/Lib/Enotify.php:375
+#, php-format
+msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
+msgstr "%1$s, ha recibido una nueva solicitud de conexión de '%2$s' en %3$s"
+
+#: ../../Zotlabs/Lib/Enotify.php:376
+#, php-format
msgid ""
-"Extremely advanced. Leave this alone unless you know what you are doing"
-msgstr "Muy avanzado. Déjelo a no ser que sepa bien lo que está haciendo."
+"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
+msgstr "%1$s, ha recibido [zrl=%2$s]una nueva solicitud de conexión[/zrl] de %3$s."
-#: ../../include/photos.php:114
+#: ../../Zotlabs/Lib/Enotify.php:380 ../../Zotlabs/Lib/Enotify.php:399
#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
-msgstr "La imagen excede el límite de %lu bytes del sitio"
+msgid "You may visit their profile at %s"
+msgstr "Puede visitar su perfil en %s"
-#: ../../include/photos.php:121
-msgid "Image file is empty."
-msgstr "El fichero de imagen está vacío. "
+#: ../../Zotlabs/Lib/Enotify.php:382
+#, php-format
+msgid "Please visit %s to approve or reject the connection request."
+msgstr "Por favor, visite %s para permitir o rechazar la solicitad de conexión."
-#: ../../include/photos.php:259
-msgid "Photo storage failed."
-msgstr "La foto no ha podido ser guardada."
+#: ../../Zotlabs/Lib/Enotify.php:389
+msgid "[$Projectname:Notify] Friend suggestion received"
+msgstr "[$Projectname:Aviso] Ha recibido una sugerencia de conexión"
-#: ../../include/auth.php:275
-msgid "Failed authentication"
-msgstr "Autenticación fallida."
+#: ../../Zotlabs/Lib/Enotify.php:390
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, ha recibido una sugerencia de conexión de '%2$s' en %3$s"
-#: ../../include/auth.php:286
-msgid "Login failed."
-msgstr "El acceso ha fallado."
+#: ../../Zotlabs/Lib/Enotify.php:391
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, ha recibido [zrl=%2$s]una sugerencia de conexión[/zrl] para %3$s de %4$s."
-#: ../../include/photos.php:506 ../../include/conversation.php:1675
-msgid "Photo Albums"
-msgstr "Álbumes de fotos"
+#: ../../Zotlabs/Lib/Enotify.php:397
+msgid "Name:"
+msgstr "Nombre:"
-#: ../../include/bbcode.php:162 ../../include/bbcode.php:928
-msgid "Encrypted content"
-msgstr "Contenido cifrado"
+#: ../../Zotlabs/Lib/Enotify.php:398
+msgid "Photo:"
+msgstr "Foto:"
-#: ../../include/features.php:58
-msgid "General Features"
-msgstr "Funcionalidades básicas"
+#: ../../Zotlabs/Lib/Enotify.php:401
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Por favor, visite %s para aprobar o rechazar la sugerencia."
-#: ../../include/features.php:63
-msgid "Multiple Profiles"
-msgstr "Múltiples perfiles"
+#: ../../Zotlabs/Lib/Enotify.php:619
+msgid "[$Projectname:Notify]"
+msgstr "[$Projectname:Aviso]"
-#: ../../include/features.php:64
-msgid "Ability to create multiple profiles"
-msgstr "Capacidad de crear múltiples perfiles"
+#: ../../Zotlabs/Lib/Enotify.php:779
+msgid "created a new post"
+msgstr "ha creado una nueva entrada"
-#: ../../include/features.php:72
-msgid "Advanced Profiles"
-msgstr "Perfiles avanzados"
+#: ../../Zotlabs/Lib/Enotify.php:780
+#, php-format
+msgid "commented on %s's post"
+msgstr "ha comentado la entrada de %s"
-#: ../../include/features.php:73
-msgid "Additional profile sections and selections"
-msgstr "Secciones y selecciones de perfil adicionales"
+#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:24
+msgid "Flag Adult Photos"
+msgstr "Indicador (\"flag\") de fotos de adultos"
-#: ../../include/features.php:81
-msgid "Profile Import/Export"
-msgstr "Importar/Exportar perfil"
+#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:25
+msgid ""
+"Provide photo edit option to hide inappropriate photos from default album "
+"view"
+msgstr "Proporcionar una opción de edición de fotos para ocultar las fotos inapropiadas de la vista de álbum predeterminada"
-#: ../../include/features.php:82
-msgid "Save and load profile details across sites/channels"
-msgstr "Guardar y cargar detalles del perfil a través de sitios/canales"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:44
+msgid ""
+"This is a fairly comprehensive and complete guitar chord dictionary which "
+"will list most of the available ways to play a certain chord, starting from "
+"the base of the fingerboard up to a few frets beyond the twelfth fret "
+"(beyond which everything repeats). A couple of non-standard tunings are "
+"provided for the benefit of slide players, etc."
+msgstr "Se trata de un diccionario bastante amplio y completo de acordes de guitarra que enumerará la mayor parte de las formas disponibles para tocar un acorde determinado, partiendo de la base del diapasón hasta unos pocos trastes más allá del traste doce (más allá del cual todo se repite). Se proporcionan un par de afinaciones no convencionales para provecho de los guitarristas con \"slides\" ( barras de acero), etc."
-#: ../../include/features.php:90
-msgid "Web Pages"
-msgstr "Páginas web"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:46
+msgid ""
+"Chord names start with a root note (A-G) and may include sharps (#) and "
+"flats (b). This software will parse most of the standard naming conventions "
+"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
+msgstr "Los nombres de acordes comienzan con una nota fundamental (La-Sol) y pueden incluir sostenidos (#) y bemoles (b). Este software analizará la mayor parte de las convenciones de nomenclatura estándar como maj, min, tenue, SUS (2 ó 4), aug, con la repetición de elementos opcionales."
-#: ../../include/features.php:91
-msgid "Provide managed web pages on your channel"
-msgstr "Proveer páginas web gestionadas en su canal"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:48
+msgid ""
+"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
+"E7b13b11 ..."
+msgstr "Ejemplos válidos son A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."
-#: ../../include/features.php:100
-msgid "Provide a wiki for your channel"
-msgstr "Proporcionar un wiki para su canal"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:51
+msgid "Guitar Chords"
+msgstr "Acordes de guitarra"
-#: ../../include/features.php:117
-msgid "Private Notes"
-msgstr "Notas privadas"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:52
+msgid "The complete online chord dictionary"
+msgstr "El diccionario completo de acordes en línea"
-#: ../../include/features.php:118
-msgid "Enables a tool to store notes and reminders (note: not encrypted)"
-msgstr "Habilita una herramienta para guardar notas y recordatorios (advertencia: las notas no estarán cifradas)"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:57
+msgid "Tuning"
+msgstr "Afinación"
-#: ../../include/features.php:126
-msgid "Navigation Channel Select"
-msgstr "Navegación por el selector de canales"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:58
+msgid "Chord name: example: Em7"
+msgstr "Nombre del acorde, por ejemplo: Em7"
-#: ../../include/features.php:127
-msgid "Change channels directly from within the navigation dropdown menu"
-msgstr "Cambiar de canales directamente desde el menú de navegación desplegable"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:59
+msgid "Show for left handed stringing"
+msgstr "Mostrar para tocadores zurdos"
-#: ../../include/features.php:135
-msgid "Photo Location"
-msgstr "Ubicación de las fotos"
+#: ../../extend/addon/addon/chords/chords.php:33
+msgid "Quick Reference"
+msgstr "Referencia rápida"
-#: ../../include/features.php:136
-msgid "If location data is available on uploaded photos, link this to a map."
-msgstr "Si los datos de ubicación están disponibles en las fotos subidas, enlazar estas a un mapa."
+#: ../../extend/addon/addon/diaspora/diaspora.php:671
+msgid "Diaspora Protocol Settings updated."
+msgstr "Los ajustes del protocolo de Diaspora se han actualizado."
-#: ../../include/features.php:144
-msgid "Access Controlled Chatrooms"
-msgstr "Salas de chat moderadas"
+#: ../../extend/addon/addon/diaspora/diaspora.php:692
+msgid "Enable the Diaspora protocol for this channel"
+msgstr "Activar el protocolo de Diaspora para este canal"
-#: ../../include/features.php:145
-msgid "Provide chatrooms and chat services with access control."
-msgstr "Proporcionar salas y servicios de chat moderados."
+#: ../../extend/addon/addon/diaspora/diaspora.php:696
+msgid "Allow any Diaspora member to comment on your public posts"
+msgstr "Permitir a cualquier miembro de Diaspora comentar sus entradas públicas"
-#: ../../include/features.php:153
-msgid "Smart Birthdays"
-msgstr "Cumpleaños inteligentes"
+#: ../../extend/addon/addon/diaspora/diaspora.php:700
+msgid "Prevent your hashtags from being redirected to other sites"
+msgstr "Impedir que sus \"hashtags\" sean redirigidos a otros sitios "
-#: ../../include/features.php:154
+#: ../../extend/addon/addon/diaspora/diaspora.php:705
+msgid "Followed hashtags (comma separated, do not include the #)"
+msgstr "\"Hashtags\" seguidos (separados por comas, sin incluir #)"
+
+#: ../../extend/addon/addon/diaspora/diaspora.php:710
+msgid "Diaspora Protocol Settings"
+msgstr "Ajustes del protocolo de Diaspora"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:94
+msgid "Hubzilla Directory Stats"
+msgstr "Estadísticas de directorio de Hubzilla"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:95
+msgid "Total Hubs"
+msgstr "Número total de servidores"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:97
+msgid "Hubzilla Hubs"
+msgstr "Servidores (hubs) de Hubzilla"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:99
+msgid "Friendica Hubs"
+msgstr "Servidores (hubs) de Friendica"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:101
+msgid "Diaspora Pods"
+msgstr "Servidores (pods) de Diaspora"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:103
+msgid "Hubzilla Channels"
+msgstr "Canales de Hubzilla"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:105
+msgid "Friendica Channels"
+msgstr "Canales de Friendica"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:107
+msgid "Diaspora Channels"
+msgstr "Canales de Diaspora"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:109
+msgid "Aged 35 and above"
+msgstr "De 35 años de edad en adelante"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:111
+msgid "Aged 34 and under"
+msgstr "De 34 o menos años de edad"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:113
+msgid "Average Age"
+msgstr "Promedio de edad"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:115
+msgid "Known Chatrooms"
+msgstr "Salas de chat conocidas"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:117
+msgid "Known Tags"
+msgstr "Etiquetas conocidas"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:119
msgid ""
-"Make birthday events timezone aware in case your friends are scattered "
-"across the planet."
-msgstr "Enlazar los eventos de cumpleaños con el huso horario en el caso de que sus amigos estén dispersos por el mundo."
+"Please note Diaspora and Friendica statistics are merely those **this "
+"directory** is aware of, and not all those known in the network. This also "
+"applies to chatrooms,"
+msgstr "Tenga en cuenta que las estadísticas de Diaspora y Friendica se refieren únicamente a aquellas de las que **este directorio** es consciente, y no a todos los conocidos en la red. Esto también es aplicable a las salas de chat,"
-#: ../../include/features.php:162
-msgid "Advanced Directory Search"
-msgstr "Búsqueda avanzada en el directorio"
+#: ../../extend/addon/addon/donate/donate.php:21
+msgid "Project Servers and Resources"
+msgstr "Servidores y recursos del proyecto"
-#: ../../include/features.php:163
-msgid "Allows creation of complex directory search queries"
-msgstr "Permitir la creación de consultas complejas en las búsquedas en el directorio"
+#: ../../extend/addon/addon/donate/donate.php:22
+msgid "Project Creator and Tech Lead"
+msgstr "Creador del proyecto y director técnico"
-#: ../../include/features.php:171
-msgid "Advanced Theme and Layout Settings"
-msgstr "Ajustes avanzados de temas y esquemas"
+#: ../../extend/addon/addon/donate/donate.php:23
+msgid "Admin, developer, directorymin, support bloke"
+msgstr "Administrador, desarrollador, administrador del directorio, trabajador de apoyo"
-#: ../../include/features.php:172
-msgid "Allows fine tuning of themes and page layouts"
-msgstr "Permitir el ajuste fino de temas y esquemas de páginas"
+#: ../../extend/addon/addon/donate/donate.php:50
+msgid ""
+"And the hundreds of other people and organisations who helped make the "
+"Hubzilla possible."
+msgstr "Y los cientos de personas y organizaciones más que ayudaron a hacer posible Hubzilla."
-#: ../../include/features.php:182
-msgid "Post Composition Features"
-msgstr "Opciones para la redacción de entradas"
+#: ../../extend/addon/addon/donate/donate.php:53
+msgid ""
+"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
+"their time and expertise - and often paying out of pocket for services they "
+"share with others."
+msgstr "Los proyectos Redmatrix / Hubzilla están proporcionados principalmente por voluntarios que les prestan su tiempo y experiencia, pagando a menudo de su bolsillo por los servicios que comparten con otros."
-#: ../../include/features.php:186
-msgid "Large Photos"
-msgstr "Fotos de gran tamaño"
+#: ../../extend/addon/addon/donate/donate.php:54
+msgid ""
+"There is no corporate funding and no ads, and we do not collect and sell "
+"your personal information. (We don't control your personal information - "
+"<strong>you do</strong>.)"
+msgstr "No hay financiación corporativa ni publicidad y no recogemos ni vendemos su información personal. (De hecho, no tenemos control sobre sus datos privados. <Strong>Usted lo tiene</strong>.)"
-#: ../../include/features.php:187
+#: ../../extend/addon/addon/donate/donate.php:55
msgid ""
-"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
-"(640px) photo thumbnails"
-msgstr "Incluir miniaturas de fotos grandes (1024px) en publicaciones. Si no está habilitado, usar miniaturas pequeñas (640px)"
+"Help support our ground-breaking work in decentralisation, web identity, and"
+" privacy."
+msgstr "Ayude apoyando nuestro trabajo pionero en la descentralización, la identidad web, y la privacidad."
-#: ../../include/features.php:196
-msgid "Automatically import channel content from other channels or feeds"
-msgstr "Importar automáticamente contenido de otros canales o \"feeds\""
+#: ../../extend/addon/addon/donate/donate.php:57
+msgid ""
+"Your donations keep servers and services running and also helps us to "
+"provide innovative new features and continued development."
+msgstr "Sus donaciones mantienen servidores y servicios en ejecución y también nos ayudan a proporcionar nuevas características innovadoras y a mantener el desarrollo de forma continuada."
-#: ../../include/features.php:204
-msgid "Even More Encryption"
-msgstr "Más cifrado todavía"
+#: ../../extend/addon/addon/donate/donate.php:60
+msgid "Donate"
+msgstr "Donar"
-#: ../../include/features.php:205
+#: ../../extend/addon/addon/donate/donate.php:62
msgid ""
-"Allow optional encryption of content end-to-end with a shared secret key"
-msgstr "Permitir cifrado adicional de contenido \"punto-a-punto\" con una clave secreta compartida."
+"Choose a project, developer, or public hub to support with a one-time "
+"donation"
+msgstr "Elija un proyecto, desarrollador, o \"hub\" público para apoyar con una donación de una sola vez"
-#: ../../include/features.php:213
-msgid "Enable Voting Tools"
-msgstr "Permitir entradas con votación"
+#: ../../extend/addon/addon/donate/donate.php:63
+msgid "Donate Now"
+msgstr "Donar ahora"
-#: ../../include/features.php:214
-msgid "Provide a class of post which others can vote on"
-msgstr "Proveer una clase de publicación en la que otros puedan votar"
+#: ../../extend/addon/addon/donate/donate.php:64
+msgid ""
+"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project "
+"only)"
+msgstr "<strong><em>O</em></strong> convertirse en un patrocinador del proyecto (sólo del proyecto Hubzilla)"
-#: ../../include/features.php:222
-msgid "Disable Comments"
-msgstr "Deshabilitar comentarios"
+#: ../../extend/addon/addon/donate/donate.php:65
+msgid ""
+"Please indicate if you would like your first name or full name (or nothing) "
+"to appear in our sponsor listing"
+msgstr "Por favor, indique si desea que su nombre de pila o el nombre completo (o nada) aparezca en nuestra lista de patrocinadores"
-#: ../../include/features.php:223
-msgid "Provide the option to disable comments for a post"
-msgstr "Proporcionar la opción de desactivar los comentarios de una publicación"
+#: ../../extend/addon/addon/donate/donate.php:66
+msgid "Sponsor"
+msgstr "Patrocinador"
-#: ../../include/features.php:231
-msgid "Delayed Posting"
-msgstr "Publicación aplazada"
+#: ../../extend/addon/addon/donate/donate.php:69
+msgid "Special thanks to: "
+msgstr "Agradecimiento especial a: "
-#: ../../include/features.php:232
-msgid "Allow posts to be published at a later date"
-msgstr "Permitir mensajes que se publicarán en una fecha posterior"
+#: ../../extend/addon/addon/dwpost/dwpost.php:42
+msgid "Post to Dreamwidth"
+msgstr "Publicar en Dreamwidth"
-#: ../../include/features.php:240
-msgid "Content Expiration"
-msgstr "Caducidad del contenido"
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+msgid "Enable Dreamwidth Post Plugin"
+msgstr "Activar el plugin de publicación en Dreamwidth"
-#: ../../include/features.php:241
-msgid "Remove posts/comments and/or private messages at a future time"
-msgstr "Eliminar publicaciones/comentarios y/o mensajes privados más adelante"
+#: ../../extend/addon/addon/dwpost/dwpost.php:77
+msgid "Dreamwidth username"
+msgstr "Nombre de usuario en Dreamwidth"
-#: ../../include/features.php:249
-msgid "Suppress Duplicate Posts/Comments"
-msgstr "Prevenir entradas o comentarios duplicados"
+#: ../../extend/addon/addon/dwpost/dwpost.php:81
+msgid "Dreamwidth password"
+msgstr "Contraseña en Dreamwidth"
-#: ../../include/features.php:250
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+msgid "Post to Dreamwidth by default"
+msgstr "Publicar en Dreamwidth de forma predeterminada"
+
+#: ../../extend/addon/addon/dwpost/dwpost.php:89
+msgid "Dreamwidth Post Settings"
+msgstr "Ajustes de publicación en Dreamwidth"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:45
+msgid "Flattr this!"
+msgstr "¡Apoyar esto en Flattr!"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:83
+msgid "Flattr widget settings updated."
+msgstr "Los ajustes del widget Flattr han sido actualizados."
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:100
+msgid "Flattr user"
+msgstr "Usuario en Flattr"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
+msgid "URL of the Thing to flattr"
+msgstr "URL de la Cosa para apoyar en flattr"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
+msgid "If empty channel URL is used"
+msgstr "Si está vacío, se usa la URL del canal"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
+msgid "Title of the Thing to flattr"
+msgstr "Título de la Cosa para apoyar en flattr"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
+msgid "If empty \"channel name on The Hubzilla\" will be used"
+msgstr "Si está vacío, se usará \"nombre del canal en Hubzilla\""
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
+msgid "Static or dynamic flattr button"
+msgstr "Botón de flattr estático o dinámico"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
+msgid "static"
+msgstr "estático"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
+msgid "dynamic"
+msgstr "dinámico"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
+msgid "Alignment of the widget"
+msgstr "Alineamiento del widget"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
+msgid "left"
+msgstr "izquierda"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
+msgid "right"
+msgstr "derecha"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+msgid "Enable Flattr widget"
+msgstr "Habilitar el widget Flattr"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
+msgid "Flattr Widget Settings"
+msgstr "Ajustes del widget Flattr"
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:118
+msgid "Contact not found."
+msgstr "No se ha encontrado el contacto."
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:119
msgid ""
-"Prevent posts with identical content to be published with less than two "
-"minutes in between submissions."
-msgstr "Prevenir que entradas con contenido idéntico se publiquen con menos de dos minutos de intervalo."
+"This may occasionally happen if contact was requested by both persons and it"
+" has already been approved."
+msgstr "Esto puede ocurrir de vez en cuando si el contacto fue solicitado por ambas personas y ya había sido aprobado."
-#: ../../include/features.php:261
-msgid "Network and Stream Filtering"
-msgstr "Filtrado del contenido"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:238
+msgid "Response from remote site was not understood."
+msgstr "No se entendió la respuesta del sitio remoto."
-#: ../../include/features.php:265
-msgid "Search by Date"
-msgstr "Buscar por fecha"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:247
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:252
+msgid "Unexpected response from remote site: "
+msgstr "Respuesta inesperada desde el sitio remoto: "
-#: ../../include/features.php:266
-msgid "Ability to select posts by date ranges"
-msgstr "Capacidad de seleccionar entradas por rango de fechas"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:261
+msgid "Confirmation completed successfully."
+msgstr "La confirmación se ha completado satisfactoriamente."
-#: ../../include/features.php:274 ../../include/group.php:311
-msgid "Privacy Groups"
-msgstr "Grupos de canales"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:263
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:277
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:284
+msgid "Remote site reported: "
+msgstr "El sitio remoto informó: "
-#: ../../include/features.php:275
-msgid "Enable management and selection of privacy groups"
-msgstr "Activar la gestión y selección de grupos de canales"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:275
+msgid "Temporary failure. Please wait and try again."
+msgstr "Fallo temporal. Por favor, espere e inténtelo de nuevo."
-#: ../../include/features.php:283 ../../include/widgets.php:283
-msgid "Saved Searches"
-msgstr "Búsquedas guardadas"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:282
+msgid "Introduction failed or was revoked."
+msgstr "La solicitud ha fallado o ha sido revocada."
-#: ../../include/features.php:284
-msgid "Save search terms for re-use"
-msgstr "Guardar términos de búsqueda para su reutilización"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:428
+msgid "Unable to set contact photo."
+msgstr "No se puede establecer la foto del contacto."
-#: ../../include/features.php:292
-msgid "Network Personal Tab"
-msgstr "Actividad personal"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:485
+#, php-format
+msgid "%1$s is now friends with %2$s"
+msgstr "%1$s es amigo ahora de %2$s"
-#: ../../include/features.php:293
-msgid "Enable tab to display only Network posts that you've interacted on"
-msgstr "Habilitar una pestaña en la cual se muestren solo las entradas en las que ha participado."
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:570
+#, php-format
+msgid "No user record found for '%s' "
+msgstr "No se encuentra ningún registro de usuario para '%s' "
-#: ../../include/features.php:301
-msgid "Network New Tab"
-msgstr "Contenido nuevo"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:580
+msgid "Our site encryption key is apparently messed up."
+msgstr "La clave de cifrado de nuestro sitio está aparentemente en mal estado."
-#: ../../include/features.php:302
-msgid "Enable tab to display all new Network activity"
-msgstr "Habilitar una pestaña en la que se muestre solo el contenido nuevo"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:591
+msgid "Empty site URL was provided or URL could not be decrypted by us."
+msgstr "Se ha proporcionado la URL de un sitio inexistente o la URL no ha podido ser descifrada por nosotros."
-#: ../../include/features.php:310
-msgid "Affinity Tool"
-msgstr "Herramienta de afinidad"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:612
+msgid "Contact record was not found for you on our site."
+msgstr "No se ha encontrado un registro de contacto para usted en nuestro sitio."
-#: ../../include/features.php:311
-msgid "Filter stream activity by depth of relationships"
-msgstr "Filtrar el contenido según la profundidad de las relaciones"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:626
+#, php-format
+msgid "Site public key not available in contact record for URL %s."
+msgstr "La clave del sitio público no está disponible en el registro de contacto para la URL %s."
-#: ../../include/features.php:320
-msgid "Show friend and connection suggestions"
-msgstr "Mostrar sugerencias de amigos y conexiones"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:646
+msgid ""
+"The ID provided by your system is a duplicate on our system. It should work "
+"if you try again."
+msgstr "La ID proporcionada por su sistema está duplicada en el nuestro. Debería funcionar si lo intenta de nuevo."
-#: ../../include/features.php:328
-msgid "Connection Filtering"
-msgstr "Filtrado de conexiones"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:657
+msgid "Unable to set your contact credentials on our system."
+msgstr "No se pueden establecer sus credenciales de contacto en nuestro sistema."
-#: ../../include/features.php:329
-msgid "Filter incoming posts from connections based on keywords/content"
-msgstr "Filtrar publicaciones entrantes de conexiones por palabras clave o contenido"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:724
+msgid "Unable to update your contact profile details on our system"
+msgstr "No se pueden actualizar los detalles del perfil de su contacto en nuestro sistema"
-#: ../../include/features.php:341
-msgid "Post/Comment Tools"
-msgstr "Gestión de entradas y comentarios"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:751
+#: ../../extend/addon/addon/friendica/dfrn_request.php:749
+msgid "[Name Withheld]"
+msgstr "[Nombre omitido]"
-#: ../../include/features.php:345
-msgid "Community Tagging"
-msgstr "Etiquetas de la comunidad"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:796
+#, php-format
+msgid "%1$s has joined %2$s"
+msgstr "%1$s se ha unido a %2$s"
-#: ../../include/features.php:346
-msgid "Ability to tag existing posts"
-msgstr "Capacidad de etiquetar entradas existentes"
+#: ../../extend/addon/addon/friendica/dfrn_poll.php:103
+#: ../../extend/addon/addon/friendica/dfrn_poll.php:536
+#, php-format
+msgid "%1$s welcomes %2$s"
+msgstr "%1$s da la bienvenida a %2$s"
-#: ../../include/features.php:354
-msgid "Post Categories"
-msgstr "Temas de las entradas"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:102
+msgid "This introduction has already been accepted."
+msgstr "Esta solicitud ya ha sido aceptada."
-#: ../../include/features.php:355
-msgid "Add categories to your posts"
-msgstr "Añadir temas a sus publicaciones"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:123
+#: ../../extend/addon/addon/friendica/dfrn_request.php:528
+msgid "Profile location is not valid or does not contain profile information."
+msgstr "La ubicación del perfil no es válida o no contiene información del perfil."
-#: ../../include/features.php:363
-msgid "Emoji Reactions"
-msgstr "Emoticonos \"emoji\""
+#: ../../extend/addon/addon/friendica/dfrn_request.php:128
+#: ../../extend/addon/addon/friendica/dfrn_request.php:533
+msgid "Warning: profile location has no identifiable owner name."
+msgstr "Advertencia: el perfil de la ubicación no tiene un nombre de propietario identificable."
-#: ../../include/features.php:364
-msgid "Add emoji reaction ability to posts"
-msgstr "Activar la capacidad de añadir un emoticono \"emoji\" a las entradas"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:130
+#: ../../extend/addon/addon/friendica/dfrn_request.php:535
+msgid "Warning: profile location has no profile photo."
+msgstr "Advertencia: el perfil de la ubicación no tiene ninguna foto de perfil."
-#: ../../include/features.php:372 ../../include/contact_widgets.php:53
-#: ../../include/widgets.php:346
-msgid "Saved Folders"
-msgstr "Carpetas guardadas"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:133
+#: ../../extend/addon/addon/friendica/dfrn_request.php:538
+#, 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] "Los parámetros requeridos de %d no se han encontrado en la localización proporcionada"
+msgstr[1] "Los parámetros requeridos de %d no se han encontrado en la localización proporcionada"
-#: ../../include/features.php:373
-msgid "Ability to file posts under folders"
-msgstr "Capacidad de archivar entradas en carpetas"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:180
+msgid "Introduction complete."
+msgstr "Solicitud completa."
-#: ../../include/features.php:381
-msgid "Dislike Posts"
-msgstr "Desagrado de publicaciones"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:224
+msgid "Unrecoverable protocol error."
+msgstr "Error irrecuperable de protocolo."
-#: ../../include/features.php:382
-msgid "Ability to dislike posts/comments"
-msgstr "Capacidad de mostrar desacuerdo con el contenido de entradas y comentarios"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:252
+msgid "Profile unavailable."
+msgstr "Perfil no disponible."
-#: ../../include/features.php:390
-msgid "Star Posts"
-msgstr "Entradas destacadas"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:277
+#, php-format
+msgid "%s has received too many connection requests today."
+msgstr "%s ha recibido demasiadas peticiones de conexión hoy."
-#: ../../include/features.php:391
-msgid "Ability to mark special posts with a star indicator"
-msgstr "Capacidad de marcar entradas destacadas con un indicador de estrella"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:278
+msgid "Spam protection measures have been invoked."
+msgstr "Se han activado las medidas de protección contra el spam."
-#: ../../include/features.php:399
-msgid "Tag Cloud"
-msgstr "Nube de etiquetas"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:279
+msgid "Friends are advised to please try again in 24 hours."
+msgstr "Se aconseja a los amigos que por favor lo intenten de nuevo en 24 horas."
-#: ../../include/features.php:400
-msgid "Provide a personal tag cloud on your channel page"
-msgstr "Proveer nube de etiquetas personal en su página de canal"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:341
+msgid "Invalid locator"
+msgstr "Localizador no válido"
-#: ../../include/features.php:412
-msgid "Premium Channel"
-msgstr "Canal premium"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:350
+msgid "Invalid email address."
+msgstr "Dirección de correo no válida."
-#: ../../include/features.php:413
+#: ../../extend/addon/addon/friendica/dfrn_request.php:377
+msgid "This account has not been configured for email. Request failed."
+msgstr "Esta cuenta no se ha configurado para el correo electrónico. La petición ha fallado."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:473
+msgid "Unable to resolve your name at the provided location."
+msgstr "No se puede resolver el nombre en la localización proporcionada."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:486
+msgid "You have already introduced yourself here."
+msgstr "Ya se ha inscrito usted mismo aquí."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:490
+#, php-format
+msgid "Apparently you are already friends with %s."
+msgstr "Al parecer ya es amigo de %s"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:511
+msgid "Invalid profile URL."
+msgstr "URL del perfil no válida."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:517
+msgid "Disallowed profile URL."
+msgstr "No se ha permitido la URL del perfil."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:587
+msgid "Failed to update contact record."
+msgstr "Se ha producido un error al actualizar el registro del contacto."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:608
+msgid "Your introduction has been sent."
+msgstr "Su solicitud ha sido enviada."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:662
+msgid "Please login to confirm introduction."
+msgstr "Por favor, inicie sesión para confirmar la solicitud."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:676
msgid ""
-"Allows you to set restrictions and terms on those that connect with your "
-"channel"
-msgstr "Le permite configurar restricciones y normas de uso a aquellos que conectan con su canal"
+"Incorrect identity currently logged in. Please login to "
+"<strong>this</strong> profile."
+msgstr "Actualmente su identidad en el sistema es incorrecta. Por favor, inicie sesión en <strong>este</strong> perfil."
-#: ../../include/help.php:25
-msgid "Help:"
-msgstr "Ayuda:"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:690
+#: ../../extend/addon/addon/friendica/dfrn_request.php:707
+msgid "Confirm"
+msgstr "Confirmar"
-#: ../../include/security.php:109
-msgid "guest:"
-msgstr "invitado: "
+#: ../../extend/addon/addon/friendica/dfrn_request.php:702
+msgid "Hide this contact"
+msgstr "Ocultar este contacto"
-#: ../../include/security.php:527
+#: ../../extend/addon/addon/friendica/dfrn_request.php:705
+#, php-format
+msgid "Welcome home %s."
+msgstr "Bienvenido a la página principal %s."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:706
+#, php-format
+msgid "Please confirm your introduction/connection request to %s."
+msgstr "Por favor, confirme su solicitud de conexión a %s."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:836
msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
-msgstr "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado"
+"Please enter your 'Identity Address' from one of the following supported "
+"communications networks:"
+msgstr "Por favor, elija su 'dirección identificativa' de entre las siguientes redes de comunicación soportadas: "
-#: ../../include/text.php:450
-msgid "prev"
-msgstr "anterior"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:857
+#, php-format
+msgid ""
+"If you are not yet a member of the free social web, <a "
+"href=\"%s/siteinfo\">follow this link to find a public Friendica site and "
+"join us today</a>."
+msgstr "Si aún no es miembro de las redes sociales libres, <a href=\"%s/siteinfo\">siga este enlace para encontrar un sitio público de Friendica y unirse a nosotros hoy</a>."
-#: ../../include/text.php:452
-msgid "first"
-msgstr "primera"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:862
+msgid "Friend/Connection Request"
+msgstr "Solicitud de conexión o amistad"
-#: ../../include/text.php:481
-msgid "last"
-msgstr "última"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:863
+msgid ""
+"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
+"testuser@identi.ca"
+msgstr "Ejemplos: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"
-#: ../../include/text.php:484
-msgid "next"
-msgstr "próxima"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:864
+msgid "Please answer the following:"
+msgstr "Por favor, responda a lo siguiente: "
-#: ../../include/text.php:494
-msgid "older"
-msgstr "más antiguas"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#, php-format
+msgid "Does %s know you?"
+msgstr "¿%s le conoce?"
-#: ../../include/text.php:496
-msgid "newer"
-msgstr "más recientes"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:869
+msgid "Add a personal note:"
+msgstr "Añadir un comentario personal: "
-#: ../../include/text.php:889
-msgid "No connections"
-msgstr "Sin conexiones"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:871
+#: ../../include/network.php:2232 ../../include/network.php:2233
+msgid "Friendica"
+msgstr "Friendica"
-#: ../../include/text.php:914
+#: ../../extend/addon/addon/friendica/dfrn_request.php:872
+msgid "StatusNet/Federated Social Web"
+msgstr "Red social federada StatusNet"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:873
+#: ../../include/network.php:2238
+msgid "Diaspora"
+msgstr "Diaspora"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:874
#, php-format
-msgid "View all %s connections"
-msgstr "Ver todas las %s conexiones"
+msgid ""
+" - please do not use this form. Instead, enter %s into your Diaspora search"
+" bar."
+msgstr "- Por favor, no use este formato. En su lugar, escriba %s en la barra de búsqueda de Diaspora."
-#: ../../include/text.php:1059 ../../include/text.php:1064
-msgid "poke"
-msgstr "un toque"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:875
+msgid "Your Identity Address:"
+msgstr "Su dirección identificativa: "
-#: ../../include/text.php:1059 ../../include/text.php:1064
-#: ../../include/conversation.php:243
-msgid "poked"
-msgstr "ha dado un toque a"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:878
+msgid "Submit Request"
+msgstr "Enviar la solicitud"
-#: ../../include/text.php:1065
-msgid "ping"
-msgstr "un \"ping\""
+#: ../../extend/addon/addon/friendica/friendica.php:113
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:114
+msgid "GNU-Social Protocol Settings updated."
+msgstr "Se han actualizado los ajustes del protocolo de GNU-Social."
-#: ../../include/text.php:1065
-msgid "pinged"
-msgstr "ha enviado un \"ping\" a"
+#: ../../extend/addon/addon/friendica/friendica.php:124
+msgid "Enable the (experimental) GNU-Social protocol for this channel"
+msgstr "Activar el protocolo (experimental) de GNU-Social para este canal"
-#: ../../include/text.php:1066
-msgid "prod"
-msgstr "una incitación "
+#: ../../extend/addon/addon/friendica/friendica.php:128
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
+msgid "GNU-Social Protocol Settings"
+msgstr "Ajustes del protocolo de GNU-Social"
-#: ../../include/text.php:1066
-msgid "prodded"
-msgstr "ha incitado a "
+#: ../../extend/addon/addon/friendica/friendica.php:185
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:319
+msgid "Follow"
+msgstr "Seguir"
-#: ../../include/text.php:1067
-msgid "slap"
-msgstr "una bofetada "
+#: ../../extend/addon/addon/friendica/friendica.php:188
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:322
+#, php-format
+msgid "%1$s is now following %2$s"
+msgstr "%1$s está siguiendo ahora a %2$s"
-#: ../../include/text.php:1067
-msgid "slapped"
-msgstr "ha abofeteado a "
+#: ../../extend/addon/addon/frphotos/frphotos.php:91
+msgid "Friendica Photo Album Import"
+msgstr "Importar un álbum de fotos de Friendica"
-#: ../../include/text.php:1068
-msgid "finger"
-msgstr "un \"finger\" "
+#: ../../extend/addon/addon/frphotos/frphotos.php:92
+msgid "This will import all your Friendica photo albums to this Red channel."
+msgstr "Esto importará todos sus álbumes de fotos de Friendica a este canal de Hubzilla."
-#: ../../include/text.php:1068
-msgid "fingered"
-msgstr "envió un \"finger\" a"
+#: ../../extend/addon/addon/frphotos/frphotos.php:93
+msgid "Friendica Server base URL"
+msgstr "URL base del servidor de Friendica"
-#: ../../include/text.php:1069
-msgid "rebuff"
-msgstr "un reproche"
+#: ../../extend/addon/addon/frphotos/frphotos.php:94
+msgid "Friendica Login Username"
+msgstr "Nombre de inicio de sesión en Friendica"
-#: ../../include/text.php:1069
-msgid "rebuffed"
-msgstr "ha hecho un reproche a "
+#: ../../extend/addon/addon/frphotos/frphotos.php:95
+msgid "Friendica Login Password"
+msgstr "Contraseña de inicio de sesión en Friendica"
-#: ../../include/text.php:1081
-msgid "happy"
-msgstr "feliz "
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:125
+msgid "Enable the GNU-Social protocol for this channel"
+msgstr "Activar el protocolo de GNU-Social para este canal"
-#: ../../include/text.php:1082
-msgid "sad"
-msgstr "triste "
+#: ../../extend/addon/addon/hubwall/hubwall.php:19
+msgid "Send email to all members"
+msgstr "Enviar un correo electrónico a todos los miembros"
-#: ../../include/text.php:1083
-msgid "mellow"
-msgstr "tranquilo/a"
+#: ../../extend/addon/addon/hubwall/hubwall.php:33
+#, php-format
+msgid "$1%s Administrator"
+msgstr "Administrador de $1%s "
-#: ../../include/text.php:1084
-msgid "tired"
-msgstr "cansado/a "
+#: ../../extend/addon/addon/hubwall/hubwall.php:50
+#: ../../extend/addon/addon/mailtest/mailtest.php:50
+msgid "No recipients found."
+msgstr "No se han encontrado destinatarios."
-#: ../../include/text.php:1085
-msgid "perky"
-msgstr "vivaz"
+#: ../../extend/addon/addon/hubwall/hubwall.php:73
+#, php-format
+msgid "%1$d of %2$d messages sent."
+msgstr "%1$d de %2$d mensajes enviados."
-#: ../../include/text.php:1086
-msgid "angry"
-msgstr "enfadado/a"
+#: ../../extend/addon/addon/hubwall/hubwall.php:81
+msgid "Send email to all hub members."
+msgstr "Enviar un correo electrónico a todos los miembros del hub."
-#: ../../include/text.php:1087
-msgid "stupefied"
-msgstr "asombrado/a"
+#: ../../extend/addon/addon/hubwall/hubwall.php:92
+#: ../../extend/addon/addon/mailtest/mailtest.php:96
+msgid "Message subject"
+msgstr "Asunto del mensaje"
-#: ../../include/text.php:1088
-msgid "puzzled"
-msgstr "perplejo/a"
+#: ../../extend/addon/addon/hubwall/hubwall.php:93
+msgid "Sender Email address"
+msgstr "Dirección de correo electrónico del remitente"
-#: ../../include/text.php:1089
-msgid "interested"
-msgstr "interesado/a"
+#: ../../extend/addon/addon/hubwall/hubwall.php:94
+msgid "Test mode (only send to hub administrator)"
+msgstr "Modo de prueba (enviar sólo al administrador del hub)"
-#: ../../include/text.php:1090
-msgid "bitter"
-msgstr "amargado/a"
+#: ../../extend/addon/addon/ijpost/ijpost.php:42
+msgid "Post to Insanejournal"
+msgstr "Publicar en Insanejournal"
-#: ../../include/text.php:1091
-msgid "cheerful"
-msgstr "alegre"
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+msgid "Enable InsaneJournal Post Plugin"
+msgstr "Habilitar el plugin de publicación en InsaneJournal"
-#: ../../include/text.php:1092
-msgid "alive"
-msgstr "animado/a"
+#: ../../extend/addon/addon/ijpost/ijpost.php:77
+msgid "InsaneJournal username"
+msgstr "Nombre de usuario en InsaneJournal"
-#: ../../include/text.php:1093
-msgid "annoyed"
-msgstr "molesto/a"
+#: ../../extend/addon/addon/ijpost/ijpost.php:81
+msgid "InsaneJournal password"
+msgstr "Contraseña en InsaneJournal"
-#: ../../include/text.php:1094
-msgid "anxious"
-msgstr "ansioso/a"
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+msgid "Post to InsaneJournal by default"
+msgstr "Publicar por defecto en InsaneJournal"
-#: ../../include/text.php:1095
-msgid "cranky"
-msgstr "de mal humor"
+#: ../../extend/addon/addon/ijpost/ijpost.php:89
+msgid "InsaneJournal Post Settings"
+msgstr "Ajustes de publicación en InsaneJournal"
-#: ../../include/text.php:1096
-msgid "disturbed"
-msgstr "perturbado/a"
+#: ../../extend/addon/addon/ijpost/ijpost.php:104
+msgid "Insane Journal Settings saved."
+msgstr "Se han guardado los ajustes de InsaneJournal."
-#: ../../include/text.php:1097
-msgid "frustrated"
-msgstr "frustrado/a"
+#: ../../extend/addon/addon/irc/irc.php:45
+msgid "Channels to auto connect"
+msgstr "Canales para conexión automática"
-#: ../../include/text.php:1098
-msgid "depressed"
-msgstr "deprimido/a"
+#: ../../extend/addon/addon/irc/irc.php:45
+#: ../../extend/addon/addon/irc/irc.php:49
+msgid "Comma separated list"
+msgstr "Lista separada por comas"
-#: ../../include/text.php:1099
-msgid "motivated"
-msgstr "motivado/a"
+#: ../../extend/addon/addon/irc/irc.php:49
+#: ../../extend/addon/addon/irc/irc.php:96
+msgid "Popular Channels"
+msgstr "Canales populares"
-#: ../../include/text.php:1100
-msgid "relaxed"
-msgstr "relajado/a"
+#: ../../extend/addon/addon/irc/irc.php:53
+msgid "IRC Settings"
+msgstr "Ajustes de IRC"
-#: ../../include/text.php:1101
-msgid "surprised"
-msgstr "sorprendido/a"
+#: ../../extend/addon/addon/irc/irc.php:69
+msgid "IRC settings saved."
+msgstr "Se han guardado los ajustes de IRC."
-#: ../../include/text.php:1285 ../../include/js_strings.php:70
-msgid "Monday"
-msgstr "lunes"
+#: ../../extend/addon/addon/irc/irc.php:74
+msgid "IRC Chatroom"
+msgstr "Sala de chat IRC"
-#: ../../include/text.php:1285 ../../include/js_strings.php:71
-msgid "Tuesday"
-msgstr "martes"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:305
+#: ../../include/channel.php:1056 ../../include/channel.php:1218
+msgid "Status:"
+msgstr "Estado:"
-#: ../../include/text.php:1285 ../../include/js_strings.php:72
-msgid "Wednesday"
-msgstr "miércoles"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+msgid "Activate addon"
+msgstr "Habilitar complemento"
-#: ../../include/text.php:1285 ../../include/js_strings.php:73
-msgid "Thursday"
-msgstr "jueves"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+msgid "Hide Jappixmini Chat-Widget from the webinterface"
+msgstr "Ocultar el widget de chat Jappixmini en la interfaz web"
-#: ../../include/text.php:1285 ../../include/js_strings.php:74
-msgid "Friday"
-msgstr "viernes"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:318
+msgid "Jabber username"
+msgstr "Nombre de usuario en Jabber"
-#: ../../include/text.php:1285 ../../include/js_strings.php:75
-msgid "Saturday"
-msgstr "sábado"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:324
+msgid "Jabber server"
+msgstr "Servidor de Jabber"
-#: ../../include/text.php:1285 ../../include/js_strings.php:69
-msgid "Sunday"
-msgstr "domingo"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:330
+msgid "Jabber BOSH host URL"
+msgstr "URL del host BOSH de Jabber"
-#: ../../include/text.php:1289 ../../include/js_strings.php:45
-msgid "January"
-msgstr "enero"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:337
+msgid "Jabber password"
+msgstr "Contraseña en Jabber"
-#: ../../include/text.php:1289 ../../include/js_strings.php:46
-msgid "February"
-msgstr "febrero"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+msgid "Encrypt Jabber password with Hubzilla password"
+msgstr "Cifrar la contraseña de Jabber con la contraseña de Hubzilla"
-#: ../../include/text.php:1289 ../../include/js_strings.php:47
-msgid "March"
-msgstr "marzo"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:347
+#: ../../extend/addon/addon/redred/redred.php:115
+msgid "Hubzilla password"
+msgstr "Contraseña de Hubzilla"
-#: ../../include/text.php:1289 ../../include/js_strings.php:48
-msgid "April"
-msgstr "abril"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+msgid "Approve subscription requests from Hubzilla contacts automatically"
+msgstr "Aprobar automáticamente las solicitudes de suscripción de los contactos de Hubzilla"
-#: ../../include/text.php:1289
-msgid "May"
-msgstr "mayo"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+msgid "Purge internal list of jabber addresses of contacts"
+msgstr "Purgar la lista interna de las direcciones de contactos de jabber"
-#: ../../include/text.php:1289 ../../include/js_strings.php:50
-msgid "June"
-msgstr "junio"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:364
+msgid "Configuration Help"
+msgstr "Ayuda para los ajustes"
-#: ../../include/text.php:1289 ../../include/js_strings.php:51
-msgid "July"
-msgstr "julio"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:368
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149
+msgid "Add Contact"
+msgstr "Añadir un contacto"
-#: ../../include/text.php:1289 ../../include/js_strings.php:52
-msgid "August"
-msgstr "agosto"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
+msgid "Jappix Mini Settings"
+msgstr "Ajustes de Jappix Mini"
-#: ../../include/text.php:1289 ../../include/js_strings.php:53
-msgid "September"
-msgstr "septiembre"
+#: ../../extend/addon/addon/js_upload/js_upload.php:44
+msgid "Upload a file"
+msgstr "Subir un fichero"
-#: ../../include/text.php:1289 ../../include/js_strings.php:54
-msgid "October"
-msgstr "octubre"
+#: ../../extend/addon/addon/js_upload/js_upload.php:45
+msgid "Drop files here to upload"
+msgstr "Arrastre los ficheros aquí para subirlos"
-#: ../../include/text.php:1289 ../../include/js_strings.php:55
-msgid "November"
-msgstr "noviembre"
+#: ../../extend/addon/addon/js_upload/js_upload.php:47
+msgid "Failed"
+msgstr "Ha fallado"
-#: ../../include/text.php:1289 ../../include/js_strings.php:56
-msgid "December"
-msgstr "diciembre"
+#: ../../extend/addon/addon/js_upload/js_upload.php:315
+msgid "No files were uploaded."
+msgstr "No se han subido ficheros."
-#: ../../include/text.php:1366 ../../include/text.php:1370
-msgid "Unknown Attachment"
-msgstr "Adjunto no reconocido"
+#: ../../extend/addon/addon/js_upload/js_upload.php:322
+msgid "Uploaded file is empty"
+msgstr "El fichero subido está vacío"
-#: ../../include/text.php:1372
-msgid "unknown"
-msgstr "desconocido"
+#: ../../extend/addon/addon/js_upload/js_upload.php:335
+msgid "Image exceeds size limit of "
+msgstr "La imagen supera el límite de tamaño de "
-#: ../../include/text.php:1408
-msgid "remove category"
-msgstr "eliminar el tema"
+#: ../../extend/addon/addon/js_upload/js_upload.php:347
+msgid "File has an invalid extension, it should be one of "
+msgstr "El fichero tiene una extensión no válida, debería ser una de estas: "
-#: ../../include/text.php:1485
-msgid "remove from file"
-msgstr "eliminar del fichero"
+#: ../../extend/addon/addon/js_upload/js_upload.php:359
+msgid "Upload was cancelled, or server error encountered"
+msgstr "Se canceló la carga o se encontró un error del servidor"
-#: ../../include/text.php:1784 ../../include/text.php:1855
-msgid "default"
-msgstr "por defecto"
+#: ../../extend/addon/addon/ldapauth/ldapauth.php:61
+msgid "An account has been created for you."
+msgstr "Se ha creado una cuenta para usted."
-#: ../../include/text.php:1792
-msgid "Page layout"
-msgstr "Plantilla de la página"
+#: ../../extend/addon/addon/ldapauth/ldapauth.php:68
+msgid "Authentication successful but rejected: account creation is disabled."
+msgstr "Autenticación correcta pero rechazada: la creación de cuentas está deshabilitada."
-#: ../../include/text.php:1792
-msgid "You can create your own with the layouts tool"
-msgstr "Puede crear su propia disposición gráfica con la herramienta de plantillas"
+#: ../../extend/addon/addon/libertree/libertree.php:38
+msgid "Post to Libertree"
+msgstr "Publicar en Libertree"
-#: ../../include/text.php:1834
-msgid "Page content type"
-msgstr "Tipo de contenido de la página"
+#: ../../extend/addon/addon/libertree/libertree.php:69
+msgid "Enable Libertree Post Plugin"
+msgstr "Habilitar el plugin de publicación en Libertree"
-#: ../../include/text.php:1867
-msgid "Select an alternate language"
-msgstr "Seleccionar un idioma alternativo"
+#: ../../extend/addon/addon/libertree/libertree.php:73
+msgid "Libertree API token"
+msgstr "Token de la API de Libertree"
-#: ../../include/text.php:2004
-msgid "activity"
-msgstr "la actividad"
+#: ../../extend/addon/addon/libertree/libertree.php:77
+msgid "Libertree site URL"
+msgstr "URL del servidor de Libertree"
-#: ../../include/text.php:2305
-msgid "Design Tools"
-msgstr "Herramientas de diseño web"
+#: ../../extend/addon/addon/libertree/libertree.php:81
+msgid "Post to Libertree by default"
+msgstr "Publicar en Libertree por defecto"
-#: ../../include/text.php:2311
-msgid "Pages"
-msgstr "Páginas"
+#: ../../extend/addon/addon/libertree/libertree.php:85
+msgid "Libertree Post Settings"
+msgstr "Ajustes de publicación en Libertree"
-#: ../../include/text.php:2333
-msgid "Import website..."
-msgstr "Importar un sitio web..."
+#: ../../extend/addon/addon/libertree/libertree.php:99
+msgid "Libertree Settings saved."
+msgstr "Se han guardado los ajustes de Libertree."
-#: ../../include/text.php:2334
-msgid "Select folder to import"
-msgstr "Seleccionar la carpeta que se va a importar"
+#: ../../extend/addon/addon/ljpost/ljpost.php:42
+msgid "Post to LiveJournal"
+msgstr "Publicar en LiveJournal"
-#: ../../include/text.php:2335
-msgid "Import from a zipped folder:"
-msgstr "Importar desde una carpeta comprimida: "
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+msgid "Enable LiveJournal Post Plugin"
+msgstr "Habilitar el plugin de publicación en LiveJournal"
-#: ../../include/text.php:2336
-msgid "Import from cloud files:"
-msgstr "Importar desde los ficheros en la nube: "
+#: ../../extend/addon/addon/ljpost/ljpost.php:74
+msgid "LiveJournal username"
+msgstr "Nombre de usuario en LiveJournal"
-#: ../../include/text.php:2337
-msgid "/cloud/channel/path/to/folder"
-msgstr "/cloud/canal/ruta/a la/carpeta"
+#: ../../extend/addon/addon/ljpost/ljpost.php:78
+msgid "LiveJournal password"
+msgstr "Contraseña en LiveJournal"
-#: ../../include/text.php:2338
-msgid "Enter path to website files"
-msgstr "Ruta a los ficheros del sitio web"
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+msgid "Post to LiveJournal by default"
+msgstr "Publicar en LiveJournal por defecto"
-#: ../../include/text.php:2339
-msgid "Select folder"
-msgstr "Seleccionar la carpeta"
+#: ../../extend/addon/addon/ljpost/ljpost.php:86
+msgid "LiveJournal Post Settings"
+msgstr "Ajustes de publicación en LiveJournal"
-#: ../../include/text.php:2340
-msgid "Export website..."
-msgstr "Exportar un sitio web..."
+#: ../../extend/addon/addon/ljpost/ljpost.php:101
+msgid "LiveJournal Settings saved."
+msgstr "Se han guardado los ajustes de LiveJournal."
-#: ../../include/text.php:2341
-msgid "Export to a zip file"
-msgstr "Exportar a un fichero comprimido .zip"
+#: ../../extend/addon/addon/logrot/logrot.php:36
+msgid "Logfile archive directory"
+msgstr "Directorio de los ficheros de informe"
-#: ../../include/text.php:2342
-msgid "website.zip"
-msgstr "sitio_web.zip"
+#: ../../extend/addon/addon/logrot/logrot.php:36
+msgid "Directory to store rotated logs"
+msgstr "Directorio para almacenar los informes rotados"
-#: ../../include/text.php:2343
-msgid "Enter a name for the zip file."
-msgstr "Escribir un nombre para el fichero .zip."
+#: ../../extend/addon/addon/logrot/logrot.php:37
+msgid "Logfile size in bytes before rotating"
+msgstr "Tamaño del fichero de informe en bytes antes de rotarlo"
-#: ../../include/text.php:2344
-msgid "Export to cloud files"
-msgstr "Exportar a los ficheros en la nube"
+#: ../../extend/addon/addon/logrot/logrot.php:38
+msgid "Number of logfiles to retain"
+msgstr "Número de ficheros de informe que se deben retener"
-#: ../../include/text.php:2345
-msgid "/path/to/export/folder"
-msgstr "/ruta/para/exportar/carpeta"
+#: ../../extend/addon/addon/mailhost/mailhost.php:36
+msgid "Email notification hub"
+msgstr "Notificación por correo electrónico del hub"
-#: ../../include/text.php:2346
-msgid "Enter a path to a cloud files destination."
-msgstr "Escribir una ruta de destino para los ficheros en la nube"
+#: ../../extend/addon/addon/mailhost/mailhost.php:36
+msgid "Hostname"
+msgstr "Nombre del host"
-#: ../../include/text.php:2347
-msgid "Specify folder"
-msgstr "Especificar una carpeta"
+#: ../../extend/addon/addon/mailhost/mailhost.php:40
+msgid "Mailhost Settings"
+msgstr "Ajustes de Mailhost"
-#: ../../include/zot.php:700
-msgid "Invalid data packet"
-msgstr "Paquete de datos no válido"
+#: ../../extend/addon/addon/mailhost/mailhost.php:54
+msgid "MAILHOST Settings saved."
+msgstr "Se han guardado los ajustes de MAILHOST."
-#: ../../include/zot.php:716
-msgid "Unable to verify channel signature"
-msgstr "No ha sido posible de verificar la firma del canal"
+#: ../../extend/addon/addon/moremoods/moremoods.php:19
+msgid "lonely"
+msgstr "Solo/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:20
+msgid "drunk"
+msgstr "ebrio/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:21
+msgid "horny"
+msgstr "caliente"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:22
+msgid "stoned"
+msgstr "drogado/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:23
+msgid "fucked up"
+msgstr "jodido/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:24
+msgid "clusterfucked"
+msgstr "hecho/a polvo"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:25
+msgid "crazy"
+msgstr "loco/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:26
+msgid "hurt"
+msgstr "ofendido/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:27
+msgid "sleepy"
+msgstr "soñoliento/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:28
+msgid "grumpy"
+msgstr "gruñón/ona"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:29
+msgid "high"
+msgstr "superior"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:30
+msgid "semi-conscious"
+msgstr "semiconsciente"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:31
+msgid "in love"
+msgstr "enamorado/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:32
+msgid "in lust"
+msgstr "lujurioso/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:33
+msgid "naked"
+msgstr "desnudo/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:34
+msgid "stinky"
+msgstr "apestoso/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:35
+msgid "sweaty"
+msgstr "sudoroso/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:36
+msgid "bleeding out"
+msgstr "desangrado/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:37
+msgid "victorious"
+msgstr "victorioso/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:38
+msgid "defeated"
+msgstr "derrotado/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:39
+msgid "envious"
+msgstr "envidioso/a"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:40
+msgid "jealous"
+msgstr "celoso/a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:19
+msgid "bitchslap"
+msgstr "una bofetada humillante"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:19
+msgid "bitchslapped"
+msgstr "ha abofeteado de forma humillante a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:20
+msgid "shag"
+msgstr "unas pelusas"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:20
+msgid "shagged"
+msgstr "ha dejado exhausto/a a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:21
+msgid "patent"
+msgstr "una patente"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:21
+msgid "patented"
+msgstr "ha patentado a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:22
+msgid "hug"
+msgstr "un abrazo"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:22
+msgid "hugged"
+msgstr "ha abrazado a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:23
+msgid "murder"
+msgstr "un asesinato"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:23
+msgid "murdered"
+msgstr "ha asesinado a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:24
+msgid "worship"
+msgstr "una alabanza"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:24
+msgid "worshipped"
+msgstr "ha elogiado a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:25
+msgid "kiss"
+msgstr "un beso"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:25
+msgid "kissed"
+msgstr "ha besado a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:26
+msgid "tempt"
+msgstr "una tentación"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:26
+msgid "tempted"
+msgstr "ha tentado a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:27
+msgid "raise eyebrows at"
+msgstr "un levantamiento de cejas"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:27
+msgid "raised their eyebrows at"
+msgstr "ha levantado las cejas a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:28
+msgid "insult"
+msgstr "un insulto"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:28
+msgid "insulted"
+msgstr "ha insultado a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:29
+msgid "praise"
+msgstr "un elogio"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:29
+msgid "praised"
+msgstr "ha elogiado a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:30
+msgid "be dubious of"
+msgstr "una duda"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:30
+msgid "was dubious of"
+msgstr "estaba dudoso de"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:31
+msgid "eat"
+msgstr "una comida"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:31
+msgid "ate"
+msgstr "ha comido"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:32
+msgid "giggle and fawn at"
+msgstr "una sonrisa aduladora"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:32
+msgid "giggled and fawned at"
+msgstr "ha sonreído y adulado a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:33
+msgid "doubt"
+msgstr "una duda"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:33
+msgid "doubted"
+msgstr "ha dudado de"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:34
+msgid "glare"
+msgstr "una mirada furiosa"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:34
+msgid "glared at"
+msgstr "ha mirado con furia a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:35
+msgid "fuck"
+msgstr "un polvo"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:35
+msgid "fucked"
+msgstr "ha jodido a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:36
+msgid "bonk"
+msgstr "un golpe"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:36
+msgid "bonked"
+msgstr "ha golpeado a"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:37
+msgid "declare undying love for"
+msgstr "una declaración de amor eterno"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:37
+msgid "declared undying love for"
+msgstr "ha declarado amor eterno"
+
+#: ../../extend/addon/addon/msgfooter/msgfooter.php:46
+#: ../../extend/addon/addon/xmpp/xmpp.php:91
+msgid "Save Settings"
+msgstr "Guardar ajustes"
+
+#: ../../extend/addon/addon/msgfooter/msgfooter.php:47
+msgid "text to include in all outgoing posts from this site"
+msgstr "texto a incluir en todos los mensajes salientes de este sitio"
+
+#: ../../extend/addon/addon/nofed/nofed.php:42
+msgid "Federate"
+msgstr "Federar"
+
+#: ../../extend/addon/addon/nofed/nofed.php:56
+msgid "nofed Settings saved."
+msgstr "Se han guardado los ajustes de nofed."
+
+#: ../../extend/addon/addon/nofed/nofed.php:72
+msgid "Allow Federation Toggle"
+msgstr "Permitir alternancia de federación"
+
+#: ../../extend/addon/addon/nofed/nofed.php:76
+msgid "Federate posts by default"
+msgstr "Federar las publicaciones por defecto"
+
+#: ../../extend/addon/addon/nofed/nofed.php:80
+msgid "NoFed Settings"
+msgstr "Ajustes de NoFed"
+
+#: ../../extend/addon/addon/nsabait/nsabait.php:125
+msgid "Nsabait Settings updated."
+msgstr "Se han actualizado los ajustes de Nsabait"
-#: ../../include/zot.php:2329
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+msgid "Enable NSAbait Plugin"
+msgstr "Habilitar el plugin NSAbait"
+
+#: ../../extend/addon/addon/nsabait/nsabait.php:161
+msgid "NSAbait Settings"
+msgstr "Ajustes de NSAbait"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:80
+msgid ""
+"This plugin looks in posts for the words/text you specify below, and "
+"collapses any content containing those keywords so it is not displayed at "
+"inappropriate times, such as sexual innuendo that may be improper in a work "
+"setting. It is polite and recommended to tag any content containing nudity "
+"with #NSFW. This filter can also match any other word/text you specify, and"
+" can thereby be used as a general purpose content filter."
+msgstr "Este complemento busca en los mensajes las palabras o texto que se especifican a continuación y contrae cualquier contenido que contenga esas palabras clave para que no se muestre en momentos inapropiados, como insinuaciones sexuales que pueden ser impropias en un entorno de trabajo. Es una muestra de educación y se recomienda marcar cualquier contenido que contenga desnudos con #NSFW. Este filtro también puede coincidir con cualquier otra palabra o texto que especifique y, por lo tanto, puede utilizarse como un filtro de contenido de propósito general."
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+msgid "Enable Content filter"
+msgstr "Habilitar filtro de contenido"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:88
+msgid "Comma separated list of keywords to hide"
+msgstr "Lista separada por comas de palabras clave para ocultar"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:88
+msgid "Use /expression/ to provide regular expressions"
+msgstr "Usar /expression/ para proporcionar expresiones regulares"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:92
+msgid "Not Safe For Work Settings"
+msgstr "No es seguro para ajustes de trabajo"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:92
+msgid "General Purpose Content Filter"
+msgstr "Filtro de contenido de propósito general"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:110
+msgid "NSFW Settings saved."
+msgstr "Se han guardado los ajustes de NSFW."
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:207
+msgid "Possible adult content"
+msgstr "Posible contenido para adultos"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:211
#, php-format
-msgid "Unable to verify site signature for %s"
-msgstr "No ha sido posible de verificar la firma del sitio para %s"
+msgid "%s - click to open/close"
+msgstr "%s - pulsar para abrir o cerrar"
-#: ../../include/zot.php:3713
-msgid "invalid target signature"
-msgstr "La firma recibida no es válida"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:49
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:127
+msgid "System defaults:"
+msgstr "Valores predeterminados del sistema: "
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
+msgid "Preferred Clipart IDs"
+msgstr "IDs de las imágenes clipart preferidas"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
+msgid "List of preferred clipart ids. These will be shown first."
+msgstr "Lista de ids de imágenes de clipart preferidas. Se verán en primer lugar."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
+msgid "Default Search Term"
+msgstr "Términos de búsqueda predeterminados"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
+msgid "The default search term. These will be shown second."
+msgstr "Los términos de búsqueda predeterminados. Estos se mostrarán en segundo lugar."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
+msgid "Return After"
+msgstr "Regresar después"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
+msgid "Page to load after image selection."
+msgstr "Página para cargar después de la selección de imágenes."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:57
+#: ../../include/channel.php:965 ../../include/nav.php:93
+msgid "Edit Profile"
+msgstr "Editar el perfil"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:58
+msgid "Profile List"
+msgstr "Lista de perfiles"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:60
+msgid "Order of Preferred"
+msgstr "Orden de preferencia"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:60
+msgid "Sort order of preferred clipart ids."
+msgstr "Orden de clasificación de los identificadores de imágenes clipart preferidas."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
+msgid "Newest first"
+msgstr "Las más nuevas en primer lugar"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:64
+msgid "As entered"
+msgstr "Tal como se ingresaron"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:66
+msgid "Order of other"
+msgstr "Orden de los demás"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:66
+msgid "Sort order of other clipart ids."
+msgstr "Orden de clasificación de otros ids de imágenes clipart."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:68
+msgid "Most downloaded first"
+msgstr "Las más descargadas en primer lugar"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:69
+msgid "Most liked first"
+msgstr "Las más apreciadas en primer lugar"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:71
+msgid "Preferred IDs Message"
+msgstr "Mensaje de IDs preferido"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:71
+msgid "Message to display above preferred results."
+msgstr "Mensaje para mostrar sobre los resultados preferidos."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:77
+msgid "Uploaded by: "
+msgstr "Subida por: "
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:77
+msgid "Drawn by: "
+msgstr "Creada por: "
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:191
+msgid "Or select from a free OpenClipart.org image:"
+msgstr "O seleccionar una imagen gratuita de OpenClipart.org: "
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:194
+msgid "Search Term"
+msgstr "Término de búsqueda"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:216
+msgid "Unknown error. Please try again later."
+msgstr "Error desconocido. Por favor, inténtelo otra vez."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:303
+msgid "Profile photo updated successfully."
+msgstr "Se ha actualizado con éxito la foto de perfil."
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:146
+msgid "View Larger"
+msgstr "Ver más grande"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+msgid "Tile Server URL"
+msgstr "URL del servidor de mosaicos de imágenes "
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+msgid ""
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" "
+"target=\"_blank\">public tile servers</a>"
+msgstr "Una lista de <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">servidores públicos de mosaicos de imágenes</a>"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+msgid "Nominatim (reverse geocoding) Server URL"
+msgstr "URL del servidor nominatim (geocodificación inversa)"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+msgid ""
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" "
+"target=\"_blank\">Nominatim servers</a>"
+msgstr "Una lista de <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">servidores nominatim</a>"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+msgid "Default zoom"
+msgstr "Zoom predeterminado"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+msgid ""
+"The default zoom level. (1:world, 18:highest, also depends on tile server)"
+msgstr "El nivel de zoom predeterminado. (1: mundo, 18: el más alto, también depende del servidor del mosaico de imágenes)"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+msgid "Include marker on map"
+msgstr "Incluir un marcador en el mapa"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+msgid "Include a marker on the map."
+msgstr "Incluir un marcador en el mapa."
+
+#: ../../extend/addon/addon/pageheader/pageheader.php:43
+msgid "Message to display on every page on this server"
+msgstr "Mensaje para mostrar en todas las páginas de este servidor"
+
+#: ../../extend/addon/addon/pageheader/pageheader.php:48
+msgid "Pageheader Settings"
+msgstr "Ajustes del encabezado de página"
+
+#: ../../extend/addon/addon/pageheader/pageheader.php:64
+msgid "pageheader Settings saved."
+msgstr "Se han guardado los ajustes del encabezado de página."
+
+#: ../../extend/addon/addon/piwik/piwik.php:85
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
+msgstr "Este sitio es rastreado mediante la herramienta analítica <a href='http://www.piwik.org'>Piwik</a>."
+
+#: ../../extend/addon/addon/piwik/piwik.php:88
+#, 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 "Si usted no quiere que sus visitas se registren de esta manera <a href='%s'>puede establecer una cookie para evitar que Piwik rastree otras visitas del sitio</a> (opt-out)."
+
+#: ../../extend/addon/addon/piwik/piwik.php:96
+msgid "Piwik Base URL"
+msgstr "URL base de Piwik"
+
+#: ../../extend/addon/addon/piwik/piwik.php:96
+msgid ""
+"Absolute path to your Piwik installation. (without protocol (http/s), with "
+"trailing slash)"
+msgstr "Ruta absoluta a la instalación de Piwik. (Sin protocolo (http/s), con barra diagonal)"
+
+#: ../../extend/addon/addon/piwik/piwik.php:97
+msgid "Site ID"
+msgstr "ID del sitio"
+
+#: ../../extend/addon/addon/piwik/piwik.php:98
+msgid "Show opt-out cookie link?"
+msgstr "Mostrar el enlace de la cookie opt-out?"
+
+#: ../../extend/addon/addon/piwik/piwik.php:99
+msgid "Asynchronous tracking"
+msgstr "Rastreo asíncrono"
+
+#: ../../extend/addon/addon/piwik/piwik.php:100
+msgid "Enable frontend JavaScript error tracking"
+msgstr "Habilitar la interfaz JavaScript de seguimiento de errores"
+
+#: ../../extend/addon/addon/piwik/piwik.php:100
+msgid "This feature requires Piwik >= 2.2.0"
+msgstr "Esta funcionalidad requiere Piwik >= 2.2.0"
+
+#: ../../extend/addon/addon/planets/planets.php:121
+msgid "Planets Settings updated."
+msgstr "Se han guardado los ajustes de Planets."
+
+#: ../../extend/addon/addon/planets/planets.php:153
+msgid "Enable Planets Plugin"
+msgstr "Habilitar el plugin Planets"
+
+#: ../../extend/addon/addon/planets/planets.php:157
+msgid "Planets Settings"
+msgstr "Ajustes de Planets"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:148
+msgid "You are now authenticated to pumpio."
+msgstr "Ahora está autenticado en pump.io."
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:149
+msgid "return to the featured settings page"
+msgstr "Volver a la página de configuración destacada"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:163
+msgid "Post to Pump.io"
+msgstr "Publicar en Pump.io"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:198
+msgid "Pump.io servername"
+msgstr "Nombre del servidor de Pump.io"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:198
+msgid "Without \"http://\" or \"https://\""
+msgstr "Sin \"http://\" or \"https://\""
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:202
+msgid "Pump.io username"
+msgstr "Nombre de usuario en Pump.io"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:202
+msgid "Without the servername"
+msgstr "Sin el nombre del servidor"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:213
+msgid "You are not authenticated to pumpio"
+msgstr "No está autenticado en pump.io"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:215
+msgid "(Re-)Authenticate your pump.io connection"
+msgstr "(Re-)Autenticar su conexión en pump.io"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+msgid "Enable pump.io Post Plugin"
+msgstr "Habilitar el plugin de publicación en pump.io"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+msgid "Post to pump.io by default"
+msgstr "Publicar por defecto en pump.io"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+msgid "Should posts be public"
+msgstr "¿Las entradas deben ser públicas?"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+msgid "Mirror all public posts"
+msgstr "Reflejar todos los mensajes públicos"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:237
+msgid "Pump.io Post Settings"
+msgstr "Ajustes de publicación en pump.io"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:266
+msgid "PumpIO Settings saved."
+msgstr "Se han guardado los ajustes de PumpIO."
+
+#: ../../extend/addon/addon/qrator/qrator.php:48
+msgid "QR code"
+msgstr "Código QR"
+
+#: ../../extend/addon/addon/qrator/qrator.php:63
+msgid "QR Generator"
+msgstr "Generador QR"
+
+#: ../../extend/addon/addon/qrator/qrator.php:64
+msgid "Enter some text"
+msgstr "Escribir algún texto"
+
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+msgid "Enable Rainbowtag"
+msgstr "Habilitar Rainbowtag"
+
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
+msgid "Rainbowtag Settings"
+msgstr "Ajustes de Rainbowtag"
+
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:101
+msgid "Rainbowtag Settings saved."
+msgstr "Se han guardado los ajustes de Rainbowtag."
+
+#: ../../extend/addon/addon/randpost/randpost.php:97
+msgid "You're welcome."
+msgstr "Bienvenido."
+
+#: ../../extend/addon/addon/randpost/randpost.php:98
+msgid "Ah shucks..."
+msgstr "Ah, joder..."
+
+#: ../../extend/addon/addon/randpost/randpost.php:99
+msgid "Don't mention it."
+msgstr "No lo menciones."
+
+#: ../../extend/addon/addon/randpost/randpost.php:100
+msgid "&lt;blush&gt;"
+msgstr "&lt;sonrojo&gt;"
+
+#: ../../extend/addon/addon/redfiles/redfiles.php:119
+msgid "Redmatrix File Storage Import"
+msgstr "Importar repositorio de ficheros de Redmatrix"
+
+#: ../../extend/addon/addon/redfiles/redfiles.php:120
+msgid "This will import all your Redmatrix cloud files to this channel."
+msgstr "Esto importará todos sus ficheros de la nube de Redmatrix a este canal."
+
+#: ../../extend/addon/addon/redfiles/redfiles.php:121
+#: ../../extend/addon/addon/redphotos/redphotos.php:131
+msgid "Redmatrix Server base URL"
+msgstr "URL base del servidor Redmatrix"
+
+#: ../../extend/addon/addon/redfiles/redfiles.php:122
+#: ../../extend/addon/addon/redphotos/redphotos.php:132
+msgid "Redmatrix Login Username"
+msgstr "Nombre de inicio de sesión en Redmatrix"
+
+#: ../../extend/addon/addon/redfiles/redfiles.php:123
+#: ../../extend/addon/addon/redphotos/redphotos.php:133
+msgid "Redmatrix Login Password"
+msgstr "Contraseña de inicio de sesión en Redmatrix"
+
+#: ../../extend/addon/addon/redfiles/redfilehelper.php:67
+msgid "file"
+msgstr "fichero"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:106
+msgid "Photos imported"
+msgstr "Se han importado las fotos"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:129
+msgid "Redmatrix Photo Album Import"
+msgstr "Importar un álbum de fotos de Redmatrix"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:130
+msgid "This will import all your Redmatrix photo albums to this channel."
+msgstr "Esto importará todos sus álbumes de fotos de Redmatrix a este canal."
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:134
+msgid "Import just this album"
+msgstr "Importar solo este álbum"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:134
+msgid "Leave blank to import all albums"
+msgstr "Dejar en blanco para importar todos los álbumes"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:135
+msgid "Maximum count to import"
+msgstr "Límite máximo de importación"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:135
+msgid "0 or blank to import all available"
+msgstr "0 o en blanco para importar todos los disponibles"
+
+#: ../../extend/addon/addon/redred/redred.php:45
+msgid "Post to Red"
+msgstr "Enviar a Red"
+
+#: ../../extend/addon/addon/redred/redred.php:60
+msgid "Channel is required."
+msgstr "Se requiere un canal."
+
+#: ../../extend/addon/addon/redred/redred.php:65
+msgid "Invalid channel."
+msgstr "El canal no es válido."
+
+#: ../../extend/addon/addon/redred/redred.php:76
+msgid "redred Settings saved."
+msgstr "Se han salvado los ajustes de redred."
+
+#: ../../extend/addon/addon/redred/redred.php:95
+msgid "Allow posting to another Hubzilla Channel"
+msgstr "Permitir la publicación en otro canal de Hubzilla"
+
+#: ../../extend/addon/addon/redred/redred.php:99
+msgid "Send public postings to Hubzilla channel by default"
+msgstr "Enviar entradas públicas al canal Hubzilla por defecto"
+
+#: ../../extend/addon/addon/redred/redred.php:103
+msgid "Hubzilla API Path"
+msgstr "Ruta de la API de Hubzilla"
+
+#: ../../extend/addon/addon/redred/redred.php:103
+#: ../../extend/addon/addon/rtof/rtof.php:89
+msgid "https://{sitename}/api"
+msgstr "https://{sitename}/api"
+
+#: ../../extend/addon/addon/redred/redred.php:107
+msgid "Hubzilla login name"
+msgstr "Nombre de inicio de sesión en Hubzilla"
+
+#: ../../extend/addon/addon/redred/redred.php:111
+msgid "Hubzilla channel name"
+msgstr "Nombre del canal de Hubzilla"
+
+#: ../../extend/addon/addon/redred/redred.php:111
+#: ../../extend/addon/addon/openid/MysqlProvider.php:54
+msgid "Nickname"
+msgstr "Alias"
+
+#: ../../extend/addon/addon/redred/redred.php:119
+msgid "Hubzilla Crosspost Settings"
+msgstr "Ajustes de Hubzilla Crosspost"
+
+#: ../../extend/addon/addon/rtof/rtof.php:45
+msgid "Post to Friendica"
+msgstr "Publicar en Friendica"
+
+#: ../../extend/addon/addon/rtof/rtof.php:62
+msgid "rtof Settings saved."
+msgstr "Se han guardado los ajustes de rtof"
+
+#: ../../extend/addon/addon/rtof/rtof.php:81
+msgid "Allow posting to Friendica"
+msgstr "Permitir publicar en Friendica"
+
+#: ../../extend/addon/addon/rtof/rtof.php:85
+msgid "Send public postings to Friendica by default"
+msgstr "Enviar entradas públicas a Friendica por defecto"
+
+#: ../../extend/addon/addon/rtof/rtof.php:89
+msgid "Friendica API Path"
+msgstr "Ruta a la API de Friendica"
+
+#: ../../extend/addon/addon/rtof/rtof.php:93
+msgid "Friendica login name"
+msgstr "Nombre de inicio de sesión en Friendica"
+
+#: ../../extend/addon/addon/rtof/rtof.php:97
+msgid "Friendica password"
+msgstr "Contraseña de Friendica"
+
+#: ../../extend/addon/addon/rtof/rtof.php:101
+msgid "Hubzilla to Friendica Post Settings"
+msgstr "Ajustes de publicación de Hubzilla a Friendica"
+
+#: ../../extend/addon/addon/sendzid/sendzid.php:25
+msgid "Extended Identity Sharing"
+msgstr "Compartir identidad extendida"
+
+#: ../../extend/addon/addon/sendzid/sendzid.php:26
+msgid ""
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Compartir su identidad con todos los sitios web en Internet. Cuando se inhabilita, la identidad sólo se comparte con los sitios de la matriz."
+
+#: ../../extend/addon/addon/skeleton/skeleton.php:59
+msgid "Some setting"
+msgstr "Algunos ajustes"
+
+#: ../../extend/addon/addon/skeleton/skeleton.php:61
+msgid "A setting"
+msgstr "Un ajuste"
+
+#: ../../extend/addon/addon/skeleton/skeleton.php:64
+msgid "Skeleton Settings"
+msgstr "Ajustes de Skeleton"
+
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+msgid "Deactivate the feature"
+msgstr "Desactivar la funcionalidad"
+
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+msgid "Hide the button and show the smilies directly."
+msgstr "Ocultar el botón y mostrar los smilies directamente."
+
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
+msgid "Smileybutton Settings"
+msgstr "Ajustes de Smileybutton"
+
+#: ../../extend/addon/addon/startpage/startpage.php:109
+msgid "Page to load after login"
+msgstr "Página para cargar tras el inicio de sesión"
+
+#: ../../extend/addon/addon/startpage/startpage.php:109
+msgid ""
+"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
+"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
+"blank for default network page (grid)."
+msgstr "Ejemplos: &quot;aplicaciones&quot;, &quot;mi red?f=&gid=37&quot; (grupo de canales), &quot;mi canal&quot; or &quot;notificaciones del sistema&quot; (dejar en blanco para la página de mi red por defecto (grid)."
+
+#: ../../extend/addon/addon/startpage/startpage.php:113
+msgid "Startpage Settings"
+msgstr "Ajustes de startpage"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:143
+msgid "Post to GNU social"
+msgstr "Publicar en GNU social"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:195
+msgid ""
+"Please contact your site administrator.<br />The provided API URL is not "
+"valid."
+msgstr "Por favor, contacte con el administrador de su sitio.<br />La URL de la API proporcionada no es válida."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:232
+msgid "We could not contact the GNU social API with the Path you entered."
+msgstr "No podemos conectar con la API de GNU social con la ruta que ha proporcionado."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:266
+msgid "GNU social settings updated."
+msgstr "Se han guardado los ajustes de GNU social."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:310
+msgid "Globally Available GNU social OAuthKeys"
+msgstr "OAuthKeys globales de GNU social disponibles"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:312
+msgid ""
+"There are preconfigured OAuth key pairs for some GNU social servers "
+"available. If you are using one of them, please use these credentials.<br "
+"/>If not feel free to connect to any other GNU social instance (see below)."
+msgstr "Existen pares de claves OAuth preconfiguradas disponibles para algunos servidores libres de GNU social. Si está usando uno de ellos, utilice estas credenciales.<br />Si no se siente libre de conectarse a cualquier otra instancia de GNU social (vea a continuación)."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:327
+msgid "Provide your own OAuth Credentials"
+msgstr "Proporcione sus propias credenciales de OAuth"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:329
+msgid ""
+"No consumer key pair for GNU social found. Register your Hubzilla Account as"
+" an desktop client on your GNU social 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 "
+"Hubzilla installation at your favourite GNU social installation."
+msgstr "No se ha encontrado un par de claves de consumidor para GNU social. Registre su cuenta de Hubzilla como un cliente de escritorio en su cuenta social GNU, copie el par de claves de consumidor aquí y escriba la dirección raíz de la API.<br />Antes de registrar su propio par de claves OAuth, pregunte al administrador si ya hay un par de claves para esta instalación de Hubzilla en su instalación GNU social favorita."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:333
+msgid "OAuth Consumer Key"
+msgstr "OAuth Consumer Key"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:337
+msgid "OAuth Consumer Secret"
+msgstr "OAuth Consumer Secret"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:341
+msgid "Base API Path"
+msgstr "Ruta base de la API"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:341
+msgid "Remember the trailing /"
+msgstr "Recuerde la barra /"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:345
+msgid "GNU social application name"
+msgstr "Nombre de la aplicación de GNU social"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:368
+msgid ""
+"To connect to your GNU social account click the button below to get a "
+"security code from GNU social which you have to copy into the input box "
+"below and submit the form. Only your <strong>public</strong> posts will be "
+"posted to GNU social."
+msgstr "Para conectarse a su cuenta de GNU social, haga clic en el botón de abajo para obtener un código de seguridad de GNU social que tiene que copiar en el cuadro de entrada a continuación y envíe el formulario. Solo sus <strong>entradas</strong> públicas aparecerán en GNU social."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:370
+msgid "Log in with GNU social"
+msgstr "Inicio de sesión en GNU social"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:373
+msgid "Copy the security code from GNU social here"
+msgstr "Copiar aquí el código de seguridad de GNU social"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:383
+msgid "Cancel Connection Process"
+msgstr "Cancelar el proceso de conexión"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:385
+msgid "Current GNU social API is"
+msgstr "La API actual de GNU social es "
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+msgid "Cancel GNU social Connection"
+msgstr "Cancelar la conexión de GNU social"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:401
+#: ../../extend/addon/addon/twitter/twitter.php:232
+msgid "Currently connected to: "
+msgstr "Actualmente está conectado a: "
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:406
+msgid ""
+"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to GNU social will lead the visitor to a blank page "
+"informing the visitor that the access to your profile has been restricted."
+msgstr "<strong>Aviso</strong>: Debido a su configuración de privacidad (<em>Ocultar los detalles de su perfil a los visitantes desconocidos?</em>) el vínculo potencialmente incluido en las entradas públicas retransmitidas a GNU social llevará al visitante a una página en blanco que le informará de que el acceso a su perfil ha sido restringido."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+msgid "Allow posting to GNU social"
+msgstr "Habilitar la publicación en GNU social"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+msgid ""
+"If enabled your public postings can be posted to the associated GNU-social "
+"account"
+msgstr "Si está habilitado, sus entradas públicas se pueden publicar en la cuenta GNU-social asociada"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+msgid "Post to GNU social by default"
+msgstr "Publicar en GNU social por defecto"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+msgid ""
+"If enabled your public postings will be posted to the associated GNU-social "
+"account by default"
+msgstr "Si está activado, sus entradas públicas se publicarán en la cuenta GNU-social asociada de forma predeterminada"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:255
+msgid "Clear OAuth configuration"
+msgstr "Limpiar la configuración de OAuth"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:432
+msgid "GNU social Post Settings"
+msgstr "Ajustes de publicación en GNU social"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:891
+msgid "API URL"
+msgstr "URL de la API"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:894
+msgid "Application name"
+msgstr "Nombre de la aplicación"
+
+#: ../../extend/addon/addon/superblock/superblock.php:110
+msgid "Currently blocked"
+msgstr "Actualmente bloqueado"
+
+#: ../../extend/addon/addon/superblock/superblock.php:112
+msgid "No channels currently blocked"
+msgstr "No hay canales bloqueados actualmente"
+
+#: ../../extend/addon/addon/superblock/superblock.php:118
+msgid "\"Superblock\" Settings"
+msgstr "Ajustes de \"Superblock\""
+
+#: ../../extend/addon/addon/superblock/superblock.php:316
+msgid "Block Completely"
+msgstr "Bloquear completamente"
+
+#: ../../extend/addon/addon/superblock/superblock.php:361
+msgid "superblock settings updated"
+msgstr "se han actualizado los ajustes de superblock"
+
+#: ../../extend/addon/addon/testdrive/testdrive.php:104
+#, php-format
+msgid "Your account on %s will expire in a few days."
+msgstr "Su cuenta en %s caducará en unos pocos días."
+
+#: ../../extend/addon/addon/testdrive/testdrive.php:105
+msgid "Your $Productname test account is about to expire."
+msgstr "Su cuenta de prueba de $Productname está a punto de caducar."
+
+#: ../../extend/addon/addon/tictac/tictac.php:21
+msgid "Three Dimensional Tic-Tac-Toe"
+msgstr "Juego en 3D Tic-Tac-Toe"
+
+#: ../../extend/addon/addon/tictac/tictac.php:54
+msgid "3D Tic-Tac-Toe"
+msgstr "3D Tic-Tac-Toe"
+
+#: ../../extend/addon/addon/tictac/tictac.php:59
+msgid "New game"
+msgstr "Nuevo juego"
+
+#: ../../extend/addon/addon/tictac/tictac.php:60
+msgid "New game with handicap"
+msgstr "Nuevo juego con hándicap"
+
+#: ../../extend/addon/addon/tictac/tictac.php:61
+msgid ""
+"Three dimensional tic-tac-toe is just like the traditional game except that "
+"it is played on multiple levels simultaneously. "
+msgstr "El juego en 3D tic-tac-toe es como el juego tradicional, excepto que se juega en varios niveles simultáneamente."
+
+#: ../../extend/addon/addon/tictac/tictac.php:62
+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 "En este caso hay tres niveles. Usted gana al conseguir tres en una fila en cualquier nivel, así como arriba, abajo, y en diagonal a través de los diferentes niveles."
+
+#: ../../extend/addon/addon/tictac/tictac.php:64
+msgid ""
+"The handicap game disables the center position on the middle level because "
+"the player claiming this square often has an unfair advantage."
+msgstr "El juego con hándicap deshabilita la posición central en el nivel medio porque el jugador que reclama este cuadrado a menudo tiene una ventaja injusta."
+
+#: ../../extend/addon/addon/tictac/tictac.php:183
+msgid "You go first..."
+msgstr "Usted va primero..."
+
+#: ../../extend/addon/addon/tictac/tictac.php:188
+msgid "I'm going first this time..."
+msgstr "Yo voy primero esta vez..."
+
+#: ../../extend/addon/addon/tictac/tictac.php:194
+msgid "You won!"
+msgstr "¡Usted ha ganado!"
+
+#: ../../extend/addon/addon/tictac/tictac.php:200
+#: ../../extend/addon/addon/tictac/tictac.php:225
+msgid "\"Cat\" game!"
+msgstr "¡El juego del \"gato\"!"
+
+#: ../../extend/addon/addon/tictac/tictac.php:223
+msgid "I won!"
+msgstr "¡He ganado yo!"
+
+#: ../../extend/addon/addon/tour/tour.php:75
+msgid "Edit your profile and change settings."
+msgstr "Editar su perfil y cambiar los ajustes."
+
+#: ../../extend/addon/addon/tour/tour.php:76
+msgid "Click here to see activity from your connections."
+msgstr "Pulsar aquí para ver la actividad de sus conexiones."
+
+#: ../../extend/addon/addon/tour/tour.php:77
+msgid "Click here to see your channel home."
+msgstr "Pulsar aquí para ver la página de inicio de su canal."
+
+#: ../../extend/addon/addon/tour/tour.php:78
+msgid "You can access your private messages from here."
+msgstr "Puede acceder a sus mensajes privados desde aquí."
+
+#: ../../extend/addon/addon/tour/tour.php:79
+msgid "Create new events here."
+msgstr "Crear nuevos eventos aquí."
+
+#: ../../extend/addon/addon/tour/tour.php:80
+msgid ""
+"You can accept new connections and change permissions for existing ones "
+"here. You can also e.g. create groups of contacts."
+msgstr "Puede aceptar nuevas conexiones y cambiar permisos para las existentes aquí. También puede, por ejemplo, crear grupos de contactos."
+
+#: ../../extend/addon/addon/tour/tour.php:81
+msgid "System notifications will arrive here"
+msgstr "Las notificaciones del sistema llegarán aquí"
+
+#: ../../extend/addon/addon/tour/tour.php:82
+msgid "Search for content and users"
+msgstr "Buscar contenido y usuarios"
+
+#: ../../extend/addon/addon/tour/tour.php:83
+msgid "Browse for new contacts"
+msgstr "Buscar nuevos contactos"
+
+#: ../../extend/addon/addon/tour/tour.php:84
+msgid "Launch installed apps"
+msgstr "Iniciar aplicaciones instaladas"
+
+#: ../../extend/addon/addon/tour/tour.php:85
+msgid "Looking for help? Click here."
+msgstr "¿Busca ayuda? Pulse aquí."
+
+#: ../../extend/addon/addon/tour/tour.php:86
+msgid ""
+"New events have occurred in your network. Click here to see what has "
+"happened!"
+msgstr "Se han producido nuevos eventos en su red. ¡Haga clic aquí para ver lo que ha sucedido!"
+
+#: ../../extend/addon/addon/tour/tour.php:87
+msgid "You have received a new private message. Click here to see from who!"
+msgstr "Ha recibido un nuevo mensaje privado. Haga clic aquí para ver de quién!"
+
+#: ../../extend/addon/addon/tour/tour.php:88
+msgid "There are events this week. Click here too see which!"
+msgstr "Hay eventos esta semana. Haga clic aquí para ver cuáles!"
+
+#: ../../extend/addon/addon/tour/tour.php:89
+msgid "You have received a new introduction. Click here to see who!"
+msgstr "Ha recibido una nueva solicitud de conexión. ¡Pulse aquí para ver de quién!"
+
+#: ../../extend/addon/addon/tour/tour.php:90
+msgid ""
+"There is a new system notification. Click here to see what has happened!"
+msgstr "Hay una nueva notificación del sistema. ¡Haga clic aquí para ver lo que ha sucedido!"
+
+#: ../../extend/addon/addon/tour/tour.php:93
+msgid "Click here to share text, images, videos and sound."
+msgstr "Haga clic aquí para compartir texto, imágenes, vídeos y sonido."
+
+#: ../../extend/addon/addon/tour/tour.php:94
+msgid "You can write an optional title for your update (good for long posts)."
+msgstr "Puede escribir un título opcional para su actualización (bueno para los mensajes largos)."
+
+#: ../../extend/addon/addon/tour/tour.php:95
+msgid "Entering some categories here makes it easier to find your post later."
+msgstr "Al ingresar algunos temas aquí, es más fácil encontrar su publicación más tarde."
+
+#: ../../extend/addon/addon/tour/tour.php:96
+msgid "Share photos, links, location, etc."
+msgstr "Compartir fotos, enlaces, ubicación, etc."
+
+#: ../../extend/addon/addon/tour/tour.php:97
+msgid ""
+"Only want to share content for a while? Make it expire at a certain date."
+msgstr "¿Solo quieres compartir contenido durante un tiempo? Haga que expire en una fecha determinada."
+
+#: ../../extend/addon/addon/tour/tour.php:98
+msgid "You can password protect content."
+msgstr "Puede proteger contenido con una contraseña."
+
+#: ../../extend/addon/addon/tour/tour.php:99
+msgid "Choose who you share with."
+msgstr "Elegir con quién compartir."
+
+#: ../../extend/addon/addon/tour/tour.php:101
+msgid "Click here when you are done."
+msgstr "Haga clic aquí cuando haya terminado."
+
+#: ../../extend/addon/addon/tour/tour.php:104
+msgid "Adjust from which channels posts should be displayed."
+msgstr "Ajustar de qué canales se deben mostrar las publicaciones."
+
+#: ../../extend/addon/addon/tour/tour.php:105
+msgid "Only show posts from channels in the specified privacy group."
+msgstr "Mostrar solo las entradas de los canales de un grupo específico de canales."
+
+#: ../../extend/addon/addon/tour/tour.php:109
+msgid "Easily find posts containing tags (keywords preceded by the \"#\" symbol)."
+msgstr "Encuentre fácilmente entradas que contengan etiquetas (palabras clave precedidas del símbolo \"#\")."
+
+#: ../../extend/addon/addon/tour/tour.php:110
+msgid "Easily find posts in given category."
+msgstr "Encuentre fácilmente las publicaciones en una categoría dada."
+
+#: ../../extend/addon/addon/tour/tour.php:111
+msgid "Easily find posts by date."
+msgstr "Encuentre fácilmente entradas por fechas."
+
+#: ../../extend/addon/addon/tour/tour.php:112
+msgid ""
+"Suggested users who have volounteered to be shown as suggestions, and who we"
+" think you might find interesting."
+msgstr "Se sugiere a los usuarios que se han ofrecido voluntariamente que se muestren como sugerencias, y que creemos que podrían resultar interesantes."
+
+#: ../../extend/addon/addon/tour/tour.php:113
+msgid "Here you see channels you have connected to."
+msgstr "Aquí puede ver los canales a los que está conectado."
+
+#: ../../extend/addon/addon/tour/tour.php:114
+msgid "Save your search so you can repeat it at a later date."
+msgstr "Guarde su búsqueda para poder repetirla en una fecha posterior."
+
+#: ../../extend/addon/addon/tour/tour.php:117
+msgid ""
+"If you see this icon you can be sure that the sender is who it say it is. It"
+" is normal that it is not always possible to verify the sender, so the icon "
+"will be missing sometimes. There is usually no need to worry about that."
+msgstr "Si ve este icono puede estar seguro de que el remitente es quien dice ser. Es normal que no siempre sea posible verificar el remitente, por lo que el icono faltará en ocasiones. Por lo general, no hay necesidad de preocuparse por eso."
+
+#: ../../extend/addon/addon/tour/tour.php:118
+msgid ""
+"Danger! It seems someone tried to forge a message! This message is not "
+"necessarily from who it says it is from!"
+msgstr "¡Peligro! ¡Parece que alguien intentó falsificar un mensaje! ¡Este mensaje no es necesariamente de quien dice que es!"
+
+#: ../../extend/addon/addon/tour/tour.php:125
+msgid ""
+"Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can "
+"pause it at any time and continue where you left off by reloading the page, "
+"or navigting to another page.</p><p>You can also advance by pressing the "
+"return key"
+msgstr "¡Bienvenido/a a Hubzilla! ¿Quiere hacer un recorrido por la interfaz de usuario?</p> <p> Puede detenerlo en cualquier momento y continuar donde lo dejó recargando la página o navegando a otra.</p> <p> También puede avanzar pulsando la tecla de retorno"
+
+#: ../../extend/addon/addon/twitter/twitter.php:99
+msgid "Post to Twitter"
+msgstr "Publicar en Twitter"
+
+#: ../../extend/addon/addon/twitter/twitter.php:154
+msgid "Twitter settings updated."
+msgstr "Se han actualizado los ajustes de Twitter."
+
+#: ../../extend/addon/addon/twitter/twitter.php:183
+msgid ""
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
+msgstr "No se encontró ningún par de \"consumer key\" para Twitter. Póngase en contacto con el administrador del sitio."
+
+#: ../../extend/addon/addon/twitter/twitter.php:205
+msgid ""
+"At this Hubzilla 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 "En esta instancia de Hubzilla, el complemento de Twitter estaba habilitado pero aún no ha conectado su cuenta a la cuenta de Twitter. Para ello, haga clic en el botón de abajo, para obtener un PIN de Twitter que debe copiar en el cuadro de entrada a continuación y enviar el formulario. Solo sus entradas <strong>públicas</ strong> se publicarán en Twitter."
+
+#: ../../extend/addon/addon/twitter/twitter.php:207
+msgid "Log in with Twitter"
+msgstr "Iniciar sesión en Twitter"
+
+#: ../../extend/addon/addon/twitter/twitter.php:210
+msgid "Copy the PIN from Twitter here"
+msgstr "Copiar aquí el PIN de Twitter"
+
+#: ../../extend/addon/addon/twitter/twitter.php:237
+msgid ""
+"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to Twitter will lead the visitor to a blank page informing "
+"the visitor that the access to your profile has been restricted."
+msgstr "<strong>Aviso:</strong> Debido a su configuración de privacidad (<em>Ocultar los detalles de su perfil a los visitantes desconocidos?</em>), el enlace potencialmente incluido en las entradas públicas retransmitidas a Twitter llevará al visitante a una página en blanco informándolo de que el acceso a su perfil ha sido restringido."
+
+#: ../../extend/addon/addon/twitter/twitter.php:242
+msgid "Allow posting to Twitter"
+msgstr "Permitir la publicación en Twitter"
+
+#: ../../extend/addon/addon/twitter/twitter.php:242
+msgid ""
+"If enabled your public postings can be posted to the associated Twitter "
+"account"
+msgstr "Si está activado, sus entradas públicas se pueden publicar en la cuenta de Twitter asociada"
+
+#: ../../extend/addon/addon/twitter/twitter.php:246
+msgid "Send public postings to Twitter by default"
+msgstr "Enviar mensajes públicos a Twitter de forma predeterminada"
+
+#: ../../extend/addon/addon/twitter/twitter.php:246
+msgid ""
+"If enabled your public postings will be posted to the associated Twitter "
+"account by default"
+msgstr "Si está activado, sus entradas públicas se publicarán en la cuenta de Twitter asociada de forma predeterminada."
+
+#: ../../extend/addon/addon/twitter/twitter.php:264
+msgid "Twitter Post Settings"
+msgstr "Ajustes de publicación en Twitter"
+
+#: ../../extend/addon/addon/twitter/twitter.php:773
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:95
+msgid "Submit Settings"
+msgstr "Enviar los ajustes"
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:25
+msgid "Show Upload Limits"
+msgstr "Mostrar los límites de subida"
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:27
+msgid "Hubzilla configured maximum size: "
+msgstr "Tamaño máximo configurado por Hubzilla: "
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:28
+msgid "PHP upload_max_filesize: "
+msgstr "PHP upload_max_filesize: "
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:29
+msgid "PHP post_max_size (must be larger than upload_max_filesize): "
+msgstr "PHP post_max_size (debe ser mayor que upload_max_filesize): "
+
+#: ../../extend/addon/addon/visage/visage.php:93
+msgid "Recent Channel/Profile Viewers"
+msgstr "Visitantes recientes del canal o perfil"
+
+#: ../../extend/addon/addon/visage/visage.php:98
+msgid "This plugin/addon has not been configured."
+msgstr "El plugin o complemento no se ha configurado."
+
+#: ../../extend/addon/addon/visage/visage.php:99
+#, php-format
+msgid "Please visit the Visage settings on %s"
+msgstr "Por favor, revise los ajustes de Visage en %s"
+
+#: ../../extend/addon/addon/visage/visage.php:99
+msgid "your feature settings page"
+msgstr "su página de ajustes de las funcionalidades"
+
+#: ../../extend/addon/addon/visage/visage.php:112
+msgid "No entries."
+msgstr "No hay entradas."
+
+#: ../../extend/addon/addon/visage/visage.php:166
+msgid "Enable Visage Visitor Logging"
+msgstr "Habilitar el registro de visitantes de Visage"
+
+#: ../../extend/addon/addon/visage/visage.php:170
+msgid "Visage Settings"
+msgstr "Ajustes de Visage"
+
+#: ../../extend/addon/addon/wholikesme/wholikesme.php:29
+msgid "Who likes me?"
+msgstr "¿A quién le gusto?"
+
+#: ../../extend/addon/addon/wppost/wppost.php:45
+msgid "Post to WordPress"
+msgstr "Publicar en WordPress"
+
+#: ../../extend/addon/addon/wppost/wppost.php:82
+msgid "Enable WordPress Post Plugin"
+msgstr "Habilitar el plugin de publicación en WordPress"
+
+#: ../../extend/addon/addon/wppost/wppost.php:86
+msgid "WordPress username"
+msgstr "Nombre de usuario de WordPress"
+
+#: ../../extend/addon/addon/wppost/wppost.php:90
+msgid "WordPress password"
+msgstr "Contraseña de WordPress"
+
+#: ../../extend/addon/addon/wppost/wppost.php:94
+msgid "WordPress API URL"
+msgstr "URL de la API de WordPress"
+
+#: ../../extend/addon/addon/wppost/wppost.php:95
+msgid "Typically https://your-blog.tld/xmlrpc.php"
+msgstr "Habitualmente https://your-blog.tld/xmlrpc.php"
+
+#: ../../extend/addon/addon/wppost/wppost.php:98
+msgid "WordPress blogid"
+msgstr "Blog de WordPress"
+
+#: ../../extend/addon/addon/wppost/wppost.php:99
+msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
+msgstr "Para sitios multiusuario como wordpress.com, de lo contrario, dejar en blanco"
+
+#: ../../extend/addon/addon/wppost/wppost.php:105
+msgid "Post to WordPress by default"
+msgstr "Publicar en WordPress por defecto"
+
+#: ../../extend/addon/addon/wppost/wppost.php:109
+msgid "Forward comments (requires hubzilla_wp plugin)"
+msgstr "Reenviar comentarios (requerido por el plugin hubzilla_wp)"
+
+#: ../../extend/addon/addon/wppost/wppost.php:113
+msgid "WordPress Post Settings"
+msgstr "Ajustes de publicación en WordPress"
+
+#: ../../extend/addon/addon/wppost/wppost.php:129
+msgid "Wordpress Settings saved."
+msgstr "Se han guardado los ajustes de WordPress."
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:31
+msgid "XMPP settings updated."
+msgstr "Se han actualizado los ajustes de XMPP."
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+msgid "Enable Chat"
+msgstr "Habilitar el chat"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:58
+msgid "Individual credentials"
+msgstr "Credenciales individuales"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:64
+msgid "Jabber BOSH server"
+msgstr "Servidor BOSH de Jabber"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:69
+msgid "XMPP Settings"
+msgstr "Ajustes de XMPP"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:92
+msgid "Jabber BOSH host"
+msgstr "BOSH de Jabber"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:93
+msgid "Use central userbase"
+msgstr "Usar la base de usuarios central"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:93
+msgid ""
+"If enabled, members will automatically login to an ejabberd server that has "
+"to be installed on this machine with synchronized credentials via the "
+"\"auth_ejabberd.php\" script."
+msgstr "Si está habilitado, los miembros se conectarán automáticamente a un servidor ejabberd que debe instalarse en esta máquina con credenciales sincronizadas a través del script \"auth ejabberd.php\"."
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:37
+msgid "Select Channel"
+msgstr "Seleccionar un canal"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:42
+msgid "Read-write"
+msgstr "Lectura y escritura"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:43
+msgid "Read-only"
+msgstr "Sólo lectura"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:116
+msgid "My Calendars"
+msgstr "Mis calendarios"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:118
+msgid "Shared Calendars"
+msgstr "Calendarios compartidos"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:122
+msgid "Share this calendar"
+msgstr "Compartir este calendario"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:124
+msgid "Calendar name and color"
+msgstr "Nombre y color del calendario"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:126
+msgid "Create new calendar"
+msgstr "Crear un nuevo calendario"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:128
+msgid "Calendar Name"
+msgstr "Nombre del calendario"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:129
+msgid "Calendar Tools"
+msgstr "Gestión de calendarios"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:130
+msgid "Import calendar"
+msgstr "Importar un calendario"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:131
+msgid "Select a calendar to import to"
+msgstr "Seleccionar un calendario para importarlo"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:158
+msgid "Addressbooks"
+msgstr "Agenda de direcciones"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:160
+msgid "Addressbook name"
+msgstr "Nombre de la agenda"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:162
+msgid "Create new addressbook"
+msgstr "Crear una nueva agenda de direcciones"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:163
+msgid "Addressbook Name"
+msgstr "Nombre de la agenda"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:165
+msgid "Addressbook Tools"
+msgstr "Gestión de agendas de direcciones"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:166
+msgid "Import addressbook"
+msgstr "Importar una agenda de direcciones"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:167
+msgid "Select an addressbook to import to"
+msgstr "Seleccionar una agenda para importarla"
+
+#: ../../extend/addon/addon/cdav/cdav.php:36
+msgid "Errors encountered creating database table: "
+msgstr "Errores encontrados al crear la tabla de la base de datos: "
+
+#: ../../extend/addon/addon/cdav/cdav.php:197
+msgid "Default Calendar"
+msgstr "Calendario por defecto"
+
+#: ../../extend/addon/addon/cdav/cdav.php:206
+msgid "Default Addressbook"
+msgstr "Agenda de direcciones por defecto"
+
+#: ../../extend/addon/addon/cdav/cdav.php:215
+msgid "CalDAV/CardDAV Settings saved."
+msgstr "Se ha guardado la configuración de CalDAV/CardDAV."
+
+#: ../../extend/addon/addon/cdav/cdav.php:234
+msgid "Enable CalDAV/CardDAV Server for this channel"
+msgstr "Habilitar el servidor CalDAV/CardDAV para este canal"
+
+#: ../../extend/addon/addon/cdav/cdav.php:237
+#, php-format
+msgid "Your CalDAV resources are located at %s "
+msgstr "Los recursos de CalDAV se encuentran en %s"
+
+#: ../../extend/addon/addon/cdav/cdav.php:240
+#, php-format
+msgid "Your CardDAV resources are located at %s "
+msgstr "Sus recursos de CalDAV están localizados en %s "
+
+#: ../../extend/addon/addon/cdav/cdav.php:246
+msgid "CalDAV/CardDAV Settings"
+msgstr "Configuración de CalDAV/CardDAV"
+
+#: ../../extend/addon/addon/cdav/cdav.php:270
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145
+msgid "Mobile"
+msgstr "Móvil"
+
+#: ../../extend/addon/addon/cdav/cdav.php:271
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146 ../../include/nav.php:88
+msgid "Home"
+msgstr "Inicio"
+
+#: ../../extend/addon/addon/cdav/cdav.php:272
+msgid "Home, Voice"
+msgstr "Llamadas particulares"
+
+#: ../../extend/addon/addon/cdav/cdav.php:273
+msgid "Home, Fax"
+msgstr "Fax particular"
+
+#: ../../extend/addon/addon/cdav/cdav.php:274
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147
+msgid "Work"
+msgstr "Trabajo"
+
+#: ../../extend/addon/addon/cdav/cdav.php:275
+msgid "Work, Voice"
+msgstr "Llamadas de trabajo"
+
+#: ../../extend/addon/addon/cdav/cdav.php:276
+msgid "Work, Fax"
+msgstr "Fax de trabajo"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:744
+msgid "INVALID EVENT DISMISSED!"
+msgstr "¡EVENTO NO VÁLIDO RECHAZADO!"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
+msgid "Summary: "
+msgstr "Resumen: "
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
+msgid "Date: "
+msgstr "Fecha: "
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:747
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:754
+msgid "Reason: "
+msgstr "Razón: "
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:752
+msgid "INVALID CARD DISMISSED!"
+msgstr "¡TARJETA NO VÁLIDA RECHAZADA!"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
+msgid "Name: "
+msgstr "Nombre: "
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:770
+msgid ""
+"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
+"Settings before you can use it."
+msgstr "Debe habilitar este complemento en Ajustes/Complementos>Configuración de CalDAV/CardDAV antes de poder utilizarlo."
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
+msgid "Example: YYYY-MM-DD HH:mm"
+msgstr "Ejemplo: YYYY-MM-DD HH:mm"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
+msgid "End date and time"
+msgstr "Fecha y hora de finalización"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:852
+msgid "List month"
+msgstr "Lista mensual"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:853
+msgid "List week"
+msgstr "Lista semanal"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:854
+msgid "List day"
+msgstr "Lista diaria"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:861
+msgid "More"
+msgstr "Más"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:862
+msgid "Less"
+msgstr "Menos"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:863
+msgid "Select calendar"
+msgstr "Seleccionar un calendario"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:865
+msgid "Delete all"
+msgstr "Eliminar todos"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:867
+msgid "Sorry! Editing of recurrent events is not yet implemented."
+msgstr "¡Disculpas! La edición de eventos recurrentes aún no se ha implementado."
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137
+msgid "Organisation"
+msgstr "Organización"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138
+#: ../../include/page_widgets.php:46
+msgid "Title"
+msgstr "Título"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139
+msgid "Phone"
+msgstr "Teléfono"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141
+msgid "Instant messenger"
+msgstr "Mensajería instantánea"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142
+msgid "Website"
+msgstr "Sitio web"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144
+msgid "Note"
+msgstr "Nota"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150
+msgid "Add Field"
+msgstr "Añadir un campo"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155
+msgid "P.O. Box"
+msgstr "Buzón de correos"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156
+msgid "Additional"
+msgstr "Adicional"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157
+msgid "Street"
+msgstr "Calle"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158
+msgid "Locality"
+msgstr "Localidad"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159
+msgid "Region"
+msgstr "Provincia, región o estado"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160
+msgid "ZIP Code"
+msgstr "Código postal"
+
+#: ../../extend/addon/addon/chess/chess.php:276
+#: ../../extend/addon/addon/chess/chess.php:430
+msgid "Invalid game."
+msgstr "Juego no válido."
+
+#: ../../extend/addon/addon/chess/chess.php:282
+#: ../../extend/addon/addon/chess/chess.php:436
+msgid "You are not a player in this game."
+msgstr "Usted no participa en este juego."
+
+#: ../../extend/addon/addon/chess/chess.php:315
+msgid "You must be a local channel to create a game."
+msgstr "Debe ser un canal local para crear un juego"
+
+#: ../../extend/addon/addon/chess/chess.php:333
+msgid "You must select one opponent that is not yourself."
+msgstr "Debe seleccionar un oponente que no sea usted mismo."
+
+#: ../../extend/addon/addon/chess/chess.php:336
+msgid "Creating new game..."
+msgstr "Crear un nuevo juego..."
+
+#: ../../extend/addon/addon/chess/chess.php:342
+msgid "You must select white or black."
+msgstr "Debe elegir blancas o negras."
+
+#: ../../extend/addon/addon/chess/chess.php:349
+msgid "Error creating new game."
+msgstr "Error al crear un nuevo juego."
+
+#: ../../extend/addon/addon/chess/chess.php:379 ../../include/channel.php:816
+msgid "Requested channel is not available."
+msgstr "El canal solicitado no está disponible."
+
+#: ../../extend/addon/addon/chess/chess.php:392
+msgid "You must select a local channel /chess/channelname"
+msgstr "Debe seleccionar un canal local /chess/nombredelcanal"
+
+#: ../../extend/addon/addon/chess/chess.php:920
+msgid "Enable notifications"
+msgstr "Habilitar notificaciones"
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:51
+msgid "Your Webbie:"
+msgstr "Su webbie: "
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:54
+msgid "Fontsize (px):"
+msgstr "Tamaño de fuente (px): "
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:68
+msgid "Link:"
+msgstr "Enlace: "
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:70
+msgid "Like us on Hubzilla"
+msgstr "Múestrenos su agrado en Hubzilla"
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:72
+msgid "Embed:"
+msgstr "Incorporado: "
+
+#: ../../extend/addon/addon/openid/Mod_Id.php:85
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+msgid "Male"
+msgstr "Hombre"
+
+#: ../../extend/addon/addon/openid/Mod_Id.php:87
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+msgid "Female"
+msgstr "Mujer"
+
+#: ../../extend/addon/addon/openid/Mod_Openid.php:30
+msgid "OpenID protocol error. No ID returned."
+msgstr "Error de protocolo OpenID. No se recuperó ninguna ID."
+
+#: ../../extend/addon/addon/openid/Mod_Openid.php:193
+#: ../../include/auth.php:286
+msgid "Login failed."
+msgstr "El acceso ha fallado."
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:52
+msgid "First Name"
+msgstr "Nombre"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:53
+msgid "Last Name"
+msgstr "Apellido"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:55
+msgid "Full Name"
+msgstr "Nombre completo"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:61
+msgid "Profile Photo 16px"
+msgstr "Foto del perfil 16px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:62
+msgid "Profile Photo 32px"
+msgstr "Foto del perfil 32px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:63
+msgid "Profile Photo 48px"
+msgstr "Foto del perfil 48px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:64
+msgid "Profile Photo 64px"
+msgstr "Foto del perfil 64px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:65
+msgid "Profile Photo 80px"
+msgstr "Foto del perfil 80px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:66
+msgid "Profile Photo 128px"
+msgstr "Foto del perfil 128px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:67
+msgid "Timezone"
+msgstr "Zona horaria"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:70
+msgid "Birth Year"
+msgstr "Año de nacimiento"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:71
+msgid "Birth Month"
+msgstr "Mes de nacimiento"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:72
+msgid "Birth Day"
+msgstr "Día de nacimiento"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:73
+msgid "Birthdate"
+msgstr "Fecha de nacimiento"
+
+#: ../../extend/addon/addon/openid/openid.php:49
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "Encontramos un problema al iniciar sesión con el OpenID que proporcionó. Compruebe si el ID está correctamente escrito."
+
+#: ../../extend/addon/addon/openid/openid.php:49
+msgid "The error message was:"
+msgstr "El mensaje de error ha sido: "
+
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:44
+#, php-format
+msgid "Reconnecting %d connections"
+msgstr "Reconectando %d conexiones"
+
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:63
+msgid "Diaspora Reconnect"
+msgstr "Reconectar con Diaspora"
+
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:65
+msgid ""
+"Use this form to re-establish Diaspora connections which were initially made"
+" from a different hub."
+msgstr "Utilice este formulario para restablecer las conexiones de diáspora que se hicieron inicialmente desde un hub diferente."
+
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:70
+msgid "Reconnect"
+msgstr "Reconectar"
+
+#: ../../extend/addon/addon/mailtest/mailtest.php:19
+msgid "Send test email"
+msgstr "Enviar un correo electrónico de prueba"
+
+#: ../../extend/addon/addon/mailtest/mailtest.php:66
+msgid "Mail sent."
+msgstr "El correo electrónico ha sido enviado."
+
+#: ../../extend/addon/addon/mailtest/mailtest.php:68
+msgid "Sending of mail failed."
+msgstr "No se pudo enviar el correo."
+
+#: ../../extend/addon/addon/mailtest/mailtest.php:77
+msgid "Mail Test"
+msgstr "Prueba de correo"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:57
+msgid "Errors encountered deleting database table "
+msgstr "Errores encontrados al eliminar la tabla de la base de datos"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
+msgid "Drop tables when uninstalling?"
+msgstr "¿Eliminar tablas al desinstalar?"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
+msgid ""
+"If checked, the Rendezvous database tables will be deleted when the plugin "
+"is uninstalled."
+msgstr "Si se selecciona, las tablas de la base de datos Rendezvous se eliminarán cuando se desinstale el plugin."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
+msgid "Mapbox Access Token"
+msgstr "Token de acceso de Mapbox"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
+msgid ""
+"If you enter a Mapbox access token, it will be used to retrieve map tiles "
+"from Mapbox instead of the default OpenStreetMap tile server."
+msgstr "Si introduce un token de acceso a Mapbox, se utilizará para recuperar los mapas de mosaicos de imágenes de Mapbox en lugar del servidor de mosaico de imágenes OpenStreetMap predeterminado."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:154
+msgid "Rendezvous"
+msgstr "Rendezvous"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:159
+msgid ""
+"This identity has been deleted by another member due to inactivity. Please "
+"press the \"New identity\" button or refresh the page to register a new "
+"identity. You may use the same name."
+msgstr "Esta identidad ha sido eliminada por otro miembro debido a su inactividad. Pulse el botón \"Nueva identidad\" o actualice la página para registrar una nueva identidad. Puede usar el mismo nombre."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:160
+msgid "Welcome to Rendezvous!"
+msgstr "¡Bienvenido/a a Rendevous!"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:161
+msgid ""
+"Enter your name to join this rendezvous. To begin sharing your location with"
+" the other members, tap the GPS control. When your location is discovered, a"
+" red dot will appear and others will be able to see you on the map."
+msgstr "Introduzca tu nombre para unirse a esta cita. Para comenzar a compartir su ubicación con los demás miembros, pulse en el control GPS. Cuando se descubra su ubicación, aparecerá un punto rojo y otros podrán verlo en el mapa."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:163
+msgid "Let's meet here"
+msgstr "Reunámonos aquí"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:166
+msgid "New marker"
+msgstr "Nuevo marcador"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:167
+msgid "Edit marker"
+msgstr "Editar un marcador"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:168
+msgid "New identity"
+msgstr "Nueva identidad"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:169
+msgid "Delete marker"
+msgstr "Eliminar un marcador"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:170
+msgid "Delete member"
+msgstr "Eliminar un miembro"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:171
+msgid "Edit proximity alert"
+msgstr "Editar alerta de proximidad"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:172
+msgid ""
+"A proximity alert will be issued when this member is within a certain radius"
+" of you.<br><br>Enter a radius in meters (0 to disable):"
+msgstr "Se emitirá una alerta de proximidad cuando este miembro esté dentro de un radio determinado respecto a usted.<br><br> Ingrese el radio en metros (0 para deshabilitar):"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:172
+msgid "distance"
+msgstr "distancia"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:183
+msgid "Add new rendezvous"
+msgstr "Añadir una nueva cita"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:184
+msgid ""
+"Create a new rendezvous and share the access link with those you wish to "
+"invite to the group. Those who open the link become members of the "
+"rendezvous. They can view other member locations, add markers to the map, or"
+" share their own locations with the group."
+msgstr "Cree una nueva cita y comparta los enlaces de acceso con los que desea invitar al grupo. Aquellos que abran el enlace se convertirán en miembros de la cita. Pueden ver otras ubicaciones de miembros, añadir marcadores al mapa o compartir sus propias ubicaciones con el grupo."
+
+#: ../../include/Import/import_diaspora.php:16
+msgid "No username found in import file."
+msgstr "No se ha encontrado el nombre de usuario en el fichero importado."
+
+#: ../../include/Import/import_diaspora.php:41 ../../include/import.php:51
+msgid "Unable to create a unique channel address. Import failed."
+msgstr "No se ha podido crear una dirección de canal única. Ha fallado la importación."
+
+#: ../../include/dba/dba_driver.php:187
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "No se ha podido localizar información de DNS para el servidor de base de datos “%s”"
+
+#: ../../include/datetime.php:147
+msgid "Birthday"
+msgstr "Cumpleaños"
+
+#: ../../include/datetime.php:149
+msgid "Age: "
+msgstr "Edad:"
+
+#: ../../include/datetime.php:151
+msgid "YYYY-MM-DD or MM-DD"
+msgstr "AAAA-MM-DD o MM-DD"
+
+#: ../../include/datetime.php:286 ../../boot.php:2564
+msgid "never"
+msgstr "nunca"
+
+#: ../../include/datetime.php:292
+msgid "less than a second ago"
+msgstr "hace un instante"
+
+#: ../../include/datetime.php:310
+#, php-format
+msgctxt "e.g. 22 hours ago, 1 minute ago"
+msgid "%1$d %2$s ago"
+msgstr "hace %1$d %2$s"
+
+#: ../../include/datetime.php:321
+msgctxt "relative_date"
+msgid "year"
+msgid_plural "years"
+msgstr[0] "año"
+msgstr[1] "años"
+
+#: ../../include/datetime.php:324
+msgctxt "relative_date"
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mes"
+msgstr[1] "meses"
+
+#: ../../include/datetime.php:327
+msgctxt "relative_date"
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
+
+#: ../../include/datetime.php:330
+msgctxt "relative_date"
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "días"
+
+#: ../../include/datetime.php:333
+msgctxt "relative_date"
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: ../../include/datetime.php:336
+msgctxt "relative_date"
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: ../../include/datetime.php:339
+msgctxt "relative_date"
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "segundo"
+msgstr[1] "segundos"
+
+#: ../../include/datetime.php:576
+#, php-format
+msgid "%1$s's birthday"
+msgstr "Cumpleaños de %1$s"
+
+#: ../../include/datetime.php:577
+#, php-format
+msgid "Happy Birthday %1$s"
+msgstr "Feliz cumpleaños %1$s"
#: ../../include/account.php:35
msgid "Not a valid email address"
@@ -8222,67 +10570,46 @@ msgstr "Por favor introduzca la información requerida."
msgid "Failed to store account information."
msgstr "La información de la cuenta no se ha podido guardar."
-#: ../../include/account.php:258
+#: ../../include/account.php:263
#, php-format
msgid "Registration confirmation for %s"
msgstr "Confirmación de registro para %s"
-#: ../../include/account.php:324
+#: ../../include/account.php:330
#, php-format
msgid "Registration request at %s"
msgstr "Solicitud de registro en %s"
-#: ../../include/account.php:326 ../../include/account.php:353
-#: ../../include/account.php:413 ../../include/network.php:1937
-msgid "Administrator"
-msgstr "Administrador"
-
-#: ../../include/account.php:348
+#: ../../include/account.php:352
msgid "your registration password"
msgstr "su contraseña de registro"
-#: ../../include/account.php:351 ../../include/account.php:411
+#: ../../include/account.php:358 ../../include/account.php:420
#, php-format
msgid "Registration details for %s"
msgstr "Detalles del registro de %s"
-#: ../../include/account.php:423
+#: ../../include/account.php:431
msgid "Account approved."
msgstr "Cuenta aprobada."
-#: ../../include/account.php:463
+#: ../../include/account.php:471
#, php-format
msgid "Registration revoked for %s"
msgstr "Registro revocado para %s"
-#: ../../include/account.php:748 ../../include/account.php:750
+#: ../../include/account.php:756 ../../include/account.php:758
msgid "Click here to upgrade."
msgstr "Pulse aquí para actualizar"
-#: ../../include/account.php:756
+#: ../../include/account.php:764
msgid "This action exceeds the limits set by your subscription plan."
msgstr "Esta acción supera los límites establecidos por su plan de suscripción "
-#: ../../include/account.php:761
+#: ../../include/account.php:769
msgid "This action is not available under your subscription plan."
msgstr "Esta acción no está disponible en su plan de suscripción."
-#: ../../include/message.php:20
-msgid "No recipient provided."
-msgstr "No se ha especificado ningún destinatario."
-
-#: ../../include/message.php:25
-msgid "[no subject]"
-msgstr "[sin asunto]"
-
-#: ../../include/message.php:45
-msgid "Unable to determine sender."
-msgstr "No ha sido posible determinar el remitente. "
-
-#: ../../include/message.php:222
-msgid "Stored post could not be verified."
-msgstr "No se han podido verificar las publicaciones guardadas."
-
#: ../../include/selectors.php:30
msgid "Frequently"
msgstr "Frecuentemente"
@@ -8307,14 +10634,6 @@ msgstr "Semanalmente"
msgid "Monthly"
msgstr "Mensualmente"
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Male"
-msgstr "Hombre"
-
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Female"
-msgstr "Mujer"
-
#: ../../include/selectors.php:49
msgid "Currently Male"
msgstr "Actualmente hombre"
@@ -8568,192 +10887,115 @@ msgstr "No ha sido posible recuperar la identidad creada"
msgid "Default Profile"
msgstr "Perfil principal"
-#: ../../include/channel.php:813
-msgid "Requested channel is not available."
-msgstr "El canal solicitado no está disponible."
-
-#: ../../include/channel.php:960
+#: ../../include/channel.php:962
msgid "Create New Profile"
msgstr "Crear un nuevo perfil"
-#: ../../include/channel.php:963 ../../include/nav.php:93
-msgid "Edit Profile"
-msgstr "Editar el perfil"
-
-#: ../../include/channel.php:980
+#: ../../include/channel.php:982
msgid "Visible to everybody"
msgstr "Visible para todos"
-#: ../../include/channel.php:1053 ../../include/channel.php:1166
+#: ../../include/channel.php:1055 ../../include/channel.php:1174
msgid "Gender:"
msgstr "Género:"
-#: ../../include/channel.php:1054 ../../include/channel.php:1210
-msgid "Status:"
-msgstr "Estado:"
-
-#: ../../include/channel.php:1055 ../../include/channel.php:1221
+#: ../../include/channel.php:1057 ../../include/channel.php:1229
msgid "Homepage:"
msgstr "Página personal:"
-#: ../../include/channel.php:1056
+#: ../../include/channel.php:1058
msgid "Online Now"
msgstr "Ahora en línea"
-#: ../../include/channel.php:1171
+#: ../../include/channel.php:1179
msgid "Like this channel"
msgstr "Me gusta este canal"
-#: ../../include/channel.php:1195
+#: ../../include/channel.php:1203
msgid "j F, Y"
msgstr "j F Y"
-#: ../../include/channel.php:1196
+#: ../../include/channel.php:1204
msgid "j F"
msgstr "j F"
-#: ../../include/channel.php:1203
+#: ../../include/channel.php:1211
msgid "Birthday:"
msgstr "Cumpleaños:"
-#: ../../include/channel.php:1216
+#: ../../include/channel.php:1224
#, php-format
msgid "for %1$d %2$s"
msgstr "por %1$d %2$s"
-#: ../../include/channel.php:1219
+#: ../../include/channel.php:1227
msgid "Sexual Preference:"
msgstr "Orientación sexual:"
-#: ../../include/channel.php:1225
+#: ../../include/channel.php:1233
msgid "Tags:"
msgstr "Etiquetas:"
-#: ../../include/channel.php:1227
+#: ../../include/channel.php:1235
msgid "Political Views:"
msgstr "Posición política:"
-#: ../../include/channel.php:1229
+#: ../../include/channel.php:1237
msgid "Religion:"
msgstr "Religión:"
-#: ../../include/channel.php:1233
+#: ../../include/channel.php:1241
msgid "Hobbies/Interests:"
msgstr "Aficciones o intereses:"
-#: ../../include/channel.php:1235
+#: ../../include/channel.php:1243
msgid "Likes:"
msgstr "Me gusta:"
-#: ../../include/channel.php:1237
+#: ../../include/channel.php:1245
msgid "Dislikes:"
msgstr "No me gusta:"
-#: ../../include/channel.php:1239
+#: ../../include/channel.php:1247
msgid "Contact information and Social Networks:"
msgstr "Información de contacto y redes sociales:"
-#: ../../include/channel.php:1241
+#: ../../include/channel.php:1249
msgid "My other channels:"
msgstr "Mis otros canales:"
-#: ../../include/channel.php:1243
+#: ../../include/channel.php:1251
msgid "Musical interests:"
msgstr "Preferencias musicales:"
-#: ../../include/channel.php:1245
+#: ../../include/channel.php:1253
msgid "Books, literature:"
msgstr "Libros, literatura:"
-#: ../../include/channel.php:1247
+#: ../../include/channel.php:1255
msgid "Television:"
msgstr "Televisión:"
-#: ../../include/channel.php:1249
+#: ../../include/channel.php:1257
msgid "Film/dance/culture/entertainment:"
msgstr "Cine, danza, cultura, entretenimiento:"
-#: ../../include/channel.php:1251
+#: ../../include/channel.php:1259
msgid "Love/Romance:"
msgstr "Vida sentimental o amorosa:"
-#: ../../include/channel.php:1253
+#: ../../include/channel.php:1261
msgid "Work/employment:"
msgstr "Trabajo:"
-#: ../../include/channel.php:1255
+#: ../../include/channel.php:1263
msgid "School/education:"
msgstr "Estudios:"
-#: ../../include/channel.php:1276
+#: ../../include/channel.php:1284
msgid "Like this thing"
msgstr "Me gusta esto"
-#: ../../include/acl_selectors.php:169
-msgid "Who can see this?"
-msgstr "¿Quién puede ver esto?"
-
-#: ../../include/acl_selectors.php:170
-msgid "Custom selection"
-msgstr "Selección personalizada"
-
-#: ../../include/acl_selectors.php:171
-msgid ""
-"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
-" the scope of \"Show\"."
-msgstr "Seleccione \"Mostrar\" para permitir la visualización. La opción \"No mostrar\" le permite anular y limitar el alcance de \"Mostrar\"."
-
-#: ../../include/acl_selectors.php:172
-msgid "Show"
-msgstr "Mostrar"
-
-#: ../../include/acl_selectors.php:173
-msgid "Don't show"
-msgstr "No mostrar"
-
-#: ../../include/acl_selectors.php:207
-#, php-format
-msgid ""
-"Post permissions %s cannot be changed %s after a post is shared.</br />These"
-" permissions set who is allowed to view the post."
-msgstr "Los permisos de la entrada %s no se pueden cambiar %s una vez que se ha compartido.</br /> Estos permisos establecen quién está autorizado para ver el mensaje."
-
-#: ../../include/bookmarks.php:35
-#, php-format
-msgid "%1$s's bookmarks"
-msgstr "Marcadores de %1$s"
-
-#: ../../include/group.php:26
-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 "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente."
-
-#: ../../include/group.php:248
-msgid "Add new connections to this privacy group"
-msgstr "Añadir conexiones nuevas a este grupo de canales"
-
-#: ../../include/group.php:289
-msgid "edit"
-msgstr "editar"
-
-#: ../../include/group.php:312
-msgid "Edit group"
-msgstr "Editar grupo"
-
-#: ../../include/group.php:313
-msgid "Add privacy group"
-msgstr "Añadir un grupo de canales"
-
-#: ../../include/group.php:314
-msgid "Channels not in any privacy group"
-msgstr "Sin canales en ningún grupo"
-
-#: ../../include/group.php:316 ../../include/widgets.php:284
-msgid "add"
-msgstr "añadir"
-
#: ../../include/connections.php:95
msgid "New window"
msgstr "Nueva ventana"
@@ -8767,19 +11009,23 @@ msgstr "Abrir la dirección seleccionada en una ventana o pestaña aparte"
msgid "User '%s' deleted"
msgstr "El usuario '%s' ha sido eliminado"
-#: ../../include/page_widgets.php:7
-msgid "New Page"
-msgstr "Nueva página"
+#: ../../include/dir_fns.php:141
+msgid "Directory Options"
+msgstr "Opciones del directorio"
-#: ../../include/page_widgets.php:46
-msgid "Title"
-msgstr "Título"
+#: ../../include/dir_fns.php:143
+msgid "Safe Mode"
+msgstr "Modo seguro"
-#: ../../include/wiki.php:525 ../../include/bbcode.php:619
-msgid "Different viewers will see this text differently"
-msgstr "Visitantes diferentes verán este texto de forma distinta"
+#: ../../include/dir_fns.php:144
+msgid "Public Forums Only"
+msgstr "Solo foros públicos"
+
+#: ../../include/dir_fns.php:145
+msgid "This Website Only"
+msgstr "Solo este sitio web"
-#: ../../include/nav.php:85 ../../include/nav.php:118 ../../boot.php:1738
+#: ../../include/nav.php:85 ../../include/nav.php:118 ../../boot.php:1719
msgid "Logout"
msgstr "Finalizar sesión"
@@ -8787,10 +11033,6 @@ msgstr "Finalizar sesión"
msgid "End this session"
msgstr "Finalizar esta sesión"
-#: ../../include/nav.php:88 ../../include/nav.php:149
-msgid "Home"
-msgstr "Inicio"
-
#: ../../include/nav.php:88
msgid "Your posts and conversations"
msgstr "Sus publicaciones y conversaciones"
@@ -8819,7 +11061,7 @@ msgstr "Sus ficheros"
msgid "Your chatrooms"
msgstr "Sus salas de chat"
-#: ../../include/nav.php:105 ../../include/conversation.php:1715
+#: ../../include/nav.php:105 ../../include/conversation.php:1717
msgid "Bookmarks"
msgstr "Marcadores"
@@ -8832,165 +11074,578 @@ msgid "Your webpages"
msgstr "Sus páginas web"
#: ../../include/nav.php:111
-msgid "Your wiki"
-msgstr "Su wiki"
+msgid "Your wikis"
+msgstr "Sus wikis"
#: ../../include/nav.php:115
msgid "Sign in"
msgstr "Acceder"
-#: ../../include/nav.php:132
-#, php-format
-msgid "%s - click to logout"
-msgstr "%s - pulsar para finalizar sesión"
-
-#: ../../include/nav.php:135
+#: ../../include/nav.php:131
msgid "Remote authentication"
msgstr "Acceder desde su servidor"
-#: ../../include/nav.php:135
+#: ../../include/nav.php:131
msgid "Click to authenticate to your home hub"
msgstr "Pulsar para identificarse en su servidor de inicio"
-#: ../../include/nav.php:149
-msgid "Home Page"
-msgstr "Página de inicio"
+#: ../../include/nav.php:143
+msgid "Get me home"
+msgstr "Volver a la página principal"
+
+#: ../../include/nav.php:145
+msgid "Log me out of this site"
+msgstr "Salir de este sitio"
-#: ../../include/nav.php:152
+#: ../../include/nav.php:150
msgid "Create an account"
msgstr "Crear una cuenta"
-#: ../../include/nav.php:164
+#: ../../include/nav.php:162
msgid "Help and documentation"
msgstr "Ayuda y documentación"
-#: ../../include/nav.php:168
+#: ../../include/nav.php:166
msgid "Applications, utilities, links, games"
msgstr "Aplicaciones, utilidades, enlaces, juegos"
-#: ../../include/nav.php:170
+#: ../../include/nav.php:168
msgid "Search site @name, #tag, ?docs, content"
msgstr "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido"
-#: ../../include/nav.php:172
+#: ../../include/nav.php:170
msgid "Channel Directory"
msgstr "Directorio de canales"
-#: ../../include/nav.php:184
+#: ../../include/nav.php:182
msgid "Your grid"
msgstr "Mi red"
-#: ../../include/nav.php:185
+#: ../../include/nav.php:183
msgid "Mark all grid notifications seen"
msgstr "Marcar todas las notificaciones de la red como vistas"
-#: ../../include/nav.php:187
+#: ../../include/nav.php:185
msgid "Channel home"
msgstr "Mi canal"
-#: ../../include/nav.php:188
+#: ../../include/nav.php:186
msgid "Mark all channel notifications seen"
msgstr "Marcar todas las notificaciones del canal como leídas"
-#: ../../include/nav.php:194
+#: ../../include/nav.php:192
msgid "Notices"
msgstr "Avisos"
-#: ../../include/nav.php:194
+#: ../../include/nav.php:192
msgid "Notifications"
msgstr "Notificaciones"
-#: ../../include/nav.php:195
+#: ../../include/nav.php:193
msgid "See all notifications"
msgstr "Ver todas las notificaciones"
-#: ../../include/nav.php:198
+#: ../../include/nav.php:196
msgid "Private mail"
msgstr "Correo privado"
-#: ../../include/nav.php:199
+#: ../../include/nav.php:197
msgid "See all private messages"
msgstr "Ver todas los mensajes privados"
-#: ../../include/nav.php:200
+#: ../../include/nav.php:198
msgid "Mark all private messages seen"
msgstr "Marcar todos los mensajes privados como leídos"
-#: ../../include/nav.php:201 ../../include/widgets.php:700
+#: ../../include/nav.php:199 ../../include/widgets.php:700
msgid "Inbox"
msgstr "Bandeja de entrada"
-#: ../../include/nav.php:202 ../../include/widgets.php:705
+#: ../../include/nav.php:200 ../../include/widgets.php:705
msgid "Outbox"
msgstr "Bandeja de salida"
-#: ../../include/nav.php:203 ../../include/widgets.php:710
+#: ../../include/nav.php:201 ../../include/widgets.php:710
msgid "New Message"
msgstr "Nuevo mensaje"
-#: ../../include/nav.php:206
+#: ../../include/nav.php:204
msgid "Event Calendar"
msgstr "Calendario de eventos"
-#: ../../include/nav.php:207
+#: ../../include/nav.php:205
msgid "See all events"
msgstr "Ver todos los eventos"
-#: ../../include/nav.php:208
+#: ../../include/nav.php:206
msgid "Mark all events seen"
msgstr "Marcar todos los eventos como leidos"
-#: ../../include/nav.php:211
+#: ../../include/nav.php:209
msgid "Manage Your Channels"
msgstr "Gestionar sus canales"
-#: ../../include/nav.php:213
+#: ../../include/nav.php:211
msgid "Account/Channel Settings"
msgstr "Ajustes de cuenta/canales"
-#: ../../include/nav.php:221 ../../include/widgets.php:1594
+#: ../../include/nav.php:219 ../../include/widgets.php:1595
msgid "Admin"
msgstr "Administrador"
-#: ../../include/nav.php:221
+#: ../../include/nav.php:219
msgid "Site Setup and Configuration"
msgstr "Ajustes y configuración del sitio"
-#: ../../include/nav.php:252 ../../include/conversation.php:853
+#: ../../include/nav.php:250 ../../include/conversation.php:835
msgid "Loading..."
msgstr "Cargando..."
-#: ../../include/nav.php:257
+#: ../../include/nav.php:255
msgid "@name, #tag, ?doc, content"
msgstr "@nombre, #etiqueta, ?ayuda, contenido"
-#: ../../include/nav.php:258
+#: ../../include/nav.php:256
msgid "Please wait..."
msgstr "Espere por favor…"
-#: ../../include/bb2diaspora.php:398
+#: ../../include/features.php:58
+msgid "General Features"
+msgstr "Funcionalidades básicas"
+
+#: ../../include/features.php:63
+msgid "Multiple Profiles"
+msgstr "Múltiples perfiles"
+
+#: ../../include/features.php:64
+msgid "Ability to create multiple profiles"
+msgstr "Capacidad de crear múltiples perfiles"
+
+#: ../../include/features.php:72
+msgid "Advanced Profiles"
+msgstr "Perfiles avanzados"
+
+#: ../../include/features.php:73
+msgid "Additional profile sections and selections"
+msgstr "Secciones y selecciones de perfil adicionales"
+
+#: ../../include/features.php:81
+msgid "Profile Import/Export"
+msgstr "Importar/Exportar perfil"
+
+#: ../../include/features.php:82
+msgid "Save and load profile details across sites/channels"
+msgstr "Guardar y cargar detalles del perfil a través de sitios/canales"
+
+#: ../../include/features.php:90
+msgid "Web Pages"
+msgstr "Páginas web"
+
+#: ../../include/features.php:91
+msgid "Provide managed web pages on your channel"
+msgstr "Proveer páginas web gestionadas en su canal"
+
+#: ../../include/features.php:100
+msgid "Provide a wiki for your channel"
+msgstr "Proporcionar un wiki para su canal"
+
+#: ../../include/features.php:117
+msgid "Private Notes"
+msgstr "Notas privadas"
+
+#: ../../include/features.php:118
+msgid "Enables a tool to store notes and reminders (note: not encrypted)"
+msgstr "Habilita una herramienta para guardar notas y recordatorios (advertencia: las notas no estarán cifradas)"
+
+#: ../../include/features.php:126
+msgid "Navigation Channel Select"
+msgstr "Navegación por el selector de canales"
+
+#: ../../include/features.php:127
+msgid "Change channels directly from within the navigation dropdown menu"
+msgstr "Cambiar de canales directamente desde el menú de navegación desplegable"
+
+#: ../../include/features.php:135
+msgid "Photo Location"
+msgstr "Ubicación de las fotos"
+
+#: ../../include/features.php:136
+msgid "If location data is available on uploaded photos, link this to a map."
+msgstr "Si los datos de ubicación están disponibles en las fotos subidas, enlazar estas a un mapa."
+
+#: ../../include/features.php:144
+msgid "Access Controlled Chatrooms"
+msgstr "Salas de chat moderadas"
+
+#: ../../include/features.php:145
+msgid "Provide chatrooms and chat services with access control."
+msgstr "Proporcionar salas y servicios de chat moderados."
+
+#: ../../include/features.php:153
+msgid "Smart Birthdays"
+msgstr "Cumpleaños inteligentes"
+
+#: ../../include/features.php:154
+msgid ""
+"Make birthday events timezone aware in case your friends are scattered "
+"across the planet."
+msgstr "Enlazar los eventos de cumpleaños con el huso horario en el caso de que sus amigos estén dispersos por el mundo."
+
+#: ../../include/features.php:162
+msgid "Advanced Directory Search"
+msgstr "Búsqueda avanzada en el directorio"
+
+#: ../../include/features.php:163
+msgid "Allows creation of complex directory search queries"
+msgstr "Permitir la creación de consultas complejas en las búsquedas en el directorio"
+
+#: ../../include/features.php:171
+msgid "Advanced Theme and Layout Settings"
+msgstr "Ajustes avanzados de temas y esquemas"
+
+#: ../../include/features.php:172
+msgid "Allows fine tuning of themes and page layouts"
+msgstr "Permitir el ajuste fino de temas y esquemas de páginas"
+
+#: ../../include/features.php:182
+msgid "Post Composition Features"
+msgstr "Opciones para la redacción de entradas"
+
+#: ../../include/features.php:186
+msgid "Large Photos"
+msgstr "Fotos de gran tamaño"
+
+#: ../../include/features.php:187
+msgid ""
+"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
+"(640px) photo thumbnails"
+msgstr "Incluir miniaturas de fotos grandes (1024px) en publicaciones. Si no está habilitado, usar miniaturas pequeñas (640px)"
+
+#: ../../include/features.php:196
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Importar automáticamente contenido de otros canales o \"feeds\""
+
+#: ../../include/features.php:204
+msgid "Even More Encryption"
+msgstr "Más cifrado todavía"
+
+#: ../../include/features.php:205
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Permitir cifrado adicional de contenido \"punto-a-punto\" con una clave secreta compartida."
+
+#: ../../include/features.php:213
+msgid "Enable Voting Tools"
+msgstr "Permitir entradas con votación"
+
+#: ../../include/features.php:214
+msgid "Provide a class of post which others can vote on"
+msgstr "Proveer una clase de publicación en la que otros puedan votar"
+
+#: ../../include/features.php:222
+msgid "Disable Comments"
+msgstr "Deshabilitar comentarios"
+
+#: ../../include/features.php:223
+msgid "Provide the option to disable comments for a post"
+msgstr "Proporcionar la opción de desactivar los comentarios para una entrada"
+
+#: ../../include/features.php:231
+msgid "Delayed Posting"
+msgstr "Publicación aplazada"
+
+#: ../../include/features.php:232
+msgid "Allow posts to be published at a later date"
+msgstr "Permitir mensajes que se publicarán en una fecha posterior"
+
+#: ../../include/features.php:240
+msgid "Content Expiration"
+msgstr "Caducidad del contenido"
+
+#: ../../include/features.php:241
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Eliminar publicaciones/comentarios y/o mensajes privados más adelante"
+
+#: ../../include/features.php:249
+msgid "Suppress Duplicate Posts/Comments"
+msgstr "Prevenir entradas o comentarios duplicados"
+
+#: ../../include/features.php:250
+msgid ""
+"Prevent posts with identical content to be published with less than two "
+"minutes in between submissions."
+msgstr "Prevenir que entradas con contenido idéntico se publiquen con menos de dos minutos de intervalo."
+
+#: ../../include/features.php:261
+msgid "Network and Stream Filtering"
+msgstr "Filtrado del contenido"
+
+#: ../../include/features.php:265
+msgid "Search by Date"
+msgstr "Buscar por fecha"
+
+#: ../../include/features.php:266
+msgid "Ability to select posts by date ranges"
+msgstr "Capacidad de seleccionar entradas por rango de fechas"
+
+#: ../../include/features.php:274 ../../include/group.php:311
+msgid "Privacy Groups"
+msgstr "Grupos de canales"
+
+#: ../../include/features.php:275
+msgid "Enable management and selection of privacy groups"
+msgstr "Activar la gestión y selección de grupos de canales"
+
+#: ../../include/features.php:283 ../../include/widgets.php:283
+msgid "Saved Searches"
+msgstr "Búsquedas guardadas"
+
+#: ../../include/features.php:284
+msgid "Save search terms for re-use"
+msgstr "Guardar términos de búsqueda para su reutilización"
+
+#: ../../include/features.php:292
+msgid "Network Personal Tab"
+msgstr "Actividad personal"
+
+#: ../../include/features.php:293
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Habilitar una pestaña en la cual se muestren solo las entradas en las que ha participado."
+
+#: ../../include/features.php:301
+msgid "Network New Tab"
+msgstr "Contenido nuevo"
+
+#: ../../include/features.php:302
+msgid "Enable tab to display all new Network activity"
+msgstr "Habilitar una pestaña en la que se muestre solo el contenido nuevo"
+
+#: ../../include/features.php:310
+msgid "Affinity Tool"
+msgstr "Herramienta de afinidad"
+
+#: ../../include/features.php:311
+msgid "Filter stream activity by depth of relationships"
+msgstr "Filtrar el contenido según la profundidad de las relaciones"
+
+#: ../../include/features.php:320
+msgid "Show friend and connection suggestions"
+msgstr "Mostrar sugerencias de amigos y conexiones"
+
+#: ../../include/features.php:328
+msgid "Connection Filtering"
+msgstr "Filtrado de conexiones"
+
+#: ../../include/features.php:329
+msgid "Filter incoming posts from connections based on keywords/content"
+msgstr "Filtrar publicaciones entrantes de conexiones por palabras clave o contenido"
+
+#: ../../include/features.php:341
+msgid "Post/Comment Tools"
+msgstr "Gestión de entradas y comentarios"
+
+#: ../../include/features.php:345
+msgid "Community Tagging"
+msgstr "Etiquetas de la comunidad"
+
+#: ../../include/features.php:346
+msgid "Ability to tag existing posts"
+msgstr "Capacidad de etiquetar entradas existentes"
+
+#: ../../include/features.php:354
+msgid "Post Categories"
+msgstr "Temas de las entradas"
+
+#: ../../include/features.php:355
+msgid "Add categories to your posts"
+msgstr "Añadir temas a sus publicaciones"
+
+#: ../../include/features.php:363
+msgid "Emoji Reactions"
+msgstr "Emoticonos \"emoji\""
+
+#: ../../include/features.php:364
+msgid "Add emoji reaction ability to posts"
+msgstr "Activar la capacidad de añadir un emoticono \"emoji\" a las entradas"
+
+#: ../../include/features.php:372 ../../include/contact_widgets.php:53
+#: ../../include/widgets.php:346
+msgid "Saved Folders"
+msgstr "Carpetas guardadas"
+
+#: ../../include/features.php:373
+msgid "Ability to file posts under folders"
+msgstr "Capacidad de archivar entradas en carpetas"
+
+#: ../../include/features.php:381
+msgid "Dislike Posts"
+msgstr "Desagrado de publicaciones"
+
+#: ../../include/features.php:382
+msgid "Ability to dislike posts/comments"
+msgstr "Capacidad de mostrar desacuerdo con el contenido de entradas y comentarios"
+
+#: ../../include/features.php:390
+msgid "Star Posts"
+msgstr "Entradas destacadas"
+
+#: ../../include/features.php:391
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Capacidad de marcar entradas destacadas con un indicador de estrella"
+
+#: ../../include/features.php:399
+msgid "Tag Cloud"
+msgstr "Nube de etiquetas"
+
+#: ../../include/features.php:400
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Proveer nube de etiquetas personal en su página de canal"
+
+#: ../../include/features.php:412
+msgid "Premium Channel"
+msgstr "Canal premium"
+
+#: ../../include/features.php:413
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Le permite configurar restricciones y normas de uso a aquellos que conectan con su canal"
+
+#: ../../include/bb2diaspora.php:404
msgid "Attachments:"
msgstr "Ficheros adjuntos:"
-#: ../../include/bb2diaspora.php:485 ../../include/event.php:22
+#: ../../include/bb2diaspora.php:499 ../../include/event.php:22
#: ../../include/event.php:69
msgid "l F d, Y \\@ g:i A"
msgstr "l d de F, Y \\@ G:i"
-#: ../../include/bb2diaspora.php:487
+#: ../../include/bb2diaspora.php:501
msgid "$Projectname event notification:"
msgstr "Notificación de eventos de $Projectname:"
-#: ../../include/bb2diaspora.php:491 ../../include/event.php:30
+#: ../../include/bb2diaspora.php:505 ../../include/event.php:30
#: ../../include/event.php:73
msgid "Starts:"
msgstr "Comienza:"
-#: ../../include/bb2diaspora.php:499 ../../include/event.php:40
+#: ../../include/bb2diaspora.php:513 ../../include/event.php:40
#: ../../include/event.php:77
msgid "Finishes:"
msgstr "Finaliza:"
+#: ../../include/bookmarks.php:35
+#, php-format
+msgid "%1$s's bookmarks"
+msgstr "Marcadores de %1$s"
+
+#: ../../include/help.php:31
+msgid "Help:"
+msgstr "Ayuda:"
+
+#: ../../include/help.php:63
+msgid "Not Found"
+msgstr "No encontrado"
+
+#: ../../include/wiki.php:546 ../../include/bbcode.php:552
+#: ../../include/bbcode.php:683
+msgid "Different viewers will see this text differently"
+msgstr "Visitantes diferentes verán este texto de forma distinta"
+
+#: ../../include/zot.php:667
+msgid "Invalid data packet"
+msgstr "Paquete de datos no válido"
+
+#: ../../include/zot.php:683
+msgid "Unable to verify channel signature"
+msgstr "No ha sido posible de verificar la firma del canal"
+
+#: ../../include/zot.php:2325
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr "No ha sido posible de verificar la firma del sitio para %s"
+
+#: ../../include/zot.php:3723
+msgid "invalid target signature"
+msgstr "La firma recibida no es válida"
+
+#: ../../include/page_widgets.php:7
+msgid "New Page"
+msgstr "Nueva página"
+
+#: ../../include/message.php:32
+msgid "Unable to determine sender."
+msgstr "No ha sido posible determinar el remitente. "
+
+#: ../../include/message.php:69
+msgid "No recipient provided."
+msgstr "No se ha especificado ningún destinatario."
+
+#: ../../include/message.php:74
+msgid "[no subject]"
+msgstr "[sin asunto]"
+
+#: ../../include/message.php:225
+msgid "Stored post could not be verified."
+msgstr "No se han podido verificar las publicaciones guardadas."
+
+#: ../../include/contact_widgets.php:11
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d invitación pendiente"
+msgstr[1] "%d invitaciones disponibles"
+
+#: ../../include/contact_widgets.php:19
+msgid "Find Channels"
+msgstr "Encontrar canales"
+
+#: ../../include/contact_widgets.php:20
+msgid "Enter name or interest"
+msgstr "Introducir nombre o interés"
+
+#: ../../include/contact_widgets.php:21
+msgid "Connect/Follow"
+msgstr "Conectar/Seguir"
+
+#: ../../include/contact_widgets.php:22
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Ejemplos: José Fernández, Pesca"
+
+#: ../../include/contact_widgets.php:26
+msgid "Random Profile"
+msgstr "Perfil aleatorio"
+
+#: ../../include/contact_widgets.php:27
+msgid "Invite Friends"
+msgstr "Invitar a amigos"
+
+#: ../../include/contact_widgets.php:29
+msgid "Advanced example: name=fred and country=iceland"
+msgstr "Ejemplo avanzado: nombre=juan y país=españa"
+
+#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
+#: ../../include/widgets.php:349 ../../include/widgets.php:468
+msgid "Everything"
+msgstr "Todo"
+
+#: ../../include/contact_widgets.php:91 ../../include/taxonomy.php:188
+#: ../../include/taxonomy.php:270 ../../include/widgets.php:46
+#: ../../include/widgets.php:465
+msgid "Categories"
+msgstr "Temas"
+
+#: ../../include/contact_widgets.php:122
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d conexión en común"
+msgstr[1] "%d conexiones en común"
+
+#: ../../include/contact_widgets.php:127
+msgid "show more"
+msgstr "mostrar más"
+
#: ../../include/js_strings.php:5
msgid "Delete this item?"
msgstr "¿Borrar este elemento?"
@@ -9131,11 +11786,55 @@ msgstr " "
msgid "timeago.numbers"
msgstr "timeago.numbers"
+#: ../../include/js_strings.php:45 ../../include/text.php:1307
+msgid "January"
+msgstr "enero"
+
+#: ../../include/js_strings.php:46 ../../include/text.php:1307
+msgid "February"
+msgstr "febrero"
+
+#: ../../include/js_strings.php:47 ../../include/text.php:1307
+msgid "March"
+msgstr "marzo"
+
+#: ../../include/js_strings.php:48 ../../include/text.php:1307
+msgid "April"
+msgstr "abril"
+
#: ../../include/js_strings.php:49
msgctxt "long"
msgid "May"
msgstr "mayo"
+#: ../../include/js_strings.php:50 ../../include/text.php:1307
+msgid "June"
+msgstr "junio"
+
+#: ../../include/js_strings.php:51 ../../include/text.php:1307
+msgid "July"
+msgstr "julio"
+
+#: ../../include/js_strings.php:52 ../../include/text.php:1307
+msgid "August"
+msgstr "agosto"
+
+#: ../../include/js_strings.php:53 ../../include/text.php:1307
+msgid "September"
+msgstr "septiembre"
+
+#: ../../include/js_strings.php:54 ../../include/text.php:1307
+msgid "October"
+msgstr "octubre"
+
+#: ../../include/js_strings.php:55 ../../include/text.php:1307
+msgid "November"
+msgstr "noviembre"
+
+#: ../../include/js_strings.php:56 ../../include/text.php:1307
+msgid "December"
+msgstr "diciembre"
+
#: ../../include/js_strings.php:57
msgid "Jan"
msgstr "ene"
@@ -9185,6 +11884,34 @@ msgstr "nov"
msgid "Dec"
msgstr "dic"
+#: ../../include/js_strings.php:69 ../../include/text.php:1303
+msgid "Sunday"
+msgstr "domingo"
+
+#: ../../include/js_strings.php:70 ../../include/text.php:1303
+msgid "Monday"
+msgstr "lunes"
+
+#: ../../include/js_strings.php:71 ../../include/text.php:1303
+msgid "Tuesday"
+msgstr "martes"
+
+#: ../../include/js_strings.php:72 ../../include/text.php:1303
+msgid "Wednesday"
+msgstr "miércoles"
+
+#: ../../include/js_strings.php:73 ../../include/text.php:1303
+msgid "Thursday"
+msgstr "jueves"
+
+#: ../../include/js_strings.php:74 ../../include/text.php:1303
+msgid "Friday"
+msgstr "viernes"
+
+#: ../../include/js_strings.php:75 ../../include/text.php:1303
+msgid "Saturday"
+msgstr "sábado"
+
#: ../../include/js_strings.php:76
msgid "Sun"
msgstr "dom"
@@ -9238,488 +11965,403 @@ msgctxt "calendar"
msgid "All day"
msgstr "Todos los días"
-#: ../../include/nav.php:183
-msgid "Your grid"
-msgstr "Mi red"
-
-#: ../../include/nav.php:184
-msgid "Mark all grid notifications seen"
-msgstr "Marcar todas las notificaciones de la red como vistas"
-
-#: ../../include/nav.php:186
-msgid "Channel home"
-msgstr "Mi canal"
+#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+msgid "Tags"
+msgstr "Etiquetas"
-#: ../../include/nav.php:187
-msgid "Mark all channel notifications seen"
-msgstr "Marcar todas las notificaciones del canal como leídas"
+#: ../../include/taxonomy.php:293
+msgid "Keywords"
+msgstr "Palabras clave"
-#: ../../include/nav.php:193
-msgid "Notices"
-msgstr "Avisos"
+#: ../../include/taxonomy.php:314
+msgid "have"
+msgstr "tener"
-#: ../../include/nav.php:193
-msgid "Notifications"
-msgstr "Notificaciones"
+#: ../../include/taxonomy.php:314
+msgid "has"
+msgstr "tiene"
-#: ../../include/nav.php:194
-msgid "See all notifications"
-msgstr "Ver todas las notificaciones"
+#: ../../include/taxonomy.php:315
+msgid "want"
+msgstr "quiero"
-#: ../../include/bbcode.php:123 ../../include/bbcode.php:881
-#: ../../include/bbcode.php:884 ../../include/bbcode.php:889
-#: ../../include/bbcode.php:892 ../../include/bbcode.php:895
-#: ../../include/bbcode.php:898 ../../include/bbcode.php:903
-#: ../../include/bbcode.php:906 ../../include/bbcode.php:911
-#: ../../include/bbcode.php:914 ../../include/bbcode.php:917
-#: ../../include/bbcode.php:920
-msgid "Image/photo"
-msgstr "Imagen/foto"
+#: ../../include/taxonomy.php:315
+msgid "wants"
+msgstr "quiere"
-#: ../../include/bbcode.php:162 ../../include/bbcode.php:931
-msgid "Encrypted content"
-msgstr "Contenido cifrado"
+#: ../../include/taxonomy.php:316
+msgid "likes"
+msgstr "gusta de"
-#: ../../include/network.php:2209
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../include/taxonomy.php:317
+msgid "dislikes"
+msgstr "no gusta de"
-#: ../../include/network.php:2210
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../include/text.php:460
+msgid "prev"
+msgstr "anterior"
-#: ../../include/network.php:2211
-msgid "Zot"
-msgstr "Zot"
+#: ../../include/text.php:462
+msgid "first"
+msgstr "primera"
-#: ../../include/network.php:2212
-msgid "LinkedIn"
-msgstr "LinkedIn"
+#: ../../include/text.php:491
+msgid "last"
+msgstr "última"
-#: ../../include/network.php:2213
-msgid "XMPP/IM"
-msgstr "XMPP/IM"
+#: ../../include/text.php:494
+msgid "next"
+msgstr "próxima"
-#: ../../include/bbcode.php:869
-msgid "$1 wrote:"
-msgstr "$1 escribió:"
+#: ../../include/text.php:505
+msgid "older"
+msgstr "más antiguas"
-#: ../../include/conversation.php:204
-#, php-format
-msgid "%1$s is now connected with %2$s"
-msgstr "%1$s ahora está conectado/a con %2$s"
+#: ../../include/text.php:507
+msgid "newer"
+msgstr "más recientes"
-#: ../../include/conversation.php:239
-#, php-format
-msgid "%1$s poked %2$s"
-msgstr "%1$s ha dado un toque a %2$s"
+#: ../../include/text.php:904
+msgid "No connections"
+msgstr "Sin conexiones"
-#: ../../include/conversation.php:694
+#: ../../include/text.php:929
#, php-format
-msgid "View %s's profile @ %s"
-msgstr "Ver el perfil @ %s de %s"
-
-#: ../../include/conversation.php:713
-msgid "Categories:"
-msgstr "Temas:"
-
-#: ../../include/conversation.php:714
-msgid "Filed under:"
-msgstr "Archivado bajo:"
+msgid "View all %s connections"
+msgstr "Ver todas las %s conexiones"
-#: ../../include/conversation.php:739
-msgid "View in context"
-msgstr "Mostrar en su contexto"
+#: ../../include/text.php:1074 ../../include/text.php:1079
+msgid "poke"
+msgstr "un toque"
-#: ../../include/conversation.php:849
-msgid "remove"
-msgstr "eliminar"
+#: ../../include/text.php:1074 ../../include/text.php:1079
+#: ../../include/conversation.php:243
+msgid "poked"
+msgstr "ha dado un toque a"
-#: ../../include/conversation.php:854
-msgid "Delete Selected Items"
-msgstr "Eliminar elementos seleccionados"
+#: ../../include/text.php:1080
+msgid "ping"
+msgstr "un \"ping\""
-#: ../../include/conversation.php:947
-msgid "View Source"
-msgstr "Ver el código fuente de la entrada"
+#: ../../include/text.php:1080
+msgid "pinged"
+msgstr "ha enviado un \"ping\" a"
-#: ../../include/conversation.php:948
-msgid "Follow Thread"
-msgstr "Seguir este hilo"
+#: ../../include/text.php:1081
+msgid "prod"
+msgstr "una incitación "
-#: ../../include/conversation.php:949
-msgid "Unfollow Thread"
-msgstr "Dejar de seguir este hilo"
+#: ../../include/text.php:1081
+msgid "prodded"
+msgstr "ha incitado a "
-#: ../../include/conversation.php:954
-msgid "Activity/Posts"
-msgstr "Actividad y publicaciones"
+#: ../../include/text.php:1082
+msgid "slap"
+msgstr "una bofetada "
-#: ../../include/conversation.php:956
-msgid "Edit Connection"
-msgstr "Editar conexión"
+#: ../../include/text.php:1082
+msgid "slapped"
+msgstr "ha abofeteado a "
-#: ../../include/conversation.php:957
-msgid "Message"
-msgstr "Mensaje"
+#: ../../include/text.php:1083
+msgid "finger"
+msgstr "un \"finger\" "
-#: ../../include/conversation.php:1077
-#, php-format
-msgid "%s likes this."
-msgstr "A %s le gusta esto."
+#: ../../include/text.php:1083
+msgid "fingered"
+msgstr "envió un \"finger\" a"
-#: ../../include/conversation.php:1077
-#, php-format
-msgid "%s doesn't like this."
-msgstr "A %s no le gusta esto."
+#: ../../include/text.php:1084
+msgid "rebuff"
+msgstr "un reproche"
-#: ../../include/conversation.php:1081
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgid_plural "<span %1$s>%2$d people</span> like this."
-msgstr[0] "a <span %1$s>%2$d personas</span> le gusta esto."
-msgstr[1] "A <span %1$s>%2$d personas</span> les gusta esto."
+#: ../../include/text.php:1084
+msgid "rebuffed"
+msgstr "ha hecho un reproche a "
-#: ../../include/conversation.php:1083
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgid_plural "<span %1$s>%2$d people</span> don't like this."
-msgstr[0] "a <span %1$s>%2$d personas</span> no les gusta esto."
-msgstr[1] "A <span %1$s>%2$d personas</span> no les gusta esto."
+#: ../../include/text.php:1096
+msgid "happy"
+msgstr "feliz "
-#: ../../include/conversation.php:1089
-msgid "and"
-msgstr "y"
+#: ../../include/text.php:1097
+msgid "sad"
+msgstr "triste "
-#: ../../include/conversation.php:1092
-#, php-format
-msgid ", and %d other people"
-msgid_plural ", and %d other people"
-msgstr[0] ", y %d persona más"
-msgstr[1] ", y %d personas más"
+#: ../../include/text.php:1098
+msgid "mellow"
+msgstr "tranquilo/a"
-#: ../../include/conversation.php:1093
-#, php-format
-msgid "%s like this."
-msgstr "A %s le gusta esto."
+#: ../../include/text.php:1099
+msgid "tired"
+msgstr "cansado/a "
-#: ../../include/conversation.php:1093
-#, php-format
-msgid "%s don't like this."
-msgstr "A %s no le gusta esto."
+#: ../../include/text.php:1100
+msgid "perky"
+msgstr "vivaz"
-#: ../../include/conversation.php:1136
-msgid "Set your location"
-msgstr "Establecer su ubicación"
+#: ../../include/text.php:1101
+msgid "angry"
+msgstr "enfadado/a"
-#: ../../include/conversation.php:1137
-msgid "Clear browser location"
-msgstr "Eliminar los datos de localización geográfica del navegador"
+#: ../../include/text.php:1102
+msgid "stupefied"
+msgstr "asombrado/a"
-#: ../../include/conversation.php:1185
-msgid "Tag term:"
-msgstr "Término de la etiqueta:"
+#: ../../include/text.php:1103
+msgid "puzzled"
+msgstr "perplejo/a"
-#: ../../include/conversation.php:1186
-msgid "Where are you right now?"
-msgstr "¿Donde está ahora?"
+#: ../../include/text.php:1104
+msgid "interested"
+msgstr "interesado/a"
-#: ../../include/conversation.php:1195
-msgid "Comments enabled"
-msgstr "Comentarios habilitados"
+#: ../../include/text.php:1105
+msgid "bitter"
+msgstr "amargado/a"
-#: ../../include/conversation.php:1196
-msgid "Comments disabled"
-msgstr "Comentarios deshabilitados"
+#: ../../include/text.php:1106
+msgid "cheerful"
+msgstr "alegre"
-#: ../../include/conversation.php:1234
-msgid "Page link name"
-msgstr "Nombre del enlace de la página"
+#: ../../include/text.php:1107
+msgid "alive"
+msgstr "animado/a"
-#: ../../include/conversation.php:1237
-msgid "Post as"
-msgstr "Publicar como"
+#: ../../include/text.php:1108
+msgid "annoyed"
+msgstr "molesto/a"
-#: ../../include/conversation.php:1251
-msgid "Toggle voting"
-msgstr "Cambiar votación"
+#: ../../include/text.php:1109
+msgid "anxious"
+msgstr "ansioso/a"
-#: ../../include/conversation.php:1254
-msgid "Disable comments"
-msgstr "Dehabilitar los comentarios"
+#: ../../include/text.php:1110
+msgid "cranky"
+msgstr "de mal humor"
-#: ../../include/conversation.php:1255
-msgid "Toggle comments"
-msgstr "Activar o desactivar los comentarios"
+#: ../../include/text.php:1111
+msgid "disturbed"
+msgstr "perturbado/a"
-#: ../../include/conversation.php:1263
-msgid "Categories (optional, comma-separated list)"
-msgstr "Temas (opcional, lista separada por comas)"
+#: ../../include/text.php:1112
+msgid "frustrated"
+msgstr "frustrado/a"
-#: ../../include/conversation.php:1286
-msgid "Other networks and post services"
-msgstr "Otras redes y servicios de publicación"
+#: ../../include/text.php:1113
+msgid "depressed"
+msgstr "deprimido/a"
-#: ../../include/conversation.php:1292
-msgid "Set publish date"
-msgstr "Establecer la fecha de publicación"
+#: ../../include/text.php:1114
+msgid "motivated"
+msgstr "motivado/a"
-#: ../../include/conversation.php:1541
-msgid "Discover"
-msgstr "Descubrir"
+#: ../../include/text.php:1115
+msgid "relaxed"
+msgstr "relajado/a"
-#: ../../include/conversation.php:1544
-msgid "Imported public streams"
-msgstr "Contenidos públicos importados"
+#: ../../include/text.php:1116
+msgid "surprised"
+msgstr "sorprendido/a"
-#: ../../include/conversation.php:1549
-msgid "Commented Order"
-msgstr "Comentarios recientes"
+#: ../../include/text.php:1307
+msgid "May"
+msgstr "mayo"
-#: ../../include/conversation.php:1552
-msgid "Sort by Comment Date"
-msgstr "Ordenar por fecha de comentario"
+#: ../../include/text.php:1384 ../../include/text.php:1388
+msgid "Unknown Attachment"
+msgstr "Adjunto no reconocido"
-#: ../../include/conversation.php:1556
-msgid "Posted Order"
-msgstr "Publicaciones recientes"
+#: ../../include/text.php:1390
+msgid "unknown"
+msgstr "desconocido"
-#: ../../include/conversation.php:1559
-msgid "Sort by Post Date"
-msgstr "Ordenar por fecha de publicación"
+#: ../../include/text.php:1426
+msgid "remove category"
+msgstr "eliminar el tema"
-#: ../../include/conversation.php:1567
-msgid "Posts that mention or involve you"
-msgstr "Publicaciones que le mencionan o involucran"
+#: ../../include/text.php:1503
+msgid "remove from file"
+msgstr "eliminar del fichero"
-#: ../../include/conversation.php:1576
-msgid "Activity Stream - by date"
-msgstr "Contenido - por fecha"
+#: ../../include/text.php:1770 ../../include/language.php:367
+msgid "default"
+msgstr "por defecto"
-#: ../../include/conversation.php:1582
-msgid "Starred"
-msgstr "Preferidas"
+#: ../../include/text.php:1778
+msgid "Page layout"
+msgstr "Plantilla de la página"
-#: ../../include/conversation.php:1585
-msgid "Favourite Posts"
-msgstr "Publicaciones favoritas"
+#: ../../include/text.php:1778
+msgid "You can create your own with the layouts tool"
+msgstr "Puede crear su propia disposición gráfica con la herramienta de plantillas"
-#: ../../include/conversation.php:1592
-msgid "Spam"
-msgstr "Correo basura"
+#: ../../include/text.php:1820
+msgid "Page content type"
+msgstr "Tipo de contenido de la página"
-#: ../../include/conversation.php:1595
-msgid "Posts flagged as SPAM"
-msgstr "Publicaciones marcadas como basura"
+#: ../../include/text.php:1953
+msgid "activity"
+msgstr "la actividad"
-#: ../../include/conversation.php:1654
-msgid "Status Messages and Posts"
-msgstr "Mensajes de estado y publicaciones"
+#: ../../include/text.php:2267
+msgid "Design Tools"
+msgstr "Herramientas de diseño web"
-#: ../../include/conversation.php:1663
-msgid "About"
-msgstr "Mi perfil"
+#: ../../include/text.php:2273
+msgid "Pages"
+msgstr "Páginas"
-#: ../../include/conversation.php:1666
-msgid "Profile Details"
-msgstr "Detalles del perfil"
+#: ../../include/text.php:2295
+msgid "Import website..."
+msgstr "Importar un sitio web..."
-#: ../../include/conversation.php:1682
-msgid "Files and Storage"
-msgstr "Ficheros y repositorio"
+#: ../../include/text.php:2296
+msgid "Select folder to import"
+msgstr "Seleccionar la carpeta que se va a importar"
-#: ../../include/conversation.php:1702 ../../include/conversation.php:1705
-#: ../../include/widgets.php:883
-msgid "Chatrooms"
-msgstr "Salas de chat"
+#: ../../include/text.php:2297
+msgid "Import from a zipped folder:"
+msgstr "Importar desde una carpeta comprimida: "
-#: ../../include/conversation.php:1718
-msgid "Saved Bookmarks"
-msgstr "Marcadores guardados"
+#: ../../include/text.php:2298
+msgid "Import from cloud files:"
+msgstr "Importar desde los ficheros en la nube: "
-#: ../../include/conversation.php:1728
-msgid "Manage Webpages"
-msgstr "Administrar páginas web"
+#: ../../include/text.php:2299
+msgid "/cloud/channel/path/to/folder"
+msgstr "/cloud/canal/ruta/a la/carpeta"
-#: ../../include/conversation.php:1793
-msgctxt "noun"
-msgid "Attending"
-msgid_plural "Attending"
-msgstr[0] "Participaré"
-msgstr[1] "Participaré"
+#: ../../include/text.php:2300
+msgid "Enter path to website files"
+msgstr "Ruta a los ficheros del sitio web"
-#: ../../include/conversation.php:1796
-msgctxt "noun"
-msgid "Not Attending"
-msgid_plural "Not Attending"
-msgstr[0] "No participaré"
-msgstr[1] "No participaré"
+#: ../../include/text.php:2301
+msgid "Select folder"
+msgstr "Seleccionar la carpeta"
-#: ../../include/conversation.php:1799
-msgctxt "noun"
-msgid "Undecided"
-msgid_plural "Undecided"
-msgstr[0] "Indeciso/a"
-msgstr[1] "Indecisos/as"
+#: ../../include/text.php:2302
+msgid "Export website..."
+msgstr "Exportar un sitio web..."
-#: ../../include/conversation.php:1802
-msgctxt "noun"
-msgid "Agree"
-msgid_plural "Agrees"
-msgstr[0] "De acuerdo"
-msgstr[1] "De acuerdo"
+#: ../../include/text.php:2303
+msgid "Export to a zip file"
+msgstr "Exportar a un fichero comprimido .zip"
-#: ../../include/conversation.php:1805
-msgctxt "noun"
-msgid "Disagree"
-msgid_plural "Disagrees"
-msgstr[0] "En desacuerdo"
-msgstr[1] "En desacuerdo"
+#: ../../include/text.php:2304
+msgid "website.zip"
+msgstr "sitio_web.zip"
-#: ../../include/conversation.php:1808
-msgctxt "noun"
-msgid "Abstain"
-msgid_plural "Abstains"
-msgstr[0] "se abstiene"
-msgstr[1] "Se abstienen"
+#: ../../include/text.php:2305
+msgid "Enter a name for the zip file."
+msgstr "Escriba un nombre para el fichero zip."
-#: ../../include/datetime.php:147
-msgid "Birthday"
-msgstr "Cumpleaños"
+#: ../../include/text.php:2306
+msgid "Export to cloud files"
+msgstr "Exportar a la nube de ficheros"
-#: ../../include/datetime.php:149
-msgid "Age: "
-msgstr "Edad:"
+#: ../../include/text.php:2307
+msgid "/path/to/export/folder"
+msgstr "/ruta/para/exportar/carpeta"
-#: ../../include/datetime.php:151
-msgid "YYYY-MM-DD or MM-DD"
-msgstr "AAAA-MM-DD o MM-DD"
+#: ../../include/text.php:2308
+msgid "Enter a path to a cloud files destination."
+msgstr "Escriba una ruta de destino a la nube de ficheros."
-#: ../../include/datetime.php:284 ../../boot.php:2578
-msgid "never"
-msgstr "nunca"
+#: ../../include/text.php:2309
+msgid "Specify folder"
+msgstr "Especificar una carpeta"
-#: ../../include/datetime.php:290
-msgid "less than a second ago"
-msgstr "hace un instante"
+#: ../../include/import.php:30
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "No se ha podido crear un canal con un identificador que ya existe en este sistema. La importación ha fallado."
-#: ../../include/datetime.php:308
-#, php-format
-msgctxt "e.g. 22 hours ago, 1 minute ago"
-msgid "%1$d %2$s ago"
-msgstr "hace %1$d %2$s"
+#: ../../include/import.php:90
+msgid "Channel clone failed. Import failed."
+msgstr "La clonación del canal no ha salido bien. La importación ha fallado."
-#: ../../include/datetime.php:319
-msgctxt "relative_date"
-msgid "year"
-msgid_plural "years"
-msgstr[0] "año"
-msgstr[1] "años"
+#: ../../include/import.php:1354
+msgid "Unable to import element \""
+msgstr "No se puede importar un elemento \""
-#: ../../include/datetime.php:322
-msgctxt "relative_date"
-msgid "month"
-msgid_plural "months"
-msgstr[0] "mes"
-msgstr[1] "meses"
+#: ../../include/security.php:117
+msgid "guest:"
+msgstr "invitado: "
-#: ../../include/datetime.php:325
-msgctxt "relative_date"
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "semana"
-msgstr[1] "semanas"
+#: ../../include/security.php:535
+msgid ""
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
+msgstr "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado"
-#: ../../include/datetime.php:328
-msgctxt "relative_date"
-msgid "day"
-msgid_plural "days"
-msgstr[0] "día"
-msgstr[1] "días"
+#: ../../include/items.php:837 ../../include/items.php:882
+msgid "(Unknown)"
+msgstr "(Desconocido)"
-#: ../../include/datetime.php:331
-msgctxt "relative_date"
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "hora"
-msgstr[1] "horas"
+#: ../../include/items.php:1080
+msgid "Visible to anybody on the internet."
+msgstr "Visible para cualquiera en internet."
-#: ../../include/datetime.php:334
-msgctxt "relative_date"
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "minuto"
-msgstr[1] "minutos"
+#: ../../include/items.php:1082
+msgid "Visible to you only."
+msgstr "Visible sólo para usted."
-#: ../../include/datetime.php:337
-msgctxt "relative_date"
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "segundo"
-msgstr[1] "segundos"
+#: ../../include/items.php:1084
+msgid "Visible to anybody in this network."
+msgstr "Visible para cualquiera en esta red."
-#: ../../include/datetime.php:574
-#, php-format
-msgid "%1$s's birthday"
-msgstr "Cumpleaños de %1$s"
+#: ../../include/items.php:1086
+msgid "Visible to anybody authenticated."
+msgstr "Visible para cualquiera que esté autenticado."
-#: ../../include/datetime.php:575
+#: ../../include/items.php:1088
#, php-format
-msgid "Happy Birthday %1$s"
-msgstr "Feliz cumpleaños %1$s"
-
-#: ../../include/dir_fns.php:141
-msgid "Directory Options"
-msgstr "Opciones del directorio"
-
-#: ../../include/dir_fns.php:143
-msgid "Safe Mode"
-msgstr "Modo seguro"
-
-#: ../../include/dir_fns.php:144
-msgid "Public Forums Only"
-msgstr "Solo foros públicos"
+msgid "Visible to anybody on %s."
+msgstr "Visible para cualquiera en %s."
-#: ../../include/dir_fns.php:145
-msgid "This Website Only"
-msgstr "Solo este sitio web"
+#: ../../include/items.php:1090
+msgid "Visible to all connections."
+msgstr "Visible para todas las conexiones."
-#: ../../include/event.php:824
-msgid "This event has been added to your calendar."
-msgstr "Este evento ha sido añadido a su calendario."
+#: ../../include/items.php:1092
+msgid "Visible to approved connections."
+msgstr "Visible para las conexiones permitidas."
-#: ../../include/event.php:1024
-msgid "Not specified"
-msgstr "Sin especificar"
+#: ../../include/items.php:1094
+msgid "Visible to specific connections."
+msgstr "Visible para conexiones específicas."
-#: ../../include/event.php:1025
-msgid "Needs Action"
-msgstr "Necesita de una intervención"
+#: ../../include/items.php:3892
+msgid "Privacy group is empty."
+msgstr "El grupo de canales está vacío."
-#: ../../include/event.php:1026
-msgid "Completed"
-msgstr "Completado/a"
+#: ../../include/items.php:3899
+#, php-format
+msgid "Privacy group: %s"
+msgstr "Grupo de canales: %s"
-#: ../../include/event.php:1027
-msgid "In Process"
-msgstr "En proceso"
+#: ../../include/items.php:3911
+msgid "Connection not found."
+msgstr "Conexión no encontrada"
-#: ../../include/event.php:1028
-msgid "Cancelled"
-msgstr "Cancelado/a"
+#: ../../include/items.php:4260
+msgid "profile photo"
+msgstr "foto del perfil"
-#: ../../include/import.php:30
-msgid ""
-"Cannot create a duplicate channel identifier on this system. Import failed."
-msgstr "No se ha podido crear un canal con un identificador que ya existe en este sistema. La importación ha fallado."
+#: ../../include/items.php:4456
+#, php-format
+msgid "[Edited %s]"
+msgstr "[se ha editado %s]"
-#: ../../include/import.php:97
-msgid "Channel clone failed. Import failed."
-msgstr "La clonación del canal no ha salido bien. La importación ha fallado."
+#: ../../include/items.php:4456
+msgctxt "edit_activity"
+msgid "Post"
+msgstr "Publicar"
-#: ../../include/import.php:1447
-msgid "Unable to import element \""
-msgstr "No se puede importar un elemento \""
+#: ../../include/items.php:4456
+msgctxt "edit_activity"
+msgid "Comment"
+msgstr "Comentar"
#: ../../include/auth.php:148
msgid "Logged out."
@@ -9729,10 +12371,6 @@ msgstr "Desconectado/a."
msgid "Failed authentication"
msgstr "Autenticación fallida."
-#: ../../include/auth.php:286
-msgid "Login failed."
-msgstr "El acceso ha fallado."
-
#: ../../include/activities.php:41
msgid " and "
msgstr " y "
@@ -9756,142 +12394,232 @@ msgstr "Visitar %2$s de %1$s"
msgid "%1$s has an updated %2$s, changing %3$s."
msgstr "%1$s ha actualizado %2$s, cambiando %3$s."
-#: ../../include/network.php:704
-msgid "view full size"
-msgstr "Ver en el tamaño original"
+#: ../../include/attach.php:248 ../../include/attach.php:336
+msgid "Item was not found."
+msgstr "Elemento no encontrado."
-#: ../../include/network.php:1953
-msgid "No Subject"
-msgstr "Sin asunto"
+#: ../../include/attach.php:497
+msgid "No source file."
+msgstr "Ningún fichero de origen"
-#: ../../include/network.php:2207 ../../include/network.php:2208
-msgid "Friendica"
-msgstr "Friendica"
+#: ../../include/attach.php:519
+msgid "Cannot locate file to replace"
+msgstr "No se puede localizar el fichero que va a ser sustituido."
-#: ../../include/network.php:2209
-msgid "OStatus"
-msgstr "OStatus"
+#: ../../include/attach.php:537
+msgid "Cannot locate file to revise/update"
+msgstr "No se puede localizar el fichero para revisar/actualizar"
-#: ../../include/network.php:2210
-msgid "GNU-Social"
-msgstr "GNU Social"
+#: ../../include/attach.php:668
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ", y %d persona más"
+msgstr[1] ", y %d personas más"
-#: ../../include/network.php:2211
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
+#: ../../include/attach.php:682
+#, php-format
+msgid "%s like this."
+msgstr "A %s le gusta esto."
-#: ../../include/network.php:2213
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../include/attach.php:852
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Error de carga, posiblemente por limite del sistema o porque la acción ha finalizado."
-#: ../../include/network.php:2214
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../include/attach.php:865
+msgid "Stored file could not be verified. Upload failed."
+msgstr "El fichero almacenado no ha podido ser verificado. El envío ha fallado."
-#: ../../include/network.php:2215
-msgid "Zot"
-msgstr "Zot"
+#: ../../include/attach.php:920 ../../include/attach.php:936
+msgid "Path not available."
+msgstr "Ruta no disponible."
-#: ../../include/network.php:2216
-msgid "LinkedIn"
-msgstr "LinkedIn"
+#: ../../include/attach.php:982 ../../include/attach.php:1140
+msgid "Empty pathname"
+msgstr "Ruta vacía"
-#: ../../include/network.php:2217
-msgid "XMPP/IM"
-msgstr "XMPP/IM"
+#: ../../include/attach.php:1008
+msgid "duplicate filename or path"
+msgstr "Nombre duplicado de ruta o fichero"
-#: ../../include/network.php:2218
-msgid "MySpace"
-msgstr "MySpace"
+#: ../../include/attach.php:1030
+msgid "Path not found."
+msgstr "Ruta no encontrada"
-#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
-#: ../../include/contact_widgets.php:91 ../../include/widgets.php:46
-#: ../../include/widgets.php:465
-msgid "Categories"
-msgstr "Temas"
+#: ../../include/attach.php:1094
+msgid "mkdir failed."
+msgstr "mkdir ha fallado."
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
-msgid "Tags"
-msgstr "Etiquetas"
+#: ../../include/attach.php:1098
+msgid "database storage failed."
+msgstr "el almacenamiento en la base de datos ha fallado."
-#: ../../include/taxonomy.php:293
-msgid "Keywords"
-msgstr "Palabras clave"
+#: ../../include/attach.php:1146
+msgid "Empty path"
+msgstr "Ruta vacía"
-#: ../../include/taxonomy.php:314
-msgid "have"
-msgstr "tener"
+#: ../../include/event.php:824
+msgid "This event has been added to your calendar."
+msgstr "Este evento ha sido añadido a su calendario."
-#: ../../include/taxonomy.php:314
-msgid "has"
-msgstr "tiene"
+#: ../../include/event.php:1024
+msgid "Not specified"
+msgstr "Sin especificar"
-#: ../../include/taxonomy.php:315
-msgid "want"
-msgstr "quiero"
+#: ../../include/event.php:1025
+msgid "Needs Action"
+msgstr "Necesita de una intervención"
-#: ../../include/taxonomy.php:315
-msgid "wants"
-msgstr "quiere"
+#: ../../include/event.php:1026
+msgid "Completed"
+msgstr "Completado/a"
-#: ../../include/taxonomy.php:316
-msgid "likes"
-msgstr "gusta de"
+#: ../../include/event.php:1027
+msgid "In Process"
+msgstr "En proceso"
-#: ../../include/taxonomy.php:317
-msgid "dislikes"
-msgstr "no gusta de"
+#: ../../include/event.php:1028
+msgid "Cancelled"
+msgstr "Cancelado/a"
-#: ../../include/contact_widgets.php:11
+#: ../../include/follow.php:27
+msgid "Channel is blocked on this site."
+msgstr "El canal está bloqueado en este sitio."
+
+#: ../../include/follow.php:32
+msgid "Channel location missing."
+msgstr "Falta la dirección del canal."
+
+#: ../../include/follow.php:80
+msgid "Response from remote channel was incomplete."
+msgstr "Respuesta incompleta del canal."
+
+#: ../../include/follow.php:97
+msgid "Channel was deleted and no longer exists."
+msgstr "El canal ha sido eliminado y ya no existe."
+
+#: ../../include/follow.php:147 ../../include/follow.php:183
+msgid "Protocol disabled."
+msgstr "Protocolo deshabilitado."
+
+#: ../../include/follow.php:171
+msgid "Channel discovery failed."
+msgstr "El intento de acceder al canal ha fallado."
+
+#: ../../include/follow.php:210
+msgid "Cannot connect to yourself."
+msgstr "No puede conectarse consigo mismo."
+
+#: ../../include/group.php:26
+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 "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente."
+
+#: ../../include/group.php:248
+msgid "Add new connections to this privacy group"
+msgstr "Añadir conexiones nuevas a este grupo de canales"
+
+#: ../../include/group.php:289
+msgid "edit"
+msgstr "editar"
+
+#: ../../include/group.php:312
+msgid "Edit group"
+msgstr "Editar grupo"
+
+#: ../../include/group.php:313
+msgid "Add privacy group"
+msgstr "Añadir un grupo de canales"
+
+#: ../../include/group.php:314
+msgid "Channels not in any privacy group"
+msgstr "Sin canales en ningún grupo"
+
+#: ../../include/group.php:316 ../../include/widgets.php:284
+msgid "add"
+msgstr "añadir"
+
+#: ../../include/language.php:380
+msgid "Select an alternate language"
+msgstr "Seleccionar un idioma alternativo"
+
+#: ../../include/photos.php:115
#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d invitación pendiente"
-msgstr[1] "%d invitaciones disponibles"
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "La imagen excede el límite de %lu bytes del sitio"
-#: ../../include/contact_widgets.php:19
-msgid "Find Channels"
-msgstr "Encontrar canales"
+#: ../../include/photos.php:122
+msgid "Image file is empty."
+msgstr "El fichero de imagen está vacío. "
-#: ../../include/contact_widgets.php:20
-msgid "Enter name or interest"
-msgstr "Introducir nombre o interés"
+#: ../../include/photos.php:260
+msgid "Photo storage failed."
+msgstr "La foto no ha podido ser guardada."
-#: ../../include/contact_widgets.php:21
-msgid "Connect/Follow"
-msgstr "Conectar/Seguir"
+#: ../../include/photos.php:300
+msgid "a new photo"
+msgstr "una nueva foto"
-#: ../../include/contact_widgets.php:22
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Ejemplos: José Fernández, Pesca"
+#: ../../include/photos.php:304
+#, php-format
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
+msgstr "%1$s ha publicado %2$s en %3$s"
-#: ../../include/contact_widgets.php:26
-msgid "Random Profile"
-msgstr "Perfil aleatorio"
+#: ../../include/photos.php:507 ../../include/conversation.php:1677
+msgid "Photo Albums"
+msgstr "Álbumes de fotos"
-#: ../../include/contact_widgets.php:27
-msgid "Invite Friends"
-msgstr "Invitar a amigos"
+#: ../../include/photos.php:511
+msgid "Upload New Photos"
+msgstr "Subir nuevas fotos"
-#: ../../include/contact_widgets.php:29
-msgid "Advanced example: name=fred and country=iceland"
-msgstr "Ejemplo avanzado: nombre=juan y país=españa"
+#: ../../include/acl_selectors.php:198
+msgid "Who can see this?"
+msgstr "¿Quién puede ver esto?"
-#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
-#: ../../include/widgets.php:349 ../../include/widgets.php:468
-msgid "Everything"
-msgstr "Todo"
+#: ../../include/acl_selectors.php:199
+msgid "Custom selection"
+msgstr "Selección personalizada"
-#: ../../include/contact_widgets.php:122
+#: ../../include/acl_selectors.php:200
+msgid ""
+"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
+" the scope of \"Show\"."
+msgstr "Seleccione \"Mostrar\" para permitir la visualización. La opción \"No mostrar\" le permite anular y limitar el alcance de \"Mostrar\"."
+
+#: ../../include/acl_selectors.php:201
+msgid "Show"
+msgstr "Mostrar"
+
+#: ../../include/acl_selectors.php:202
+msgid "Don't show"
+msgstr "No mostrar"
+
+#: ../../include/acl_selectors.php:235
#, php-format
-msgid "%d connection in common"
-msgid_plural "%d connections in common"
-msgstr[0] "%d conexión en común"
-msgstr[1] "%d conexiones en común"
+msgid ""
+"Post permissions %s cannot be changed %s after a post is shared.</br />These"
+" permissions set who is allowed to view the post."
+msgstr "Los permisos de la entrada %s no se pueden cambiar %s una vez que se ha compartido.</br /> Estos permisos establecen quién está autorizado para ver el mensaje."
-#: ../../include/contact_widgets.php:127
-msgid "show more"
-msgstr "mostrar más"
+#: ../../include/oembed.php:312
+msgid " by "
+msgstr "por"
+
+#: ../../include/oembed.php:313
+msgid " on "
+msgstr "en"
+
+#: ../../include/oembed.php:342
+msgid "Embedded content"
+msgstr "Contenido incorporado"
+
+#: ../../include/oembed.php:351
+msgid "Embedding disabled"
+msgstr "Incrustación deshabilitada"
#: ../../include/widgets.php:103
msgid "System"
@@ -10018,6 +12746,11 @@ msgstr "Exportar el calendario"
msgid "Import Calendar"
msgstr "Importar un calendario"
+#: ../../include/widgets.php:883 ../../include/conversation.php:1704
+#: ../../include/conversation.php:1707
+msgid "Chatrooms"
+msgstr "Salas de chat"
+
#: ../../include/widgets.php:887
msgid "Overview"
msgstr "Resumen"
@@ -10026,205 +12759,487 @@ msgstr "Resumen"
msgid "Chat Members"
msgstr "Miembros del chat"
-#: ../../include/widgets.php:916
+#: ../../include/widgets.php:906
msgid "Wiki List"
msgstr "Lista de wikis"
-#: ../../include/widgets.php:954
+#: ../../include/widgets.php:944
msgid "Wiki Pages"
msgstr "Páginas del wiki"
-#: ../../include/widgets.php:989
+#: ../../include/widgets.php:949
+msgid "Add new page"
+msgstr "Añadir una nueva página"
+
+#: ../../include/widgets.php:950
+msgid "Page name"
+msgstr "Nombre de la página"
+
+#: ../../include/widgets.php:983
msgid "Bookmarked Chatrooms"
msgstr "Salas de chat preferidas"
-#: ../../include/widgets.php:1020
+#: ../../include/widgets.php:1014
msgid "Suggested Chatrooms"
msgstr "Salas de chat sugeridas"
-#: ../../include/widgets.php:1166 ../../include/widgets.php:1278
+#: ../../include/widgets.php:1159 ../../include/widgets.php:1271
msgid "photo/image"
msgstr "foto/imagen"
-#: ../../include/widgets.php:1221
+#: ../../include/widgets.php:1214
msgid "Click to show more"
msgstr "Hacer clic para ver más"
-#: ../../include/widgets.php:1372
+#: ../../include/widgets.php:1365
msgid "Rating Tools"
msgstr "Valoraciones"
-#: ../../include/widgets.php:1376 ../../include/widgets.php:1378
+#: ../../include/widgets.php:1369 ../../include/widgets.php:1371
msgid "Rate Me"
msgstr "Valorar este canal"
-#: ../../include/widgets.php:1381
+#: ../../include/widgets.php:1374
msgid "View Ratings"
msgstr "Mostrar las valoraciones"
-#: ../../include/widgets.php:1465
+#: ../../include/widgets.php:1467
msgid "Forums"
msgstr "Foros"
-#: ../../include/widgets.php:1494
+#: ../../include/widgets.php:1496
msgid "Tasks"
msgstr "Tareas"
-#: ../../include/widgets.php:1505
-msgid "Documentation"
-msgstr "Documentación"
-
-#: ../../include/widgets.php:1561 ../../include/widgets.php:1599
+#: ../../include/widgets.php:1562 ../../include/widgets.php:1600
msgid "Member registrations waiting for confirmation"
msgstr "Inscripciones de nuevos miembros pendientes de aprobación"
-#: ../../include/widgets.php:1567
+#: ../../include/widgets.php:1568
msgid "Inspect queue"
msgstr "Examinar la cola"
-#: ../../include/widgets.php:1569
+#: ../../include/widgets.php:1570
msgid "DB updates"
msgstr "Actualizaciones de la base de datos"
-#: ../../include/widgets.php:1595
+#: ../../include/widgets.php:1596
msgid "Plugin Features"
msgstr "Extensiones"
-#: ../../include/api.php:1330
-msgid "Public Timeline"
-msgstr "Cronología pública"
+#: ../../include/network.php:729
+msgid "view full size"
+msgstr "Ver en el tamaño original"
-#: ../../include/oembed.php:322
-msgid " by "
-msgstr "por"
+#: ../../include/network.php:1978
+msgid "No Subject"
+msgstr "Sin asunto"
-#: ../../include/oembed.php:323
-msgid " on "
-msgstr "en"
+#: ../../include/network.php:2234
+msgid "OStatus"
+msgstr "OStatus"
-#: ../../include/oembed.php:352
-msgid "Embedded content"
-msgstr "Contenido incorporado"
+#: ../../include/network.php:2235
+msgid "GNU-Social"
+msgstr "GNU Social"
-#: ../../include/oembed.php:361
-msgid "Embedding disabled"
-msgstr "Incrustación deshabilitada"
+#: ../../include/network.php:2236
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
-#: ../../include/items.php:918 ../../include/items.php:963
-msgid "(Unknown)"
-msgstr "(Desconocido)"
+#: ../../include/network.php:2239
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../include/items.php:1162
-msgid "Visible to anybody on the internet."
-msgstr "Visible para cualquiera en internet."
+#: ../../include/network.php:2240
+msgid "Zot"
+msgstr "Zot"
-#: ../../include/items.php:1164
-msgid "Visible to you only."
-msgstr "Visible sólo para usted."
+#: ../../include/network.php:2241
+msgid "LinkedIn"
+msgstr "LinkedIn"
-#: ../../include/items.php:1166
-msgid "Visible to anybody in this network."
-msgstr "Visible para cualquiera en esta red."
+#: ../../include/network.php:2242
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
-#: ../../include/items.php:1168
-msgid "Visible to anybody authenticated."
-msgstr "Visible para cualquiera que esté autenticado."
+#: ../../include/network.php:2243
+msgid "MySpace"
+msgstr "MySpace"
-#: ../../include/items.php:1170
-#, php-format
-msgid "Visible to anybody on %s."
-msgstr "Visible para cualquiera en %s."
+#: ../../include/permissions.php:35
+msgid "Can view my normal stream and posts"
+msgstr "Pueden verse mi actividad y publicaciones normales"
-#: ../../include/items.php:1172
-msgid "Visible to all connections."
-msgstr "Visible para todas las conexiones."
+#: ../../include/permissions.php:39
+msgid "Can view my webpages"
+msgstr "Pueden verse mis páginas web"
-#: ../../include/items.php:1174
-msgid "Visible to approved connections."
-msgstr "Visible para las conexiones permitidas."
+#: ../../include/permissions.php:43
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Pueden crearse entradas en mi página de inicio del canal (“muro”)"
-#: ../../include/items.php:1176
-msgid "Visible to specific connections."
-msgstr "Visible para conexiones específicas."
+#: ../../include/permissions.php:46
+msgid "Can like/dislike stuff"
+msgstr "Puede marcarse contenido como me gusta/no me gusta"
-#: ../../include/items.php:3976
-msgid "Privacy group is empty."
-msgstr "El grupo de canales está vacío."
+#: ../../include/permissions.php:46
+msgid "Profiles and things other than posts/comments"
+msgstr "Perfiles y otras cosas aparte de publicaciones/comentarios"
+
+#: ../../include/permissions.php:48
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Puede enviarse una entrada a todos mis contactos del canal mediante una @mención"
+
+#: ../../include/permissions.php:48
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Avanzado - útil para crear canales de foros de discusión o grupos"
+
+#: ../../include/permissions.php:49
+msgid "Can chat with me (when available)"
+msgstr "Se puede charlar conmigo (cuando esté disponible)"
+
+#: ../../include/permissions.php:50
+msgid "Can write to my file storage and photos"
+msgstr "Puede escribirse en mi repositorio de ficheros y fotos"
+
+#: ../../include/permissions.php:51
+msgid "Can edit my webpages"
+msgstr "Pueden editarse mis páginas web"
+
+#: ../../include/permissions.php:53
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Algo avanzado - muy útil en comunidades abiertas"
-#: ../../include/items.php:3983
+#: ../../include/permissions.php:55
+msgid "Can administer my channel resources"
+msgstr "Pueden administrarse mis recursos del canal"
+
+#: ../../include/permissions.php:55
+msgid ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Muy avanzado. Déjelo a no ser que sepa bien lo que está haciendo."
+
+#: ../../include/conversation.php:204
#, php-format
-msgid "Privacy group: %s"
-msgstr "Grupo de canales: %s"
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s ahora está conectado/a con %2$s"
-#: ../../include/items.php:3995
-msgid "Connection not found."
-msgstr "Conexión no encontrada"
+#: ../../include/conversation.php:239
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s ha dado un toque a %2$s"
-#: ../../include/items.php:4348
-msgid "profile photo"
-msgstr "foto del perfil"
+#: ../../include/conversation.php:690
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "Ver el perfil @ %s de %s"
-#: ../../include/attach.php:248 ../../include/attach.php:334
-msgid "Item was not found."
-msgstr "Elemento no encontrado."
+#: ../../include/conversation.php:709
+msgid "Categories:"
+msgstr "Temas:"
-#: ../../include/attach.php:500
-msgid "No source file."
-msgstr "Ningún fichero de origen"
+#: ../../include/conversation.php:710
+msgid "Filed under:"
+msgstr "Archivado bajo:"
-#: ../../include/attach.php:522
-msgid "Cannot locate file to replace"
-msgstr "No se puede localizar el fichero que va a ser sustituido."
+#: ../../include/conversation.php:735
+msgid "View in context"
+msgstr "Mostrar en su contexto"
-#: ../../include/attach.php:540
-msgid "Cannot locate file to revise/update"
-msgstr "No se puede localizar el fichero para revisar/actualizar"
+#: ../../include/conversation.php:831
+msgid "remove"
+msgstr "eliminar"
+
+#: ../../include/conversation.php:836
+msgid "Delete Selected Items"
+msgstr "Eliminar elementos seleccionados"
+
+#: ../../include/conversation.php:929
+msgid "View Source"
+msgstr "Ver el código fuente de la entrada"
+
+#: ../../include/conversation.php:930
+msgid "Follow Thread"
+msgstr "Seguir este hilo"
+
+#: ../../include/conversation.php:931
+msgid "Unfollow Thread"
+msgstr "Dejar de seguir este hilo"
-#: ../../include/attach.php:675
+#: ../../include/conversation.php:936
+msgid "Activity/Posts"
+msgstr "Actividad y publicaciones"
+
+#: ../../include/conversation.php:938
+msgid "Edit Connection"
+msgstr "Editar conexión"
+
+#: ../../include/conversation.php:939
+msgid "Message"
+msgstr "Mensaje"
+
+#: ../../include/conversation.php:1075
#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "El fichero supera el limite de tamaño de %d"
+msgid "%s likes this."
+msgstr "A %s le gusta esto."
-#: ../../include/attach.php:689
+#: ../../include/conversation.php:1075
#, php-format
-msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
-msgstr "Ha alcanzado su límite de %1$.0f Mbytes de almacenamiento de adjuntos."
+msgid "%s doesn't like this."
+msgstr "A %s no le gusta esto."
-#: ../../include/attach.php:854
-msgid "File upload failed. Possible system limit or action terminated."
-msgstr "Error de carga, posiblemente por limite del sistema o porque la acción ha finalizado."
+#: ../../include/conversation.php:1079
+#, php-format
+msgid "<span %1$s>%2$d people</span> like this."
+msgid_plural "<span %1$s>%2$d people</span> like this."
+msgstr[0] "a <span %1$s>%2$d personas</span> le gusta esto."
+msgstr[1] "A <span %1$s>%2$d personas</span> les gusta esto."
-#: ../../include/attach.php:867
-msgid "Stored file could not be verified. Upload failed."
-msgstr "El fichero almacenado no ha podido ser verificado. El envío ha fallado."
+#: ../../include/conversation.php:1081
+#, php-format
+msgid "<span %1$s>%2$d people</span> don't like this."
+msgid_plural "<span %1$s>%2$d people</span> don't like this."
+msgstr[0] "a <span %1$s>%2$d personas</span> no les gusta esto."
+msgstr[1] "A <span %1$s>%2$d personas</span> no les gusta esto."
-#: ../../include/attach.php:923 ../../include/attach.php:939
-msgid "Path not available."
-msgstr "Ruta no disponible."
+#: ../../include/conversation.php:1087
+msgid "and"
+msgstr "y"
-#: ../../include/attach.php:985 ../../include/attach.php:1137
-msgid "Empty pathname"
-msgstr "Ruta vacía"
+#: ../../include/conversation.php:1090
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ", y %d persona más"
+msgstr[1] ", y %d personas más"
-#: ../../include/attach.php:1011
-msgid "duplicate filename or path"
-msgstr "Nombre duplicado de ruta o fichero"
+#: ../../include/conversation.php:1091
+#, php-format
+msgid "%s like this."
+msgstr "A %s le gusta esto."
-#: ../../include/attach.php:1033
-msgid "Path not found."
-msgstr "Ruta no encontrada"
+#: ../../include/conversation.php:1091
+#, php-format
+msgid "%s don't like this."
+msgstr "A %s no le gusta esto."
-#: ../../include/attach.php:1091
-msgid "mkdir failed."
-msgstr "mkdir ha fallado."
+#: ../../include/conversation.php:1134
+msgid "Set your location"
+msgstr "Establecer su ubicación"
-#: ../../include/attach.php:1095
-msgid "database storage failed."
-msgstr "el almacenamiento en la base de datos ha fallado."
+#: ../../include/conversation.php:1135
+msgid "Clear browser location"
+msgstr "Eliminar los datos de localización geográfica del navegador"
-#: ../../include/attach.php:1143
-msgid "Empty path"
-msgstr "Ruta vacía"
+#: ../../include/conversation.php:1183
+msgid "Tag term:"
+msgstr "Término de la etiqueta:"
+
+#: ../../include/conversation.php:1184
+msgid "Where are you right now?"
+msgstr "¿Donde está ahora?"
+
+#: ../../include/conversation.php:1189
+msgid "Choose a different album..."
+msgstr "Elegir un álbum diferente..."
+
+#: ../../include/conversation.php:1193
+msgid "Comments enabled"
+msgstr "Comentarios habilitados"
+
+#: ../../include/conversation.php:1194
+msgid "Comments disabled"
+msgstr "Comentarios deshabilitados"
+
+#: ../../include/conversation.php:1232
+msgid "Page link name"
+msgstr "Nombre del enlace de la página"
+
+#: ../../include/conversation.php:1235
+msgid "Post as"
+msgstr "Publicar como"
+
+#: ../../include/conversation.php:1249
+msgid "Toggle voting"
+msgstr "Cambiar votación"
+
+#: ../../include/conversation.php:1252
+msgid "Disable comments"
+msgstr "Dehabilitar los comentarios"
+
+#: ../../include/conversation.php:1253
+msgid "Toggle comments"
+msgstr "Activar o desactivar los comentarios"
+
+#: ../../include/conversation.php:1261
+msgid "Categories (optional, comma-separated list)"
+msgstr "Temas (opcional, lista separada por comas)"
+
+#: ../../include/conversation.php:1284
+msgid "Other networks and post services"
+msgstr "Otras redes y servicios de publicación"
+
+#: ../../include/conversation.php:1290
+msgid "Set publish date"
+msgstr "Establecer la fecha de publicación"
+
+#: ../../include/conversation.php:1544
+msgid "Discover"
+msgstr "Descubrir"
+
+#: ../../include/conversation.php:1547
+msgid "Imported public streams"
+msgstr "Contenidos públicos importados"
+
+#: ../../include/conversation.php:1552
+msgid "Commented Order"
+msgstr "Comentarios recientes"
+
+#: ../../include/conversation.php:1555
+msgid "Sort by Comment Date"
+msgstr "Ordenar por fecha de comentario"
+
+#: ../../include/conversation.php:1559
+msgid "Posted Order"
+msgstr "Publicaciones recientes"
+
+#: ../../include/conversation.php:1562
+msgid "Sort by Post Date"
+msgstr "Ordenar por fecha de publicación"
+
+#: ../../include/conversation.php:1570
+msgid "Posts that mention or involve you"
+msgstr "Publicaciones que le mencionan o involucran"
+
+#: ../../include/conversation.php:1579
+msgid "Activity Stream - by date"
+msgstr "Contenido - por fecha"
+
+#: ../../include/conversation.php:1585
+msgid "Starred"
+msgstr "Preferidas"
+
+#: ../../include/conversation.php:1588
+msgid "Favourite Posts"
+msgstr "Publicaciones favoritas"
+
+#: ../../include/conversation.php:1595
+msgid "Spam"
+msgstr "Correo basura"
+
+#: ../../include/conversation.php:1598
+msgid "Posts flagged as SPAM"
+msgstr "Publicaciones marcadas como basura"
+
+#: ../../include/conversation.php:1656
+msgid "Status Messages and Posts"
+msgstr "Mensajes de estado y publicaciones"
+
+#: ../../include/conversation.php:1668
+msgid "Profile Details"
+msgstr "Detalles del perfil"
+
+#: ../../include/conversation.php:1684
+msgid "Files and Storage"
+msgstr "Ficheros y repositorio"
+
+#: ../../include/conversation.php:1720
+msgid "Saved Bookmarks"
+msgstr "Marcadores guardados"
+
+#: ../../include/conversation.php:1730
+msgid "Manage Webpages"
+msgstr "Administrar páginas web"
+
+#: ../../include/conversation.php:1795
+msgctxt "noun"
+msgid "Attending"
+msgid_plural "Attending"
+msgstr[0] "Participaré"
+msgstr[1] "Participaré"
+
+#: ../../include/conversation.php:1798
+msgctxt "noun"
+msgid "Not Attending"
+msgid_plural "Not Attending"
+msgstr[0] "No participaré"
+msgstr[1] "No participaré"
+
+#: ../../include/conversation.php:1801
+msgctxt "noun"
+msgid "Undecided"
+msgid_plural "Undecided"
+msgstr[0] "Indeciso/a"
+msgstr[1] "Indecisos/as"
+
+#: ../../include/conversation.php:1804
+msgctxt "noun"
+msgid "Agree"
+msgid_plural "Agrees"
+msgstr[0] "De acuerdo"
+msgstr[1] "De acuerdo"
+
+#: ../../include/conversation.php:1807
+msgctxt "noun"
+msgid "Disagree"
+msgid_plural "Disagrees"
+msgstr[0] "En desacuerdo"
+msgstr[1] "En desacuerdo"
+
+#: ../../include/conversation.php:1810
+msgctxt "noun"
+msgid "Abstain"
+msgid_plural "Abstains"
+msgstr[0] "se abstiene"
+msgstr[1] "Se abstienen"
+
+#: ../../include/bbcode.php:134 ../../include/bbcode.php:962
+#: ../../include/bbcode.php:965 ../../include/bbcode.php:970
+#: ../../include/bbcode.php:973 ../../include/bbcode.php:976
+#: ../../include/bbcode.php:979 ../../include/bbcode.php:984
+#: ../../include/bbcode.php:987 ../../include/bbcode.php:992
+#: ../../include/bbcode.php:995 ../../include/bbcode.php:998
+#: ../../include/bbcode.php:1001
+msgid "Image/photo"
+msgstr "Imagen/foto"
+
+#: ../../include/bbcode.php:173 ../../include/bbcode.php:1012
+msgid "Encrypted content"
+msgstr "Contenido cifrado"
+
+#: ../../include/bbcode.php:189
+#, php-format
+msgid "Install %s element: "
+msgstr "Instalar el elemento %s:"
+
+#: ../../include/bbcode.php:193
+#, php-format
+msgid ""
+"This post contains an installable %s element, however you lack permissions "
+"to install it on this site."
+msgstr "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio."
+
+#: ../../include/bbcode.php:272
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s escribió %2$s siguiente %3$s"
+
+#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
+msgid "Click to open/close"
+msgstr "Pulsar para abrir/cerrar"
+
+#: ../../include/bbcode.php:357
+msgid "spoiler"
+msgstr "spoiler"
+
+#: ../../include/bbcode.php:950
+msgid "$1 wrote:"
+msgstr "$1 escribió:"
+
+#: ../../util/nconfig.php:34
+msgid "Source channel not found."
+msgstr "No se ha encontrado el canal de origen."
#: ../../view/theme/redbasic/php/config.php:9
msgid "Focus (Hubzilla default)"
@@ -10358,66 +13373,66 @@ msgstr "Ajustar el tamaño de la foto del autor de la conversación"
msgid "Set size of followup author photos"
msgstr "Ajustar el tamaño de foto de los seguidores del autor"
-#: ../../boot.php:1195
+#: ../../boot.php:1176
#, php-format
msgctxt "opensearch"
msgid "Search %1$s (%2$s)"
msgstr "Buscar %1$s (%2$s)"
-#: ../../boot.php:1195
+#: ../../boot.php:1176
msgctxt "opensearch"
msgid "$Projectname"
msgstr "$Projectname"
-#: ../../boot.php:1513
+#: ../../boot.php:1494
#, php-format
msgid "Update %s failed. See error logs."
msgstr "La actualización %s ha fallado. Mire el informe de errores."
-#: ../../boot.php:1516
+#: ../../boot.php:1497
#, php-format
msgid "Update Error at %s"
msgstr "Error de actualización en %s"
-#: ../../boot.php:1720
+#: ../../boot.php:1701
msgid ""
"Create an account to access services and applications within the Hubzilla"
msgstr "Crear una cuenta para acceder a los servicios y aplicaciones dentro de Hubzilla"
-#: ../../boot.php:1741
+#: ../../boot.php:1722
msgid "Login/Email"
msgstr "Inicio de sesión / Correo electrónico"
-#: ../../boot.php:1742
+#: ../../boot.php:1723
msgid "Password"
msgstr "Contraseña"
-#: ../../boot.php:1743
+#: ../../boot.php:1724
msgid "Remember me"
msgstr "Recordarme"
-#: ../../boot.php:1746
+#: ../../boot.php:1727
msgid "Forgot your password?"
msgstr "¿Olvidó su contraseña?"
-#: ../../boot.php:2315
+#: ../../boot.php:2288
msgid "toggle mobile"
msgstr "cambiar a modo móvil"
-#: ../../boot.php:2470
+#: ../../boot.php:2443
msgid "Website SSL certificate is not valid. Please correct."
msgstr "El certificado SSL del sitio web no es válido. Por favor, solucione el problema."
-#: ../../boot.php:2473
+#: ../../boot.php:2446
#, php-format
msgid "[hubzilla] Website SSL error for %s"
msgstr "[hubzilla] Error SSL del sitio web en %s"
-#: ../../boot.php:2577
+#: ../../boot.php:2563
msgid "Cron/Scheduled tasks not running."
msgstr "Las tareas del Planificador/Cron no están funcionando."
-#: ../../boot.php:2581
+#: ../../boot.php:2567
#, php-format
msgid "[hubzilla] Cron tasks not running on %s"
msgstr "[hubzilla] Las tareas de Cron no están funcionando en %s"
diff --git a/view/es-es/hstrings.php b/view/es-es/hstrings.php
index dd97c81c7..1fde618ea 100644
--- a/view/es-es/hstrings.php
+++ b/view/es-es/hstrings.php
@@ -35,7 +35,7 @@ App::$strings["Can send me private mail messages"] = "Se me pueden enviar mensaj
App::$strings["Can like/dislike profiles and profile things"] = "Se puede mostrar agrado o desagrado (Me gusta / No me gusta) en mis perfiles y sus distintos apartados";
App::$strings["Can forward to all my channel connections via @+ mentions in posts"] = "Pueden reenviarse publicaciones a todas las conexiones de mi canal a través de @+ menciones en las entradas";
App::$strings["Can chat with me"] = "Se puede chatear conmigo";
-App::$strings["Can source my public posts in derived channels"] = "Pueden utilizarse mis publicaciones públicas como origen de contenidos en canales derivados";
+App::$strings["Can source my public posts in derived channels"] = "Pueden utilizarse mis entradas públicas como origen de contenidos en canales derivados";
App::$strings["Can administer my channel"] = "Se puede administrar mi canal";
App::$strings["parent"] = "padre";
App::$strings["Collection"] = "Colección";
@@ -63,7 +63,6 @@ App::$strings["Create new folder"] = "Crear nueva carpeta";
App::$strings["Upload file"] = "Subir fichero";
App::$strings["Drop files here to immediately upload"] = "Arrastre los ficheros aquí para subirlos de forma inmediata";
App::$strings["Permission denied."] = "Acceso denegado.";
-App::$strings["Not Found"] = "No encontrado";
App::$strings["Page not found."] = "Página no encontrada.";
App::$strings["Permission denied"] = "Permiso denegado";
App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo.";
@@ -72,117 +71,233 @@ App::$strings["Requested profile is not available."] = "El perfil solicitado no
App::$strings["Some blurb about what to do when you're new here"] = "Algunas propuestas para el nuevo usuario sobre qué se puede hacer aquí";
App::$strings["Away"] = "Ausente";
App::$strings["Online"] = "Conectado/a";
-App::$strings["No such group"] = "No se encuentra el grupo";
-App::$strings["No such channel"] = "No se encuentra el canal";
-App::$strings["forum"] = "foro";
-App::$strings["Search Results For:"] = "Buscar resultados para:";
-App::$strings["Privacy group is empty"] = "El grupo de canales está vacío";
-App::$strings["Privacy group: "] = "Grupo de canales: ";
-App::$strings["Invalid connection."] = "Conexión no válida.";
+App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Se ha superado el límite máximo de inscripciones diarias de este sitio. Por favor, pruebe de nuevo mañana.";
+App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Por favor, confirme que acepta los Términos del servicio. El registro ha fallado.";
+App::$strings["Passwords do not match."] = "Las contraseñas no coinciden.";
+App::$strings["Registration successful. Please check your email for validation instructions."] = "Registro realizado con éxito. Por favor, compruebe su correo electrónico para ver las instrucciones para validarlo.";
+App::$strings["Your registration is pending approval by the site owner."] = "Su registro está pendiente de aprobación por el propietario del sitio.";
+App::$strings["Your registration can not be processed."] = "Su registro no puede ser procesado.";
+App::$strings["Registration on this hub is disabled."] = "El registro está deshabilitado en este sitio.";
+App::$strings["Registration on this hub is by approval only."] = "El registro en este hub está sometido a aprobación previa.";
+App::$strings["<a href=\"pubsites\">Register at another affiliated hub.</a>"] = "<a href=\"pubsites\">Registrarse en otro hub afiliado.</a>";
+App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Este sitio ha excedido el límite de inscripción diaria de cuentas. Por favor, inténtelo de nuevo mañana.";
+App::$strings["Terms of Service"] = "Términos del servicio";
+App::$strings["I accept the %s for this website"] = "Acepto los %s de este sitio";
+App::$strings["I am over 13 years of age and accept the %s for this website"] = "Tengo más de 13 años de edad y acepto los %s de este sitio";
+App::$strings["Your email address"] = "Su dirección de correo electrónico";
+App::$strings["Choose a password"] = "Elija una contraseña";
+App::$strings["Please re-enter your password"] = "Por favor, vuelva a escribir su contraseña";
+App::$strings["Please enter your invitation code"] = "Por favor, introduzca el código de su invitación";
+App::$strings["Name or caption"] = "Nombre o descripción";
+App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Ejemplos: \"Juan García\", \"Luisa y sus caballos\", \"Fútbol\", \"Grupo de aviación\"";
+App::$strings["Choose a short nickname"] = "Elija un alias corto";
+App::$strings["Your nickname will be used to create an easy to remember channel address e.g. nickname%s"] = "Su alias se usará para crear una dirección de canal fácil de recordar, p. ej.: alias%s";
+App::$strings["Channel role and privacy"] = "Clase de canal y privacidad";
+App::$strings["Select a channel role with your privacy requirements."] = "Seleccione un tipo de canal con sus requisitos de privacidad";
+App::$strings["Read more about roles"] = "Leer más sobre los roles";
+App::$strings["no"] = "no";
+App::$strings["yes"] = "sí";
+App::$strings["Registration"] = "Registro";
+App::$strings["Membership on this site is by invitation only."] = "Para registrarse en este sitio es necesaria una invitación.";
+App::$strings["Register"] = "Registrarse";
+App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Este sitio puede requerir una verificación de correo electrónico después de enviar este formulario. Si es devuelto a una página de inicio de sesión, compruebe su email para recibir y leer las instrucciones.";
App::$strings["Fetching URL returns error: %1\$s"] = "Al intentar obtener la dirección, retorna el error: %1\$s";
-App::$strings["network"] = "red";
-App::$strings["RSS"] = "RSS";
-App::$strings["You must be logged in to see this page."] = "Debe haber iniciado sesión para poder ver esta página.";
-App::$strings["Posts and comments"] = "Publicaciones y comentarios";
-App::$strings["Only posts"] = "Solo publicaciones";
-App::$strings["Insufficient permissions. Request redirected to profile page."] = "Permisos insuficientes. Petición redirigida a la página del perfil.";
-App::$strings["Your service plan only allows %d channels."] = "Su paquete de servicios solo permite %d canales.";
-App::$strings["Nothing to import."] = "No hay nada para importar.";
-App::$strings["Unable to download data from old server"] = "No se han podido descargar datos de su antiguo servidor";
-App::$strings["Imported file is empty."] = "El fichero importado está vacío.";
-App::$strings["Warning: Database versions differ by %1\$d updates."] = "Atención: Las versiones de la base de datos difieren en %1\$d actualizaciones.";
-App::$strings["Cloned channel not found. Import failed."] = "No se ha podido importar el canal porque el canal clonado no se ha encontrado.";
-App::$strings["No channel. Import failed."] = "No hay canal. La importación ha fallado";
-App::$strings["Import completed."] = "Importación completada.";
-App::$strings["You must be logged in to use this feature."] = "Debe estar registrado para poder usar esta funcionalidad.";
-App::$strings["Import Channel"] = "Importar canal";
-App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación.";
-App::$strings["File to Upload"] = "Fichero para subir";
-App::$strings["Or provide the old server/hub details"] = "O proporcione los detalles de su antiguo servidor/hub";
-App::$strings["Your old identity address (xyz@example.com)"] = "Su identidad en el antiguo servidor (canal@ejemplo.com)";
-App::$strings["Your old login email address"] = "Su antigua dirección de correo electrónico";
-App::$strings["Your old login password"] = "Su antigua contraseña";
-App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos.";
-App::$strings["Make this hub my primary location"] = "Convertir este servidor en mi ubicación primaria";
-App::$strings["Import existing posts if possible (experimental - limited by available memory"] = "Importar el contenido publicado si es posible (experimental - limitado por la memoria disponible";
-App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine.";
+App::$strings["Profile Match"] = "Perfil compatible";
+App::$strings["No keywords to match. Please add keywords to your default profile."] = "No hay palabras clave en el perfil principal para poder encontrar perfiles compatibles. Por favor, añada palabras clave a su perfil principal.";
+App::$strings["is interested in:"] = "está interesado en:";
+App::$strings["Connect"] = "Conectar";
+App::$strings["No matches"] = "No se han encontrado perfiles compatibles";
+App::$strings["Could not access contact record."] = "No se ha podido acceder al registro de contacto.";
+App::$strings["Could not locate selected profile."] = "No se ha podido localizar el perfil seleccionado.";
+App::$strings["Connection updated."] = "Conexión actualizada.";
+App::$strings["Failed to update connection record."] = "Error al actualizar el registro de la conexión.";
+App::$strings["is now connected to"] = "ahora está conectado/a";
+App::$strings["No"] = "No";
+App::$strings["Yes"] = "Sí";
+App::$strings["Could not access address book record."] = "No se pudo acceder al registro en su libreta de direcciones.";
+App::$strings["Refresh failed - channel is currently unavailable."] = "Recarga fallida - no se puede encontrar el canal en este momento.";
+App::$strings["Unable to set address book parameters."] = "No ha sido posible establecer los parámetros de la libreta de direcciones.";
+App::$strings["Connection has been removed."] = "La conexión ha sido eliminada.";
+App::$strings["View Profile"] = "Ver el perfil";
+App::$strings["View %s's profile"] = "Ver el perfil de %s";
+App::$strings["Refresh Permissions"] = "Recargar los permisos";
+App::$strings["Fetch updated permissions"] = "Obtener los permisos actualizados";
+App::$strings["Recent Activity"] = "Actividad reciente";
+App::$strings["View recent posts and comments"] = "Ver publicaciones y comentarios recientes";
+App::$strings["Unblock"] = "Desbloquear";
+App::$strings["Block"] = "Bloquear";
+App::$strings["Block (or Unblock) all communications with this connection"] = "Bloquear (o desbloquear) todas las comunicaciones con esta conexión";
+App::$strings["This connection is blocked!"] = "¡Esta conexión está bloqueada!";
+App::$strings["Unignore"] = "Dejar de ignorar";
+App::$strings["Ignore"] = "Ignorar";
+App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Ignorar (o dejar de ignorar) todas las comunicaciones entrantes de esta conexión";
+App::$strings["This connection is ignored!"] = "¡Esta conexión es ignorada!";
+App::$strings["Unarchive"] = "Desarchivar";
+App::$strings["Archive"] = "Archivar";
+App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Archiva (o desarchiva) esta conexión - marca el canal como muerto aunque mantiene sus contenidos";
+App::$strings["This connection is archived!"] = "¡Esta conexión esta archivada!";
+App::$strings["Unhide"] = "Mostrar";
+App::$strings["Hide"] = "Ocultar";
+App::$strings["Hide or Unhide this connection from your other connections"] = "Ocultar o mostrar esta conexión a sus otras conexiones";
+App::$strings["This connection is hidden!"] = "¡Esta conexión está oculta!";
+App::$strings["Delete this connection"] = "Eliminar esta conexión";
+App::$strings["Me"] = "Yo";
+App::$strings["Family"] = "Familia";
+App::$strings["Friends"] = "Amigos/as";
+App::$strings["Acquaintances"] = "Conocidos/as";
+App::$strings["All"] = "Todos/as";
+App::$strings["Approve this connection"] = "Aprobar esta conexión";
+App::$strings["Accept connection to allow communication"] = "Aceptar la conexión para permitir la comunicación";
+App::$strings["Set Affinity"] = "Ajustar la afinidad";
+App::$strings["Set Profile"] = "Ajustar el perfil";
+App::$strings["Set Affinity & Profile"] = "Ajustar la afinidad y el perfil";
+App::$strings["none"] = "-";
+App::$strings["Connection Default Permissions"] = "Permisos predeterminados de conexión";
+App::$strings["Connection: %s"] = "Conexión: %s";
+App::$strings["Apply these permissions automatically"] = "Aplicar estos permisos automaticamente";
+App::$strings["Connection requests will be approved without your interaction"] = "Las solicitudes de conexión serán aprobadas sin su intervención";
+App::$strings["This connection's primary address is"] = "La dirección primaria de esta conexión es";
+App::$strings["Available locations:"] = "Ubicaciones disponibles:";
+App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Los permisos indicados en esta página serán aplicados en todas las nuevas conexiones.";
+App::$strings["Connection Tools"] = "Gestión de las conexiones";
+App::$strings["Slide to adjust your degree of friendship"] = "Deslizar para ajustar el grado de amistad";
+App::$strings["Rating"] = "Valoración";
+App::$strings["Slide to adjust your rating"] = "Deslizar para ajustar su valoración";
+App::$strings["Optionally explain your rating"] = "Opcionalmente, puede explicar su valoración";
+App::$strings["Custom Filter"] = "Filtro personalizado";
+App::$strings["Only import posts with this text"] = "Importar solo entradas que contengan este texto";
+App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "Una sola opción por línea: palabras, #etiquetas, /patrones/ o lang=xx. Dejar en blanco para importarlo todo";
+App::$strings["Do not import posts with this text"] = "No importar entradas que contengan este texto";
+App::$strings["This information is public!"] = "¡Esta información es pública!";
+App::$strings["Connection Pending Approval"] = "Conexión pendiente de aprobación";
+App::$strings["inherited"] = "heredado";
App::$strings["Submit"] = "Enviar";
+App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Por favor, escoja el perfil que quiere mostrar a %s cuando esté viendo su perfil de forma segura.";
+App::$strings["Their Settings"] = "Sus ajustes";
+App::$strings["My Settings"] = "Mis ajustes";
+App::$strings["Individual Permissions"] = "Permisos individuales";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. <strong>No</strong> puede cambiar estos ajustes aquí.";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados.";
+App::$strings["Last update:"] = "Última actualización:";
+App::$strings["Invalid message"] = "Mensaje no válido";
+App::$strings["no results"] = "sin resultados";
+App::$strings["channel sync processed"] = "se ha realizado la sincronización del canal";
+App::$strings["queued"] = "encolado";
+App::$strings["posted"] = "enviado";
+App::$strings["accepted for delivery"] = "aceptado para el envío";
+App::$strings["updated"] = "actualizado";
+App::$strings["update ignored"] = "actualización ignorada";
+App::$strings["permission denied"] = "permiso denegado";
+App::$strings["recipient not found"] = "destinatario no encontrado";
+App::$strings["mail recalled"] = "mensaje de correo revocado";
+App::$strings["duplicate mail received"] = "se ha recibido mensaje duplicado";
+App::$strings["mail delivered"] = "correo enviado";
+App::$strings["Delivery report for %1\$s"] = "Informe de entrega para %1\$s";
+App::$strings["Options"] = "Opciones";
+App::$strings["Redeliver"] = "Volver a enviar";
App::$strings["Bookmark added"] = "Marcador añadido";
App::$strings["My Bookmarks"] = "Mis marcadores";
App::$strings["My Connections Bookmarks"] = "Marcadores de mis conexiones";
-App::$strings["%s account blocked/unblocked"] = array(
- 0 => "%s cuenta bloqueada/desbloqueada",
- 1 => "%s cuenta bloqueada/desbloqueada",
-);
-App::$strings["%s account deleted"] = array(
- 0 => "%s cuentas eliminadas",
- 1 => "%s cuentas eliminadas",
-);
-App::$strings["Account not found"] = "Cuenta no encontrada";
-App::$strings["Account '%s' deleted"] = "La cuenta '%s' ha sido eliminada";
-App::$strings["Account '%s' blocked"] = "La cuenta '%s' ha sido bloqueada";
-App::$strings["Account '%s' unblocked"] = "La cuenta '%s' ha sido desbloqueada";
-App::$strings["Administration"] = "Administración";
-App::$strings["Accounts"] = "Cuentas";
-App::$strings["select all"] = "seleccionar todo";
-App::$strings["Registrations waiting for confirm"] = "Inscripciones en espera de confirmación";
-App::$strings["Request date"] = "Fecha de solicitud";
-App::$strings["Email"] = "Correo electrónico";
-App::$strings["No registrations."] = "Sin registros.";
-App::$strings["Approve"] = "Aprobar";
-App::$strings["Deny"] = "Rechazar";
-App::$strings["Block"] = "Bloquear";
-App::$strings["Unblock"] = "Desbloquear";
-App::$strings["ID"] = "ID";
-App::$strings["All Channels"] = "Todos los canales";
-App::$strings["Register date"] = "Fecha de registro";
-App::$strings["Last login"] = "Último acceso";
-App::$strings["Expires"] = "Caduca";
-App::$strings["Service Class"] = "Clase de servicio";
-App::$strings["Selected accounts will be deleted!\\n\\nEverything these accounts had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "¡Las cuentas seleccionadas van a ser eliminadas!\\n\\n¡Todo lo que estas cuentas han publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?";
-App::$strings["The account {0} will be deleted!\\n\\nEverything this account has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "¡La cuenta {0} va a ser eliminada!\\n\\n¡Todo lo que esta cuenta ha publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?";
-App::$strings["%s channel censored/uncensored"] = array(
- 0 => "%s canales censurados/no censurados",
- 1 => "%s canales censurados/no censurados",
-);
-App::$strings["%s channel code allowed/disallowed"] = array(
- 0 => "%s código permitido/no permitido al canal",
- 1 => "%s código permitido/no permitido al canal",
-);
-App::$strings["%s channel deleted"] = array(
- 0 => "%s canales eliminados",
- 1 => "%s canales eliminados",
-);
-App::$strings["Channel not found"] = "Canal no encontrado";
-App::$strings["Channel '%s' deleted"] = "Canal '%s' eliminado";
-App::$strings["Channel '%s' censored"] = "Canal '%s' censurado";
-App::$strings["Channel '%s' uncensored"] = "Canal '%s' no censurado";
-App::$strings["Channel '%s' code allowed"] = "Código permitido al canal '%s'";
-App::$strings["Channel '%s' code disallowed"] = "Código no permitido al canal '%s'";
-App::$strings["Channels"] = "Canales";
-App::$strings["Censor"] = "Censurar";
-App::$strings["Uncensor"] = "No censurar";
-App::$strings["Allow Code"] = "Permitir código";
-App::$strings["Disallow Code"] = "No permitir código";
-App::$strings["Channel"] = "Canal";
-App::$strings["UID"] = "UID";
+App::$strings["network"] = "red";
+App::$strings["RSS"] = "RSS";
+App::$strings["Location not found."] = "Dirección no encontrada.";
+App::$strings["Location lookup failed."] = "Ha fallado la búsqueda de la dirección.";
+App::$strings["Please select another location to become primary before removing the primary location."] = "Por favor, seleccione una copia de su canal (un clon) para convertirlo en primario antes de eliminar su canal principal.";
+App::$strings["Syncing locations"] = "Sincronizando ubicaciones";
+App::$strings["No locations found."] = "No encontrada ninguna dirección.";
+App::$strings["Manage Channel Locations"] = "Gestionar las direcciones del canal";
+App::$strings["Location"] = "Ubicación";
App::$strings["Address"] = "Dirección";
-App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Los canales seleccionados se eliminarán!\\n\\nTodo lo publicado por estos canales en este sitio se borrarán definitivamente!\\n\\n¿Está seguro de querer hacerlo?";
-App::$strings["The channel {0} will be deleted!\\n\\nEverything that was posted in this channel on this site will be permanently deleted!\\n\\nAre you sure?"] = "El canal {0} va a ser eliminado!\\n\\nTodo lo publicado por el canal en este sitio se borrará definitivamente!\\n\\n¿Está seguro de querer hacerlo?";
-App::$strings["Update has been marked successful"] = "La actualización ha sido marcada como exitosa";
-App::$strings["Executing %s failed. Check system logs."] = "La ejecución de %s ha fallado. Mirar en los informes del sistema.";
-App::$strings["Update %s was successfully applied."] = "La actualización de %s se ha realizado exitosamente.";
-App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "La actualización de %s no ha devuelto ningún estado. No se sabe si ha tenido éxito.";
-App::$strings["Update function %s could not be found."] = "No se encuentra la función de actualización de %s.";
-App::$strings["No failed updates."] = "No ha fallado ninguna actualización.";
-App::$strings["Failed Updates"] = "Han fallado las actualizaciones";
-App::$strings["Mark success (if update was manually applied)"] = "Marcar como exitosa (si la actualización se ha hecho manualmente)";
-App::$strings["Attempt to execute this update step automatically"] = "Intentar ejecutar este paso de actualización automáticamente";
+App::$strings["Primary"] = "Primario";
+App::$strings["Drop"] = "Eliminar";
+App::$strings["Sync Now"] = "Sincronizar ahora";
+App::$strings["Please wait several minutes between consecutive operations."] = "Por favor, espere algunos minutos entre operaciones consecutivas.";
+App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal.";
+App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo.";
+App::$strings["Continue"] = "Continuar";
+App::$strings["Premium Channel Setup"] = "Configuración del canal premium";
+App::$strings["Enable premium channel connection restrictions"] = "Habilitar restricciones de conexión del canal premium";
+App::$strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Por favor introduzca sus restricciones o condiciones, como recibo de paypal, normas de uso, etc.";
+App::$strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Este canal puede requerir antes de conectar unos pasos adicionales o el conocimiento de las siguientes condiciones:";
+App::$strings["Potential connections will then see the following text before proceeding:"] = "Las posibles conexiones verán, por tanto, el siguiente texto antes de proceder:";
+App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Al continuar, certifico que he cumplido con todas las instrucciones proporcionadas en esta página.";
+App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(No ha sido proporcionada ninguna instrucción específica por el propietario del canal.)";
+App::$strings["Restricted or Premium Channel"] = "Canal premium o restringido";
+App::$strings["Invalid item."] = "Elemento no válido.";
+App::$strings["Channel not found."] = "Canal no encontrado.";
+App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
+App::$strings["Save to Folder:"] = "Guardar en carpeta:";
+App::$strings["- select -"] = "- seleccionar -";
+App::$strings["Save"] = "Guardar";
+App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Ha creado %1$.0f de %2$.0f canales permitidos.";
+App::$strings["Create a new channel"] = "Crear un nuevo canal";
+App::$strings["Create New"] = "Crear";
+App::$strings["Channel Manager"] = "Administración de canales";
+App::$strings["Current Channel"] = "Canal actual";
+App::$strings["Switch to one of your channels by selecting it."] = "Cambiar a uno de sus canales seleccionándolo.";
+App::$strings["Default Channel"] = "Canal principal";
+App::$strings["Make Default"] = "Convertir en predeterminado";
+App::$strings["%d new messages"] = "%d mensajes nuevos";
+App::$strings["%d new introductions"] = "%d nuevas solicitudes de conexión";
+App::$strings["Delegated Channel"] = "Canal delegado";
+App::$strings["Blocked"] = "Bloqueadas";
+App::$strings["Ignored"] = "Ignoradas";
+App::$strings["Hidden"] = "Ocultas";
+App::$strings["Archived"] = "Archivadas";
+App::$strings["New"] = "Nuevas";
+App::$strings["New Connections"] = "Nuevas conexiones";
+App::$strings["Show pending (new) connections"] = "Mostrar conexiones (nuevas) pendientes";
+App::$strings["All Connections"] = "Todas las conexiones";
+App::$strings["Show all connections"] = "Mostrar todas las conexiones";
+App::$strings["Only show blocked connections"] = "Mostrar solo las conexiones bloqueadas";
+App::$strings["Only show ignored connections"] = "Mostrar solo conexiones ignoradas";
+App::$strings["Only show archived connections"] = "Mostrar solo las conexiones archivadas";
+App::$strings["Only show hidden connections"] = "Mostrar solo las conexiones ocultas";
+App::$strings["Pending approval"] = "Pendiente de aprobación";
+App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+App::$strings["Edit connection"] = "Editar conexión";
+App::$strings["Delete connection"] = "Eliminar conexión";
+App::$strings["Channel address"] = "Dirección del canal";
+App::$strings["Network"] = "Red";
+App::$strings["Status"] = "Estado";
+App::$strings["Connected"] = "Conectado/a";
+App::$strings["Approve connection"] = "Aprobar esta conexión";
+App::$strings["Approve"] = "Aprobar";
+App::$strings["Ignore connection"] = "Ignorar esta conexión";
+App::$strings["Recent activity"] = "Actividad reciente";
+App::$strings["Connections"] = "Conexiones";
+App::$strings["Search"] = "Buscar";
+App::$strings["Search your connections"] = "Buscar sus conexiones";
+App::$strings["Connections search"] = "Buscar conexiones";
+App::$strings["Find"] = "Encontrar";
+App::$strings["Image uploaded but image cropping failed."] = "Imagen actualizada, pero el recorte de la imagen ha fallado. ";
+App::$strings["Cover Photos"] = "Imágenes de portada del perfil";
+App::$strings["Image resize failed."] = "El ajuste del tamaño de la imagen ha fallado.";
+App::$strings["Unable to process image"] = "No ha sido posible procesar la imagen";
+App::$strings["Image upload failed."] = "La carga de la imagen ha fallado.";
+App::$strings["Unable to process image."] = "No ha sido posible procesar la imagen.";
+App::$strings["female"] = "mujer";
+App::$strings["%1\$s updated her %2\$s"] = "%1\$s ha actualizado su %2\$s";
+App::$strings["male"] = "hombre";
+App::$strings["%1\$s updated his %2\$s"] = "%1\$s ha actualizado su %2\$s";
+App::$strings["%1\$s updated their %2\$s"] = "%1\$s ha actualizado su %2\$s";
+App::$strings["cover photo"] = "Imagen de portada del perfil";
+App::$strings["Photo not available."] = "Foto no disponible.";
+App::$strings["Upload File:"] = "Subir fichero:";
+App::$strings["Select a profile:"] = "Seleccionar un perfil:";
+App::$strings["Upload Cover Photo"] = "Subir imagen de portada del perfil";
+App::$strings["or"] = "o";
+App::$strings["skip this step"] = "Omitir este paso";
+App::$strings["select a photo from your photo albums"] = "Seleccione una foto de sus álbumes de fotos";
+App::$strings["Crop Image"] = "Recortar imagen";
+App::$strings["Please adjust the image cropping for optimum viewing."] = "Por favor ajuste el recorte de la imagen para una visión óptima.";
+App::$strings["Done Editing"] = "Edición completada";
App::$strings["Off"] = "Desactivado";
App::$strings["On"] = "Activado";
App::$strings["Lock feature %s"] = "Bloquear la funcionalidad %s";
App::$strings["Manage Additional Features"] = "Gestionar las funcionalidades";
App::$strings["Log settings updated."] = "Actualizado el informe de configuraciones.";
+App::$strings["Administration"] = "Administración";
App::$strings["Logs"] = "Informes";
App::$strings["Clear"] = "Vaciar";
App::$strings["Debugging"] = "Depuración";
@@ -227,7 +342,6 @@ App::$strings["Field Name"] = "Nombre del campo";
App::$strings["Label on profile pages"] = "Etiqueta a mostrar en la página del perfil";
App::$strings["Help text"] = "Texto de ayuda";
App::$strings["Additional info (optional)"] = "Información adicional (opcional)";
-App::$strings["Save"] = "Guardar";
App::$strings["Field definition not found"] = "Definición del campo no encontrada";
App::$strings["Edit Profile Field"] = "Modificar el campo del perfil";
App::$strings["Profile Fields"] = "Campos del perfil";
@@ -267,6 +381,84 @@ App::$strings["Only allow embeds from secure (SSL) websites and links."] = "Sól
App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "Permitir contenido HTML sin filtrar sólo desde estos dominios ";
App::$strings["One site per line. By default embedded content is filtered."] = "Un sitio por línea. El contenido incorporado se filtra de forma predeterminada.";
App::$strings["Block embedded HTML from these domains"] = "Bloquear contenido con HTML incorporado desde estos dominios";
+App::$strings["Theme settings updated."] = "Ajustes del tema actualizados.";
+App::$strings["No themes found."] = "No se han encontrado temas.";
+App::$strings["Screenshot"] = "Instantánea de pantalla";
+App::$strings["Themes"] = "Temas";
+App::$strings["[Experimental]"] = "[Experimental]";
+App::$strings["[Unsupported]"] = "[No soportado]";
+App::$strings["Password changed for account %d."] = "Ha cambiado la contraseña para la cuenta %d.";
+App::$strings["Account settings updated."] = "Se han actualizado los ajustes de la cuenta.";
+App::$strings["Account not found."] = "No se ha encontrado la cuenta.";
+App::$strings["Account Edit"] = "Editar la cuenta";
+App::$strings["New Password"] = "Nueva contraseña";
+App::$strings["New Password again"] = "Nueva contraseña otra vez";
+App::$strings["Technical skill level"] = "Nivel de habilidad técnica";
+App::$strings["Account language (for emails)"] = "Idioma de la cuenta (para los correos electrónicos)";
+App::$strings["Service class"] = "Clase de servicio";
+App::$strings["%s account blocked/unblocked"] = array(
+ 0 => "%s cuenta bloqueada/desbloqueada",
+ 1 => "%s cuenta bloqueada/desbloqueada",
+);
+App::$strings["%s account deleted"] = array(
+ 0 => "%s cuentas eliminadas",
+ 1 => "%s cuentas eliminadas",
+);
+App::$strings["Account not found"] = "Cuenta no encontrada";
+App::$strings["Account '%s' deleted"] = "La cuenta '%s' ha sido eliminada";
+App::$strings["Account '%s' blocked"] = "La cuenta '%s' ha sido bloqueada";
+App::$strings["Account '%s' unblocked"] = "La cuenta '%s' ha sido desbloqueada";
+App::$strings["Accounts"] = "Cuentas";
+App::$strings["select all"] = "seleccionar todo";
+App::$strings["Registrations waiting for confirm"] = "Inscripciones en espera de confirmación";
+App::$strings["Request date"] = "Fecha de solicitud";
+App::$strings["Email"] = "Correo electrónico";
+App::$strings["No registrations."] = "Sin registros.";
+App::$strings["Deny"] = "Rechazar";
+App::$strings["ID"] = "ID";
+App::$strings["All Channels"] = "Todos los canales";
+App::$strings["Register date"] = "Fecha de registro";
+App::$strings["Last login"] = "Último acceso";
+App::$strings["Expires"] = "Caduca";
+App::$strings["Service Class"] = "Clase de servicio";
+App::$strings["Selected accounts will be deleted!\\n\\nEverything these accounts had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "¡Las cuentas seleccionadas van a ser eliminadas!\\n\\n¡Todo lo que estas cuentas han publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?";
+App::$strings["The account {0} will be deleted!\\n\\nEverything this account has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "¡La cuenta {0} va a ser eliminada!\\n\\n¡Todo lo que esta cuenta ha publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?";
+App::$strings["%s channel censored/uncensored"] = array(
+ 0 => "%s canales censurados/no censurados",
+ 1 => "%s canales censurados/no censurados",
+);
+App::$strings["%s channel code allowed/disallowed"] = array(
+ 0 => "%s código permitido/no permitido al canal",
+ 1 => "%s código permitido/no permitido al canal",
+);
+App::$strings["%s channel deleted"] = array(
+ 0 => "%s canales eliminados",
+ 1 => "%s canales eliminados",
+);
+App::$strings["Channel not found"] = "Canal no encontrado";
+App::$strings["Channel '%s' deleted"] = "Canal '%s' eliminado";
+App::$strings["Channel '%s' censored"] = "Canal '%s' censurado";
+App::$strings["Channel '%s' uncensored"] = "Canal '%s' no censurado";
+App::$strings["Channel '%s' code allowed"] = "Código permitido al canal '%s'";
+App::$strings["Channel '%s' code disallowed"] = "Código no permitido al canal '%s'";
+App::$strings["Channels"] = "Canales";
+App::$strings["Censor"] = "Censurar";
+App::$strings["Uncensor"] = "No censurar";
+App::$strings["Allow Code"] = "Permitir código";
+App::$strings["Disallow Code"] = "No permitir código";
+App::$strings["Channel"] = "Canal";
+App::$strings["UID"] = "UID";
+App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Los canales seleccionados se eliminarán!\\n\\nTodo lo publicado por estos canales en este sitio se borrarán definitivamente!\\n\\n¿Está seguro de querer hacerlo?";
+App::$strings["The channel {0} will be deleted!\\n\\nEverything that was posted in this channel on this site will be permanently deleted!\\n\\nAre you sure?"] = "El canal {0} va a ser eliminado!\\n\\nTodo lo publicado por el canal en este sitio se borrará definitivamente!\\n\\n¿Está seguro de querer hacerlo?";
+App::$strings["Update has been marked successful"] = "La actualización ha sido marcada como exitosa";
+App::$strings["Executing %s failed. Check system logs."] = "La ejecución de %s ha fallado. Mirar en los informes del sistema.";
+App::$strings["Update %s was successfully applied."] = "La actualización de %s se ha realizado exitosamente.";
+App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "La actualización de %s no ha devuelto ningún estado. No se sabe si ha tenido éxito.";
+App::$strings["Update function %s could not be found."] = "No se encuentra la función de actualización de %s.";
+App::$strings["No failed updates."] = "No ha fallado ninguna actualización.";
+App::$strings["Failed Updates"] = "Han fallado las actualizaciones";
+App::$strings["Mark success (if update was manually applied)"] = "Marcar como exitosa (si la actualización se ha hecho manualmente)";
+App::$strings["Attempt to execute this update step automatically"] = "Intentar ejecutar este paso de actualización automáticamente";
App::$strings["Site settings updated."] = "Ajustes del sitio actualizados.";
App::$strings["Default"] = "Predeterminado";
App::$strings["mobile"] = "móvil";
@@ -296,12 +488,14 @@ App::$strings["Advanced"] = "Avanzado";
App::$strings["Site name"] = "Nombre del sitio";
App::$strings["Server Configuration/Role"] = "Configuración del servidor";
App::$strings["Site default technical skill level"] = "Nivel de habilidad técnica predeterminado del sitio";
-App::$strings["Used to provide a member experience matched to technical comfort level"] = "Se utiliza para proporcionar la experiencia de los miembros adaptada al nivel de comodidad";
+App::$strings["Used to provide a member experience matched to technical comfort level"] = "Se utiliza para proporcionar una experiencia a los miembros adaptada a su nivel de comodidad técnica";
App::$strings["Lock the technical skill level setting"] = "Bloquear el ajuste del nivel de habilidad técnica";
-App::$strings["Members can set their own technical comfort level by default"] = "Los miembros pueden configurar por defecto su nivel de comodidad técnica";
+App::$strings["Members can set their own technical comfort level by default"] = "Los miembros pueden configurar su nivel de comodidad técnica por defecto";
App::$strings["Banner/Logo"] = "Banner/Logo";
App::$strings["Administrator Information"] = "Información del Administrador";
App::$strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Información de contacto de los administradores del sitio. Visible en la página \"siteinfo\". Se puede usar BBCode";
+App::$strings["Site Information"] = "Información sobre el sitio";
+App::$strings["Publicly visible description of this site. Displayed on siteinfo page. BBCode can be used here"] = "Descripción pública de este sitio. Visible en la página \"siteinfo\". Se puede usar BBCode";
App::$strings["System language"] = "Idioma del sistema";
App::$strings["System theme"] = "Tema gráfico del sistema";
App::$strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Tema del sistema por defecto - se puede cambiar por cada perfil de usuario - <a href='#' id='cnftheme'>modificar los ajustes del tema</a>";
@@ -351,173 +545,35 @@ App::$strings["Maximum Load Average"] = "Carga media máxima";
App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Carga máxima del sistema antes de que los procesos de entrega y envío se hayan retardado - por defecto, 50.";
App::$strings["Expiration period in days for imported (grid/network) content"] = "Caducidad del contenido importado de otros sitios (en días)";
App::$strings["0 for no expiration of imported content"] = "0 para que no caduque el contenido importado";
-App::$strings["Theme settings updated."] = "Ajustes del tema actualizados.";
-App::$strings["No themes found."] = "No se han encontrado temas.";
-App::$strings["Screenshot"] = "Instantánea de pantalla";
-App::$strings["Themes"] = "Temas";
-App::$strings["[Experimental]"] = "[Experimental]";
-App::$strings["[Unsupported]"] = "[No soportado]";
-App::$strings["Photos"] = "Fotos";
-App::$strings["Invalid item."] = "Elemento no válido.";
-App::$strings["Channel not found."] = "Canal no encontrado.";
-App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
-App::$strings["Save to Folder:"] = "Guardar en carpeta:";
-App::$strings["- select -"] = "- seleccionar -";
-App::$strings["Unable to lookup recipient."] = "No se puede asociar a un destinatario.";
-App::$strings["Unable to communicate with requested channel."] = "No se puede establecer la comunicación con el canal solicitado.";
-App::$strings["Cannot verify requested channel."] = "No se puede verificar el canal solicitado.";
-App::$strings["Selected channel has private message restrictions. Send failed."] = "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló.";
-App::$strings["Messages"] = "Mensajes";
-App::$strings["Message recalled."] = "Mensaje revocado.";
-App::$strings["Conversation removed."] = "Conversación eliminada.";
-App::$strings["Please enter a link URL:"] = "Por favor, introduzca la dirección del enlace:";
-App::$strings["Expires YYYY-MM-DD HH:MM"] = "Caduca YYYY-MM-DD HH:MM";
-App::$strings["Requested channel is not in this network"] = "El canal solicitado no existe en esta red";
-App::$strings["Send Private Message"] = "Enviar un mensaje privado";
-App::$strings["To:"] = "Para:";
-App::$strings["Subject:"] = "Asunto:";
-App::$strings["Your message:"] = "Su mensaje:";
-App::$strings["Attach file"] = "Adjuntar fichero";
-App::$strings["Insert web link"] = "Insertar enlace web";
-App::$strings["Send"] = "Enviar";
-App::$strings["Set expiration date"] = "Configurar fecha de caducidad";
-App::$strings["Encrypt text"] = "Cifrar texto";
-App::$strings["Delete message"] = "Borrar mensaje";
-App::$strings["Delivery report"] = "Informe de transmisión";
-App::$strings["Recall message"] = "Revocar el mensaje";
-App::$strings["Message has been recalled."] = "El mensaje ha sido revocado.";
-App::$strings["Delete Conversation"] = "Eliminar conversación";
-App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Comunicación segura no disponible. Pero <strong>puede</strong> responder desde la página del perfil del remitente.";
-App::$strings["Send Reply"] = "Responder";
-App::$strings["Your message for %s (%s):"] = "Su mensaje para %s (%s):";
-App::$strings["Blocked"] = "Bloqueadas";
-App::$strings["Ignored"] = "Ignoradas";
-App::$strings["Hidden"] = "Ocultas";
-App::$strings["Archived"] = "Archivadas";
-App::$strings["New"] = "Nuevas";
-App::$strings["All"] = "Todos/as";
-App::$strings["New Connections"] = "Nuevas conexiones";
-App::$strings["Show pending (new) connections"] = "Mostrar conexiones (nuevas) pendientes";
-App::$strings["All Connections"] = "Todas las conexiones";
-App::$strings["Show all connections"] = "Mostrar todas las conexiones";
-App::$strings["Only show blocked connections"] = "Mostrar solo las conexiones bloqueadas";
-App::$strings["Only show ignored connections"] = "Mostrar solo conexiones ignoradas";
-App::$strings["Only show archived connections"] = "Mostrar solo las conexiones archivadas";
-App::$strings["Only show hidden connections"] = "Mostrar solo las conexiones ocultas";
-App::$strings["Pending approval"] = "Pendiente de aprobación";
-App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
-App::$strings["Edit connection"] = "Editar conexión";
-App::$strings["Delete connection"] = "Eliminar conexión";
-App::$strings["Channel address"] = "Dirección del canal";
-App::$strings["Network"] = "Red";
-App::$strings["Status"] = "Estado";
-App::$strings["Connected"] = "Conectado/a";
-App::$strings["Approve connection"] = "Aprobar esta conexión";
-App::$strings["Ignore connection"] = "Ignorar esta conexión";
-App::$strings["Ignore"] = "Ignorar";
-App::$strings["Recent activity"] = "Actividad reciente";
-App::$strings["Connections"] = "Conexiones";
-App::$strings["Search"] = "Buscar";
-App::$strings["Search your connections"] = "Buscar sus conexiones";
-App::$strings["Connections search"] = "Buscar conexiones";
-App::$strings["Find"] = "Encontrar";
-App::$strings["Image uploaded but image cropping failed."] = "Imagen actualizada, pero el recorte de la imagen ha fallado. ";
-App::$strings["Cover Photos"] = "Imágenes de portada del perfil";
-App::$strings["Image resize failed."] = "El ajuste del tamaño de la imagen ha fallado.";
-App::$strings["Unable to process image"] = "No ha sido posible procesar la imagen";
-App::$strings["Image upload failed."] = "La carga de la imagen ha fallado.";
-App::$strings["Unable to process image."] = "No ha sido posible procesar la imagen.";
-App::$strings["female"] = "mujer";
-App::$strings["%1\$s updated her %2\$s"] = "%1\$s ha actualizado su %2\$s";
-App::$strings["male"] = "hombre";
-App::$strings["%1\$s updated his %2\$s"] = "%1\$s ha actualizado su %2\$s";
-App::$strings["%1\$s updated their %2\$s"] = "%1\$s ha actualizado su %2\$s";
-App::$strings["cover photo"] = "Imagen de portada del perfil";
-App::$strings["Photo not available."] = "Foto no disponible.";
-App::$strings["Upload File:"] = "Subir fichero:";
-App::$strings["Select a profile:"] = "Seleccionar un perfil:";
-App::$strings["Upload Cover Photo"] = "Subir imagen de portada del perfil";
-App::$strings["or"] = "o";
-App::$strings["skip this step"] = "Omitir este paso";
-App::$strings["select a photo from your photo albums"] = "Seleccione una foto de sus álbumes de fotos";
-App::$strings["Crop Image"] = "Recortar imagen";
-App::$strings["Please adjust the image cropping for optimum viewing."] = "Por favor ajuste el recorte de la imagen para una visión óptima.";
-App::$strings["Done Editing"] = "Edición completada";
-App::$strings["Edit post"] = "Editar la entrada";
-App::$strings["Could not access contact record."] = "No se ha podido acceder al registro de contacto.";
-App::$strings["Could not locate selected profile."] = "No se ha podido localizar el perfil seleccionado.";
-App::$strings["Connection updated."] = "Conexión actualizada.";
-App::$strings["Failed to update connection record."] = "Error al actualizar el registro de la conexión.";
-App::$strings["is now connected to"] = "ahora está conectado/a";
-App::$strings["Could not access address book record."] = "No se pudo acceder al registro en su libreta de direcciones.";
-App::$strings["Refresh failed - channel is currently unavailable."] = "Recarga fallida - no se puede encontrar el canal en este momento.";
-App::$strings["Unable to set address book parameters."] = "No ha sido posible establecer los parámetros de la libreta de direcciones.";
-App::$strings["Connection has been removed."] = "La conexión ha sido eliminada.";
-App::$strings["View Profile"] = "Ver el perfil";
-App::$strings["View %s's profile"] = "Ver el perfil de %s";
-App::$strings["Refresh Permissions"] = "Recargar los permisos";
-App::$strings["Fetch updated permissions"] = "Obtener los permisos actualizados";
-App::$strings["Recent Activity"] = "Actividad reciente";
-App::$strings["View recent posts and comments"] = "Ver publicaciones y comentarios recientes";
-App::$strings["Block (or Unblock) all communications with this connection"] = "Bloquear (o desbloquear) todas las comunicaciones con esta conexión";
-App::$strings["This connection is blocked!"] = "¡Esta conexión está bloqueada!";
-App::$strings["Unignore"] = "Dejar de ignorar";
-App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Ignorar (o dejar de ignorar) todas las comunicaciones entrantes de esta conexión";
-App::$strings["This connection is ignored!"] = "¡Esta conexión es ignorada!";
-App::$strings["Unarchive"] = "Desarchivar";
-App::$strings["Archive"] = "Archivar";
-App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Archiva (o desarchiva) esta conexión - marca el canal como muerto aunque mantiene sus contenidos";
-App::$strings["This connection is archived!"] = "¡Esta conexión esta archivada!";
-App::$strings["Unhide"] = "Mostrar";
-App::$strings["Hide"] = "Ocultar";
-App::$strings["Hide or Unhide this connection from your other connections"] = "Ocultar o mostrar esta conexión a sus otras conexiones";
-App::$strings["This connection is hidden!"] = "¡Esta conexión está oculta!";
-App::$strings["Delete this connection"] = "Eliminar esta conexión";
-App::$strings["Me"] = "Yo";
-App::$strings["Family"] = "Familia";
-App::$strings["Friends"] = "Amigos/as";
-App::$strings["Acquaintances"] = "Conocidos/as";
-App::$strings["Approve this connection"] = "Aprobar esta conexión";
-App::$strings["Accept connection to allow communication"] = "Aceptar la conexión para permitir la comunicación";
-App::$strings["Set Affinity"] = "Ajustar la afinidad";
-App::$strings["Set Profile"] = "Ajustar el perfil";
-App::$strings["Set Affinity & Profile"] = "Ajustar la afinidad y el perfil";
-App::$strings["none"] = "-";
-App::$strings["Connection Default Permissions"] = "Permisos predeterminados de conexión";
-App::$strings["Connection: %s"] = "Conexión: %s";
-App::$strings["Apply these permissions automatically"] = "Aplicar estos permisos automaticamente";
-App::$strings["Connection requests will be approved without your interaction"] = "Las solicitudes de conexión serán aprobadas sin su intervención";
-App::$strings["This connection's primary address is"] = "La dirección primaria de esta conexión es";
-App::$strings["Available locations:"] = "Ubicaciones disponibles:";
-App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Los permisos indicados en esta página serán aplicados en todas las nuevas conexiones.";
-App::$strings["Connection Tools"] = "Gestión de las conexiones";
-App::$strings["Slide to adjust your degree of friendship"] = "Deslizar para ajustar el grado de amistad";
-App::$strings["Rating"] = "Valoración";
-App::$strings["Slide to adjust your rating"] = "Deslizar para ajustar su valoración";
-App::$strings["Optionally explain your rating"] = "Opcionalmente, puede explicar su valoración";
-App::$strings["Custom Filter"] = "Filtro personalizado";
-App::$strings["Only import posts with this text"] = "Importar solo entradas que contengan este texto";
-App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "Una sola opción por línea: palabras, #etiquetas, /patrones/ o lang=xx. Dejar en blanco para importarlo todo";
-App::$strings["Do not import posts with this text"] = "No importar entradas que contengan este texto";
-App::$strings["This information is public!"] = "¡Esta información es pública!";
-App::$strings["Connection Pending Approval"] = "Conexión pendiente de aprobación";
-App::$strings["inherited"] = "heredado";
-App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Por favor, escoja el perfil que quiere mostrar a %s cuando esté viendo su perfil de forma segura.";
-App::$strings["Their Settings"] = "Sus ajustes";
-App::$strings["My Settings"] = "Mis ajustes";
-App::$strings["Individual Permissions"] = "Permisos individuales";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. <strong>No</strong> puede cambiar estos ajustes aquí.";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados.";
-App::$strings["Last update:"] = "Última actualización:";
+App::$strings["Public Hubs"] = "Servidores públicos";
+App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Los sitios listados permiten el registro público en la red \$Projectname. Todos los sitios de la red están vinculados entre sí, por lo que sus miembros, en ninguno de ellos, indican la pertenencia a la red en su conjunto. Algunos sitios pueden requerir suscripción o proporcionar planes de servicio por niveles. Los mismos hubs <strong>pueden</strong> proporcionar detalles adicionales.";
+App::$strings["Hub URL"] = "Dirección del hub";
+App::$strings["Access Type"] = "Tipo de acceso";
+App::$strings["Registration Policy"] = "Normas de registro";
+App::$strings["Stats"] = "Estadísticas";
+App::$strings["Software"] = "Software";
+App::$strings["Ratings"] = "Valoraciones";
+App::$strings["Rate"] = "Valorar";
+App::$strings["View"] = "Ver";
App::$strings["Item not found"] = "Elemento no encontrado";
-App::$strings["Block Name"] = "Nombre del bloque";
-App::$strings["Title (optional)"] = "Título (opcional)";
-App::$strings["Edit Block"] = "Modificar este bloque";
App::$strings["Layout Name"] = "Nombre de la plantilla";
App::$strings["Layout Description (Optional)"] = "Descripción de la plantilla (opcional)";
App::$strings["Edit Layout"] = "Modificar la plantilla";
App::$strings["Page link"] = "Enlace de la página";
+App::$strings["Insert web link"] = "Insertar enlace web";
App::$strings["Edit Webpage"] = "Editar la página web";
+App::$strings["Photos"] = "Fotos";
+App::$strings["You must be logged in to see this page."] = "Debe haber iniciado sesión para poder ver esta página.";
+App::$strings["Posts and comments"] = "Publicaciones y comentarios";
+App::$strings["Only posts"] = "Solo publicaciones";
+App::$strings["Insufficient permissions. Request redirected to profile page."] = "Permisos insuficientes. Petición redirigida a la página del perfil.";
+App::$strings["No such group"] = "No se encuentra el grupo";
+App::$strings["No such channel"] = "No se encuentra el canal";
+App::$strings["forum"] = "foro";
+App::$strings["Search Results For:"] = "Buscar resultados para:";
+App::$strings["Privacy group is empty"] = "El grupo de canales está vacío";
+App::$strings["Privacy group: "] = "Grupo de canales: ";
+App::$strings["Invalid connection."] = "Conexión no válida.";
App::$strings["Unable to update menu."] = "No se puede actualizar el menú.";
App::$strings["Unable to create menu."] = "No se puede crear el menú.";
App::$strings["Menu Name"] = "Nombre del menú";
@@ -528,7 +584,6 @@ App::$strings["Allow Bookmarks"] = "Permitir marcadores";
App::$strings["Menu may be used to store saved bookmarks"] = "El menú se puede usar para guardar marcadores";
App::$strings["Submit and proceed"] = "Enviar y proceder";
App::$strings["Menus"] = "Menús";
-App::$strings["Drop"] = "Eliminar";
App::$strings["Created"] = "Creado";
App::$strings["Edited"] = "Editado";
App::$strings["Bookmarks allowed"] = "Marcadores permitidos";
@@ -560,34 +615,20 @@ App::$strings["Categories (optional, comma separated list)"] = "Temas (opcional,
App::$strings["Version ID"] = "Versión";
App::$strings["Price of app"] = "Precio de la aplicación";
App::$strings["Location (URL) to purchase app"] = "Dirección (URL) donde adquirir la aplicación";
-App::$strings["Public Hubs"] = "Servidores públicos";
-App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Los sitios listados permiten el registro público en la red \$Projectname. Todos los sitios de la red están vinculados entre sí, por lo que sus miembros, en ninguno de ellos, indican la pertenencia a la red en su conjunto. Algunos sitios pueden requerir suscripción o proporcionar planes de servicio por niveles. Los mismos hubs <strong>pueden</strong> proporcionar detalles adicionales.";
-App::$strings["Hub URL"] = "Dirección del hub";
-App::$strings["Access Type"] = "Tipo de acceso";
-App::$strings["Registration Policy"] = "Normas de registro";
-App::$strings["Stats"] = "Estadísticas";
-App::$strings["Software"] = "Software";
-App::$strings["Ratings"] = "Valoraciones";
-App::$strings["Rate"] = "Valorar";
-App::$strings["Location"] = "Ubicación";
-App::$strings["View"] = "Ver";
-App::$strings["Item not available."] = "Elemento no disponible";
-App::$strings["Authorize application connection"] = "Autorizar una conexión de aplicación";
-App::$strings["Return to your app and insert this Security Code:"] = "Volver a su aplicación e introducir este código de seguridad:";
-App::$strings["Please login to continue."] = "Por favor inicie sesión para continuar.";
-App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "¿Desea autorizar a esta aplicación a acceder a sus publicaciones y contactos, y/o crear nuevas publicaciones por usted?";
+App::$strings["Edit post"] = "Editar la entrada";
+App::$strings["Documentation Search"] = "Búsqueda de Documentación";
+App::$strings["About"] = "Mi perfil";
+App::$strings["Members"] = "Miembros";
+App::$strings["Administrators"] = "Administradores";
+App::$strings["Developers"] = "Desarrolladores";
+App::$strings["Tutorials"] = "Tutoriales";
+App::$strings["\$Projectname Documentation"] = "Documentación de \$Projectname";
+App::$strings["Contents"] = "Contenidos";
App::$strings["Share content from Firefox to \$Projectname"] = "Compartir contenido desde Firefox a \$Projectname";
App::$strings["Activate the Firefox \$Projectname provider"] = "Servicio de compartición de Firefox: activar el proveedor \$Projectname ";
-App::$strings["Layout updated."] = "Plantilla actualizada.";
-App::$strings["Feature disabled."] = "Funcionalidad deshabilitada.";
-App::$strings["Edit System Page Description"] = "Editor del Sistema de Descripción de Páginas";
-App::$strings["Layout not found."] = "Plantilla no encontrada";
-App::$strings["Module Name:"] = "Nombre del módulo:";
-App::$strings["Layout Help"] = "Ayuda para el diseño de plantillas de página";
+App::$strings["Apps"] = "Aplicaciones (apps)";
App::$strings["\$Projectname"] = "\$Projectname";
App::$strings["Welcome to %s"] = "Bienvenido a %s";
-App::$strings["Remote privacy information not available."] = "La información privada remota no está disponible.";
-App::$strings["Visible to:"] = "Visible para:";
App::$strings["Permission Denied."] = "Permiso denegado";
App::$strings["File not found."] = "Fichero no encontrado.";
App::$strings["Edit file permissions"] = "Modificar los permisos del fichero";
@@ -600,64 +641,85 @@ App::$strings["Copy/paste this URL to link file from a web page"] = "Copiar/pega
App::$strings["Share this file"] = "Compartir este fichero";
App::$strings["Show URL to this file"] = "Mostrar la dirección de este fichero";
App::$strings["Notify your contacts about this file"] = "Avisar a sus contactos sobre este fichero";
-App::$strings["Continue"] = "Continuar";
-App::$strings["Premium Channel Setup"] = "Configuración del canal premium";
-App::$strings["Enable premium channel connection restrictions"] = "Habilitar restricciones de conexión del canal premium";
-App::$strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Por favor introduzca sus restricciones o condiciones, como recibo de paypal, normas de uso, etc.";
-App::$strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Este canal puede requerir antes de conectar unos pasos adicionales o el conocimiento de las siguientes condiciones:";
-App::$strings["Potential connections will then see the following text before proceeding:"] = "Las posibles conexiones verán, por tanto, el siguiente texto antes de proceder:";
-App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Al continuar, certifico que he cumplido con todas las instrucciones proporcionadas en esta página.";
-App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(No ha sido proporcionada ninguna instrucción específica por el propietario del canal.)";
-App::$strings["Restricted or Premium Channel"] = "Canal premium o restringido";
-App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Ha creado %1$.0f de %2$.0f canales permitidos.";
-App::$strings["Create a new channel"] = "Crear un nuevo canal";
-App::$strings["Create New"] = "Crear";
-App::$strings["Channel Manager"] = "Administración de canales";
-App::$strings["Current Channel"] = "Canal actual";
-App::$strings["Switch to one of your channels by selecting it."] = "Cambiar a uno de sus canales seleccionándolo.";
-App::$strings["Default Channel"] = "Canal principal";
-App::$strings["Make Default"] = "Convertir en predeterminado";
-App::$strings["%d new messages"] = "%d mensajes nuevos";
-App::$strings["%d new introductions"] = "%d nuevas isolicitudes de conexión";
-App::$strings["Delegated Channel"] = "Canal delegado";
-App::$strings["Privacy group created."] = "El grupo de canales ha sido creado.";
-App::$strings["Could not create privacy group."] = "No se puede crear el grupo de canales";
-App::$strings["Privacy group not found."] = "Grupo de canales no encontrado.";
-App::$strings["Privacy group updated."] = "Grupo de canales actualizado.";
-App::$strings["Create a group of channels."] = "Crear un grupo de canales.";
-App::$strings["Privacy group name: "] = "Nombre del grupo de canales:";
-App::$strings["Members are visible to other channels"] = "Los miembros son visibles para otros canales";
-App::$strings["Privacy group removed."] = "Grupo de canales eliminado.";
-App::$strings["Unable to remove privacy group."] = "No se puede eliminar el grupo de canales.";
-App::$strings["Privacy group editor"] = "Editor de grupos de canales";
-App::$strings["Members"] = "Miembros";
-App::$strings["All Connected Channels"] = "Todos los canales conectados";
-App::$strings["Click on a channel to add or remove."] = "Haga clic en un canal para agregarlo o quitarlo.";
-App::$strings["Invalid message"] = "Mensaje no válido";
-App::$strings["no results"] = "sin resultados";
-App::$strings["channel sync processed"] = "se ha realizado la sincronización del canal";
-App::$strings["queued"] = "encolado";
-App::$strings["posted"] = "enviado";
-App::$strings["accepted for delivery"] = "aceptado para el envío";
-App::$strings["updated"] = "actualizado";
-App::$strings["update ignored"] = "actualización ignorada";
-App::$strings["permission denied"] = "permiso denegado";
-App::$strings["recipient not found"] = "destinatario no encontrado";
-App::$strings["mail recalled"] = "mensaje de correo revocado";
-App::$strings["duplicate mail received"] = "se ha recibido mensaje duplicado";
-App::$strings["mail delivered"] = "correo enviado";
-App::$strings["Delivery report for %1\$s"] = "Informe de entrega para %1\$s";
-App::$strings["Options"] = "Opciones";
-App::$strings["Redeliver"] = "Volver a enviar";
+App::$strings["Public access denied."] = "Acceso público denegado.";
+App::$strings["%d rating"] = array(
+ 0 => "%d valoración",
+ 1 => "%d valoraciones",
+);
+App::$strings["Gender: "] = "Género:";
+App::$strings["Status: "] = "Estado:";
+App::$strings["Homepage: "] = "Página personal:";
+App::$strings["Age:"] = "Edad:";
+App::$strings["Location:"] = "Ubicación:";
+App::$strings["Description:"] = "Descripción:";
+App::$strings["Hometown:"] = "Lugar de nacimiento:";
+App::$strings["About:"] = "Sobre mí:";
+App::$strings["Public Forum:"] = "Foro público:";
+App::$strings["Keywords: "] = "Palabras clave:";
+App::$strings["Don't suggest"] = "No sugerir:";
+App::$strings["Common connections:"] = "Conexiones comunes:";
+App::$strings["Global Directory"] = "Directorio global:";
+App::$strings["Local Directory"] = "Directorio local:";
+App::$strings["Finding:"] = "Encontrar:";
+App::$strings["Channel Suggestions"] = "Sugerencias de canales";
+App::$strings["next page"] = "siguiente página";
+App::$strings["previous page"] = "página anterior";
+App::$strings["Sort options"] = "Ordenar opciones";
+App::$strings["Alphabetic"] = "Alfabético";
+App::$strings["Reverse Alphabetic"] = "Alfabético inverso";
+App::$strings["Newest to Oldest"] = "De más nuevo a más antiguo";
+App::$strings["Oldest to Newest"] = "De más antiguo a más nuevo";
+App::$strings["No entries (some entries may be hidden)."] = "Sin entradas (algunas entradas pueden estar ocultas).";
+App::$strings["Unable to locate original post."] = "No ha sido posible encontrar la entrada original.";
+App::$strings["Empty post discarded."] = "La entrada vacía ha sido desechada.";
+App::$strings["Executable content type not permitted to this channel."] = "Contenido de tipo ejecutable no permitido en este canal.";
+App::$strings["Duplicate post suppressed."] = "Se ha suprimido la entrada duplicada.";
+App::$strings["System error. Post not saved."] = "Error del sistema. La entrada no se ha podido salvar.";
+App::$strings["Unable to obtain post information from database."] = "No ha sido posible obtener información de la entrada en la base de datos.";
+App::$strings["You have reached your limit of %1$.0f top level posts."] = "Ha alcanzado su límite de %1$.0f entradas en la página principal.";
+App::$strings["You have reached your limit of %1$.0f webpages."] = "Ha alcanzado su límite de %1$.0f páginas web.";
+App::$strings["toggle full screen mode"] = "cambiar al modo de pantalla completa";
+App::$strings["Channel added."] = "Canal añadido.";
+App::$strings["Unable to lookup recipient."] = "No se puede asociar a un destinatario.";
+App::$strings["Unable to communicate with requested channel."] = "No se puede establecer la comunicación con el canal solicitado.";
+App::$strings["Cannot verify requested channel."] = "No se puede verificar el canal solicitado.";
+App::$strings["Selected channel has private message restrictions. Send failed."] = "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló.";
+App::$strings["Messages"] = "Mensajes";
+App::$strings["Message recalled."] = "Mensaje revocado.";
+App::$strings["Conversation removed."] = "Conversación eliminada.";
+App::$strings["Please enter a link URL:"] = "Por favor, introduzca la dirección del enlace:";
+App::$strings["Expires YYYY-MM-DD HH:MM"] = "Caduca YYYY-MM-DD HH:MM";
+App::$strings["Requested channel is not in this network"] = "El canal solicitado no existe en esta red";
+App::$strings["Send Private Message"] = "Enviar un mensaje privado";
+App::$strings["To:"] = "Para:";
+App::$strings["Subject:"] = "Asunto:";
+App::$strings["Your message:"] = "Su mensaje:";
+App::$strings["Attach file"] = "Adjuntar fichero";
+App::$strings["Send"] = "Enviar";
+App::$strings["Set expiration date"] = "Configurar fecha de caducidad";
+App::$strings["Encrypt text"] = "Cifrar texto";
+App::$strings["Delete message"] = "Borrar mensaje";
+App::$strings["Delivery report"] = "Informe de transmisión";
+App::$strings["Recall message"] = "Revocar el mensaje";
+App::$strings["Message has been recalled."] = "El mensaje ha sido revocado.";
+App::$strings["Delete Conversation"] = "Eliminar conversación";
+App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Comunicación segura no disponible. Pero <strong>puede</strong> responder desde la página del perfil del remitente.";
+App::$strings["Send Reply"] = "Responder";
+App::$strings["Your message for %s (%s):"] = "Su mensaje para %s (%s):";
App::$strings["webpage"] = "página web";
App::$strings["block"] = "bloque";
App::$strings["layout"] = "plantilla";
App::$strings["menu"] = "menú";
App::$strings["%s element installed"] = "%s elemento instalado";
App::$strings["%s element installation failed"] = "Elemento con instalación fallida: %s";
+App::$strings["Nothing to import."] = "No hay nada para importar.";
+App::$strings["Unable to download data from old server"] = "No se han podido descargar datos de su antiguo servidor";
+App::$strings["Imported file is empty."] = "El fichero importado está vacío.";
+App::$strings["Warning: Database versions differ by %1\$d updates."] = "Atención: Las versiones de la base de datos difieren en %1\$d actualizaciones.";
App::$strings["Import completed"] = "Importación completada";
App::$strings["Import Items"] = "Importar elementos";
App::$strings["Use this form to import existing posts and content from an export file."] = "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación.";
+App::$strings["File to Upload"] = "Fichero para subir";
App::$strings["Total invitation limit exceeded."] = "Se ha superado el límite máximo de invitaciones.";
App::$strings["%s : Not a valid email address."] = "%s : No es una dirección de correo electrónico válida. ";
App::$strings["Please join us on \$Projectname"] = "Únase a nosotros en \$Projectname";
@@ -676,110 +738,27 @@ App::$strings["1. Register at any \$Projectname location (they are all inter-con
App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Introduzca mi dirección \$Projectname en la caja de búsqueda del sitio.";
App::$strings["or visit"] = "o visitar";
App::$strings["3. Click [Connect]"] = "3. Pulse [conectar]";
-App::$strings["Location not found."] = "Dirección no encontrada.";
-App::$strings["Location lookup failed."] = "Ha fallado la búsqueda de la dirección.";
-App::$strings["Please select another location to become primary before removing the primary location."] = "Por favor, seleccione una copia de su canal (un clon) para convertirlo en primario antes de eliminar su canal principal.";
-App::$strings["Syncing locations"] = "Sincronizando ubicaciones";
-App::$strings["No locations found."] = "No encontrada ninguna dirección.";
-App::$strings["Manage Channel Locations"] = "Gestionar las direcciones del canal";
-App::$strings["Primary"] = "Primario";
-App::$strings["Sync Now"] = "Sincronizar ahora";
-App::$strings["Please wait several minutes between consecutive operations."] = "Por favor, espere algunos minutos entre operaciones consecutivas.";
-App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal.";
-App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo.";
-App::$strings["Website:"] = "Sitio web:";
-App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Canal remoto [%s] (aún no es conocido en este sitio)";
-App::$strings["Rating (this information is public)"] = "Valoración (esta información es pública)";
-App::$strings["Optionally explain your rating (this information is public)"] = "Opcionalmente puede explicar su valoración (esta información es pública)";
-App::$strings["Like/Dislike"] = "Me gusta/No me gusta";
-App::$strings["This action is restricted to members."] = "Esta acción está restringida solo para miembros.";
-App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Por favor, <a href=\"rmagic\">identifíquese con su \$Projectname ID</a> o <a href=\"register\">rregístrese como un nuevo \$Projectname member</a> para continuar.";
-App::$strings["Invalid request."] = "Solicitud incorrecta.";
-App::$strings["channel"] = "el canal";
-App::$strings["thing"] = "elemento";
-App::$strings["Channel unavailable."] = "Canal no disponible.";
-App::$strings["Previous action reversed."] = "Acción anterior revocada.";
-App::$strings["photo"] = "foto";
-App::$strings["status"] = "el mensaje de estado";
-App::$strings["event"] = "evento";
-App::$strings["%1\$s likes %2\$s's %3\$s"] = "A %1\$s le gusta %3\$s de %2\$s";
-App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "A %1\$s no le gusta %3\$s de %2\$s";
-App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s está de acuerdo";
-App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s no está de acuerdo";
-App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s se abstiene";
-App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s participa";
-App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s no participa";
-App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s quizá participe";
-App::$strings["Action completed."] = "Acción completada.";
-App::$strings["Thank you."] = "Gracias.";
-App::$strings["Profile not found."] = "Perfil no encontrado.";
-App::$strings["Profile deleted."] = "Perfil eliminado.";
-App::$strings["Profile-"] = "Perfil-";
-App::$strings["New profile created."] = "El nuevo perfil ha sido creado.";
-App::$strings["Profile unavailable to clone."] = "Perfil no disponible para clonar.";
-App::$strings["Profile unavailable to export."] = "Perfil no disponible para exportar.";
-App::$strings["Profile Name is required."] = "Se necesita el nombre del perfil.";
-App::$strings["Marital Status"] = "Estado civil";
-App::$strings["Romantic Partner"] = "Pareja sentimental";
-App::$strings["Likes"] = "Me gusta";
-App::$strings["Dislikes"] = "No me gusta";
-App::$strings["Work/Employment"] = "Trabajo:";
-App::$strings["Religion"] = "Religión";
-App::$strings["Political Views"] = "Ideas políticas";
-App::$strings["Gender"] = "Género";
-App::$strings["Sexual Preference"] = "Preferencia sexual";
-App::$strings["Homepage"] = "Página personal";
-App::$strings["Interests"] = "Intereses";
-App::$strings["Profile updated."] = "Perfil actualizado.";
-App::$strings["Hide your connections list from viewers of this profile"] = "Ocultar la lista de conexiones a los visitantes del perfil";
-App::$strings["Edit Profile Details"] = "Modificar los detalles de este perfil";
-App::$strings["View this profile"] = "Ver este perfil";
-App::$strings["Edit visibility"] = "Editar visibilidad";
-App::$strings["Profile Tools"] = "Gestión del perfil";
-App::$strings["Change cover photo"] = "Cambiar la imagen de portada del perfil";
-App::$strings["Change profile photo"] = "Cambiar la foto del perfil";
-App::$strings["Create a new profile using these settings"] = "Crear un nuevo perfil usando estos ajustes";
-App::$strings["Clone this profile"] = "Clonar este perfil";
-App::$strings["Delete this profile"] = "Eliminar este perfil";
-App::$strings["Add profile things"] = "Añadir cosas al perfil";
-App::$strings["Personal"] = "Personales";
-App::$strings["Relation"] = "Relación";
-App::$strings["Miscellaneous"] = "Varios";
-App::$strings["Import profile from file"] = "Importar perfil desde un fichero";
-App::$strings["Export profile to file"] = "Exportar perfil a un fichero";
-App::$strings["Your gender"] = "Género";
-App::$strings["Marital status"] = "Estado civil";
-App::$strings["Sexual preference"] = "Preferencia sexual";
-App::$strings["Profile name"] = "Nombre del perfil";
-App::$strings["This is your default profile."] = "Este es su perfil principal.";
-App::$strings["Your full name"] = "Nombre completo";
-App::$strings["Title/Description"] = "Título o descripción";
-App::$strings["Street address"] = "Dirección";
-App::$strings["Locality/City"] = "Ciudad";
-App::$strings["Region/State"] = "Región o Estado";
-App::$strings["Postal/Zip code"] = "Código postal";
-App::$strings["Country"] = "País";
-App::$strings["Who (if applicable)"] = "Quién (si es pertinente)";
-App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Por ejemplo: ana123, María González, sara@ejemplo.com";
-App::$strings["Since (date)"] = "Desde (fecha)";
-App::$strings["Tell us about yourself"] = "Háblenos de usted";
-App::$strings["Homepage URL"] = "Dirección de la página personal";
-App::$strings["Hometown"] = "Lugar de nacimiento";
-App::$strings["Political views"] = "Ideas políticas";
-App::$strings["Religious views"] = "Creencias religiosas";
-App::$strings["Keywords used in directory listings"] = "Palabras clave utilizadas en los listados de directorios";
-App::$strings["Example: fishing photography software"] = "Por ejemplo: software de fotografía submarina";
-App::$strings["Musical interests"] = "Preferencias musicales";
-App::$strings["Books, literature"] = "Libros, literatura";
-App::$strings["Television"] = "Televisión";
-App::$strings["Film/Dance/Culture/Entertainment"] = "Cine, danza, cultura, entretenimiento";
-App::$strings["Hobbies/Interests"] = "Aficiones o intereses";
-App::$strings["Love/Romance"] = "Vida sentimental o amorosa";
-App::$strings["School/Education"] = "Estudios";
-App::$strings["Contact information and social networks"] = "Información de contacto y redes sociales";
-App::$strings["My other channels"] = "Mis otros canales";
-App::$strings["Profile Image"] = "Imagen del perfil";
-App::$strings["Edit Profiles"] = "Editar perfiles";
+App::$strings["Block Name"] = "Nombre del bloque";
+App::$strings["Title (optional)"] = "Título (opcional)";
+App::$strings["Edit Block"] = "Modificar este bloque";
+App::$strings["Privacy group created."] = "El grupo de canales ha sido creado.";
+App::$strings["Could not create privacy group."] = "No se puede crear el grupo de canales";
+App::$strings["Privacy group not found."] = "Grupo de canales no encontrado.";
+App::$strings["Privacy group updated."] = "Grupo de canales actualizado.";
+App::$strings["Create a group of channels."] = "Crear un grupo de canales.";
+App::$strings["Privacy group name: "] = "Nombre del grupo de canales:";
+App::$strings["Members are visible to other channels"] = "Los miembros son visibles para otros canales";
+App::$strings["Privacy group removed."] = "Grupo de canales eliminado.";
+App::$strings["Unable to remove privacy group."] = "No se puede eliminar el grupo de canales.";
+App::$strings["Privacy group editor"] = "Editor de grupos de canales";
+App::$strings["All Connected Channels"] = "Todos los canales conectados";
+App::$strings["Click on a channel to add or remove."] = "Haga clic en un canal para agregarlo o quitarlo.";
+App::$strings["Invalid profile identifier."] = "Identificador del perfil no válido";
+App::$strings["Profile Visibility Editor"] = "Editor de visibilidad del perfil";
+App::$strings["Profile"] = "Perfil";
+App::$strings["Click on a contact to add or remove."] = "Pulsar en un contacto para añadirlo o eliminarlo.";
+App::$strings["Visible To"] = "Visible para";
+App::$strings["Hub not found."] = "Servidor no encontrado";
App::$strings["Unable to create element."] = "No se puede crear el elemento.";
App::$strings["Unable to update menu element."] = "No es posible actualizar el elemento del menú.";
App::$strings["Unable to add menu element."] = "No es posible añadir el elemento al menú";
@@ -809,6 +788,88 @@ App::$strings["Menu item deleted."] = "Este elemento del menú ha sido borrado";
App::$strings["Menu item could not be deleted."] = "Este elemento del menú no puede ser borrado.";
App::$strings["Edit Menu Element"] = "Editar elemento del menú";
App::$strings["Link text"] = "Texto del enlace";
+App::$strings["No ratings"] = "Ninguna valoración";
+App::$strings["Rating: "] = "Valoración:";
+App::$strings["Website: "] = "Sitio web:";
+App::$strings["Description: "] = "Descripción:";
+App::$strings["Item not available."] = "Elemento no disponible";
+App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s está %2\$s";
+App::$strings["Mood"] = "Estado de ánimo";
+App::$strings["Set your current mood and tell your friends"] = "Describir su estado de ánimo para comunicárselo a sus amigos";
+App::$strings["No more system notifications."] = "No hay más notificaciones del sistema";
+App::$strings["System Notifications"] = "Notificaciones del sistema";
+App::$strings["Page owner information could not be retrieved."] = "La información del propietario de la página no pudo ser recuperada.";
+App::$strings["Profile Photos"] = "Fotos del perfil";
+App::$strings["Album not found."] = "Álbum no encontrado.";
+App::$strings["Delete Album"] = "Borrar álbum";
+App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Hay varias carpetas con este nombre de álbum, pero dentro de diferentes directorios. Por favor, elimine la carpeta o carpetas que desee utilizando el administrador de ficheros";
+App::$strings["Delete Photo"] = "Borrar foto";
+App::$strings["No photos selected"] = "No hay fotos seleccionadas";
+App::$strings["Access to this item is restricted."] = "El acceso a este elemento está restringido.";
+App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado.";
+App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB de almacenamiento de fotos utilizado.";
+App::$strings["Upload Photos"] = "Subir fotos";
+App::$strings["Enter an album name"] = "Introducir un nombre de álbum";
+App::$strings["or select an existing album (doubleclick)"] = "o seleccionar uno existente (doble click)";
+App::$strings["Create a status post for this upload"] = "Crear un mensaje de estado para esta subida";
+App::$strings["Caption (optional):"] = "Título (opcional):";
+App::$strings["Description (optional):"] = "Descripción (opcional):";
+App::$strings["Album name could not be decoded"] = "El nombre del álbum no ha podido ser descifrado";
+App::$strings["Contact Photos"] = "Fotos de contacto";
+App::$strings["Show Newest First"] = "Mostrar lo más reciente primero";
+App::$strings["Show Oldest First"] = "Mostrar lo más antiguo primero";
+App::$strings["View Photo"] = "Ver foto";
+App::$strings["Edit Album"] = "Editar álbum";
+App::$strings["Permission denied. Access to this item may be restricted."] = "Permiso denegado. El acceso a este elemento puede estar restringido.";
+App::$strings["Photo not available"] = "Foto no disponible";
+App::$strings["Use as profile photo"] = "Usar como foto del perfil";
+App::$strings["Use as cover photo"] = "Usar como imagen de portada del perfil";
+App::$strings["Private Photo"] = "Foto privada";
+App::$strings["Previous"] = "Anterior";
+App::$strings["View Full Size"] = "Ver tamaño completo";
+App::$strings["Next"] = "Siguiente";
+App::$strings["Edit photo"] = "Editar foto";
+App::$strings["Rotate CW (right)"] = "Girar CW (a la derecha)";
+App::$strings["Rotate CCW (left)"] = "Girar CCW (a la izquierda)";
+App::$strings["Move photo to album"] = "Mover la foto a un álbum";
+App::$strings["Enter a new album name"] = "Introducir un nuevo nombre de álbum";
+App::$strings["or select an existing one (doubleclick)"] = "o seleccionar uno (doble click) existente";
+App::$strings["Caption"] = "Título";
+App::$strings["Add a Tag"] = "Añadir una etiqueta";
+App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com";
+App::$strings["Flag as adult in album view"] = "Marcar como \"solo para adultos\" en el álbum";
+App::$strings["I like this (toggle)"] = "Me gusta (cambiar)";
+App::$strings["I don't like this (toggle)"] = "No me gusta esto (cambiar)";
+App::$strings["Share"] = "Compartir";
+App::$strings["Please wait"] = "Espere por favor";
+App::$strings["This is you"] = "Este es usted";
+App::$strings["Comment"] = "Comentar";
+App::$strings["Preview"] = "Previsualizar";
+App::$strings["__ctx:title__ Likes"] = "Me gusta";
+App::$strings["__ctx:title__ Dislikes"] = "No me gusta";
+App::$strings["__ctx:title__ Agree"] = "De acuerdo";
+App::$strings["__ctx:title__ Disagree"] = "En desacuerdo";
+App::$strings["__ctx:title__ Abstain"] = "Abstención";
+App::$strings["__ctx:title__ Attending"] = "Participaré";
+App::$strings["__ctx:title__ Not attending"] = "No participaré";
+App::$strings["__ctx:title__ Might attend"] = "Quizá participe";
+App::$strings["View all"] = "Ver todo";
+App::$strings["__ctx:noun__ Like"] = array(
+ 0 => "Me gusta",
+ 1 => "Me gusta",
+);
+App::$strings["__ctx:noun__ Dislike"] = array(
+ 0 => "No me gusta",
+ 1 => "No me gusta",
+);
+App::$strings["Photo Tools"] = "Gestión de las fotos";
+App::$strings["In This Photo:"] = "En esta foto:";
+App::$strings["Map"] = "Mapa";
+App::$strings["__ctx:noun__ Likes"] = "Me gusta";
+App::$strings["__ctx:noun__ Dislikes"] = "No me gusta";
+App::$strings["Close"] = "Cerrar";
+App::$strings["View Album"] = "Ver álbum";
+App::$strings["Recent Photos"] = "Fotos recientes";
App::$strings["\$Projectname Server - Setup"] = "Servidor \$Projectname - Instalación";
App::$strings["Could not connect to database."] = "No se ha podido conectar a la base de datos.";
App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "No se puede conectar con la dirección del sitio indicada. Podría tratarse de un problema de SSL o DNS.";
@@ -817,7 +878,6 @@ App::$strings["Your site database has been installed."] = "La base de datos del
App::$strings["You may need to import the file \"install/schema_xxx.sql\" manually using a database client."] = "Podría tener que importar manualmente el fichero \"install/schema_xxx.sql\" usando un cliente de base de datos.";
App::$strings["Please see the file \"install/INSTALL.txt\"."] = "Por favor, lea el fichero \"install/INSTALL.txt\".";
App::$strings["System check"] = "Verificación del sistema";
-App::$strings["Next"] = "Siguiente";
App::$strings["Check again"] = "Verificar de nuevo";
App::$strings["Database connection"] = "Conexión a la base de datos";
App::$strings["In order to install \$Projectname we need to know how to connect to your database."] = "Para instalar \$Projectname es necesario saber cómo conectar con su base de datos.";
@@ -844,11 +904,12 @@ App::$strings["If you don't have a command line version of PHP installed on serv
App::$strings["PHP executable path"] = "Ruta del ejecutable PHP";
App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Introducir la ruta completa del ejecutable PHP. Puede dejar la línea en blanco para continuar la instalación.";
App::$strings["Command line PHP"] = "PHP en línea de comandos";
+App::$strings["Unable to check command line PHP, as shell_exec() is disabled. This is required."] = "No se puede comprobar la línea de comandos PHP, ya que shell_exec() está deshabilitado. Es necesario que esté activado.";
App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La línea de comandos PHP de su sistema no tiene activado \"register_argc_argv\".";
App::$strings["This is required for message delivery to work."] = "Esto es necesario para que funcione la transmisión de mensajes.";
App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv";
App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "La carga máxima que se le permite subir está establecida en %s. El tamaño máximo de un fichero está establecido en %s. Está permitido subir hasta un máximo de %d ficheros de una sola vez.";
-App::$strings["You can adjust these settings in the servers php.ini."] = "Puede ajustar estos valores en el fichero php.ini de su servidor.";
+App::$strings["You can adjust these settings in the server php.ini file."] = "Puede ajustar estos valores en el fichero php.ini de su servidor.";
App::$strings["PHP upload limits"] = "Límites PHP de subida";
App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Error: La función \"openssl_pkey_new\" en este sistema no es capaz de general claves de cifrado.";
App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Si está en un servidor Windows, por favor, lea \"http://www.php.net/manual/en/openssl.installation.php\".";
@@ -856,17 +917,19 @@ App::$strings["Generate encryption keys"] = "Generar claves de cifrado";
App::$strings["libCurl PHP module"] = "módulo libCurl PHP";
App::$strings["GD graphics PHP module"] = "módulo PHP GD graphics";
App::$strings["OpenSSL PHP module"] = "módulo PHP OpenSSL";
-App::$strings["mysqli or postgres PHP module"] = "módulo PHP mysqli o postgres";
+App::$strings["PDO database PHP module"] = "Módulo PHP de la base de datos PDO ";
App::$strings["mb_string PHP module"] = "módulo PHP mb_string";
App::$strings["xml PHP module"] = "módulo PHP xml";
App::$strings["Apache mod_rewrite module"] = "módulo Apache mod_rewrite ";
App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Error: se necesita el módulo del servidor web Apache mod-rewrite pero no está instalado.";
-App::$strings["proc_open"] = "proc_open";
-App::$strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "Error: se necesita proc_open pero o no está instalado o ha sido desactivado en el fichero php.ini";
+App::$strings["exec"] = "ejecutable";
+App::$strings["Error: exec is required but is either not installed or has been disabled in php.ini"] = "Error: se necesita un ejecutable pero o no se instaló o está deshabilitado en php.ini";
+App::$strings["shell_exec"] = "shell_exec";
+App::$strings["Error: shell_exec is required but is either not installed or has been disabled in php.ini"] = "Error: se necesita shell_exec pero o no se instaló o está deshabilitado en php.ini";
App::$strings["Error: libCURL PHP module required but not installed."] = "Error: se necesita el módulo PHP libCURL pero no está instalado.";
App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Error: el módulo PHP GD graphics es necesario, pero no está instalado.";
App::$strings["Error: openssl PHP module required but not installed."] = "Error: el módulo PHP openssl es necesario, pero no está instalado.";
-App::$strings["Error: mysqli or postgres PHP module required but neither are installed."] = "Error: el módulo PHP mysqli o postgres es necesario pero ninguno de los dos está instalado.";
+App::$strings["Error: PDO database PHP module required but not installed."] = "Error: se necesita el módulo PHP de la base de datos PDO, pero no está instalado.";
App::$strings["Error: mb_string PHP module required but not installed."] = "Error: el módulo PHP mb_string es necesario, pero no está instalado.";
App::$strings["Error: xml PHP module required for DAV but not installed."] = "Error: el módulo PHP xml es necesario para DAV, pero no está instalado.";
App::$strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "El instalador web no ha podido crear un fichero llamado “.htconfig.php” en la carpeta base de su servidor.";
@@ -874,16 +937,16 @@ App::$strings["This is most often a permission setting, as the web server may no
App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "Al término de este procedimiento, podemos crear un fichero de texto para guardar con el nombre .htconfig.php en el directorio raíz de su instalación de Hubzilla.";
App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Como alternativa, puede dejar este procedimiento e intentar realizar una instalación manual. Lea, por favor, el fichero\"install/INSTALL.txt\" para las instrucciones.";
App::$strings[".htconfig.php is writable"] = ".htconfig.php tiene permisos de escritura";
-App::$strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Hubzilla hace uso del motor de plantillas Smarty3 para diseñar sus plantillas gráficas. Smarty3 es más rápido porque compila las plantillas de páginas directamente en PHP.";
+App::$strings["This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Este software hace uso del motor de plantillas Smarty3 para diseñar sus plantillas gráficas. Smarty3 compila las plantillas a PHP para acelerar la renderización.";
App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "Para poder guardar las plantillas compiladas, el servidor web necesita permisos para acceder al directorio %s en la carpeta web principal.";
App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Por favor, asegúrese de que el servidor web está siendo ejecutado por un usuario que tenga permisos de escritura sobre esta carpeta (por ejemplo, www-data).";
App::$strings["Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."] = "Nota: como medida de seguridad, debe dar al servidor web permisos de escritura solo sobre %s - no sobre el fichero de plantilla (.tpl) que contiene.";
App::$strings["%s is writable"] = "%s tiene permisos de escritura";
-App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "Este software utiliza el directorio de almacenamiento para guardar los archivos subidos. El servidor web debe tener acceso de escritura al directorio de almacenamiento en la carpeta de nivel superior";
+App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"] = "Este software utiliza el directorio de almacenamiento para guardar los ficheros subidos. El servidor web debe tener acceso de escritura a este directorio en la carpeta de nivel superior";
App::$strings["store is writable"] = "\"store\" tiene permisos de escritura";
App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "El certificado SSL no ha podido ser validado. Corrija este problema o desactive el acceso https a este sitio.";
App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "Si su servidor soporta conexiones cifradas SSL o si permite conexiones al puerto TCP 443 (el puerto usado por el protocolo https), debe utilizar un certificado válido. No debe usar un certificado firmado por usted mismo.";
-App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Se ha incorporado esta restricción para evitar que sus publicaciones públicas hagan referencia a imágenes en su propio servidor.";
+App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Se ha incorporado esta restricción para evitar que sus entradas públicas hagan referencia a imágenes en su propio servidor.";
App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "Si su certificado no ha sido reconocido, los miembros de otros sitios (con certificados válidos) recibirán mensajes de aviso en sus propios sitios web.";
App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "Por razones de compatibilidad (sobre el conjunto de la red, no solo sobre su propio sitio), debemos insistir en estos requisitos.";
App::$strings["Providers are available that issue free certificates which are browser-valid."] = "Existen varias Autoridades de Certificación que le pueden proporcionar certificados válidos.";
@@ -895,133 +958,11 @@ App::$strings["The database configuration file \".htconfig.php\" could not be wr
App::$strings["Errors encountered creating database tables."] = "Se han encontrado errores al crear las tablas de la base de datos.";
App::$strings["<h1>What next</h1>"] = "<h1>Siguiente paso</h1>";
App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANTE: Debe crear [manualmente] una tarea programada para el \"poller\".";
-App::$strings["No valid account found."] = "No se ha encontrado una cuenta válida.";
-App::$strings["Password reset request issued. Check your email."] = "Se ha recibido una solicitud de restablecimiento de contraseña. Consulte su correo electrónico.";
-App::$strings["Site Member (%s)"] = "Usuario del sitio (%s)";
-App::$strings["Password reset requested at %s"] = "Se ha solicitado restablecer la contraseña en %s";
-App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado.";
-App::$strings["Password Reset"] = "Restablecer la contraseña";
-App::$strings["Your password has been reset as requested."] = "Su contraseña ha sido restablecida según lo solicitó.";
-App::$strings["Your new password is"] = "Su nueva contraseña es";
-App::$strings["Save or copy your new password - and then"] = "Guarde o copie su nueva contraseña - y después";
-App::$strings["click here to login"] = "pulse aquí para conectarse";
-App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Puede cambiar la contraseña en la página <em>Ajustes</em> una vez iniciada la sesión.";
-App::$strings["Your password has changed at %s"] = "Su contraseña en %s ha sido cambiada";
-App::$strings["Forgot your Password?"] = "¿Ha olvidado su contraseña?";
-App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones.";
-App::$strings["Email Address"] = "Dirección de correo electrónico";
-App::$strings["Reset"] = "Reiniciar";
-App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s está %2\$s";
-App::$strings["Mood"] = "Estado de ánimo";
-App::$strings["Set your current mood and tell your friends"] = "Describir su estado de ánimo para comunicárselo a sus amigos";
-App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "La eliminación de canales no está permitida hasta pasadas 48 horas desde el último cambio de contraseña.";
-App::$strings["Remove This Channel"] = "Eliminar este canal";
-App::$strings["WARNING: "] = "ATENCIÓN:";
-App::$strings["This channel will be completely removed from the network. "] = "Este canal va a ser completamente eliminado de la red. ";
-App::$strings["This action is permanent and can not be undone!"] = "¡Esta acción tiene carácter definitivo y no se puede deshacer!";
-App::$strings["Please enter your password for verification:"] = "Por favor, introduzca su contraseña para su verificación:";
-App::$strings["Remove this channel and all its clones from the network"] = "Eliminar este canal y todos sus clones de la red";
-App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Por defecto, solo la instancia del canal alojado en este servidor será eliminado de la red";
-App::$strings["Remove Channel"] = "Eliminar el canal";
-App::$strings["No more system notifications."] = "No hay más notificaciones del sistema";
-App::$strings["System Notifications"] = "Notificaciones del sistema";
-App::$strings["Profile Match"] = "Perfil compatible";
-App::$strings["No keywords to match. Please add keywords to your default profile."] = "No hay palabras clave en el perfil principal para poder encontrar perfiles compatibles. Por favor, añada palabras clave a su perfil principal.";
-App::$strings["is interested in:"] = "está interesado en:";
-App::$strings["Connect"] = "Conectar";
-App::$strings["No matches"] = "No se han encontrado perfiles compatibles";
+App::$strings["Item is not editable"] = "El elemento no es editable";
App::$strings["This site is not a directory server"] = "Este sitio no es un servidor de directorio";
-App::$strings["This directory server requires an access token"] = "El servidor de este directorio necesita un \"token\" de acceso";
-App::$strings["Hub not found."] = "Servidor no encontrado";
-App::$strings["Page owner information could not be retrieved."] = "La información del propietario de la página no pudo ser recuperada.";
-App::$strings["Profile Photos"] = "Fotos del perfil";
-App::$strings["Album not found."] = "Álbum no encontrado.";
-App::$strings["Delete Album"] = "Borrar álbum";
-App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Hay varias carpetas con este nombre de álbum, pero dentro de diferentes directorios. Por favor, elimine la carpeta o carpetas que desee utilizando el administrador de ficheros";
-App::$strings["Delete Photo"] = "Borrar foto";
-App::$strings["Public access denied."] = "Acceso público denegado.";
-App::$strings["No photos selected"] = "No hay fotos seleccionadas";
-App::$strings["Access to this item is restricted."] = "El acceso a este elemento está restringido.";
-App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado.";
-App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB de almacenamiento de fotos utilizado.";
-App::$strings["Upload Photos"] = "Subir fotos";
-App::$strings["Enter an album name"] = "Introducir un nombre de álbum";
-App::$strings["or select an existing album (doubleclick)"] = "o seleccionar uno existente (doble click)";
-App::$strings["Create a status post for this upload"] = "Crear un mensaje de estado para esta subida";
-App::$strings["Caption (optional):"] = "Título (opcional):";
-App::$strings["Description (optional):"] = "Descripción (opcional):";
-App::$strings["Album name could not be decoded"] = "El nombre del álbum no ha podido ser descifrado";
-App::$strings["Contact Photos"] = "Fotos de contacto";
-App::$strings["Show Newest First"] = "Mostrar lo más reciente primero";
-App::$strings["Show Oldest First"] = "Mostrar lo más antiguo primero";
-App::$strings["View Photo"] = "Ver foto";
-App::$strings["Edit Album"] = "Editar álbum";
-App::$strings["Permission denied. Access to this item may be restricted."] = "Permiso denegado. El acceso a este elemento puede estar restringido.";
-App::$strings["Photo not available"] = "Foto no disponible";
-App::$strings["Use as profile photo"] = "Usar como foto del perfil";
-App::$strings["Use as cover photo"] = "Usar como imagen de portada del perfil";
-App::$strings["Private Photo"] = "Foto privada";
-App::$strings["Previous"] = "Anterior";
-App::$strings["View Full Size"] = "Ver tamaño completo";
-App::$strings["Edit photo"] = "Editar foto";
-App::$strings["Rotate CW (right)"] = "Girar CW (a la derecha)";
-App::$strings["Rotate CCW (left)"] = "Girar CCW (a la izquierda)";
-App::$strings["Move photo to album"] = "Mover la foto a un álbum";
-App::$strings["Enter a new album name"] = "Introducir un nuevo nombre de álbum";
-App::$strings["or select an existing one (doubleclick)"] = "o seleccionar uno (doble click) existente";
-App::$strings["Caption"] = "Título";
-App::$strings["Add a Tag"] = "Añadir una etiqueta";
-App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com";
-App::$strings["Flag as adult in album view"] = "Marcar como \"solo para adultos\" en el álbum";
-App::$strings["I like this (toggle)"] = "Me gusta (cambiar)";
-App::$strings["I don't like this (toggle)"] = "No me gusta esto (cambiar)";
-App::$strings["Share"] = "Compartir";
-App::$strings["Please wait"] = "Espere por favor";
-App::$strings["This is you"] = "Este es usted";
-App::$strings["Comment"] = "Comentar";
-App::$strings["Preview"] = "Previsualizar";
-App::$strings["__ctx:title__ Likes"] = "Me gusta";
-App::$strings["__ctx:title__ Dislikes"] = "No me gusta";
-App::$strings["__ctx:title__ Agree"] = "De acuerdo";
-App::$strings["__ctx:title__ Disagree"] = "En desacuerdo";
-App::$strings["__ctx:title__ Abstain"] = "Abstención";
-App::$strings["__ctx:title__ Attending"] = "Participaré";
-App::$strings["__ctx:title__ Not attending"] = "No participaré";
-App::$strings["__ctx:title__ Might attend"] = "Quizá participe";
-App::$strings["View all"] = "Ver todo";
-App::$strings["__ctx:noun__ Like"] = array(
- 0 => "Me gusta",
- 1 => "Me gusta",
-);
-App::$strings["__ctx:noun__ Dislike"] = array(
- 0 => "No me gusta",
- 1 => "No me gusta",
-);
-App::$strings["Photo Tools"] = "Gestión de las fotos";
-App::$strings["In This Photo:"] = "En esta foto:";
-App::$strings["Map"] = "Mapa";
-App::$strings["__ctx:noun__ Likes"] = "Me gusta";
-App::$strings["__ctx:noun__ Dislikes"] = "No me gusta";
-App::$strings["Close"] = "Cerrar";
-App::$strings["View Album"] = "Ver álbum";
-App::$strings["Recent Photos"] = "Fotos recientes";
-App::$strings["Name or caption"] = "Nombre o descripción";
-App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Ejemplos: \"Juan García\", \"Luisa y sus caballos\", \"Fútbol\", \"Grupo de aviación\"";
-App::$strings["Choose a short nickname"] = "Elija un alias corto";
-App::$strings["Your nickname will be used to create an easy to remember channel address e.g. nickname%s"] = "Su alias se usará para crear una dirección de canal fácil de recordar, p. ej.: alias%s";
-App::$strings["Channel role and privacy"] = "Clase de canal y privacidad";
-App::$strings["Select a channel role with your privacy requirements."] = "Seleccione un tipo de canal con sus requisitos de privacidad";
-App::$strings["Read more about roles"] = "Leer más sobre los roles";
App::$strings["Create Channel"] = "Crear un canal";
App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Un canal es su identidad en esta red. Puede representar a una persona, un blog o un foro, por nombrar unos pocos ejemplos. Los canales se pueden conectar con otros canales para compartir información con una gama de permisos extremadamente detallada.";
App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "O <a href=\"import\">importar un canal existente</a> desde otro lugar.";
-App::$strings["sent you a private message"] = "le ha enviado un mensaje privado";
-App::$strings["added your channel"] = "añadió este canal a sus conexiones";
-App::$strings["g A l F d"] = "g A l d F";
-App::$strings["[today]"] = "[hoy]";
-App::$strings["posted an event"] = "publicó un evento";
-App::$strings["Invalid request identifier."] = "Petición inválida del identificador.";
-App::$strings["Discard"] = "Descartar";
App::$strings["Mark all system notifications seen"] = "Marcar todas las notificaciones de sistema como leídas";
App::$strings["Poke"] = "Toques y otras cosas";
App::$strings["Poke somebody"] = "Dar un toque a alguien";
@@ -1030,30 +971,79 @@ App::$strings["Poke, prod or do other things to somebody"] = "Dar un toque, inci
App::$strings["Recipient"] = "Destinatario";
App::$strings["Choose what you wish to do to recipient"] = "Elegir qué desea enviar al destinatario";
App::$strings["Make this post private"] = "Convertir en privado este envío";
-App::$strings["Apps"] = "Aplicaciones (apps)";
+App::$strings["Profile not found."] = "Perfil no encontrado.";
+App::$strings["Profile deleted."] = "Perfil eliminado.";
+App::$strings["Profile-"] = "Perfil-";
+App::$strings["New profile created."] = "El nuevo perfil ha sido creado.";
+App::$strings["Profile unavailable to clone."] = "Perfil no disponible para clonar.";
+App::$strings["Profile unavailable to export."] = "Perfil no disponible para exportar.";
+App::$strings["Profile Name is required."] = "Se necesita el nombre del perfil.";
+App::$strings["Marital Status"] = "Estado civil";
+App::$strings["Romantic Partner"] = "Pareja sentimental";
+App::$strings["Likes"] = "Me gusta";
+App::$strings["Dislikes"] = "No me gusta";
+App::$strings["Work/Employment"] = "Trabajo:";
+App::$strings["Religion"] = "Religión";
+App::$strings["Political Views"] = "Ideas políticas";
+App::$strings["Gender"] = "Género";
+App::$strings["Sexual Preference"] = "Preferencia sexual";
+App::$strings["Homepage"] = "Página personal";
+App::$strings["Interests"] = "Intereses";
+App::$strings["Profile updated."] = "Perfil actualizado.";
+App::$strings["Hide your connections list from viewers of this profile"] = "Ocultar la lista de conexiones a los visitantes del perfil";
+App::$strings["Edit Profile Details"] = "Modificar los detalles de este perfil";
+App::$strings["View this profile"] = "Ver este perfil";
+App::$strings["Edit visibility"] = "Editar visibilidad";
+App::$strings["Profile Tools"] = "Gestión del perfil";
+App::$strings["Change cover photo"] = "Cambiar la imagen de portada del perfil";
+App::$strings["Change profile photo"] = "Cambiar la foto del perfil";
+App::$strings["Create a new profile using these settings"] = "Crear un nuevo perfil usando estos ajustes";
+App::$strings["Clone this profile"] = "Clonar este perfil";
+App::$strings["Delete this profile"] = "Eliminar este perfil";
+App::$strings["Add profile things"] = "Añadir cosas al perfil";
+App::$strings["Personal"] = "Personales";
+App::$strings["Relation"] = "Relación";
+App::$strings["Miscellaneous"] = "Varios";
+App::$strings["Import profile from file"] = "Importar perfil desde un fichero";
+App::$strings["Export profile to file"] = "Exportar perfil a un fichero";
+App::$strings["Your gender"] = "Género";
+App::$strings["Marital status"] = "Estado civil";
+App::$strings["Sexual preference"] = "Preferencia sexual";
+App::$strings["Profile name"] = "Nombre del perfil";
+App::$strings["This is your default profile."] = "Este es su perfil principal.";
+App::$strings["Your full name"] = "Nombre completo";
+App::$strings["Title/Description"] = "Título o descripción";
+App::$strings["Street address"] = "Dirección";
+App::$strings["Locality/City"] = "Ciudad";
+App::$strings["Region/State"] = "Región o Estado";
+App::$strings["Postal/Zip code"] = "Código postal";
+App::$strings["Country"] = "País";
+App::$strings["Who (if applicable)"] = "Quién (si es pertinente)";
+App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Por ejemplo: ana123, María González, sara@ejemplo.com";
+App::$strings["Since (date)"] = "Desde (fecha)";
+App::$strings["Tell us about yourself"] = "Háblenos de usted";
+App::$strings["Homepage URL"] = "Dirección de la página personal";
+App::$strings["Hometown"] = "Lugar de nacimiento";
+App::$strings["Political views"] = "Ideas políticas";
+App::$strings["Religious views"] = "Creencias religiosas";
+App::$strings["Keywords used in directory listings"] = "Palabras clave utilizadas en los listados de directorios";
+App::$strings["Example: fishing photography software"] = "Por ejemplo: software de fotografía submarina";
+App::$strings["Musical interests"] = "Preferencias musicales";
+App::$strings["Books, literature"] = "Libros, literatura";
+App::$strings["Television"] = "Televisión";
+App::$strings["Film/Dance/Culture/Entertainment"] = "Cine, danza, cultura, entretenimiento";
+App::$strings["Hobbies/Interests"] = "Aficiones o intereses";
+App::$strings["Love/Romance"] = "Vida sentimental o amorosa";
+App::$strings["School/Education"] = "Estudios";
+App::$strings["Contact information and social networks"] = "Información de contacto y redes sociales";
+App::$strings["My other channels"] = "Mis otros canales";
+App::$strings["Profile Image"] = "Imagen del perfil";
+App::$strings["Edit Profiles"] = "Editar perfiles";
App::$strings["Unable to find your hub."] = "No se puede encontrar su servidor.";
App::$strings["Post successful."] = "Enviado con éxito.";
-App::$strings["Invalid profile identifier."] = "Identificador del perfil no válido";
-App::$strings["Profile Visibility Editor"] = "Editor de visibilidad del perfil";
-App::$strings["Profile"] = "Perfil";
-App::$strings["Click on a contact to add or remove."] = "Pulsar en un contacto para añadirlo o eliminarlo.";
-App::$strings["Visible To"] = "Visible para";
App::$strings["This setting requires special processing and editing has been blocked."] = "Este ajuste necesita de un proceso especial y la edición ha sido bloqueada.";
App::$strings["Configuration Editor"] = "Editor de configuración";
App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Atención: El cambio de algunos ajustes puede volver inutilizable su canal. Por favor, abandone la página excepto que esté seguro y sepa cómo usar correctamente esta característica.";
-App::$strings["Version %s"] = "Versión %s";
-App::$strings["Installed plugins/addons/apps:"] = "Extensiones (plugins), complementos o aplicaciones (apps) instaladas:";
-App::$strings["No installed plugins/addons/apps"] = "No hay instalada ninguna extensión (plugin), complemento o aplicación (app)";
-App::$strings["This is a hub of \$Projectname - a global cooperative network of decentralized privacy enhanced websites."] = "Este es un sitio integrado en \$Projectname - una red cooperativa mundial de sitios web descentralizados de privacidad mejorada.";
-App::$strings["Tag: "] = "Etiqueta:";
-App::$strings["Last background fetch: "] = "Última actualización en segundo plano:";
-App::$strings["Current load average: "] = "Carga media actual:";
-App::$strings["Running at web location"] = "Corriendo en el sitio web";
-App::$strings["Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more about \$Projectname."] = "Por favor, visite <a href=\"http://hubzilla.org\">hubzilla.org</a> para más información sobre \$Projectname.";
-App::$strings["Bug reports and issues: please visit"] = "Informes de errores e incidencias: por favor visite";
-App::$strings["\$projectname issues"] = "Problemas en \$projectname";
-App::$strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "Sugerencias, elogios, etc - por favor, un correo electrónico a \"redmatrix\" en librelist - punto com";
-App::$strings["Site Administrators"] = "Administradores del sitio";
App::$strings["Blocks"] = "Bloques";
App::$strings["Block Title"] = "Título del bloque";
App::$strings["Layouts"] = "Plantillas";
@@ -1061,68 +1051,79 @@ App::$strings["Help"] = "Ayuda";
App::$strings["Comanche page description language help"] = "Página de ayuda del lenguaje de descripción de páginas (PDL) Comanche";
App::$strings["Layout Description"] = "Descripción de la plantilla";
App::$strings["Download PDL file"] = "Descargar el fichero PDL";
-App::$strings["# Accounts"] = "# Cuentas";
-App::$strings["# blocked accounts"] = "# cuentas bloqueadas";
-App::$strings["# expired accounts"] = "# cuentas caducadas";
-App::$strings["# expiring accounts"] = "# cuentas que caducan";
-App::$strings["# Channels"] = "# Canales";
-App::$strings["# primary"] = "# primario";
-App::$strings["# clones"] = "# clones";
-App::$strings["Message queues"] = "Mensajes en cola";
-App::$strings["Your software should be updated"] = "Debe actualizar su software";
-App::$strings["Summary"] = "Sumario";
-App::$strings["Registered accounts"] = "Cuentas registradas";
-App::$strings["Pending registrations"] = "Registros pendientes";
-App::$strings["Registered channels"] = "Canales registrados";
-App::$strings["Active plugins"] = "Extensiones (plugins) activas";
-App::$strings["Version"] = "Versión";
-App::$strings["Repository version (master)"] = "Versión del repositorio (master)";
-App::$strings["Repository version (dev)"] = "Versión del repositorio (dev)";
+App::$strings["Website:"] = "Sitio web:";
+App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Canal remoto [%s] (aún no es conocido en este sitio)";
+App::$strings["Rating (this information is public)"] = "Valoración (esta información es pública)";
+App::$strings["Optionally explain your rating (this information is public)"] = "Opcionalmente puede explicar su valoración (esta información es pública)";
+App::$strings["Like/Dislike"] = "Me gusta/No me gusta";
+App::$strings["This action is restricted to members."] = "Esta acción está restringida solo para miembros.";
+App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Por favor, <a href=\"rmagic\">identifíquese con su \$Projectname ID</a> o <a href=\"register\">rregístrese como un nuevo \$Projectname member</a> para continuar.";
+App::$strings["Invalid request."] = "Solicitud incorrecta.";
+App::$strings["channel"] = "el canal";
+App::$strings["thing"] = "elemento";
+App::$strings["Channel unavailable."] = "Canal no disponible.";
+App::$strings["Previous action reversed."] = "Acción anterior revocada.";
+App::$strings["photo"] = "foto";
+App::$strings["status"] = "el mensaje de estado";
+App::$strings["event"] = "evento";
+App::$strings["%1\$s likes %2\$s's %3\$s"] = "A %1\$s le gusta %3\$s de %2\$s";
+App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "A %1\$s no le gusta %3\$s de %2\$s";
+App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s está de acuerdo";
+App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s no está de acuerdo";
+App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s se abstiene";
+App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s participa";
+App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s no participa";
+App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s quizá participe";
+App::$strings["Action completed."] = "Acción completada.";
+App::$strings["Thank you."] = "Gracias.";
App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Recargue la página o limpie el caché del navegador si la nueva foto no se muestra inmediatamente.";
+App::$strings["Use Photo for Profile"] = "Usar la fotografía para el perfil";
App::$strings["Upload Profile Photo"] = "Subir foto de perfil";
-App::$strings["Permissions denied."] = "Permisos denegados.";
-App::$strings["l, F j"] = "l j F";
-App::$strings["Link to Source"] = "Enlazar con la entrada en su ubicación original";
-App::$strings["Edit Event"] = "Editar el evento";
-App::$strings["Create Event"] = "Crear un evento";
-App::$strings["Export"] = "Exportar";
-App::$strings["Import"] = "Importar";
-App::$strings["Today"] = "Hoy";
+App::$strings["Use"] = "Usar";
+App::$strings["Items tagged with: %s"] = "elementos etiquetados con: %s";
+App::$strings["Search results for: %s"] = "Resultados de la búsqueda para: %s";
App::$strings["No channel."] = "Ningún canal.";
App::$strings["Common connections"] = "Conexiones comunes";
App::$strings["No connections in common."] = "Ninguna conexión en común.";
-App::$strings["No ratings"] = "Ninguna valoración";
-App::$strings["Rating: "] = "Valoración:";
-App::$strings["Website: "] = "Sitio web:";
-App::$strings["Description: "] = "Descripción:";
-App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Se ha superado el límite máximo de inscripciones diarias de este sitio. Por favor, pruebe de nuevo mañana.";
-App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Por favor, confirme que acepta los Términos del servicio. El registro ha fallado.";
-App::$strings["Passwords do not match."] = "Las contraseñas no coinciden.";
-App::$strings["Registration successful. Please check your email for validation instructions."] = "Registro realizado con éxito. Por favor, compruebe su correo electrónico para ver las instrucciones para validarlo.";
-App::$strings["Your registration is pending approval by the site owner."] = "Su registro está pendiente de aprobación por el propietario del sitio.";
-App::$strings["Your registration can not be processed."] = "Su registro no puede ser procesado.";
-App::$strings["Registration on this hub is disabled."] = "El registro está deshabilitado en este sitio.";
-App::$strings["Registration on this hub is by approval only."] = "El registro en este hub está sometido a aprobación previa.";
-App::$strings["<a href=\"pubsites\">Register at another affiliated hub.</a>"] = "<a href=\"pubsites\">Registrarse en otro hub afiliado.</a>";
-App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Este sitio ha excedido el límite de inscripción diaria de cuentas. Por favor, inténtelo de nuevo mañana.";
-App::$strings["Terms of Service"] = "Términos del servicio";
-App::$strings["I accept the %s for this website"] = "Acepto los %s de este sitio";
-App::$strings["I am over 13 years of age and accept the %s for this website"] = "Tengo más de 13 años de edad y acepto los %s de este sitio";
-App::$strings["Your email address"] = "Su dirección de correo electrónico";
-App::$strings["Choose a password"] = "Elija una contraseña";
-App::$strings["Please re-enter your password"] = "Por favor, vuelva a escribir su contraseña";
-App::$strings["Please enter your invitation code"] = "Por favor, introduzca el código de su invitación";
-App::$strings["no"] = "no";
-App::$strings["yes"] = "sí";
-App::$strings["Membership on this site is by invitation only."] = "Para registrarse en este sitio es necesaria una invitación.";
-App::$strings["Register"] = "Registrarse";
-App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Este sitio puede requerir una verificación de correo electrónico después de enviar este formulario. Si es devuelto a una página de inicio de sesión, compruebe su email para recibir y leer las instrucciones.";
-App::$strings["Documentation Search"] = "Búsqueda de Documentación";
-App::$strings["\$Projectname Documentation"] = "Documentación de \$Projectname";
+App::$strings["Authorize application connection"] = "Autorizar una conexión de aplicación";
+App::$strings["Return to your app and insert this Security Code:"] = "Vuelva a su aplicación e introduzca este código de seguridad: ";
+App::$strings["Please login to continue."] = "Por favor inicie sesión para continuar.";
+App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "¿Desea autorizar a esta aplicación a acceder a sus publicaciones y contactos, y/o crear nuevas publicaciones por usted?";
+App::$strings["sent you a private message"] = "le ha enviado un mensaje privado";
+App::$strings["added your channel"] = "añadió este canal a sus conexiones";
+App::$strings["g A l F d"] = "g A l d F";
+App::$strings["[today]"] = "[hoy]";
+App::$strings["posted an event"] = "publicó un evento";
+App::$strings["About this site"] = "Acerca de este sitio";
+App::$strings["Site Name"] = "Nombre del sitio";
+App::$strings["Administrator"] = "Administrador";
+App::$strings["Software and Project information"] = "Información sobre el software y el proyecto";
+App::$strings["This site is powered by \$Projectname"] = "Este sitio funciona con \$Projectname";
+App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Servicios federados y descentralizados de identidad y redes proporcionados por Zot";
+App::$strings["Version %s"] = "Versión %s";
+App::$strings["Project homepage"] = "Página principal del proyecto";
+App::$strings["Developer homepage"] = "Página principal del desarrollador";
+App::$strings["No valid account found."] = "No se ha encontrado una cuenta válida.";
+App::$strings["Password reset request issued. Check your email."] = "Se ha recibido una solicitud de restablecimiento de contraseña. Consulte su correo electrónico.";
+App::$strings["Site Member (%s)"] = "Usuario del sitio (%s)";
+App::$strings["Password reset requested at %s"] = "Se ha solicitado restablecer la contraseña en %s";
+App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado.";
+App::$strings["Password Reset"] = "Restablecer la contraseña";
+App::$strings["Your password has been reset as requested."] = "Su contraseña ha sido restablecida según lo solicitó.";
+App::$strings["Your new password is"] = "Su nueva contraseña es";
+App::$strings["Save or copy your new password - and then"] = "Guarde o copie su nueva contraseña - y después";
+App::$strings["click here to login"] = "pulse aquí para conectarse";
+App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Puede cambiar la contraseña en la página <em>Ajustes</em> una vez iniciada la sesión.";
+App::$strings["Your password has changed at %s"] = "Su contraseña en %s ha sido cambiada";
+App::$strings["Forgot your Password?"] = "¿Ha olvidado su contraseña?";
+App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones.";
+App::$strings["Email Address"] = "Dirección de correo electrónico";
+App::$strings["Reset"] = "Reiniciar";
App::$strings["Select a bookmark folder"] = "Seleccionar una carpeta de marcadores";
App::$strings["Save Bookmark"] = "Guardar marcador";
App::$strings["URL of bookmark"] = "Dirección del marcador";
App::$strings["Or enter new bookmark folder name"] = "O introduzca un nuevo nombre para la carpeta de marcadores";
+App::$strings["This directory server requires an access token"] = "El servidor de este directorio necesita un \"token\" de acceso";
App::$strings["Authentication failed."] = "Falló la autenticación.";
App::$strings["Remote Authentication"] = "Acceso desde su servidor";
App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Introduzca la dirección del canal (p.ej. canal@ejemplo.com)";
@@ -1134,10 +1135,53 @@ App::$strings["This account and all its channels will be completely removed from
App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Remover esta cuenta, todos sus canales y clones de la red";
App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "Por defecto, solo las instancias de los canales ubicados en este servidor serán eliminados de la red";
App::$strings["Remove Account"] = "Eliminar cuenta";
+App::$strings["Layout updated."] = "Plantilla actualizada.";
+App::$strings["Feature disabled."] = "Funcionalidad deshabilitada.";
+App::$strings["Edit System Page Description"] = "Editor del Sistema de Descripción de Páginas";
+App::$strings["Layout not found."] = "Plantilla no encontrada";
+App::$strings["Module Name:"] = "Nombre del módulo:";
+App::$strings["Layout Help"] = "Ayuda para el diseño de plantillas de página";
+App::$strings["Export Channel"] = "Exportar el canal";
+App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exportar la información básica del canal a un fichero. Este equivale a una copia de seguridad de sus conexiones, el perfil y datos fundamentales, que puede usarse para importar sus datos a un nuevo servidor, pero no incluye su contenido.";
+App::$strings["Export Content"] = "Exportar contenidos";
+App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exportar la información sobre su canal y el contenido reciente a un fichero de respaldo JSON, que puede ser restaurado o importado a otro servidor. Este fichero incluye todas sus conexiones, permisos, datos del perfil y publicaciones de varios meses. Puede llegar a ser MUY grande. Por favor, sea paciente, la descarga puede tardar varios minutos en comenzar.";
+App::$strings["Export your posts from a given year."] = "Exporta sus publicaciones de un año dado.";
+App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "También puede exportar sus mensajes y conversaciones durante un año o mes en particular. Ajuste la fecha en la barra de direcciones del navegador para seleccionar otras fechas. Si la exportación falla (posiblemente debido al agotamiento de la memoria del servidor hub), por favor, intente de nuevo la selección de un rango de fechas más pequeño.";
+App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Para seleccionar todos los mensajes de un año determinado, como este año, visite <a href=\"%1\$s\">%2\$s</a>";
+App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Para seleccionar todos los mensajes de un mes determinado, como el de enero de este año, visite <a href=\"%1\$s\">%2\$s</a>";
+App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Estos ficheros pueden ser importados o restaurados visitando <a href=\"%1\$s\">%2\$s</a> o cualquier sitio que contenga su canal. Para obtener los mejores resultados, por favor, importar o restaurar estos ficheros en orden de fecha (la más antigua primero).";
+App::$strings["Permissions denied."] = "Permisos denegados.";
+App::$strings["l, F j"] = "l j F";
+App::$strings["Link to Source"] = "Enlazar con la entrada en su ubicación original";
+App::$strings["Edit Event"] = "Editar el evento";
+App::$strings["Create Event"] = "Crear un evento";
+App::$strings["Export"] = "Exportar";
+App::$strings["Import"] = "Importar";
+App::$strings["Today"] = "Hoy";
+App::$strings["# Accounts"] = "# Cuentas";
+App::$strings["# blocked accounts"] = "# cuentas bloqueadas";
+App::$strings["# expired accounts"] = "# cuentas caducadas";
+App::$strings["# expiring accounts"] = "# cuentas que caducan";
+App::$strings["# Channels"] = "# Canales";
+App::$strings["# primary"] = "# primario";
+App::$strings["# clones"] = "# clones";
+App::$strings["Message queues"] = "Mensajes en cola";
+App::$strings["Your software should be updated"] = "Debe actualizar su software";
+App::$strings["Summary"] = "Sumario";
+App::$strings["Registered accounts"] = "Cuentas registradas";
+App::$strings["Pending registrations"] = "Registros pendientes";
+App::$strings["Registered channels"] = "Canales registrados";
+App::$strings["Active plugins"] = "Extensiones (plugins) activas";
+App::$strings["Version"] = "Versión";
+App::$strings["Repository version (master)"] = "Versión del repositorio (master)";
+App::$strings["Repository version (dev)"] = "Versión del repositorio (dev)";
+App::$strings["Remote privacy information not available."] = "La información privada remota no está disponible.";
+App::$strings["Visible to:"] = "Visible para:";
+App::$strings["No service class restrictions found."] = "No se han encontrado restricciones sobre esta clase de servicio.";
App::$strings["Import Webpage Elements"] = "Importar elementos de una página web";
App::$strings["Import selected"] = "Importar elementos seleccionados";
App::$strings["Export Webpage Elements"] = "Exportar elementos de una página web";
-App::$strings["Export selected"] = "Exportar elementos seleccionados";
+App::$strings["Export selected"] = "Exportar los elementos seleccionados";
App::$strings["Webpages"] = "Páginas web";
App::$strings["Actions"] = "Acciones";
App::$strings["Page Link"] = "Vínculo de la página";
@@ -1147,94 +1191,46 @@ App::$strings["Error opening zip file"] = "Error al abrir el fichero comprimido
App::$strings["Invalid folder path."] = "La ruta de la carpeta no es válida.";
App::$strings["No webpage elements detected."] = "No se han detectado elementos de ninguna página web.";
App::$strings["Import complete."] = "Importación completada.";
-App::$strings["Export Channel"] = "Exportar el canal";
-App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exportar la información básica del canal a un fichero. Este equivale a una copia de seguridad de sus conexiones, el perfil y datos fundamentales, que puede usarse para importar sus datos a un nuevo servidor, pero no incluye su contenido.";
-App::$strings["Export Content"] = "Exportar contenidos";
-App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exportar la información sobre su canal y el contenido reciente a un fichero de respaldo JSON, que puede ser restaurado o importado a otro servidor. Este fichero incluye todas sus conexiones, permisos, datos del perfil y publicaciones de varios meses. Puede llegar a ser MUY grande. Por favor, sea paciente, la descarga puede tardar varios minutos en comenzar.";
-App::$strings["Export your posts from a given year."] = "Exporta sus publicaciones de un año dado.";
-App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "También puede exportar sus mensajes y conversaciones durante un año o mes en particular. Ajuste la fecha en la barra de direcciones del navegador para seleccionar otras fechas. Si la exportación falla (posiblemente debido al agotamiento de la memoria del servidor hub), por favor, intente de nuevo la selección de un rango de fechas más pequeño.";
-App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Para seleccionar todos los mensajes de un año determinado, como este año, visite <a href=\"%1\$s\">%2\$s</a>";
-App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Para seleccionar todos los mensajes de un mes determinado, como el de enero de este año, visite <a href=\"%1\$s\">%2\$s</a>";
-App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Estos ficheros pueden ser importados o restaurados visitando <a href=\"%1\$s\">%2\$s</a> o cualquier sitio que contenga su canal. Para obtener los mejores resultados, por favor, importar o restaurar estos ficheros en orden de fecha (la más antigua primero).";
-App::$strings["Item is not editable"] = "El elemento no es editable";
-App::$strings["Items tagged with: %s"] = "elementos etiquetados con: %s";
-App::$strings["Search results for: %s"] = "Resultados de la búsqueda para: %s";
-App::$strings["Calendar entries imported."] = "Entradas de calendario importadas.";
-App::$strings["No calendar entries found."] = "No se han encontrado entradas de calendario.";
-App::$strings["Event can not end before it has started."] = "Un evento no puede terminar antes de que haya comenzado.";
-App::$strings["Unable to generate preview."] = "No se puede crear la vista previa.";
-App::$strings["Event title and start time are required."] = "Se requieren el título del evento y su hora de inicio.";
-App::$strings["Event not found."] = "Evento no encontrado.";
-App::$strings["Edit event title"] = "Editar el título del evento";
-App::$strings["Event title"] = "Título del evento";
-App::$strings["Categories (comma-separated list)"] = "Temas (lista separada por comas)";
-App::$strings["Edit Category"] = "Modificar el tema";
-App::$strings["Category"] = "Tema";
-App::$strings["Edit start date and time"] = "Modificar la fecha y hora de comienzo";
-App::$strings["Start date and time"] = "Fecha y hora de comienzo";
-App::$strings["Finish date and time are not known or not relevant"] = "La fecha y hora de terminación no se conocen o no son relevantes";
-App::$strings["Edit finish date and time"] = "Modificar la fecha y hora de terminación";
-App::$strings["Finish date and time"] = "Fecha y hora de terminación";
-App::$strings["Adjust for viewer timezone"] = "Ajustar para obtener el visor de los husos horarios";
-App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales.";
-App::$strings["Edit Description"] = "Editar la descripción";
-App::$strings["Edit Location"] = "Modificar la dirección";
-App::$strings["Share this event"] = "Compartir este evento";
-App::$strings["Permission settings"] = "Configuración de permisos";
-App::$strings["Advanced Options"] = "Opciones avanzadas";
-App::$strings["Edit event"] = "Editar evento";
-App::$strings["Delete event"] = "Borrar evento";
-App::$strings["calendar"] = "calendario";
-App::$strings["Month"] = "Mes";
-App::$strings["Week"] = "Semana";
-App::$strings["Day"] = "Día";
-App::$strings["Event removed"] = "Evento borrado";
-App::$strings["Failed to remove event"] = "Error al eliminar el evento";
-App::$strings["No service class restrictions found."] = "No se han encontrado restricciones sobre esta clase de servicio.";
-App::$strings["Thing updated"] = "Elemento actualizado.";
-App::$strings["Object store: failed"] = "Guardar objeto: ha fallado";
-App::$strings["Thing added"] = "Elemento añadido";
-App::$strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
-App::$strings["Show Thing"] = "Mostrar elemento";
-App::$strings["item not found."] = "elemento no encontrado.";
-App::$strings["Edit Thing"] = "Editar elemento";
-App::$strings["Select a profile"] = "Seleccionar un perfil";
-App::$strings["Post an activity"] = "Publicar una actividad";
-App::$strings["Only sends to viewers of the applicable profile"] = "Sólo enviar a espectadores del perfil pertinente.";
-App::$strings["Name of thing e.g. something"] = "Nombre del elemento, p. ej.:. \"algo\"";
-App::$strings["URL of thing (optional)"] = "Dirección del elemento (opcional)";
-App::$strings["URL for photo of thing (optional)"] = "Dirección para la foto o elemento (opcional)";
-App::$strings["Add Thing to your Profile"] = "Añadir alguna cosa a su perfil";
-App::$strings["Unable to locate original post."] = "No ha sido posible encontrar la entrada original.";
-App::$strings["Empty post discarded."] = "La entrada vacía ha sido desechada.";
-App::$strings["Executable content type not permitted to this channel."] = "Contenido de tipo ejecutable no permitido en este canal.";
-App::$strings["Duplicate post suppressed."] = "Se ha suprimido la entrada duplicada.";
-App::$strings["System error. Post not saved."] = "Error del sistema. La entrada no se ha podido salvar.";
-App::$strings["Unable to obtain post information from database."] = "No ha sido posible obtener información de la entrada en la base de datos.";
-App::$strings["You have reached your limit of %1$.0f top level posts."] = "Ha alcanzado su límite de %1$.0f entradas en la página principal.";
-App::$strings["You have reached your limit of %1$.0f webpages."] = "Ha alcanzado su límite de %1$.0f páginas web.";
+App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "La eliminación de canales no está permitida hasta pasadas 48 horas desde el último cambio de contraseña.";
+App::$strings["Remove This Channel"] = "Eliminar este canal";
+App::$strings["This channel will be completely removed from the network. "] = "Este canal va a ser completamente eliminado de la red. ";
+App::$strings["Remove this channel and all its clones from the network"] = "Eliminar este canal y todos sus clones de la red";
+App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Por defecto, solo la instancia del canal alojado en este servidor será eliminado de la red";
+App::$strings["Remove Channel"] = "Eliminar el canal";
App::$strings["Files: shared with me"] = "Ficheros: compartidos conmigo";
App::$strings["NEW"] = "NUEVO";
App::$strings["Remove all files"] = "Eliminar todos los ficheros";
App::$strings["Remove this file"] = "Eliminar este fichero";
App::$strings["Not found"] = "No encontrado";
-App::$strings["Wiki"] = "Wiki";
-App::$strings["Sandbox"] = "Entorno de edición";
-App::$strings["\"# Wiki Sandbox\\n\\nContent you **edit** and **preview** here *will not be saved*.\""] = "\"# Entorno de edición del Wiki\\n\\nEl contenido que se **edite** y **previsualizce** aquí *no se guardará*.\"";
+App::$strings["Invalid channel"] = "Canal no válido";
+App::$strings["Error retrieving wiki"] = "Error al recuperar el wiki";
+App::$strings["Error creating zip file export folder"] = "Error al crear el fichero comprimido zip de la carpeta a exportar";
+App::$strings["Error downloading wiki: "] = "Error al descargar el wiki: ";
+App::$strings["Wikis"] = "Wikis";
+App::$strings["Download"] = "Descargar";
+App::$strings["Wiki name"] = "Nombre del wiki";
+App::$strings["Content type"] = "Tipo de contenido";
+App::$strings["Create a status post for this wiki"] = "Crear un mensaje de estado para este wiki";
+App::$strings["Wiki not found"] = "Wiki no encontrado";
+App::$strings["Rename page"] = "Renombrar la página";
+App::$strings["Error retrieving page content"] = "Error al recuperar el contenido de la página";
App::$strings["Revision Comparison"] = "Comparación de revisiones";
App::$strings["Revert"] = "Revertir";
-App::$strings["Enter the name of your new wiki:"] = "Nombre de su nuevo wiki:";
-App::$strings["Enter the name of the new page:"] = "Nombre de la nueva página:";
-App::$strings["Enter the new name:"] = "Nuevo nombre:";
+App::$strings["Source"] = "Fuente";
+App::$strings["New page name"] = "Nombre de la nueva página";
App::$strings["Embed image from photo albums"] = "Incluir una imagen de los álbumes de fotos";
App::$strings["Embed an image from your albums"] = "Incluir una imagen de sus álbumes";
App::$strings["OK"] = "OK";
App::$strings["Choose images to embed"] = "Elegir imágenes para incluir";
App::$strings["Choose an album"] = "Elegir un álbum";
-App::$strings["Choose a different album..."] = "Elegir un álbum diferente...";
+App::$strings["Choose a different album"] = "Elegir un álbum diferente...";
App::$strings["Error getting album list"] = "Error al obtener la lista de álbumes";
App::$strings["Error getting photo link"] = "Error al obtener el enlace de la foto";
App::$strings["Error getting album"] = "Error al obtener el álbum";
+App::$strings["Error creating wiki. Invalid name."] = "Error al crear el wiki: el nombre no es válido.";
+App::$strings["Wiki created, but error creating Home page."] = "Se ha creado el wiki, pero se ha producido un error al crear la página de inicio.";
+App::$strings["Error creating wiki"] = "Error al crear el wiki";
+App::$strings["New page created"] = "Se ha creado la nueva página";
App::$strings["Failed to create source. No channel selected."] = "No se ha podido crear el origen de los contenidos. No ha sido seleccionado ningún canal.";
App::$strings["Source created."] = "Fuente creada.";
App::$strings["Source updated."] = "Fuente actualizada.";
@@ -1261,60 +1257,35 @@ App::$strings["Channel Suggestions"] = "Sugerencias de canales";
App::$strings["post"] = "la entrada";
App::$strings["comment"] = "el comentario";
App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s ha etiquetado %3\$s de %2\$s con %4\$s";
-App::$strings["Tag removed"] = "Etiqueta eliminada.";
-App::$strings["Remove Item Tag"] = "Eliminar etiqueta del elemento.";
-App::$strings["Select a tag to remove: "] = "Seleccionar una etiqueta para eliminar:";
-App::$strings["Channel added."] = "Canal añadido.";
-App::$strings["No connections."] = "Sin conexiones.";
-App::$strings["Visit %s's profile [%s]"] = "Visitar el perfil de %s [%s]";
-App::$strings["View Connections"] = "Ver conexiones";
-App::$strings["Source of Item"] = "Origen del elemento";
-App::$strings["Room not found"] = "Sala no encontrada";
-App::$strings["Leave Room"] = "Abandonar la sala";
-App::$strings["Delete Room"] = "Eliminar esta sala";
-App::$strings["I am away right now"] = "Estoy ausente momentáneamente";
-App::$strings["I am online"] = "Estoy conectado/a";
-App::$strings["Bookmark this room"] = "Añadir esta sala a Marcadores";
-App::$strings["New Chatroom"] = "Nueva sala de chat";
-App::$strings["Chatroom name"] = "Nombre de la sala de chat";
-App::$strings["Expiration of chats (minutes)"] = "Caducidad de los mensajes en los chats (en minutos)";
-App::$strings["%1\$s's Chatrooms"] = "Salas de chat de %1\$s";
-App::$strings["No chatrooms available"] = "No hay salas de chat disponibles";
-App::$strings["Expiration"] = "Caducidad";
-App::$strings["min"] = "min";
-App::$strings["Xchan Lookup"] = "Búsqueda de canales";
-App::$strings["Lookup xchan beginning with (or webbie): "] = "Buscar un canal (o un \"webbie\") que comience por:";
-App::$strings["%d rating"] = array(
- 0 => "%d valoración",
- 1 => "%d valoraciones",
-);
-App::$strings["Gender: "] = "Género:";
-App::$strings["Status: "] = "Estado:";
-App::$strings["Homepage: "] = "Página personal:";
-App::$strings["Age:"] = "Edad:";
-App::$strings["Location:"] = "Ubicación:";
-App::$strings["Description:"] = "Descripción:";
-App::$strings["Hometown:"] = "Lugar de nacimiento:";
-App::$strings["About:"] = "Sobre mí:";
-App::$strings["Public Forum:"] = "Foro público:";
-App::$strings["Keywords: "] = "Palabras clave:";
-App::$strings["Don't suggest"] = "No sugerir:";
-App::$strings["Common connections:"] = "Conexiones comunes:";
-App::$strings["Global Directory"] = "Directorio global:";
-App::$strings["Local Directory"] = "Directorio local:";
-App::$strings["Finding:"] = "Encontrar:";
-App::$strings["next page"] = "siguiente página";
-App::$strings["previous page"] = "página anterior";
-App::$strings["Sort options"] = "Ordenar opciones";
-App::$strings["Alphabetic"] = "Alfabético";
-App::$strings["Reverse Alphabetic"] = "Alfabético inverso";
-App::$strings["Newest to Oldest"] = "De más nuevo a más antiguo";
-App::$strings["Oldest to Newest"] = "De más antiguo a más nuevo";
-App::$strings["No entries (some entries may be hidden)."] = "Sin entradas (algunas entradas pueden estar ocultas).";
+App::$strings["Additional Features"] = "Funcionalidades";
+App::$strings["Name is required"] = "El nombre es obligatorio";
+App::$strings["Key and Secret are required"] = "\"Key\" y \"Secret\" son obligatorios";
+App::$strings["Add application"] = "Añadir aplicación";
+App::$strings["Name of application"] = "Nombre de la aplicación";
+App::$strings["Consumer Key"] = "Consumer Key";
+App::$strings["Automatically generated - change if desired. Max length 20"] = "Generado automáticamente - si lo desea, cámbielo. Longitud máxima: 20";
+App::$strings["Consumer Secret"] = "Consumer Secret";
+App::$strings["Redirect"] = "Redirigir";
+App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI de redirección - dejar en blanco a menos que su aplicación específicamente lo requiera";
+App::$strings["Icon url"] = "Dirección del icono";
+App::$strings["Application not found."] = "Aplicación no encontrada.";
+App::$strings["Connected Apps"] = "Aplicaciones (apps) conectadas";
+App::$strings["Client key starts with"] = "La \"client key\" empieza por";
+App::$strings["No name"] = "Sin nombre";
+App::$strings["Remove authorization"] = "Eliminar autorización";
+App::$strings["This channel is limited to %d tokens"] = "Este canal tiene un límite de %d tokens";
+App::$strings["Name and Password are required."] = "Se requiere el nombre y la contraseña.";
+App::$strings["Token saved."] = "Token salvado.";
+App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Utilice este formulario para crear identificadores de acceso temporal para compartir cosas con los no miembros de Hubzilla. Estas identidades se pueden usar en las Listas de control de acceso (ACL) y así los visitantes pueden iniciar sesión, utilizando estas credenciales, para acceder a su contenido privado.";
+App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "También puede proporcionar, con el estilo <em>dropbox</em>, enlaces de acceso a sus amigos y asociados añadiendo la contraseña de inicio de sesión a cualquier dirección URL, como se muestra. Ejemplos: ";
+App::$strings["Guest Access Tokens"] = "Tokens de acceso para invitados";
+App::$strings["Login Name"] = "Nombre de inicio de sesión";
+App::$strings["Login Password"] = "Contraseña de inicio de sesión";
+App::$strings["Expires (yyyy-mm-dd)"] = "Expira (aaaa-mm-dd)";
App::$strings["Not valid email."] = "Correo electrónico no válido.";
App::$strings["Protected email address. Cannot change to that email."] = "Dirección de correo electrónico protegida. No se puede cambiar a ella.";
App::$strings["System failure storing new email. Please try again."] = "Fallo de sistema al guardar el nuevo correo electrónico. Por favor, inténtelo de nuevo.";
-App::$strings["Technical skill level updated"] = "Nivel de habilidad técnica actualizado";
+App::$strings["Technical skill level updated"] = "Se ha actualizado el nivel de habilidad técnica";
App::$strings["Password verification failed."] = "La comprobación de la contraseña ha fallado.";
App::$strings["Passwords do not match. Password unchanged."] = "Las contraseñas no coinciden. La contraseña no se ha cambiado.";
App::$strings["Empty passwords are not allowed. Password unchanged."] = "No se permiten contraseñas vacías. La contraseña no se ha cambiado.";
@@ -1341,6 +1312,7 @@ App::$strings["Anybody on the internet"] = "Cualquiera en internet";
App::$strings["Publish your default profile in the network directory"] = "Publicar su perfil principal en el directorio de la red";
App::$strings["Allow us to suggest you as a potential friend to new members?"] = "¿Nos permite sugerirle como amigo potencial a los nuevos miembros?";
App::$strings["Your channel address is"] = "Su dirección de canal es";
+App::$strings["Your files/photos are accessible via WebDAV at"] = "Sus archivos y fotos son accesibles a través de WebDAV en ";
App::$strings["Channel Settings"] = "Ajustes del canal";
App::$strings["Basic Settings"] = "Configuración básica";
App::$strings["Full Name:"] = "Nombre completo:";
@@ -1388,6 +1360,7 @@ App::$strings["You receive a private message"] = "Reciba un mensaje privado";
App::$strings["You receive a friend suggestion"] = "Reciba una sugerencia de amistad";
App::$strings["You are tagged in a post"] = "Usted sea etiquetado en una publicación";
App::$strings["You are poked/prodded/etc. in a post"] = "Reciba un toque o incitación en una publicación";
+App::$strings["Someone likes your post/comment"] = "Alguien muestre agrado por su entrada o comentario";
App::$strings["Show visual notifications including:"] = "Mostrar notificaciones visuales que incluyan:";
App::$strings["Unseen grid activity"] = "Nueva actividad en la red";
App::$strings["Unseen channel activity"] = "Actividad no vista en el canal";
@@ -1410,7 +1383,7 @@ App::$strings["Change the behaviour of this account for special situations"] = "
App::$strings["Miscellaneous Settings"] = "Ajustes diversos";
App::$strings["Default photo upload folder"] = "Carpeta por defecto de las fotos subidas";
App::$strings["%Y - current year, %m - current month"] = "%Y - año en curso, %m - mes actual";
-App::$strings["Default file upload folder"] = "Carpeta por defecto de los archivos subidos";
+App::$strings["Default file upload folder"] = "Carpeta por defecto de los ficheros subidos";
App::$strings["Personal menu to display in your channel pages"] = "Menú personal que debe mostrarse en las páginas de su canal";
App::$strings["Remove this channel."] = "Eliminar este canal.";
App::$strings["Firefox Share \$Projectname provider"] = "Servicio de compartición de Firefox: proveedor \$Projectname";
@@ -1432,6 +1405,8 @@ App::$strings["Minimum of 10 seconds, no maximum"] = "Mínimo de 10 segundos, si
App::$strings["Maximum number of conversations to load at any time:"] = "Máximo número de conversaciones a cargar en cualquier momento:";
App::$strings["Maximum of 100 items"] = "Máximo de 100 elementos";
App::$strings["Show emoticons (smilies) as images"] = "Mostrar emoticonos (smilies) como imágenes";
+App::$strings["Manual conversation updates"] = "Actualizaciones manuales de la conversación";
+App::$strings["Default is automatic, which may increase screen jumping"] = "El valor predeterminado es automático, lo que puede aumentar el salto de pantalla";
App::$strings["Link post titles to source"] = "Enlazar título de la publicación a la fuente original";
App::$strings["System Page Layout Editor - (advanced)"] = "Editor de plantilla de página del sistema - (avanzado)";
App::$strings["Use blog/list mode on channel page"] = "Usar modo blog/lista en la página de inicio del canal";
@@ -1442,78 +1417,106 @@ App::$strings["click to expand content exceeding this height"] = "Pulsar para ex
App::$strings["Grid page max height of content (in pixels)"] = "Altura máxima del contenido de mi red (en píxeles)";
App::$strings["No feature settings configured"] = "No se ha establecido la configuración de los complementos";
App::$strings["Feature/Addon Settings"] = "Ajustes de los complementos";
-App::$strings["Additional Features"] = "Funcionalidades";
-App::$strings["Name is required"] = "El nombre es obligatorio";
-App::$strings["Key and Secret are required"] = "\"Key\" y \"Secret\" son obligatorios";
-App::$strings["Add application"] = "Añadir aplicación";
-App::$strings["Name of application"] = "Nombre de la aplicación";
-App::$strings["Consumer Key"] = "Consumer Key";
-App::$strings["Automatically generated - change if desired. Max length 20"] = "Generado automáticamente - si lo desea, cámbielo. Longitud máxima: 20";
-App::$strings["Consumer Secret"] = "Consumer Secret";
-App::$strings["Redirect"] = "Redirigir";
-App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI de redirección - dejar en blanco a menos que su aplicación específicamente lo requiera";
-App::$strings["Icon url"] = "Dirección del icono";
-App::$strings["Application not found."] = "Aplicación no encontrada.";
-App::$strings["Connected Apps"] = "Aplicaciones (apps) conectadas";
-App::$strings["Client key starts with"] = "La \"client key\" empieza por";
-App::$strings["No name"] = "Sin nombre";
-App::$strings["Remove authorization"] = "Eliminar autorización";
-App::$strings["This channel is limited to %d tokens"] = "Este canal tiene un límite de %d tokens";
-App::$strings["Name and Password are required."] = "Se requiere el nombre y la contraseña.";
-App::$strings["Token saved."] = "Token salvado.";
-App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Utilice este formulario para crear identificadores de acceso temporal para compartir cosas con los no miembros de Hubzilla. Estas identidades se pueden usar en las Listas de control de acceso (ACL) y así los visitantes pueden iniciar sesión, utilizando estas credenciales, para acceder a su contenido privado.";
-App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "También puede proporcionar, con el estilo <em>dropbox</em>, enlaces de acceso a sus amigos y asociados añadiendo la contraseña de inicio de sesión a cualquier dirección URL, como se muestra. Ejemplos: ";
-App::$strings["Guest Access Tokens"] = "Tokens de acceso para invitados";
-App::$strings["Login Name"] = "Nombre de inicio de sesión";
-App::$strings["Login Password"] = "Contraseña de inicio de sesión";
-App::$strings["Expires (yyyy-mm-dd)"] = "Expira (aaaa-mm-dd)";
+App::$strings["Tag removed"] = "Etiqueta eliminada.";
+App::$strings["Remove Item Tag"] = "Eliminar etiqueta del elemento.";
+App::$strings["Select a tag to remove: "] = "Seleccionar una etiqueta para eliminar:";
+App::$strings["Thing updated"] = "Elemento actualizado.";
+App::$strings["Object store: failed"] = "Guardar objeto: ha fallado";
+App::$strings["Thing added"] = "Elemento añadido";
+App::$strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+App::$strings["Show Thing"] = "Mostrar elemento";
+App::$strings["item not found."] = "elemento no encontrado.";
+App::$strings["Edit Thing"] = "Editar elemento";
+App::$strings["Select a profile"] = "Seleccionar un perfil";
+App::$strings["Post an activity"] = "Publicar una actividad";
+App::$strings["Only sends to viewers of the applicable profile"] = "Sólo enviar a espectadores del perfil pertinente.";
+App::$strings["Name of thing e.g. something"] = "Nombre del elemento, p. ej.:. \"algo\"";
+App::$strings["URL of thing (optional)"] = "Dirección del elemento (opcional)";
+App::$strings["URL for photo of thing (optional)"] = "Dirección para la foto o elemento (opcional)";
+App::$strings["Add Thing to your Profile"] = "Añadir alguna cosa a su perfil";
+App::$strings["Your service plan only allows %d channels."] = "Su paquete de servicios solo permite %d canales.";
+App::$strings["Cloned channel not found. Import failed."] = "No se ha podido importar el canal porque el canal clonado no se ha encontrado.";
+App::$strings["No channel. Import failed."] = "No hay canal. La importación ha fallado";
+App::$strings["Import completed."] = "Importación completada.";
+App::$strings["You must be logged in to use this feature."] = "Debe estar registrado para poder usar esta funcionalidad.";
+App::$strings["Import Channel"] = "Importar canal";
+App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación.";
+App::$strings["Or provide the old server/hub details"] = "O proporcione los detalles de su antiguo servidor/hub";
+App::$strings["Your old identity address (xyz@example.com)"] = "Su identidad en el antiguo servidor (canal@ejemplo.com)";
+App::$strings["Your old login email address"] = "Su antigua dirección de correo electrónico";
+App::$strings["Your old login password"] = "Su antigua contraseña";
+App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos.";
+App::$strings["Make this hub my primary location"] = "Convertir este servidor en mi ubicación primaria";
+App::$strings["Import existing posts if possible (experimental - limited by available memory"] = "Importar el contenido publicado si es posible (experimental - limitado por la memoria disponible";
+App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine.";
+App::$strings["No connections."] = "Sin conexiones.";
+App::$strings["Visit %s's profile [%s]"] = "Visitar el perfil de %s [%s]";
+App::$strings["View Connections"] = "Ver conexiones";
+App::$strings["Source of Item"] = "Origen del elemento";
+App::$strings["Room not found"] = "Sala no encontrada";
+App::$strings["Leave Room"] = "Abandonar la sala";
+App::$strings["Delete Room"] = "Eliminar esta sala";
+App::$strings["I am away right now"] = "Estoy ausente momentáneamente";
+App::$strings["I am online"] = "Estoy conectado/a";
+App::$strings["Bookmark this room"] = "Añadir esta sala a Marcadores";
+App::$strings["New Chatroom"] = "Nueva sala de chat";
+App::$strings["Chatroom name"] = "Nombre de la sala de chat";
+App::$strings["Expiration of chats (minutes)"] = "Caducidad de los mensajes en los chats (en minutos)";
+App::$strings["%1\$s's Chatrooms"] = "Salas de chat de %1\$s";
+App::$strings["No chatrooms available"] = "No hay salas de chat disponibles";
+App::$strings["Expiration"] = "Caducidad";
+App::$strings["min"] = "min";
+App::$strings["Xchan Lookup"] = "Búsqueda de canales";
+App::$strings["Lookup xchan beginning with (or webbie): "] = "Buscar un canal (o un \"webbie\") que comience por:";
+App::$strings["Calendar entries imported."] = "Entradas de calendario importadas.";
+App::$strings["No calendar entries found."] = "No se han encontrado entradas de calendario.";
+App::$strings["Event can not end before it has started."] = "Un evento no puede terminar antes de que haya comenzado.";
+App::$strings["Unable to generate preview."] = "No se puede crear la vista previa.";
+App::$strings["Event title and start time are required."] = "Se requieren el título del evento y su hora de inicio.";
+App::$strings["Event not found."] = "Evento no encontrado.";
+App::$strings["Edit event title"] = "Editar el título del evento";
+App::$strings["Event title"] = "Título del evento";
+App::$strings["Categories (comma-separated list)"] = "Temas (lista separada por comas)";
+App::$strings["Edit Category"] = "Modificar el tema";
+App::$strings["Category"] = "Tema";
+App::$strings["Edit start date and time"] = "Modificar la fecha y hora de comienzo";
+App::$strings["Start date and time"] = "Fecha y hora de comienzo";
+App::$strings["Finish date and time are not known or not relevant"] = "La fecha y hora de terminación no se conocen o no son relevantes";
+App::$strings["Edit finish date and time"] = "Modificar la fecha y hora de terminación";
+App::$strings["Finish date and time"] = "Fecha y hora de terminación";
+App::$strings["Adjust for viewer timezone"] = "Ajustar para obtener el visor de los husos horarios";
+App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales.";
+App::$strings["Edit Description"] = "Editar la descripción";
+App::$strings["Edit Location"] = "Modificar la dirección";
+App::$strings["Permission settings"] = "Configuración de permisos";
+App::$strings["Advanced Options"] = "Opciones avanzadas";
+App::$strings["Edit event"] = "Editar evento";
+App::$strings["Delete event"] = "Borrar evento";
+App::$strings["calendar"] = "calendario";
+App::$strings["Month"] = "Mes";
+App::$strings["Week"] = "Semana";
+App::$strings["Day"] = "Día";
+App::$strings["Event removed"] = "Evento borrado";
+App::$strings["Failed to remove event"] = "Error al eliminar el evento";
App::$strings["Missing room name"] = "Sala de chat sin nombre";
App::$strings["Duplicate room name"] = "Nombre de sala duplicado.";
App::$strings["Invalid room specifier."] = "Especificador de sala no válido.";
App::$strings["Room not found."] = "Sala no encontrada.";
App::$strings["Room is full"] = "La sala está llena.";
-App::$strings["\$Projectname Notification"] = "Notificación de \$Projectname";
-App::$strings["\$projectname"] = "\$projectname";
-App::$strings["Thank You,"] = "Gracias,";
-App::$strings["%s Administrator"] = "%s Administrador";
-App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
-App::$strings["[\$Projectname:Notify] New mail received at %s"] = "[\$Projectname:Aviso] Nuevo correo recibido en %s";
-App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s le ha enviado un nuevo mensaje privado en %3\$s.";
-App::$strings["%1\$s sent you %2\$s."] = "%1\$s le ha enviado %2\$s.";
-App::$strings["a private message"] = "un mensaje privado";
-App::$strings["Please visit %s to view and/or reply to your private messages."] = "Por favor visite %s para ver y/o responder a su mensaje privado.";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%4\$s[/zrl]";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%5\$s de %4\$s[/zrl] ";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%4\$s creado por usted[/zrl]";
-App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Aviso] Nuevo comentario de %2\$s en la conversación #%1\$d";
-App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s ha comentado un elemento/conversación que ha estado siguiendo.";
-App::$strings["Please visit %s to view and/or reply to the conversation."] = "Para ver o comentar la conversación, visite %s";
-App::$strings["[\$Projectname:Notify] %s posted to your profile wall"] = "[\$Projectname:Aviso] %s ha publicado una entrada en su página de inicio del perfil (\"muro\")";
-App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s ha publicado en su página del perfil en %3\$s";
-App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s ha publicado en [zrl=%3\$s]su página del perfil[/zrl]";
-App::$strings["[\$Projectname:Notify] %s tagged you"] = "[\$Projectname:Aviso] %s le ha etiquetado";
-App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s le ha etiquetado en %3\$s";
-App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]le etiquetó[/zrl].";
-App::$strings["[\$Projectname:Notify] %1\$s poked you"] = "[\$Projectname:Aviso] %1\$s le ha dado un toque";
-App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s le ha dado un toque en %3\$s";
-App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]le ha dado un toque[/zrl].";
-App::$strings["[\$Projectname:Notify] %s tagged your post"] = "[\$Projectname:Aviso] %s ha etiquetado su entrada";
-App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s ha etiquetado su publicación en %3\$s";
-App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s ha etiquetado [zrl=%3\$s]su publicación[/zrl]";
-App::$strings["[\$Projectname:Notify] Introduction received"] = "[\$Projectname:Aviso] Ha recibido una solicitud de conexión";
-App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, ha recibido una nueva solicitud de conexión de '%2\$s' en %3\$s";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, ha recibido [zrl=%2\$s]una nueva solicitud de conexión[/zrl] de %3\$s.";
-App::$strings["You may visit their profile at %s"] = "Puede visitar su perfil en %s";
-App::$strings["Please visit %s to approve or reject the connection request."] = "Por favor, visite %s para permitir o rechazar la solicitad de conexión.";
-App::$strings["[\$Projectname:Notify] Friend suggestion received"] = "[\$Projectname:Aviso] Ha recibido una sugerencia de conexión";
-App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, ha recibido una sugerencia de conexión de '%2\$s' en %3\$s";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, ha recibido [zrl=%2\$s]una sugerencia de conexión[/zrl] para %3\$s de %4\$s.";
-App::$strings["Name:"] = "Nombre:";
-App::$strings["Photo:"] = "Foto:";
-App::$strings["Please visit %s to approve or reject the suggestion."] = "Por favor, visite %s para aprobar o rechazar la sugerencia.";
-App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Aviso]";
-App::$strings["created a new post"] = "ha creado una nueva entrada";
-App::$strings["commented on %s's post"] = "ha comentado la entrada de %s";
+App::$strings["Visible to your default audience"] = "Visible para su público predeterminado.";
+App::$strings["Only me"] = "Sólo yo";
+App::$strings["Public"] = "Público";
+App::$strings["Anybody in the \$Projectname network"] = "Cualquiera en la red \$Projectname";
+App::$strings["Any account on %s"] = "Cualquier cuenta en %s";
+App::$strings["Any of my connections"] = "Cualquiera de mis conexiones";
+App::$strings["Only connections I specifically allow"] = "Sólo las conexiones que yo permita de forma explícita";
+App::$strings["Anybody authenticated (could include visitors from other networks)"] = "Cualquiera que esté autenticado (podría incluir a los visitantes de otras redes)";
+App::$strings["Any connections including those who haven't yet been approved"] = "Cualquier conexión incluyendo aquellas que aún no han sido aprobadas";
+App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Esta es la configuración predeterminada para su flujo (stream) habitual de publicaciones.";
+App::$strings["This is your default setting for who can view your default channel profile"] = "Esta es su configuración por defecto para establecer quién puede ver su perfil del canal predeterminado";
+App::$strings["This is your default setting for who can view your connections"] = "Este es su ajuste predeterminado para establecer quién puede ver sus conexiones";
+App::$strings["This is your default setting for who can view your file storage and photos"] = "Este es su ajuste predeterminado para establecer quién puede ver su repositorio de ficheros y sus fotos";
+App::$strings["This is your default setting for the audience of your webpages"] = "Este es el ajuste predeterminado para establecer la audiencia de sus páginas web";
App::$strings["Private Message"] = "Mensaje Privado";
App::$strings["Select"] = "Seleccionar";
App::$strings["Save to Folder"] = "Guardar en carpeta";
@@ -1547,6 +1550,10 @@ App::$strings["via Wall-To-Wall:"] = "Mediante el procedimiento página del perf
App::$strings["from %s"] = "desde %s";
App::$strings["last edited: %s"] = "último cambio: %s";
App::$strings["Expires: %s"] = "Caduca: %s";
+App::$strings["Attend"] = "Participar o asistir";
+App::$strings["Attendance Options"] = "Opciones de participación o asistencia";
+App::$strings["Vote"] = "Votar";
+App::$strings["Voting Options"] = "Opciones de votación";
App::$strings["Save Bookmarks"] = "Guardar en Marcadores";
App::$strings["Add to Calendar"] = "Añadir al calendario";
App::$strings["Mark all seen"] = "Marcar todo como visto";
@@ -1559,22 +1566,8 @@ App::$strings["Code"] = "Código";
App::$strings["Image"] = "Imagen";
App::$strings["Insert Link"] = "Insertar enlace";
App::$strings["Video"] = "Vídeo";
-App::$strings["Visible to your default audience"] = "Visible para su público predeterminado.";
-App::$strings["Only me"] = "Sólo yo";
-App::$strings["Public"] = "Público";
-App::$strings["Anybody in the \$Projectname network"] = "Cualquiera en la red \$Projectname";
-App::$strings["Any account on %s"] = "Cualquier cuenta en %s";
-App::$strings["Any of my connections"] = "Cualquiera de mis conexiones";
-App::$strings["Only connections I specifically allow"] = "Sólo las conexiones que yo permita de forma explícita";
-App::$strings["Anybody authenticated (could include visitors from other networks)"] = "Cualquiera que esté autenticado (podría incluir a los visitantes de otras redes)";
-App::$strings["Any connections including those who haven't yet been approved"] = "Cualquier conexión incluyendo aquellas que aún no han sido aprobadas";
-App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Esta es la configuración predeterminada para su flujo (stream) habitual de publicaciones.";
-App::$strings["This is your default setting for who can view your default channel profile"] = "Esta es su configuración por defecto para establecer quién puede ver su perfil del canal predeterminado";
-App::$strings["This is your default setting for who can view your connections"] = "Este es su ajuste predeterminado para establecer quién puede ver sus conexiones";
-App::$strings["This is your default setting for who can view your file storage and photos"] = "Este es su ajuste predeterminado para establecer quién puede ver su repositorio de ficheros y sus fotos";
-App::$strings["This is your default setting for the audience of your webpages"] = "Este es el ajuste predeterminado para establecer la audiencia de sus páginas web";
App::$strings["Site Admin"] = "Administrador del sitio";
-App::$strings["Bug Report"] = "Informe de errores";
+App::$strings["Report Bug"] = "Informe de errores";
App::$strings["View Bookmarks"] = "Ver los marcadores";
App::$strings["My Chatrooms"] = "Mis salas de chat";
App::$strings["Firefox Share"] = "Servicio de compartición de Firefox";
@@ -1582,6 +1575,7 @@ App::$strings["Remote Diagnostics"] = "Diagnóstico remoto";
App::$strings["Suggest Channels"] = "Sugerir canales";
App::$strings["Login"] = "Iniciar sesión";
App::$strings["Grid"] = "Red";
+App::$strings["Wiki"] = "Wiki";
App::$strings["Channel Home"] = "Mi canal";
App::$strings["Events"] = "Eventos";
App::$strings["Directory"] = "Directorio";
@@ -1596,196 +1590,752 @@ App::$strings["Language"] = "Idioma";
App::$strings["Post"] = "Publicación";
App::$strings["Profile Photo"] = "Foto del perfil";
App::$strings["Purchase"] = "Comprar";
+App::$strings["Undelete"] = "Recuperar";
+App::$strings["\$Projectname Notification"] = "Notificación de \$Projectname";
+App::$strings["\$projectname"] = "\$projectname";
+App::$strings["Thank You,"] = "Gracias,";
+App::$strings["%s Administrator"] = "%s Administrador";
+App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
+App::$strings["[\$Projectname:Notify] New mail received at %s"] = "[\$Projectname:Aviso] Nuevo correo recibido en %s";
+App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s le ha enviado un nuevo mensaje privado en %3\$s.";
+App::$strings["%1\$s sent you %2\$s."] = "%1\$s le ha enviado %2\$s.";
+App::$strings["a private message"] = "un mensaje privado";
+App::$strings["Please visit %s to view and/or reply to your private messages."] = "Por favor visite %s para ver y/o responder a su mensaje privado.";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%4\$s[/zrl]";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%5\$s de %4\$s[/zrl] ";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%4\$s creado por usted[/zrl]";
+App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Aviso] Nuevo comentario de %2\$s en la conversación #%1\$d";
+App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s ha comentado un elemento/conversación que ha estado siguiendo.";
+App::$strings["Please visit %s to view and/or reply to the conversation."] = "Para ver o comentar la conversación, visite %s";
+App::$strings["%1\$s, %2\$s liked [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s ha mostrado su agrado por [zrl=%3\$s]%4\$s creado por usted[/zrl]";
+App::$strings["[\$Projectname:Notify] Like received to conversation #%1\$d by %2\$s"] = "[\$Projectname:Aviso] \"Me gusta\" de %2\$s en la conversación #%1\$d";
+App::$strings["%1\$s, %2\$s liked an item/conversation you created."] = "%1\$s, %2\$s ha mostrado su agrado por un elemento o conversación que ha creado usted.";
+App::$strings["[\$Projectname:Notify] %s posted to your profile wall"] = "[\$Projectname:Aviso] %s ha publicado una entrada en su página de inicio del perfil (\"muro\")";
+App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s ha publicado en su página del perfil en %3\$s";
+App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s ha publicado en [zrl=%3\$s]su página del perfil[/zrl]";
+App::$strings["[\$Projectname:Notify] %s tagged you"] = "[\$Projectname:Aviso] %s le ha etiquetado";
+App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s le ha etiquetado en %3\$s";
+App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]le etiquetó[/zrl].";
+App::$strings["[\$Projectname:Notify] %1\$s poked you"] = "[\$Projectname:Aviso] %1\$s le ha dado un toque";
+App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s le ha dado un toque en %3\$s";
+App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]le ha dado un toque[/zrl].";
+App::$strings["[\$Projectname:Notify] %s tagged your post"] = "[\$Projectname:Aviso] %s ha etiquetado su entrada";
+App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s ha etiquetado su publicación en %3\$s";
+App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s ha etiquetado [zrl=%3\$s]su publicación[/zrl]";
+App::$strings["[\$Projectname:Notify] Introduction received"] = "[\$Projectname:Aviso] Ha recibido una solicitud de conexión";
+App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, ha recibido una nueva solicitud de conexión de '%2\$s' en %3\$s";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, ha recibido [zrl=%2\$s]una nueva solicitud de conexión[/zrl] de %3\$s.";
+App::$strings["You may visit their profile at %s"] = "Puede visitar su perfil en %s";
+App::$strings["Please visit %s to approve or reject the connection request."] = "Por favor, visite %s para permitir o rechazar la solicitad de conexión.";
+App::$strings["[\$Projectname:Notify] Friend suggestion received"] = "[\$Projectname:Aviso] Ha recibido una sugerencia de conexión";
+App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, ha recibido una sugerencia de conexión de '%2\$s' en %3\$s";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, ha recibido [zrl=%2\$s]una sugerencia de conexión[/zrl] para %3\$s de %4\$s.";
+App::$strings["Name:"] = "Nombre:";
+App::$strings["Photo:"] = "Foto:";
+App::$strings["Please visit %s to approve or reject the suggestion."] = "Por favor, visite %s para aprobar o rechazar la sugerencia.";
+App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Aviso]";
+App::$strings["created a new post"] = "ha creado una nueva entrada";
+App::$strings["commented on %s's post"] = "ha comentado la entrada de %s";
+App::$strings["Flag Adult Photos"] = "Indicador (\"flag\") de fotos de adultos";
+App::$strings["Provide photo edit option to hide inappropriate photos from default album view"] = "Proporcionar una opción de edición de fotos para ocultar las fotos inapropiadas de la vista de álbum predeterminada";
+App::$strings["This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc."] = "Se trata de un diccionario bastante amplio y completo de acordes de guitarra que enumerará la mayor parte de las formas disponibles para tocar un acorde determinado, partiendo de la base del diapasón hasta unos pocos trastes más allá del traste doce (más allá del cual todo se repite). Se proporcionan un par de afinaciones no convencionales para provecho de los guitarristas con \"slides\" ( barras de acero), etc.";
+App::$strings["Chord names start with a root note (A-G) and may include sharps (#) and flats (b). This software will parse most of the standard naming conventions such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."] = "Los nombres de acordes comienzan con una nota fundamental (La-Sol) y pueden incluir sostenidos (#) y bemoles (b). Este software analizará la mayor parte de las convenciones de nomenclatura estándar como maj, min, tenue, SUS (2 ó 4), aug, con la repetición de elementos opcionales.";
+App::$strings["Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."] = "Ejemplos válidos son A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ...";
+App::$strings["Guitar Chords"] = "Acordes de guitarra";
+App::$strings["The complete online chord dictionary"] = "El diccionario completo de acordes en línea";
+App::$strings["Tuning"] = "Afinación";
+App::$strings["Chord name: example: Em7"] = "Nombre del acorde, por ejemplo: Em7";
+App::$strings["Show for left handed stringing"] = "Mostrar para tocadores zurdos";
+App::$strings["Quick Reference"] = "Referencia rápida";
+App::$strings["Diaspora Protocol Settings updated."] = "Los ajustes del protocolo de Diaspora se han actualizado.";
+App::$strings["Enable the Diaspora protocol for this channel"] = "Activar el protocolo de Diaspora para este canal";
+App::$strings["Allow any Diaspora member to comment on your public posts"] = "Permitir a cualquier miembro de Diaspora comentar sus entradas públicas";
+App::$strings["Prevent your hashtags from being redirected to other sites"] = "Impedir que sus \"hashtags\" sean redirigidos a otros sitios ";
+App::$strings["Followed hashtags (comma separated, do not include the #)"] = "\"Hashtags\" seguidos (separados por comas, sin incluir #)";
+App::$strings["Diaspora Protocol Settings"] = "Ajustes del protocolo de Diaspora";
+App::$strings["Hubzilla Directory Stats"] = "Estadísticas de directorio de Hubzilla";
+App::$strings["Total Hubs"] = "Número total de servidores";
+App::$strings["Hubzilla Hubs"] = "Servidores (hubs) de Hubzilla";
+App::$strings["Friendica Hubs"] = "Servidores (hubs) de Friendica";
+App::$strings["Diaspora Pods"] = "Servidores (pods) de Diaspora";
+App::$strings["Hubzilla Channels"] = "Canales de Hubzilla";
+App::$strings["Friendica Channels"] = "Canales de Friendica";
+App::$strings["Diaspora Channels"] = "Canales de Diaspora";
+App::$strings["Aged 35 and above"] = "De 35 años de edad en adelante";
+App::$strings["Aged 34 and under"] = "De 34 o menos años de edad";
+App::$strings["Average Age"] = "Promedio de edad";
+App::$strings["Known Chatrooms"] = "Salas de chat conocidas";
+App::$strings["Known Tags"] = "Etiquetas conocidas";
+App::$strings["Please note Diaspora and Friendica statistics are merely those **this directory** is aware of, and not all those known in the network. This also applies to chatrooms,"] = "Tenga en cuenta que las estadísticas de Diaspora y Friendica se refieren únicamente a aquellas de las que **este directorio** es consciente, y no a todos los conocidos en la red. Esto también es aplicable a las salas de chat,";
+App::$strings["Project Servers and Resources"] = "Servidores y recursos del proyecto";
+App::$strings["Project Creator and Tech Lead"] = "Creador del proyecto y director técnico";
+App::$strings["Admin, developer, directorymin, support bloke"] = "Administrador, desarrollador, administrador del directorio, trabajador de apoyo";
+App::$strings["And the hundreds of other people and organisations who helped make the Hubzilla possible."] = "Y los cientos de personas y organizaciones más que ayudaron a hacer posible Hubzilla.";
+App::$strings["The Redmatrix/Hubzilla projects are provided primarily by volunteers giving their time and expertise - and often paying out of pocket for services they share with others."] = "Los proyectos Redmatrix / Hubzilla están proporcionados principalmente por voluntarios que les prestan su tiempo y experiencia, pagando a menudo de su bolsillo por los servicios que comparten con otros.";
+App::$strings["There is no corporate funding and no ads, and we do not collect and sell your personal information. (We don't control your personal information - <strong>you do</strong>.)"] = "No hay financiación corporativa ni publicidad y no recogemos ni vendemos su información personal. (De hecho, no tenemos control sobre sus datos privados. <Strong>Usted lo tiene</strong>.)";
+App::$strings["Help support our ground-breaking work in decentralisation, web identity, and privacy."] = "Ayude apoyando nuestro trabajo pionero en la descentralización, la identidad web, y la privacidad.";
+App::$strings["Your donations keep servers and services running and also helps us to provide innovative new features and continued development."] = "Sus donaciones mantienen servidores y servicios en ejecución y también nos ayudan a proporcionar nuevas características innovadoras y a mantener el desarrollo de forma continuada.";
+App::$strings["Donate"] = "Donar";
+App::$strings["Choose a project, developer, or public hub to support with a one-time donation"] = "Elija un proyecto, desarrollador, o \"hub\" público para apoyar con una donación de una sola vez";
+App::$strings["Donate Now"] = "Donar ahora";
+App::$strings["<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"] = "<strong><em>O</em></strong> convertirse en un patrocinador del proyecto (sólo del proyecto Hubzilla)";
+App::$strings["Please indicate if you would like your first name or full name (or nothing) to appear in our sponsor listing"] = "Por favor, indique si desea que su nombre de pila o el nombre completo (o nada) aparezca en nuestra lista de patrocinadores";
+App::$strings["Sponsor"] = "Patrocinador";
+App::$strings["Special thanks to: "] = "Agradecimiento especial a: ";
+App::$strings["Post to Dreamwidth"] = "Publicar en Dreamwidth";
+App::$strings["Enable Dreamwidth Post Plugin"] = "Activar el plugin de publicación en Dreamwidth";
+App::$strings["Dreamwidth username"] = "Nombre de usuario en Dreamwidth";
+App::$strings["Dreamwidth password"] = "Contraseña en Dreamwidth";
+App::$strings["Post to Dreamwidth by default"] = "Publicar en Dreamwidth de forma predeterminada";
+App::$strings["Dreamwidth Post Settings"] = "Ajustes de publicación en Dreamwidth";
+App::$strings["Flattr this!"] = "¡Apoyar esto en Flattr!";
+App::$strings["Flattr widget settings updated."] = "Los ajustes del widget Flattr han sido actualizados.";
+App::$strings["Flattr user"] = "Usuario en Flattr";
+App::$strings["URL of the Thing to flattr"] = "URL de la Cosa para apoyar en flattr";
+App::$strings["If empty channel URL is used"] = "Si está vacío, se usa la URL del canal";
+App::$strings["Title of the Thing to flattr"] = "Título de la Cosa para apoyar en flattr";
+App::$strings["If empty \"channel name on The Hubzilla\" will be used"] = "Si está vacío, se usará \"nombre del canal en Hubzilla\"";
+App::$strings["Static or dynamic flattr button"] = "Botón de flattr estático o dinámico";
+App::$strings["static"] = "estático";
+App::$strings["dynamic"] = "dinámico";
+App::$strings["Alignment of the widget"] = "Alineamiento del widget";
+App::$strings["left"] = "izquierda";
+App::$strings["right"] = "derecha";
+App::$strings["Enable Flattr widget"] = "Habilitar el widget Flattr";
+App::$strings["Flattr Widget Settings"] = "Ajustes del widget Flattr";
+App::$strings["Contact not found."] = "No se ha encontrado el contacto.";
+App::$strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "Esto puede ocurrir de vez en cuando si el contacto fue solicitado por ambas personas y ya había sido aprobado.";
+App::$strings["Response from remote site was not understood."] = "No se entendió la respuesta del sitio remoto.";
+App::$strings["Unexpected response from remote site: "] = "Respuesta inesperada desde el sitio remoto: ";
+App::$strings["Confirmation completed successfully."] = "La confirmación se ha completado satisfactoriamente.";
+App::$strings["Remote site reported: "] = "El sitio remoto informó: ";
+App::$strings["Temporary failure. Please wait and try again."] = "Fallo temporal. Por favor, espere e inténtelo de nuevo.";
+App::$strings["Introduction failed or was revoked."] = "La solicitud ha fallado o ha sido revocada.";
+App::$strings["Unable to set contact photo."] = "No se puede establecer la foto del contacto.";
+App::$strings["%1\$s is now friends with %2\$s"] = "%1\$s es amigo ahora de %2\$s";
+App::$strings["No user record found for '%s' "] = "No se encuentra ningún registro de usuario para '%s' ";
+App::$strings["Our site encryption key is apparently messed up."] = "La clave de cifrado de nuestro sitio está aparentemente en mal estado.";
+App::$strings["Empty site URL was provided or URL could not be decrypted by us."] = "Se ha proporcionado la URL de un sitio inexistente o la URL no ha podido ser descifrada por nosotros.";
+App::$strings["Contact record was not found for you on our site."] = "No se ha encontrado un registro de contacto para usted en nuestro sitio.";
+App::$strings["Site public key not available in contact record for URL %s."] = "La clave del sitio público no está disponible en el registro de contacto para la URL %s.";
+App::$strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "La ID proporcionada por su sistema está duplicada en el nuestro. Debería funcionar si lo intenta de nuevo.";
+App::$strings["Unable to set your contact credentials on our system."] = "No se pueden establecer sus credenciales de contacto en nuestro sistema.";
+App::$strings["Unable to update your contact profile details on our system"] = "No se pueden actualizar los detalles del perfil de su contacto en nuestro sistema";
+App::$strings["[Name Withheld]"] = "[Nombre omitido]";
+App::$strings["%1\$s has joined %2\$s"] = "%1\$s se ha unido a %2\$s";
+App::$strings["%1\$s welcomes %2\$s"] = "%1\$s da la bienvenida a %2\$s";
+App::$strings["This introduction has already been accepted."] = "Esta solicitud ya ha sido aceptada.";
+App::$strings["Profile location is not valid or does not contain profile information."] = "La ubicación del perfil no es válida o no contiene información del perfil.";
+App::$strings["Warning: profile location has no identifiable owner name."] = "Advertencia: el perfil de la ubicación no tiene un nombre de propietario identificable.";
+App::$strings["Warning: profile location has no profile photo."] = "Advertencia: el perfil de la ubicación no tiene ninguna foto de perfil.";
+App::$strings["%d required parameter was not found at the given location"] = array(
+ 0 => "Los parámetros requeridos de %d no se han encontrado en la localización proporcionada",
+ 1 => "Los parámetros requeridos de %d no se han encontrado en la localización proporcionada",
+);
+App::$strings["Introduction complete."] = "Solicitud completa.";
+App::$strings["Unrecoverable protocol error."] = "Error irrecuperable de protocolo.";
+App::$strings["Profile unavailable."] = "Perfil no disponible.";
+App::$strings["%s has received too many connection requests today."] = "%s ha recibido demasiadas peticiones de conexión hoy.";
+App::$strings["Spam protection measures have been invoked."] = "Se han activado las medidas de protección contra el spam.";
+App::$strings["Friends are advised to please try again in 24 hours."] = "Se aconseja a los amigos que por favor lo intenten de nuevo en 24 horas.";
+App::$strings["Invalid locator"] = "Localizador no válido";
+App::$strings["Invalid email address."] = "Dirección de correo no válida.";
+App::$strings["This account has not been configured for email. Request failed."] = "Esta cuenta no se ha configurado para el correo electrónico. La petición ha fallado.";
+App::$strings["Unable to resolve your name at the provided location."] = "No se puede resolver el nombre en la localización proporcionada.";
+App::$strings["You have already introduced yourself here."] = "Ya se ha inscrito usted mismo aquí.";
+App::$strings["Apparently you are already friends with %s."] = "Al parecer ya es amigo de %s";
+App::$strings["Invalid profile URL."] = "URL del perfil no válida.";
+App::$strings["Disallowed profile URL."] = "No se ha permitido la URL del perfil.";
+App::$strings["Failed to update contact record."] = "Se ha producido un error al actualizar el registro del contacto.";
+App::$strings["Your introduction has been sent."] = "Su solicitud ha sido enviada.";
+App::$strings["Please login to confirm introduction."] = "Por favor, inicie sesión para confirmar la solicitud.";
+App::$strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Actualmente su identidad en el sistema es incorrecta. Por favor, inicie sesión en <strong>este</strong> perfil.";
+App::$strings["Confirm"] = "Confirmar";
+App::$strings["Hide this contact"] = "Ocultar este contacto";
+App::$strings["Welcome home %s."] = "Bienvenido a la página principal %s.";
+App::$strings["Please confirm your introduction/connection request to %s."] = "Por favor, confirme su solicitud de conexión a %s.";
+App::$strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "Por favor, elija su 'dirección identificativa' de entre las siguientes redes de comunicación soportadas: ";
+App::$strings["If you are not yet a member of the free social web, <a href=\"%s/siteinfo\">follow this link to find a public Friendica site and join us today</a>."] = "Si aún no es miembro de las redes sociales libres, <a href=\"%s/siteinfo\">siga este enlace para encontrar un sitio público de Friendica y unirse a nosotros hoy</a>.";
+App::$strings["Friend/Connection Request"] = "Solicitud de conexión o amistad";
+App::$strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Ejemplos: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca";
+App::$strings["Please answer the following:"] = "Por favor, responda a lo siguiente: ";
+App::$strings["Does %s know you?"] = "¿%s le conoce?";
+App::$strings["Add a personal note:"] = "Añadir un comentario personal: ";
+App::$strings["Friendica"] = "Friendica";
+App::$strings["StatusNet/Federated Social Web"] = "Red social federada StatusNet";
+App::$strings["Diaspora"] = "Diaspora";
+App::$strings[" - please do not use this form. Instead, enter %s into your Diaspora search bar."] = "- Por favor, no use este formato. En su lugar, escriba %s en la barra de búsqueda de Diaspora.";
+App::$strings["Your Identity Address:"] = "Su dirección identificativa: ";
+App::$strings["Submit Request"] = "Enviar la solicitud";
+App::$strings["GNU-Social Protocol Settings updated."] = "Se han actualizado los ajustes del protocolo de GNU-Social.";
+App::$strings["Enable the (experimental) GNU-Social protocol for this channel"] = "Activar el protocolo (experimental) de GNU-Social para este canal";
+App::$strings["GNU-Social Protocol Settings"] = "Ajustes del protocolo de GNU-Social";
+App::$strings["Follow"] = "Seguir";
+App::$strings["%1\$s is now following %2\$s"] = "%1\$s está siguiendo ahora a %2\$s";
+App::$strings["Friendica Photo Album Import"] = "Importar un álbum de fotos de Friendica";
+App::$strings["This will import all your Friendica photo albums to this Red channel."] = "Esto importará todos sus álbumes de fotos de Friendica a este canal de Hubzilla.";
+App::$strings["Friendica Server base URL"] = "URL base del servidor de Friendica";
+App::$strings["Friendica Login Username"] = "Nombre de inicio de sesión en Friendica";
+App::$strings["Friendica Login Password"] = "Contraseña de inicio de sesión en Friendica";
+App::$strings["Enable the GNU-Social protocol for this channel"] = "Activar el protocolo de GNU-Social para este canal";
+App::$strings["Send email to all members"] = "Enviar un correo electrónico a todos los miembros";
+App::$strings["$1%s Administrator"] = "Administrador de $1%s ";
+App::$strings["No recipients found."] = "No se han encontrado destinatarios.";
+App::$strings["%1\$d of %2\$d messages sent."] = "%1\$d de %2\$d mensajes enviados.";
+App::$strings["Send email to all hub members."] = "Enviar un correo electrónico a todos los miembros del hub.";
+App::$strings["Message subject"] = "Asunto del mensaje";
+App::$strings["Sender Email address"] = "Dirección de correo electrónico del remitente";
+App::$strings["Test mode (only send to hub administrator)"] = "Modo de prueba (enviar sólo al administrador del hub)";
+App::$strings["Post to Insanejournal"] = "Publicar en Insanejournal";
+App::$strings["Enable InsaneJournal Post Plugin"] = "Habilitar el plugin de publicación en InsaneJournal";
+App::$strings["InsaneJournal username"] = "Nombre de usuario en InsaneJournal";
+App::$strings["InsaneJournal password"] = "Contraseña en InsaneJournal";
+App::$strings["Post to InsaneJournal by default"] = "Publicar por defecto en InsaneJournal";
+App::$strings["InsaneJournal Post Settings"] = "Ajustes de publicación en InsaneJournal";
+App::$strings["Insane Journal Settings saved."] = "Se han guardado los ajustes de InsaneJournal.";
+App::$strings["Channels to auto connect"] = "Canales para conexión automática";
+App::$strings["Comma separated list"] = "Lista separada por comas";
+App::$strings["Popular Channels"] = "Canales populares";
+App::$strings["IRC Settings"] = "Ajustes de IRC";
+App::$strings["IRC settings saved."] = "Se han guardado los ajustes de IRC.";
+App::$strings["IRC Chatroom"] = "Sala de chat IRC";
+App::$strings["Status:"] = "Estado:";
+App::$strings["Activate addon"] = "Habilitar complemento";
+App::$strings["Hide Jappixmini Chat-Widget from the webinterface"] = "Ocultar el widget de chat Jappixmini en la interfaz web";
+App::$strings["Jabber username"] = "Nombre de usuario en Jabber";
+App::$strings["Jabber server"] = "Servidor de Jabber";
+App::$strings["Jabber BOSH host URL"] = "URL del host BOSH de Jabber";
+App::$strings["Jabber password"] = "Contraseña en Jabber";
+App::$strings["Encrypt Jabber password with Hubzilla password"] = "Cifrar la contraseña de Jabber con la contraseña de Hubzilla";
+App::$strings["Hubzilla password"] = "Contraseña de Hubzilla";
+App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "Aprobar automáticamente las solicitudes de suscripción de los contactos de Hubzilla";
+App::$strings["Purge internal list of jabber addresses of contacts"] = "Purgar la lista interna de las direcciones de contactos de jabber";
+App::$strings["Configuration Help"] = "Ayuda para los ajustes";
+App::$strings["Add Contact"] = "Añadir un contacto";
+App::$strings["Jappix Mini Settings"] = "Ajustes de Jappix Mini";
+App::$strings["Upload a file"] = "Subir un fichero";
+App::$strings["Drop files here to upload"] = "Arrastre los ficheros aquí para subirlos";
+App::$strings["Failed"] = "Ha fallado";
+App::$strings["No files were uploaded."] = "No se han subido ficheros.";
+App::$strings["Uploaded file is empty"] = "El fichero subido está vacío";
+App::$strings["Image exceeds size limit of "] = "La imagen supera el límite de tamaño de ";
+App::$strings["File has an invalid extension, it should be one of "] = "El fichero tiene una extensión no válida, debería ser una de estas: ";
+App::$strings["Upload was cancelled, or server error encountered"] = "Se canceló la carga o se encontró un error del servidor";
+App::$strings["An account has been created for you."] = "Se ha creado una cuenta para usted.";
+App::$strings["Authentication successful but rejected: account creation is disabled."] = "Autenticación correcta pero rechazada: la creación de cuentas está deshabilitada.";
+App::$strings["Post to Libertree"] = "Publicar en Libertree";
+App::$strings["Enable Libertree Post Plugin"] = "Habilitar el plugin de publicación en Libertree";
+App::$strings["Libertree API token"] = "Token de la API de Libertree";
+App::$strings["Libertree site URL"] = "URL del servidor de Libertree";
+App::$strings["Post to Libertree by default"] = "Publicar en Libertree por defecto";
+App::$strings["Libertree Post Settings"] = "Ajustes de publicación en Libertree";
+App::$strings["Libertree Settings saved."] = "Se han guardado los ajustes de Libertree.";
+App::$strings["Post to LiveJournal"] = "Publicar en LiveJournal";
+App::$strings["Enable LiveJournal Post Plugin"] = "Habilitar el plugin de publicación en LiveJournal";
+App::$strings["LiveJournal username"] = "Nombre de usuario en LiveJournal";
+App::$strings["LiveJournal password"] = "Contraseña en LiveJournal";
+App::$strings["Post to LiveJournal by default"] = "Publicar en LiveJournal por defecto";
+App::$strings["LiveJournal Post Settings"] = "Ajustes de publicación en LiveJournal";
+App::$strings["LiveJournal Settings saved."] = "Se han guardado los ajustes de LiveJournal.";
+App::$strings["Logfile archive directory"] = "Directorio de los ficheros de informe";
+App::$strings["Directory to store rotated logs"] = "Directorio para almacenar los informes rotados";
+App::$strings["Logfile size in bytes before rotating"] = "Tamaño del fichero de informe en bytes antes de rotarlo";
+App::$strings["Number of logfiles to retain"] = "Número de ficheros de informe que se deben retener";
+App::$strings["Email notification hub"] = "Notificación por correo electrónico del hub";
+App::$strings["Hostname"] = "Nombre del host";
+App::$strings["Mailhost Settings"] = "Ajustes de Mailhost";
+App::$strings["MAILHOST Settings saved."] = "Se han guardado los ajustes de MAILHOST.";
+App::$strings["lonely"] = "Solo/a";
+App::$strings["drunk"] = "ebrio/a";
+App::$strings["horny"] = "caliente";
+App::$strings["stoned"] = "drogado/a";
+App::$strings["fucked up"] = "jodido/a";
+App::$strings["clusterfucked"] = "hecho/a polvo";
+App::$strings["crazy"] = "loco/a";
+App::$strings["hurt"] = "ofendido/a";
+App::$strings["sleepy"] = "soñoliento/a";
+App::$strings["grumpy"] = "gruñón/ona";
+App::$strings["high"] = "superior";
+App::$strings["semi-conscious"] = "semiconsciente";
+App::$strings["in love"] = "enamorado/a";
+App::$strings["in lust"] = "lujurioso/a";
+App::$strings["naked"] = "desnudo/a";
+App::$strings["stinky"] = "apestoso/a";
+App::$strings["sweaty"] = "sudoroso/a";
+App::$strings["bleeding out"] = "desangrado/a";
+App::$strings["victorious"] = "victorioso/a";
+App::$strings["defeated"] = "derrotado/a";
+App::$strings["envious"] = "envidioso/a";
+App::$strings["jealous"] = "celoso/a";
+App::$strings["bitchslap"] = "una bofetada humillante";
+App::$strings["bitchslapped"] = "ha abofeteado de forma humillante a";
+App::$strings["shag"] = "unas pelusas";
+App::$strings["shagged"] = "ha dejado exhausto/a a";
+App::$strings["patent"] = "una patente";
+App::$strings["patented"] = "ha patentado a";
+App::$strings["hug"] = "un abrazo";
+App::$strings["hugged"] = "ha abrazado a";
+App::$strings["murder"] = "un asesinato";
+App::$strings["murdered"] = "ha asesinado a";
+App::$strings["worship"] = "una alabanza";
+App::$strings["worshipped"] = "ha elogiado a";
+App::$strings["kiss"] = "un beso";
+App::$strings["kissed"] = "ha besado a";
+App::$strings["tempt"] = "una tentación";
+App::$strings["tempted"] = "ha tentado a";
+App::$strings["raise eyebrows at"] = "un levantamiento de cejas";
+App::$strings["raised their eyebrows at"] = "ha levantado las cejas a";
+App::$strings["insult"] = "un insulto";
+App::$strings["insulted"] = "ha insultado a";
+App::$strings["praise"] = "un elogio";
+App::$strings["praised"] = "ha elogiado a";
+App::$strings["be dubious of"] = "una duda";
+App::$strings["was dubious of"] = "estaba dudoso de";
+App::$strings["eat"] = "una comida";
+App::$strings["ate"] = "ha comido";
+App::$strings["giggle and fawn at"] = "una sonrisa aduladora";
+App::$strings["giggled and fawned at"] = "ha sonreído y adulado a";
+App::$strings["doubt"] = "una duda";
+App::$strings["doubted"] = "ha dudado de";
+App::$strings["glare"] = "una mirada furiosa";
+App::$strings["glared at"] = "ha mirado con furia a";
+App::$strings["fuck"] = "un polvo";
+App::$strings["fucked"] = "ha jodido a";
+App::$strings["bonk"] = "un golpe";
+App::$strings["bonked"] = "ha golpeado a";
+App::$strings["declare undying love for"] = "una declaración de amor eterno";
+App::$strings["declared undying love for"] = "ha declarado amor eterno";
+App::$strings["Save Settings"] = "Guardar ajustes";
+App::$strings["text to include in all outgoing posts from this site"] = "texto a incluir en todos los mensajes salientes de este sitio";
+App::$strings["Federate"] = "Federar";
+App::$strings["nofed Settings saved."] = "Se han guardado los ajustes de nofed.";
+App::$strings["Allow Federation Toggle"] = "Permitir alternancia de federación";
+App::$strings["Federate posts by default"] = "Federar las publicaciones por defecto";
+App::$strings["NoFed Settings"] = "Ajustes de NoFed";
+App::$strings["Nsabait Settings updated."] = "Se han actualizado los ajustes de Nsabait";
+App::$strings["Enable NSAbait Plugin"] = "Habilitar el plugin NSAbait";
+App::$strings["NSAbait Settings"] = "Ajustes de NSAbait";
+App::$strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Este complemento busca en los mensajes las palabras o texto que se especifican a continuación y contrae cualquier contenido que contenga esas palabras clave para que no se muestre en momentos inapropiados, como insinuaciones sexuales que pueden ser impropias en un entorno de trabajo. Es una muestra de educación y se recomienda marcar cualquier contenido que contenga desnudos con #NSFW. Este filtro también puede coincidir con cualquier otra palabra o texto que especifique y, por lo tanto, puede utilizarse como un filtro de contenido de propósito general.";
+App::$strings["Enable Content filter"] = "Habilitar filtro de contenido";
+App::$strings["Comma separated list of keywords to hide"] = "Lista separada por comas de palabras clave para ocultar";
+App::$strings["Use /expression/ to provide regular expressions"] = "Usar /expression/ para proporcionar expresiones regulares";
+App::$strings["Not Safe For Work Settings"] = "No es seguro para ajustes de trabajo";
+App::$strings["General Purpose Content Filter"] = "Filtro de contenido de propósito general";
+App::$strings["NSFW Settings saved."] = "Se han guardado los ajustes de NSFW.";
+App::$strings["Possible adult content"] = "Posible contenido para adultos";
+App::$strings["%s - click to open/close"] = "%s - pulsar para abrir o cerrar";
+App::$strings["System defaults:"] = "Valores predeterminados del sistema: ";
+App::$strings["Preferred Clipart IDs"] = "IDs de las imágenes clipart preferidas";
+App::$strings["List of preferred clipart ids. These will be shown first."] = "Lista de ids de imágenes de clipart preferidas. Se verán en primer lugar.";
+App::$strings["Default Search Term"] = "Términos de búsqueda predeterminados";
+App::$strings["The default search term. These will be shown second."] = "Los términos de búsqueda predeterminados. Estos se mostrarán en segundo lugar.";
+App::$strings["Return After"] = "Regresar después";
+App::$strings["Page to load after image selection."] = "Página para cargar después de la selección de imágenes.";
+App::$strings["Edit Profile"] = "Editar el perfil";
+App::$strings["Profile List"] = "Lista de perfiles";
+App::$strings["Order of Preferred"] = "Orden de preferencia";
+App::$strings["Sort order of preferred clipart ids."] = "Orden de clasificación de los identificadores de imágenes clipart preferidas.";
+App::$strings["Newest first"] = "Las más nuevas en primer lugar";
+App::$strings["As entered"] = "Tal como se ingresaron";
+App::$strings["Order of other"] = "Orden de los demás";
+App::$strings["Sort order of other clipart ids."] = "Orden de clasificación de otros ids de imágenes clipart.";
+App::$strings["Most downloaded first"] = "Las más descargadas en primer lugar";
+App::$strings["Most liked first"] = "Las más apreciadas en primer lugar";
+App::$strings["Preferred IDs Message"] = "Mensaje de IDs preferido";
+App::$strings["Message to display above preferred results."] = "Mensaje para mostrar sobre los resultados preferidos.";
+App::$strings["Uploaded by: "] = "Subida por: ";
+App::$strings["Drawn by: "] = "Creada por: ";
+App::$strings["Or select from a free OpenClipart.org image:"] = "O seleccionar una imagen gratuita de OpenClipart.org: ";
+App::$strings["Search Term"] = "Término de búsqueda";
+App::$strings["Unknown error. Please try again later."] = "Error desconocido. Por favor, inténtelo otra vez.";
+App::$strings["Profile photo updated successfully."] = "Se ha actualizado con éxito la foto de perfil.";
+App::$strings["View Larger"] = "Ver más grande";
+App::$strings["Tile Server URL"] = "URL del servidor de mosaicos de imágenes ";
+App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "Una lista de <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">servidores públicos de mosaicos de imágenes</a>";
+App::$strings["Nominatim (reverse geocoding) Server URL"] = "URL del servidor nominatim (geocodificación inversa)";
+App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">Nominatim servers</a>"] = "Una lista de <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">servidores nominatim</a>";
+App::$strings["Default zoom"] = "Zoom predeterminado";
+App::$strings["The default zoom level. (1:world, 18:highest, also depends on tile server)"] = "El nivel de zoom predeterminado. (1: mundo, 18: el más alto, también depende del servidor del mosaico de imágenes)";
+App::$strings["Include marker on map"] = "Incluir un marcador en el mapa";
+App::$strings["Include a marker on the map."] = "Incluir un marcador en el mapa.";
+App::$strings["Message to display on every page on this server"] = "Mensaje para mostrar en todas las páginas de este servidor";
+App::$strings["Pageheader Settings"] = "Ajustes del encabezado de página";
+App::$strings["pageheader Settings saved."] = "Se han guardado los ajustes del encabezado de página.";
+App::$strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Este sitio es rastreado mediante la herramienta analítica <a href='http://www.piwik.org'>Piwik</a>.";
+App::$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)."] = "Si usted no quiere que sus visitas se registren de esta manera <a href='%s'>puede establecer una cookie para evitar que Piwik rastree otras visitas del sitio</a> (opt-out).";
+App::$strings["Piwik Base URL"] = "URL base de Piwik";
+App::$strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Ruta absoluta a la instalación de Piwik. (Sin protocolo (http/s), con barra diagonal)";
+App::$strings["Site ID"] = "ID del sitio";
+App::$strings["Show opt-out cookie link?"] = "Mostrar el enlace de la cookie opt-out?";
+App::$strings["Asynchronous tracking"] = "Rastreo asíncrono";
+App::$strings["Enable frontend JavaScript error tracking"] = "Habilitar la interfaz JavaScript de seguimiento de errores";
+App::$strings["This feature requires Piwik >= 2.2.0"] = "Esta funcionalidad requiere Piwik >= 2.2.0";
+App::$strings["Planets Settings updated."] = "Se han guardado los ajustes de Planets.";
+App::$strings["Enable Planets Plugin"] = "Habilitar el plugin Planets";
+App::$strings["Planets Settings"] = "Ajustes de Planets";
+App::$strings["You are now authenticated to pumpio."] = "Ahora está autenticado en pump.io.";
+App::$strings["return to the featured settings page"] = "Volver a la página de configuración destacada";
+App::$strings["Post to Pump.io"] = "Publicar en Pump.io";
+App::$strings["Pump.io servername"] = "Nombre del servidor de Pump.io";
+App::$strings["Without \"http://\" or \"https://\""] = "Sin \"http://\" or \"https://\"";
+App::$strings["Pump.io username"] = "Nombre de usuario en Pump.io";
+App::$strings["Without the servername"] = "Sin el nombre del servidor";
+App::$strings["You are not authenticated to pumpio"] = "No está autenticado en pump.io";
+App::$strings["(Re-)Authenticate your pump.io connection"] = "(Re-)Autenticar su conexión en pump.io";
+App::$strings["Enable pump.io Post Plugin"] = "Habilitar el plugin de publicación en pump.io";
+App::$strings["Post to pump.io by default"] = "Publicar por defecto en pump.io";
+App::$strings["Should posts be public"] = "¿Las entradas deben ser públicas?";
+App::$strings["Mirror all public posts"] = "Reflejar todos los mensajes públicos";
+App::$strings["Pump.io Post Settings"] = "Ajustes de publicación en pump.io";
+App::$strings["PumpIO Settings saved."] = "Se han guardado los ajustes de PumpIO.";
+App::$strings["QR code"] = "Código QR";
+App::$strings["QR Generator"] = "Generador QR";
+App::$strings["Enter some text"] = "Escribir algún texto";
+App::$strings["Enable Rainbowtag"] = "Habilitar Rainbowtag";
+App::$strings["Rainbowtag Settings"] = "Ajustes de Rainbowtag";
+App::$strings["Rainbowtag Settings saved."] = "Se han guardado los ajustes de Rainbowtag.";
+App::$strings["You're welcome."] = "Bienvenido.";
+App::$strings["Ah shucks..."] = "Ah, joder...";
+App::$strings["Don't mention it."] = "No lo menciones.";
+App::$strings["&lt;blush&gt;"] = "&lt;sonrojo&gt;";
+App::$strings["Redmatrix File Storage Import"] = "Importar repositorio de ficheros de Redmatrix";
+App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Esto importará todos sus ficheros de la nube de Redmatrix a este canal.";
+App::$strings["Redmatrix Server base URL"] = "URL base del servidor Redmatrix";
+App::$strings["Redmatrix Login Username"] = "Nombre de inicio de sesión en Redmatrix";
+App::$strings["Redmatrix Login Password"] = "Contraseña de inicio de sesión en Redmatrix";
+App::$strings["file"] = "fichero";
+App::$strings["Photos imported"] = "Se han importado las fotos";
+App::$strings["Redmatrix Photo Album Import"] = "Importar un álbum de fotos de Redmatrix";
+App::$strings["This will import all your Redmatrix photo albums to this channel."] = "Esto importará todos sus álbumes de fotos de Redmatrix a este canal.";
+App::$strings["Import just this album"] = "Importar solo este álbum";
+App::$strings["Leave blank to import all albums"] = "Dejar en blanco para importar todos los álbumes";
+App::$strings["Maximum count to import"] = "Límite máximo de importación";
+App::$strings["0 or blank to import all available"] = "0 o en blanco para importar todos los disponibles";
+App::$strings["Post to Red"] = "Enviar a Red";
+App::$strings["Channel is required."] = "Se requiere un canal.";
+App::$strings["Invalid channel."] = "El canal no es válido.";
+App::$strings["redred Settings saved."] = "Se han salvado los ajustes de redred.";
+App::$strings["Allow posting to another Hubzilla Channel"] = "Permitir la publicación en otro canal de Hubzilla";
+App::$strings["Send public postings to Hubzilla channel by default"] = "Enviar entradas públicas al canal Hubzilla por defecto";
+App::$strings["Hubzilla API Path"] = "Ruta de la API de Hubzilla";
+App::$strings["https://{sitename}/api"] = "https://{sitename}/api";
+App::$strings["Hubzilla login name"] = "Nombre de inicio de sesión en Hubzilla";
+App::$strings["Hubzilla channel name"] = "Nombre del canal de Hubzilla";
+App::$strings["Nickname"] = "Alias";
+App::$strings["Hubzilla Crosspost Settings"] = "Ajustes de Hubzilla Crosspost";
+App::$strings["Post to Friendica"] = "Publicar en Friendica";
+App::$strings["rtof Settings saved."] = "Se han guardado los ajustes de rtof";
+App::$strings["Allow posting to Friendica"] = "Permitir publicar en Friendica";
+App::$strings["Send public postings to Friendica by default"] = "Enviar entradas públicas a Friendica por defecto";
+App::$strings["Friendica API Path"] = "Ruta a la API de Friendica";
+App::$strings["Friendica login name"] = "Nombre de inicio de sesión en Friendica";
+App::$strings["Friendica password"] = "Contraseña de Friendica";
+App::$strings["Hubzilla to Friendica Post Settings"] = "Ajustes de publicación de Hubzilla a Friendica";
+App::$strings["Extended Identity Sharing"] = "Compartir identidad extendida";
+App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Compartir su identidad con todos los sitios web en Internet. Cuando se inhabilita, la identidad sólo se comparte con los sitios de la matriz.";
+App::$strings["Some setting"] = "Algunos ajustes";
+App::$strings["A setting"] = "Un ajuste";
+App::$strings["Skeleton Settings"] = "Ajustes de Skeleton";
+App::$strings["Deactivate the feature"] = "Desactivar la funcionalidad";
+App::$strings["Hide the button and show the smilies directly."] = "Ocultar el botón y mostrar los smilies directamente.";
+App::$strings["Smileybutton Settings"] = "Ajustes de Smileybutton";
+App::$strings["Page to load after login"] = "Página para cargar tras el inicio de sesión";
+App::$strings["Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave blank for default network page (grid)."] = "Ejemplos: &quot;aplicaciones&quot;, &quot;mi red?f=&gid=37&quot; (grupo de canales), &quot;mi canal&quot; or &quot;notificaciones del sistema&quot; (dejar en blanco para la página de mi red por defecto (grid).";
+App::$strings["Startpage Settings"] = "Ajustes de startpage";
+App::$strings["Post to GNU social"] = "Publicar en GNU social";
+App::$strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Por favor, contacte con el administrador de su sitio.<br />La URL de la API proporcionada no es válida.";
+App::$strings["We could not contact the GNU social API with the Path you entered."] = "No podemos conectar con la API de GNU social con la ruta que ha proporcionado.";
+App::$strings["GNU social settings updated."] = "Se han guardado los ajustes de GNU social.";
+App::$strings["Globally Available GNU social OAuthKeys"] = "OAuthKeys globales de GNU social disponibles";
+App::$strings["There are preconfigured OAuth key pairs for some GNU social servers available. If you are using one of them, please use these credentials.<br />If not feel free to connect to any other GNU social instance (see below)."] = "Existen pares de claves OAuth preconfiguradas disponibles para algunos servidores libres de GNU social. Si está usando uno de ellos, utilice estas credenciales.<br />Si no se siente libre de conectarse a cualquier otra instancia de GNU social (vea a continuación).";
+App::$strings["Provide your own OAuth Credentials"] = "Proporcione sus propias credenciales de OAuth";
+App::$strings["No consumer key pair for GNU social found. Register your Hubzilla Account as an desktop client on your GNU social 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 Hubzilla installation at your favourite GNU social installation."] = "No se ha encontrado un par de claves de consumidor para GNU social. Registre su cuenta de Hubzilla como un cliente de escritorio en su cuenta social GNU, copie el par de claves de consumidor aquí y escriba la dirección raíz de la API.<br />Antes de registrar su propio par de claves OAuth, pregunte al administrador si ya hay un par de claves para esta instalación de Hubzilla en su instalación GNU social favorita.";
+App::$strings["OAuth Consumer Key"] = "OAuth Consumer Key";
+App::$strings["OAuth Consumer Secret"] = "OAuth Consumer Secret";
+App::$strings["Base API Path"] = "Ruta base de la API";
+App::$strings["Remember the trailing /"] = "Recuerde la barra /";
+App::$strings["GNU social application name"] = "Nombre de la aplicación de GNU social";
+App::$strings["To connect to your GNU social account click the button below to get a security code from GNU social which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to GNU social."] = "Para conectarse a su cuenta de GNU social, haga clic en el botón de abajo para obtener un código de seguridad de GNU social que tiene que copiar en el cuadro de entrada a continuación y envíe el formulario. Solo sus <strong>entradas</strong> públicas aparecerán en GNU social.";
+App::$strings["Log in with GNU social"] = "Inicio de sesión en GNU social";
+App::$strings["Copy the security code from GNU social here"] = "Copiar aquí el código de seguridad de GNU social";
+App::$strings["Cancel Connection Process"] = "Cancelar el proceso de conexión";
+App::$strings["Current GNU social API is"] = "La API actual de GNU social es ";
+App::$strings["Cancel GNU social Connection"] = "Cancelar la conexión de GNU social";
+App::$strings["Currently connected to: "] = "Actualmente está conectado a: ";
+App::$strings["<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to GNU social will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Aviso</strong>: Debido a su configuración de privacidad (<em>Ocultar los detalles de su perfil a los visitantes desconocidos?</em>) el vínculo potencialmente incluido en las entradas públicas retransmitidas a GNU social llevará al visitante a una página en blanco que le informará de que el acceso a su perfil ha sido restringido.";
+App::$strings["Allow posting to GNU social"] = "Habilitar la publicación en GNU social";
+App::$strings["If enabled your public postings can be posted to the associated GNU-social account"] = "Si está habilitado, sus entradas públicas se pueden publicar en la cuenta GNU-social asociada";
+App::$strings["Post to GNU social by default"] = "Publicar en GNU social por defecto";
+App::$strings["If enabled your public postings will be posted to the associated GNU-social account by default"] = "Si está activado, sus entradas públicas se publicarán en la cuenta GNU-social asociada de forma predeterminada";
+App::$strings["Clear OAuth configuration"] = "Limpiar la configuración de OAuth";
+App::$strings["GNU social Post Settings"] = "Ajustes de publicación en GNU social";
+App::$strings["API URL"] = "URL de la API";
+App::$strings["Application name"] = "Nombre de la aplicación";
+App::$strings["Currently blocked"] = "Actualmente bloqueado";
+App::$strings["No channels currently blocked"] = "No hay canales bloqueados actualmente";
+App::$strings["\"Superblock\" Settings"] = "Ajustes de \"Superblock\"";
+App::$strings["Block Completely"] = "Bloquear completamente";
+App::$strings["superblock settings updated"] = "se han actualizado los ajustes de superblock";
+App::$strings["Your account on %s will expire in a few days."] = "Su cuenta en %s caducará en unos pocos días.";
+App::$strings["Your $Productname test account is about to expire."] = "Su cuenta de prueba de $Productname está a punto de caducar.";
+App::$strings["Three Dimensional Tic-Tac-Toe"] = "Juego en 3D Tic-Tac-Toe";
+App::$strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
+App::$strings["New game"] = "Nuevo juego";
+App::$strings["New game with handicap"] = "Nuevo juego con hándicap";
+App::$strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "El juego en 3D tic-tac-toe es como el juego tradicional, excepto que se juega en varios niveles simultáneamente.";
+App::$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."] = "En este caso hay tres niveles. Usted gana al conseguir tres en una fila en cualquier nivel, así como arriba, abajo, y en diagonal a través de los diferentes niveles.";
+App::$strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "El juego con hándicap deshabilita la posición central en el nivel medio porque el jugador que reclama este cuadrado a menudo tiene una ventaja injusta.";
+App::$strings["You go first..."] = "Usted va primero...";
+App::$strings["I'm going first this time..."] = "Yo voy primero esta vez...";
+App::$strings["You won!"] = "¡Usted ha ganado!";
+App::$strings["\"Cat\" game!"] = "¡El juego del \"gato\"!";
+App::$strings["I won!"] = "¡He ganado yo!";
+App::$strings["Edit your profile and change settings."] = "Editar su perfil y cambiar los ajustes.";
+App::$strings["Click here to see activity from your connections."] = "Pulsar aquí para ver la actividad de sus conexiones.";
+App::$strings["Click here to see your channel home."] = "Pulsar aquí para ver la página de inicio de su canal.";
+App::$strings["You can access your private messages from here."] = "Puede acceder a sus mensajes privados desde aquí.";
+App::$strings["Create new events here."] = "Crear nuevos eventos aquí.";
+App::$strings["You can accept new connections and change permissions for existing ones here. You can also e.g. create groups of contacts."] = "Puede aceptar nuevas conexiones y cambiar permisos para las existentes aquí. También puede, por ejemplo, crear grupos de contactos.";
+App::$strings["System notifications will arrive here"] = "Las notificaciones del sistema llegarán aquí";
+App::$strings["Search for content and users"] = "Buscar contenido y usuarios";
+App::$strings["Browse for new contacts"] = "Buscar nuevos contactos";
+App::$strings["Launch installed apps"] = "Iniciar aplicaciones instaladas";
+App::$strings["Looking for help? Click here."] = "¿Busca ayuda? Pulse aquí.";
+App::$strings["New events have occurred in your network. Click here to see what has happened!"] = "Se han producido nuevos eventos en su red. ¡Haga clic aquí para ver lo que ha sucedido!";
+App::$strings["You have received a new private message. Click here to see from who!"] = "Ha recibido un nuevo mensaje privado. Haga clic aquí para ver de quién!";
+App::$strings["There are events this week. Click here too see which!"] = "Hay eventos esta semana. Haga clic aquí para ver cuáles!";
+App::$strings["You have received a new introduction. Click here to see who!"] = "Ha recibido una nueva solicitud de conexión. ¡Pulse aquí para ver de quién!";
+App::$strings["There is a new system notification. Click here to see what has happened!"] = "Hay una nueva notificación del sistema. ¡Haga clic aquí para ver lo que ha sucedido!";
+App::$strings["Click here to share text, images, videos and sound."] = "Haga clic aquí para compartir texto, imágenes, vídeos y sonido.";
+App::$strings["You can write an optional title for your update (good for long posts)."] = "Puede escribir un título opcional para su actualización (bueno para los mensajes largos).";
+App::$strings["Entering some categories here makes it easier to find your post later."] = "Al ingresar algunos temas aquí, es más fácil encontrar su publicación más tarde.";
+App::$strings["Share photos, links, location, etc."] = "Compartir fotos, enlaces, ubicación, etc.";
+App::$strings["Only want to share content for a while? Make it expire at a certain date."] = "¿Solo quieres compartir contenido durante un tiempo? Haga que expire en una fecha determinada.";
+App::$strings["You can password protect content."] = "Puede proteger contenido con una contraseña.";
+App::$strings["Choose who you share with."] = "Elegir con quién compartir.";
+App::$strings["Click here when you are done."] = "Haga clic aquí cuando haya terminado.";
+App::$strings["Adjust from which channels posts should be displayed."] = "Ajustar de qué canales se deben mostrar las publicaciones.";
+App::$strings["Only show posts from channels in the specified privacy group."] = "Mostrar solo las entradas de los canales de un grupo específico de canales.";
+App::$strings["Easily find posts containing tags (keywords preceded by the \"#\" symbol)."] = "Encuentre fácilmente entradas que contengan etiquetas (palabras clave precedidas del símbolo \"#\").";
+App::$strings["Easily find posts in given category."] = "Encuentre fácilmente las publicaciones en una categoría dada.";
+App::$strings["Easily find posts by date."] = "Encuentre fácilmente entradas por fechas.";
+App::$strings["Suggested users who have volounteered to be shown as suggestions, and who we think you might find interesting."] = "Se sugiere a los usuarios que se han ofrecido voluntariamente que se muestren como sugerencias, y que creemos que podrían resultar interesantes.";
+App::$strings["Here you see channels you have connected to."] = "Aquí puede ver los canales a los que está conectado.";
+App::$strings["Save your search so you can repeat it at a later date."] = "Guarde su búsqueda para poder repetirla en una fecha posterior.";
+App::$strings["If you see this icon you can be sure that the sender is who it say it is. It is normal that it is not always possible to verify the sender, so the icon will be missing sometimes. There is usually no need to worry about that."] = "Si ve este icono puede estar seguro de que el remitente es quien dice ser. Es normal que no siempre sea posible verificar el remitente, por lo que el icono faltará en ocasiones. Por lo general, no hay necesidad de preocuparse por eso.";
+App::$strings["Danger! It seems someone tried to forge a message! This message is not necessarily from who it says it is from!"] = "¡Peligro! ¡Parece que alguien intentó falsificar un mensaje! ¡Este mensaje no es necesariamente de quien dice que es!";
+App::$strings["Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can pause it at any time and continue where you left off by reloading the page, or navigting to another page.</p><p>You can also advance by pressing the return key"] = "¡Bienvenido/a a Hubzilla! ¿Quiere hacer un recorrido por la interfaz de usuario?</p> <p> Puede detenerlo en cualquier momento y continuar donde lo dejó recargando la página o navegando a otra.</p> <p> También puede avanzar pulsando la tecla de retorno";
+App::$strings["Post to Twitter"] = "Publicar en Twitter";
+App::$strings["Twitter settings updated."] = "Se han actualizado los ajustes de Twitter.";
+App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "No se encontró ningún par de \"consumer key\" para Twitter. Póngase en contacto con el administrador del sitio.";
+App::$strings["At this Hubzilla 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."] = "En esta instancia de Hubzilla, el complemento de Twitter estaba habilitado pero aún no ha conectado su cuenta a la cuenta de Twitter. Para ello, haga clic en el botón de abajo, para obtener un PIN de Twitter que debe copiar en el cuadro de entrada a continuación y enviar el formulario. Solo sus entradas <strong>públicas</ strong> se publicarán en Twitter.";
+App::$strings["Log in with Twitter"] = "Iniciar sesión en Twitter";
+App::$strings["Copy the PIN from Twitter here"] = "Copiar aquí el PIN de Twitter";
+App::$strings["<strong>Note:</strong> Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Aviso:</strong> Debido a su configuración de privacidad (<em>Ocultar los detalles de su perfil a los visitantes desconocidos?</em>), el enlace potencialmente incluido en las entradas públicas retransmitidas a Twitter llevará al visitante a una página en blanco informándolo de que el acceso a su perfil ha sido restringido.";
+App::$strings["Allow posting to Twitter"] = "Permitir la publicación en Twitter";
+App::$strings["If enabled your public postings can be posted to the associated Twitter account"] = "Si está activado, sus entradas públicas se pueden publicar en la cuenta de Twitter asociada";
+App::$strings["Send public postings to Twitter by default"] = "Enviar mensajes públicos a Twitter de forma predeterminada";
+App::$strings["If enabled your public postings will be posted to the associated Twitter account by default"] = "Si está activado, sus entradas públicas se publicarán en la cuenta de Twitter asociada de forma predeterminada.";
+App::$strings["Twitter Post Settings"] = "Ajustes de publicación en Twitter";
+App::$strings["Submit Settings"] = "Enviar los ajustes";
+App::$strings["Show Upload Limits"] = "Mostrar los límites de subida";
+App::$strings["Hubzilla configured maximum size: "] = "Tamaño máximo configurado por Hubzilla: ";
+App::$strings["PHP upload_max_filesize: "] = "PHP upload_max_filesize: ";
+App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] = "PHP post_max_size (debe ser mayor que upload_max_filesize): ";
+App::$strings["Recent Channel/Profile Viewers"] = "Visitantes recientes del canal o perfil";
+App::$strings["This plugin/addon has not been configured."] = "El plugin o complemento no se ha configurado.";
+App::$strings["Please visit the Visage settings on %s"] = "Por favor, revise los ajustes de Visage en %s";
+App::$strings["your feature settings page"] = "su página de ajustes de las funcionalidades";
+App::$strings["No entries."] = "No hay entradas.";
+App::$strings["Enable Visage Visitor Logging"] = "Habilitar el registro de visitantes de Visage";
+App::$strings["Visage Settings"] = "Ajustes de Visage";
+App::$strings["Who likes me?"] = "¿A quién le gusto?";
+App::$strings["Post to WordPress"] = "Publicar en WordPress";
+App::$strings["Enable WordPress Post Plugin"] = "Habilitar el plugin de publicación en WordPress";
+App::$strings["WordPress username"] = "Nombre de usuario de WordPress";
+App::$strings["WordPress password"] = "Contraseña de WordPress";
+App::$strings["WordPress API URL"] = "URL de la API de WordPress";
+App::$strings["Typically https://your-blog.tld/xmlrpc.php"] = "Habitualmente https://your-blog.tld/xmlrpc.php";
+App::$strings["WordPress blogid"] = "Blog de WordPress";
+App::$strings["For multi-user sites such as wordpress.com, otherwise leave blank"] = "Para sitios multiusuario como wordpress.com, de lo contrario, dejar en blanco";
+App::$strings["Post to WordPress by default"] = "Publicar en WordPress por defecto";
+App::$strings["Forward comments (requires hubzilla_wp plugin)"] = "Reenviar comentarios (requerido por el plugin hubzilla_wp)";
+App::$strings["WordPress Post Settings"] = "Ajustes de publicación en WordPress";
+App::$strings["Wordpress Settings saved."] = "Se han guardado los ajustes de WordPress.";
+App::$strings["XMPP settings updated."] = "Se han actualizado los ajustes de XMPP.";
+App::$strings["Enable Chat"] = "Habilitar el chat";
+App::$strings["Individual credentials"] = "Credenciales individuales";
+App::$strings["Jabber BOSH server"] = "Servidor BOSH de Jabber";
+App::$strings["XMPP Settings"] = "Ajustes de XMPP";
+App::$strings["Jabber BOSH host"] = "BOSH de Jabber";
+App::$strings["Use central userbase"] = "Usar la base de usuarios central";
+App::$strings["If enabled, members will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the \"auth_ejabberd.php\" script."] = "Si está habilitado, los miembros se conectarán automáticamente a un servidor ejabberd que debe instalarse en esta máquina con credenciales sincronizadas a través del script \"auth ejabberd.php\".";
+App::$strings["Select Channel"] = "Seleccionar un canal";
+App::$strings["Read-write"] = "Lectura y escritura";
+App::$strings["Read-only"] = "Sólo lectura";
+App::$strings["My Calendars"] = "Mis calendarios";
+App::$strings["Shared Calendars"] = "Calendarios compartidos";
+App::$strings["Share this calendar"] = "Compartir este calendario";
+App::$strings["Calendar name and color"] = "Nombre y color del calendario";
+App::$strings["Create new calendar"] = "Crear un nuevo calendario";
+App::$strings["Calendar Name"] = "Nombre del calendario";
+App::$strings["Calendar Tools"] = "Gestión de calendarios";
+App::$strings["Import calendar"] = "Importar un calendario";
+App::$strings["Select a calendar to import to"] = "Seleccionar un calendario para importarlo";
+App::$strings["Addressbooks"] = "Agenda de direcciones";
+App::$strings["Addressbook name"] = "Nombre de la agenda";
+App::$strings["Create new addressbook"] = "Crear una nueva agenda de direcciones";
+App::$strings["Addressbook Name"] = "Nombre de la agenda";
+App::$strings["Addressbook Tools"] = "Gestión de agendas de direcciones";
+App::$strings["Import addressbook"] = "Importar una agenda de direcciones";
+App::$strings["Select an addressbook to import to"] = "Seleccionar una agenda para importarla";
+App::$strings["Errors encountered creating database table: "] = "Errores encontrados al crear la tabla de la base de datos: ";
+App::$strings["Default Calendar"] = "Calendario por defecto";
+App::$strings["Default Addressbook"] = "Agenda de direcciones por defecto";
+App::$strings["CalDAV/CardDAV Settings saved."] = "Se ha guardado la configuración de CalDAV/CardDAV.";
+App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "Habilitar el servidor CalDAV/CardDAV para este canal";
+App::$strings["Your CalDAV resources are located at %s "] = "Los recursos de CalDAV se encuentran en %s";
+App::$strings["Your CardDAV resources are located at %s "] = "Sus recursos de CalDAV están localizados en %s ";
+App::$strings["CalDAV/CardDAV Settings"] = "Configuración de CalDAV/CardDAV";
+App::$strings["Mobile"] = "Móvil";
+App::$strings["Home"] = "Inicio";
+App::$strings["Home, Voice"] = "Llamadas particulares";
+App::$strings["Home, Fax"] = "Fax particular";
+App::$strings["Work"] = "Trabajo";
+App::$strings["Work, Voice"] = "Llamadas de trabajo";
+App::$strings["Work, Fax"] = "Fax de trabajo";
+App::$strings["INVALID EVENT DISMISSED!"] = "¡EVENTO NO VÁLIDO RECHAZADO!";
+App::$strings["Summary: "] = "Resumen: ";
+App::$strings["Date: "] = "Fecha: ";
+App::$strings["Reason: "] = "Razón: ";
+App::$strings["INVALID CARD DISMISSED!"] = "¡TARJETA NO VÁLIDA RECHAZADA!";
+App::$strings["Name: "] = "Nombre: ";
+App::$strings["You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV Settings before you can use it."] = "Debe habilitar este complemento en Ajustes/Complementos>Configuración de CalDAV/CardDAV antes de poder utilizarlo.";
+App::$strings["Example: YYYY-MM-DD HH:mm"] = "Ejemplo: YYYY-MM-DD HH:mm";
+App::$strings["End date and time"] = "Fecha y hora de finalización";
+App::$strings["List month"] = "Lista mensual";
+App::$strings["List week"] = "Lista semanal";
+App::$strings["List day"] = "Lista diaria";
+App::$strings["More"] = "Más";
+App::$strings["Less"] = "Menos";
+App::$strings["Select calendar"] = "Seleccionar un calendario";
+App::$strings["Delete all"] = "Eliminar todos";
+App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "¡Disculpas! La edición de eventos recurrentes aún no se ha implementado.";
+App::$strings["Organisation"] = "Organización";
+App::$strings["Title"] = "Título";
+App::$strings["Phone"] = "Teléfono";
+App::$strings["Instant messenger"] = "Mensajería instantánea";
+App::$strings["Website"] = "Sitio web";
+App::$strings["Note"] = "Nota";
+App::$strings["Add Field"] = "Añadir un campo";
+App::$strings["P.O. Box"] = "Buzón de correos";
+App::$strings["Additional"] = "Adicional";
+App::$strings["Street"] = "Calle";
+App::$strings["Locality"] = "Localidad";
+App::$strings["Region"] = "Provincia, región o estado";
+App::$strings["ZIP Code"] = "Código postal";
+App::$strings["Invalid game."] = "Juego no válido.";
+App::$strings["You are not a player in this game."] = "Usted no participa en este juego.";
+App::$strings["You must be a local channel to create a game."] = "Debe ser un canal local para crear un juego";
+App::$strings["You must select one opponent that is not yourself."] = "Debe seleccionar un oponente que no sea usted mismo.";
+App::$strings["Creating new game..."] = "Crear un nuevo juego...";
+App::$strings["You must select white or black."] = "Debe elegir blancas o negras.";
+App::$strings["Error creating new game."] = "Error al crear un nuevo juego.";
+App::$strings["Requested channel is not available."] = "El canal solicitado no está disponible.";
+App::$strings["You must select a local channel /chess/channelname"] = "Debe seleccionar un canal local /chess/nombredelcanal";
+App::$strings["Enable notifications"] = "Habilitar notificaciones";
+App::$strings["Your Webbie:"] = "Su webbie: ";
+App::$strings["Fontsize (px):"] = "Tamaño de fuente (px): ";
+App::$strings["Link:"] = "Enlace: ";
+App::$strings["Like us on Hubzilla"] = "Múestrenos su agrado en Hubzilla";
+App::$strings["Embed:"] = "Incorporado: ";
+App::$strings["Male"] = "Hombre";
+App::$strings["Female"] = "Mujer";
+App::$strings["OpenID protocol error. No ID returned."] = "Error de protocolo OpenID. No se recuperó ninguna ID.";
+App::$strings["Login failed."] = "El acceso ha fallado.";
+App::$strings["First Name"] = "Nombre";
+App::$strings["Last Name"] = "Apellido";
+App::$strings["Full Name"] = "Nombre completo";
+App::$strings["Profile Photo 16px"] = "Foto del perfil 16px";
+App::$strings["Profile Photo 32px"] = "Foto del perfil 32px";
+App::$strings["Profile Photo 48px"] = "Foto del perfil 48px";
+App::$strings["Profile Photo 64px"] = "Foto del perfil 64px";
+App::$strings["Profile Photo 80px"] = "Foto del perfil 80px";
+App::$strings["Profile Photo 128px"] = "Foto del perfil 128px";
+App::$strings["Timezone"] = "Zona horaria";
+App::$strings["Birth Year"] = "Año de nacimiento";
+App::$strings["Birth Month"] = "Mes de nacimiento";
+App::$strings["Birth Day"] = "Día de nacimiento";
+App::$strings["Birthdate"] = "Fecha de nacimiento";
+App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Encontramos un problema al iniciar sesión con el OpenID que proporcionó. Compruebe si el ID está correctamente escrito.";
+App::$strings["The error message was:"] = "El mensaje de error ha sido: ";
+App::$strings["Reconnecting %d connections"] = "Reconectando %d conexiones";
+App::$strings["Diaspora Reconnect"] = "Reconectar con Diaspora";
+App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "Utilice este formulario para restablecer las conexiones de diáspora que se hicieron inicialmente desde un hub diferente.";
+App::$strings["Reconnect"] = "Reconectar";
+App::$strings["Send test email"] = "Enviar un correo electrónico de prueba";
+App::$strings["Mail sent."] = "El correo electrónico ha sido enviado.";
+App::$strings["Sending of mail failed."] = "No se pudo enviar el correo.";
+App::$strings["Mail Test"] = "Prueba de correo";
+App::$strings["Errors encountered deleting database table "] = "Errores encontrados al eliminar la tabla de la base de datos";
+App::$strings["Drop tables when uninstalling?"] = "¿Eliminar tablas al desinstalar?";
+App::$strings["If checked, the Rendezvous database tables will be deleted when the plugin is uninstalled."] = "Si se selecciona, las tablas de la base de datos Rendezvous se eliminarán cuando se desinstale el plugin.";
+App::$strings["Mapbox Access Token"] = "Token de acceso de Mapbox";
+App::$strings["If you enter a Mapbox access token, it will be used to retrieve map tiles from Mapbox instead of the default OpenStreetMap tile server."] = "Si introduce un token de acceso a Mapbox, se utilizará para recuperar los mapas de mosaicos de imágenes de Mapbox en lugar del servidor de mosaico de imágenes OpenStreetMap predeterminado.";
+App::$strings["Rendezvous"] = "Rendezvous";
+App::$strings["This identity has been deleted by another member due to inactivity. Please press the \"New identity\" button or refresh the page to register a new identity. You may use the same name."] = "Esta identidad ha sido eliminada por otro miembro debido a su inactividad. Pulse el botón \"Nueva identidad\" o actualice la página para registrar una nueva identidad. Puede usar el mismo nombre.";
+App::$strings["Welcome to Rendezvous!"] = "¡Bienvenido/a a Rendevous!";
+App::$strings["Enter your name to join this rendezvous. To begin sharing your location with the other members, tap the GPS control. When your location is discovered, a red dot will appear and others will be able to see you on the map."] = "Introduzca tu nombre para unirse a esta cita. Para comenzar a compartir su ubicación con los demás miembros, pulse en el control GPS. Cuando se descubra su ubicación, aparecerá un punto rojo y otros podrán verlo en el mapa.";
+App::$strings["Let's meet here"] = "Reunámonos aquí";
+App::$strings["New marker"] = "Nuevo marcador";
+App::$strings["Edit marker"] = "Editar un marcador";
+App::$strings["New identity"] = "Nueva identidad";
+App::$strings["Delete marker"] = "Eliminar un marcador";
+App::$strings["Delete member"] = "Eliminar un miembro";
+App::$strings["Edit proximity alert"] = "Editar alerta de proximidad";
+App::$strings["A proximity alert will be issued when this member is within a certain radius of you.<br><br>Enter a radius in meters (0 to disable):"] = "Se emitirá una alerta de proximidad cuando este miembro esté dentro de un radio determinado respecto a usted.<br><br> Ingrese el radio en metros (0 para deshabilitar):";
+App::$strings["distance"] = "distancia";
+App::$strings["Add new rendezvous"] = "Añadir una nueva cita";
+App::$strings["Create a new rendezvous and share the access link with those you wish to invite to the group. Those who open the link become members of the rendezvous. They can view other member locations, add markers to the map, or share their own locations with the group."] = "Cree una nueva cita y comparta los enlaces de acceso con los que desea invitar al grupo. Aquellos que abran el enlace se convertirán en miembros de la cita. Pueden ver otras ubicaciones de miembros, añadir marcadores al mapa o compartir sus propias ubicaciones con el grupo.";
App::$strings["No username found in import file."] = "No se ha encontrado el nombre de usuario en el fichero importado.";
App::$strings["Unable to create a unique channel address. Import failed."] = "No se ha podido crear una dirección de canal única. Ha fallado la importación.";
App::$strings["Cannot locate DNS info for database server '%s'"] = "No se ha podido localizar información de DNS para el servidor de base de datos “%s”";
-App::$strings["Can view my normal stream and posts"] = "Pueden verse mi actividad y publicaciones normales";
-App::$strings["Can view my webpages"] = "Pueden verse mis páginas web";
-App::$strings["Can post on my channel page (\"wall\")"] = "Pueden crearse entradas en mi página de inicio del canal (“muro”)";
-App::$strings["Can like/dislike stuff"] = "Puede marcarse contenido como me gusta/no me gusta";
-App::$strings["Profiles and things other than posts/comments"] = "Perfiles y otras cosas aparte de publicaciones/comentarios";
-App::$strings["Can forward to all my channel contacts via post @mentions"] = "Puede enviarse una entrada a todos mis contactos del canal mediante una @mención";
-App::$strings["Advanced - useful for creating group forum channels"] = "Avanzado - útil para crear canales de foros de discusión o grupos";
-App::$strings["Can chat with me (when available)"] = "Se puede charlar conmigo (cuando esté disponible)";
-App::$strings["Can write to my file storage and photos"] = "Puede escribirse en mi repositorio de ficheros y fotos";
-App::$strings["Can edit my webpages"] = "Pueden editarse mis páginas web";
-App::$strings["Somewhat advanced - very useful in open communities"] = "Algo avanzado - muy útil en comunidades abiertas";
-App::$strings["Can administer my channel resources"] = "Pueden administrarse mis recursos del canal";
-App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Muy avanzado. Déjelo a no ser que sepa bien lo que está haciendo.";
-App::$strings["Image exceeds website size limit of %lu bytes"] = "La imagen excede el límite de %lu bytes del sitio";
-App::$strings["Image file is empty."] = "El fichero de imagen está vacío. ";
-App::$strings["Photo storage failed."] = "La foto no ha podido ser guardada.";
-App::$strings["a new photo"] = "una nueva foto";
-App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s ha publicado %2\$s en %3\$s";
-App::$strings["Photo Albums"] = "Álbumes de fotos";
-App::$strings["Upload New Photos"] = "Subir nuevas fotos";
-App::$strings["General Features"] = "Funcionalidades básicas";
-App::$strings["Multiple Profiles"] = "Múltiples perfiles";
-App::$strings["Ability to create multiple profiles"] = "Capacidad de crear múltiples perfiles";
-App::$strings["Advanced Profiles"] = "Perfiles avanzados";
-App::$strings["Additional profile sections and selections"] = "Secciones y selecciones de perfil adicionales";
-App::$strings["Profile Import/Export"] = "Importar/Exportar perfil";
-App::$strings["Save and load profile details across sites/channels"] = "Guardar y cargar detalles del perfil a través de sitios/canales";
-App::$strings["Web Pages"] = "Páginas web";
-App::$strings["Provide managed web pages on your channel"] = "Proveer páginas web gestionadas en su canal";
-App::$strings["Provide a wiki for your channel"] = "Proporcionar un wiki para su canal";
-App::$strings["Private Notes"] = "Notas privadas";
-App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Habilita una herramienta para guardar notas y recordatorios (advertencia: las notas no estarán cifradas)";
-App::$strings["Navigation Channel Select"] = "Navegación por el selector de canales";
-App::$strings["Change channels directly from within the navigation dropdown menu"] = "Cambiar de canales directamente desde el menú de navegación desplegable";
-App::$strings["Photo Location"] = "Ubicación de las fotos";
-App::$strings["If location data is available on uploaded photos, link this to a map."] = "Si los datos de ubicación están disponibles en las fotos subidas, enlazar estas a un mapa.";
-App::$strings["Access Controlled Chatrooms"] = "Salas de chat moderadas";
-App::$strings["Provide chatrooms and chat services with access control."] = "Proporcionar salas y servicios de chat moderados.";
-App::$strings["Smart Birthdays"] = "Cumpleaños inteligentes";
-App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Enlazar los eventos de cumpleaños con el huso horario en el caso de que sus amigos estén dispersos por el mundo.";
-App::$strings["Advanced Directory Search"] = "Búsqueda avanzada en el directorio";
-App::$strings["Allows creation of complex directory search queries"] = "Permitir la creación de consultas complejas en las búsquedas en el directorio";
-App::$strings["Advanced Theme and Layout Settings"] = "Ajustes avanzados de temas y esquemas";
-App::$strings["Allows fine tuning of themes and page layouts"] = "Permitir el ajuste fino de temas y esquemas de páginas";
-App::$strings["Post Composition Features"] = "Opciones para la redacción de entradas";
-App::$strings["Large Photos"] = "Fotos de gran tamaño";
-App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Incluir miniaturas de fotos grandes (1024px) en publicaciones. Si no está habilitado, usar miniaturas pequeñas (640px)";
-App::$strings["Automatically import channel content from other channels or feeds"] = "Importar automáticamente contenido de otros canales o \"feeds\"";
-App::$strings["Even More Encryption"] = "Más cifrado todavía";
-App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Permitir cifrado adicional de contenido \"punto-a-punto\" con una clave secreta compartida.";
-App::$strings["Enable Voting Tools"] = "Permitir entradas con votación";
-App::$strings["Provide a class of post which others can vote on"] = "Proveer una clase de publicación en la que otros puedan votar";
-App::$strings["Disable Comments"] = "Deshabilitar comentarios";
-App::$strings["Provide the option to disable comments for a post"] = "Proporcionar la opción de desactivar los comentarios de una publicación";
-App::$strings["Delayed Posting"] = "Publicación aplazada";
-App::$strings["Allow posts to be published at a later date"] = "Permitir mensajes que se publicarán en una fecha posterior";
-App::$strings["Content Expiration"] = "Caducidad del contenido";
-App::$strings["Remove posts/comments and/or private messages at a future time"] = "Eliminar publicaciones/comentarios y/o mensajes privados más adelante";
-App::$strings["Suppress Duplicate Posts/Comments"] = "Prevenir entradas o comentarios duplicados";
-App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Prevenir que entradas con contenido idéntico se publiquen con menos de dos minutos de intervalo.";
-App::$strings["Network and Stream Filtering"] = "Filtrado del contenido";
-App::$strings["Search by Date"] = "Buscar por fecha";
-App::$strings["Ability to select posts by date ranges"] = "Capacidad de seleccionar entradas por rango de fechas";
-App::$strings["Privacy Groups"] = "Grupos de canales";
-App::$strings["Enable management and selection of privacy groups"] = "Activar la gestión y selección de grupos de canales";
-App::$strings["Saved Searches"] = "Búsquedas guardadas";
-App::$strings["Save search terms for re-use"] = "Guardar términos de búsqueda para su reutilización";
-App::$strings["Network Personal Tab"] = "Actividad personal";
-App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Habilitar una pestaña en la cual se muestren solo las entradas en las que ha participado.";
-App::$strings["Network New Tab"] = "Contenido nuevo";
-App::$strings["Enable tab to display all new Network activity"] = "Habilitar una pestaña en la que se muestre solo el contenido nuevo";
-App::$strings["Affinity Tool"] = "Herramienta de afinidad";
-App::$strings["Filter stream activity by depth of relationships"] = "Filtrar el contenido según la profundidad de las relaciones";
-App::$strings["Show friend and connection suggestions"] = "Mostrar sugerencias de amigos y conexiones";
-App::$strings["Connection Filtering"] = "Filtrado de conexiones";
-App::$strings["Filter incoming posts from connections based on keywords/content"] = "Filtrar publicaciones entrantes de conexiones por palabras clave o contenido";
-App::$strings["Post/Comment Tools"] = "Gestión de entradas y comentarios";
-App::$strings["Community Tagging"] = "Etiquetas de la comunidad";
-App::$strings["Ability to tag existing posts"] = "Capacidad de etiquetar entradas existentes";
-App::$strings["Post Categories"] = "Temas de las entradas";
-App::$strings["Add categories to your posts"] = "Añadir temas a sus publicaciones";
-App::$strings["Emoji Reactions"] = "Emoticonos \"emoji\"";
-App::$strings["Add emoji reaction ability to posts"] = "Activar la capacidad de añadir un emoticono \"emoji\" a las entradas";
-App::$strings["Saved Folders"] = "Carpetas guardadas";
-App::$strings["Ability to file posts under folders"] = "Capacidad de archivar entradas en carpetas";
-App::$strings["Dislike Posts"] = "Desagrado de publicaciones";
-App::$strings["Ability to dislike posts/comments"] = "Capacidad de mostrar desacuerdo con el contenido de entradas y comentarios";
-App::$strings["Star Posts"] = "Entradas destacadas";
-App::$strings["Ability to mark special posts with a star indicator"] = "Capacidad de marcar entradas destacadas con un indicador de estrella";
-App::$strings["Tag Cloud"] = "Nube de etiquetas";
-App::$strings["Provide a personal tag cloud on your channel page"] = "Proveer nube de etiquetas personal en su página de canal";
-App::$strings["Premium Channel"] = "Canal premium";
-App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Le permite configurar restricciones y normas de uso a aquellos que conectan con su canal";
-App::$strings["Help:"] = "Ayuda:";
-App::$strings["guest:"] = "invitado: ";
-App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado";
-App::$strings["prev"] = "anterior";
-App::$strings["first"] = "primera";
-App::$strings["last"] = "última";
-App::$strings["next"] = "próxima";
-App::$strings["older"] = "más antiguas";
-App::$strings["newer"] = "más recientes";
-App::$strings["No connections"] = "Sin conexiones";
-App::$strings["View all %s connections"] = "Ver todas las %s conexiones";
-App::$strings["poke"] = "un toque";
-App::$strings["poked"] = "ha dado un toque a";
-App::$strings["ping"] = "un \"ping\"";
-App::$strings["pinged"] = "ha enviado un \"ping\" a";
-App::$strings["prod"] = "una incitación ";
-App::$strings["prodded"] = "ha incitado a ";
-App::$strings["slap"] = "una bofetada ";
-App::$strings["slapped"] = "ha abofeteado a ";
-App::$strings["finger"] = "un \"finger\" ";
-App::$strings["fingered"] = "envió un \"finger\" a";
-App::$strings["rebuff"] = "un reproche";
-App::$strings["rebuffed"] = "ha hecho un reproche a ";
-App::$strings["happy"] = "feliz ";
-App::$strings["sad"] = "triste ";
-App::$strings["mellow"] = "tranquilo/a";
-App::$strings["tired"] = "cansado/a ";
-App::$strings["perky"] = "vivaz";
-App::$strings["angry"] = "enfadado/a";
-App::$strings["stupefied"] = "asombrado/a";
-App::$strings["puzzled"] = "perplejo/a";
-App::$strings["interested"] = "interesado/a";
-App::$strings["bitter"] = "amargado/a";
-App::$strings["cheerful"] = "alegre";
-App::$strings["alive"] = "animado/a";
-App::$strings["annoyed"] = "molesto/a";
-App::$strings["anxious"] = "ansioso/a";
-App::$strings["cranky"] = "de mal humor";
-App::$strings["disturbed"] = "perturbado/a";
-App::$strings["frustrated"] = "frustrado/a";
-App::$strings["depressed"] = "deprimido/a";
-App::$strings["motivated"] = "motivado/a";
-App::$strings["relaxed"] = "relajado/a";
-App::$strings["surprised"] = "sorprendido/a";
-App::$strings["Monday"] = "lunes";
-App::$strings["Tuesday"] = "martes";
-App::$strings["Wednesday"] = "miércoles";
-App::$strings["Thursday"] = "jueves";
-App::$strings["Friday"] = "viernes";
-App::$strings["Saturday"] = "sábado";
-App::$strings["Sunday"] = "domingo";
-App::$strings["January"] = "enero";
-App::$strings["February"] = "febrero";
-App::$strings["March"] = "marzo";
-App::$strings["April"] = "abril";
-App::$strings["May"] = "mayo";
-App::$strings["June"] = "junio";
-App::$strings["July"] = "julio";
-App::$strings["August"] = "agosto";
-App::$strings["September"] = "septiembre";
-App::$strings["October"] = "octubre";
-App::$strings["November"] = "noviembre";
-App::$strings["December"] = "diciembre";
-App::$strings["Unknown Attachment"] = "Adjunto no reconocido";
-App::$strings["unknown"] = "desconocido";
-App::$strings["remove category"] = "eliminar el tema";
-App::$strings["remove from file"] = "eliminar del fichero";
-App::$strings["default"] = "por defecto";
-App::$strings["Page layout"] = "Plantilla de la página";
-App::$strings["You can create your own with the layouts tool"] = "Puede crear su propia disposición gráfica con la herramienta de plantillas";
-App::$strings["Page content type"] = "Tipo de contenido de la página";
-App::$strings["Select an alternate language"] = "Seleccionar un idioma alternativo";
-App::$strings["activity"] = "la actividad";
-App::$strings["Design Tools"] = "Herramientas de diseño web";
-App::$strings["Pages"] = "Páginas";
-App::$strings["Import website..."] = "Importar un sitio web...";
-App::$strings["Select folder to import"] = "Seleccionar la carpeta que se va a importar";
-App::$strings["Import from a zipped folder:"] = "Importar desde una carpeta comprimida: ";
-App::$strings["Import from cloud files:"] = "Importar desde los ficheros en la nube: ";
-App::$strings["/cloud/channel/path/to/folder"] = "/cloud/canal/ruta/a la/carpeta";
-App::$strings["Enter path to website files"] = "Ruta a los ficheros del sitio web";
-App::$strings["Select folder"] = "Seleccionar la carpeta";
-App::$strings["Export website..."] = "Exportar un sitio web...";
-App::$strings["Export to a zip file"] = "Exportar a un fichero comprimido .zip";
-App::$strings["website.zip"] = "sitio_web.zip";
-App::$strings["Enter a name for the zip file."] = "Escribir un nombre para el fichero .zip.";
-App::$strings["Export to cloud files"] = "Exportar a los ficheros en la nube";
-App::$strings["/path/to/export/folder"] = "/ruta/para/exportar/carpeta";
-App::$strings["Enter a path to a cloud files destination."] = "Escribir una ruta de destino para los ficheros en la nube";
-App::$strings["Specify folder"] = "Especificar una carpeta";
-App::$strings["Invalid data packet"] = "Paquete de datos no válido";
-App::$strings["Unable to verify channel signature"] = "No ha sido posible de verificar la firma del canal";
-App::$strings["Unable to verify site signature for %s"] = "No ha sido posible de verificar la firma del sitio para %s";
-App::$strings["invalid target signature"] = "La firma recibida no es válida";
+App::$strings["Birthday"] = "Cumpleaños";
+App::$strings["Age: "] = "Edad:";
+App::$strings["YYYY-MM-DD or MM-DD"] = "AAAA-MM-DD o MM-DD";
+App::$strings["never"] = "nunca";
+App::$strings["less than a second ago"] = "hace un instante";
+App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "hace %1\$d %2\$s";
+App::$strings["__ctx:relative_date__ year"] = array(
+ 0 => "año",
+ 1 => "años",
+);
+App::$strings["__ctx:relative_date__ month"] = array(
+ 0 => "mes",
+ 1 => "meses",
+);
+App::$strings["__ctx:relative_date__ week"] = array(
+ 0 => "semana",
+ 1 => "semanas",
+);
+App::$strings["__ctx:relative_date__ day"] = array(
+ 0 => "día",
+ 1 => "días",
+);
+App::$strings["__ctx:relative_date__ hour"] = array(
+ 0 => "hora",
+ 1 => "horas",
+);
+App::$strings["__ctx:relative_date__ minute"] = array(
+ 0 => "minuto",
+ 1 => "minutos",
+);
+App::$strings["__ctx:relative_date__ second"] = array(
+ 0 => "segundo",
+ 1 => "segundos",
+);
+App::$strings["%1\$s's birthday"] = "Cumpleaños de %1\$s";
+App::$strings["Happy Birthday %1\$s"] = "Feliz cumpleaños %1\$s";
App::$strings["Not a valid email address"] = "Dirección de correo no válida";
App::$strings["Your email domain is not among those allowed on this site"] = "Su dirección de correo no pertenece a ninguno de los dominios permitidos en este sitio.";
App::$strings["Your email address is already registered at this site."] = "Su dirección de correo está ya registrada en este sitio.";
@@ -1795,7 +2345,6 @@ App::$strings["Please enter the required information."] = "Por favor introduzca
App::$strings["Failed to store account information."] = "La información de la cuenta no se ha podido guardar.";
App::$strings["Registration confirmation for %s"] = "Confirmación de registro para %s";
App::$strings["Registration request at %s"] = "Solicitud de registro en %s";
-App::$strings["Administrator"] = "Administrador";
App::$strings["your registration password"] = "su contraseña de registro";
App::$strings["Registration details for %s"] = "Detalles del registro de %s";
App::$strings["Account approved."] = "Cuenta aprobada.";
@@ -1803,18 +2352,12 @@ App::$strings["Registration revoked for %s"] = "Registro revocado para %s";
App::$strings["Click here to upgrade."] = "Pulse aquí para actualizar";
App::$strings["This action exceeds the limits set by your subscription plan."] = "Esta acción supera los límites establecidos por su plan de suscripción ";
App::$strings["This action is not available under your subscription plan."] = "Esta acción no está disponible en su plan de suscripción.";
-App::$strings["No recipient provided."] = "No se ha especificado ningún destinatario.";
-App::$strings["[no subject]"] = "[sin asunto]";
-App::$strings["Unable to determine sender."] = "No ha sido posible determinar el remitente. ";
-App::$strings["Stored post could not be verified."] = "No se han podido verificar las publicaciones guardadas.";
App::$strings["Frequently"] = "Frecuentemente";
App::$strings["Hourly"] = "Cada hora";
App::$strings["Twice daily"] = "Dos veces al día";
App::$strings["Daily"] = "Diariamente";
App::$strings["Weekly"] = "Semanalmente";
App::$strings["Monthly"] = "Mensualmente";
-App::$strings["Male"] = "Hombre";
-App::$strings["Female"] = "Mujer";
App::$strings["Currently Male"] = "Actualmente hombre";
App::$strings["Currently Female"] = "Actualmente mujer";
App::$strings["Mostly Male"] = "Generalmente hombre";
@@ -1878,12 +2421,9 @@ App::$strings["Reserved nickname. Please choose another."] = "Sobrenombre en uso
App::$strings["Nickname has unsupported characters or is already being used on this site."] = "El alias contiene caracteres no admitidos o está ya en uso por otros miembros de este sitio.";
App::$strings["Unable to retrieve created identity"] = "No ha sido posible recuperar la identidad creada";
App::$strings["Default Profile"] = "Perfil principal";
-App::$strings["Requested channel is not available."] = "El canal solicitado no está disponible.";
App::$strings["Create New Profile"] = "Crear un nuevo perfil";
-App::$strings["Edit Profile"] = "Editar el perfil";
App::$strings["Visible to everybody"] = "Visible para todos";
App::$strings["Gender:"] = "Género:";
-App::$strings["Status:"] = "Estado:";
App::$strings["Homepage:"] = "Página personal:";
App::$strings["Online Now"] = "Ahora en línea";
App::$strings["Like this channel"] = "Me gusta este canal";
@@ -1908,29 +2448,15 @@ App::$strings["Love/Romance:"] = "Vida sentimental o amorosa:";
App::$strings["Work/employment:"] = "Trabajo:";
App::$strings["School/education:"] = "Estudios:";
App::$strings["Like this thing"] = "Me gusta esto";
-App::$strings["Who can see this?"] = "¿Quién puede ver esto?";
-App::$strings["Custom selection"] = "Selección personalizada";
-App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Seleccione \"Mostrar\" para permitir la visualización. La opción \"No mostrar\" le permite anular y limitar el alcance de \"Mostrar\".";
-App::$strings["Show"] = "Mostrar";
-App::$strings["Don't show"] = "No mostrar";
-App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Los permisos de la entrada %s no se pueden cambiar %s una vez que se ha compartido.</br /> Estos permisos establecen quién está autorizado para ver el mensaje.";
-App::$strings["%1\$s's bookmarks"] = "Marcadores de %1\$s";
-App::$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."] = "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente.";
-App::$strings["Add new connections to this privacy group"] = "Añadir conexiones nuevas a este grupo de canales";
-App::$strings["edit"] = "editar";
-App::$strings["Edit group"] = "Editar grupo";
-App::$strings["Add privacy group"] = "Añadir un grupo de canales";
-App::$strings["Channels not in any privacy group"] = "Sin canales en ningún grupo";
-App::$strings["add"] = "añadir";
App::$strings["New window"] = "Nueva ventana";
App::$strings["Open the selected location in a different window or browser tab"] = "Abrir la dirección seleccionada en una ventana o pestaña aparte";
App::$strings["User '%s' deleted"] = "El usuario '%s' ha sido eliminado";
-App::$strings["New Page"] = "Nueva página";
-App::$strings["Title"] = "Título";
-App::$strings["Different viewers will see this text differently"] = "Visitantes diferentes verán este texto de forma distinta";
+App::$strings["Directory Options"] = "Opciones del directorio";
+App::$strings["Safe Mode"] = "Modo seguro";
+App::$strings["Public Forums Only"] = "Solo foros públicos";
+App::$strings["This Website Only"] = "Solo este sitio web";
App::$strings["Logout"] = "Finalizar sesión";
App::$strings["End this session"] = "Finalizar esta sesión";
-App::$strings["Home"] = "Inicio";
App::$strings["Your posts and conversations"] = "Sus publicaciones y conversaciones";
App::$strings["Your profile page"] = "Su página del perfil";
App::$strings["Manage/Edit profiles"] = "Administrar/editar perfiles";
@@ -1941,12 +2467,12 @@ App::$strings["Your chatrooms"] = "Sus salas de chat";
App::$strings["Bookmarks"] = "Marcadores";
App::$strings["Your bookmarks"] = "Sus marcadores";
App::$strings["Your webpages"] = "Sus páginas web";
-App::$strings["Your wiki"] = "Su wiki";
+App::$strings["Your wikis"] = "Sus wikis";
App::$strings["Sign in"] = "Acceder";
-App::$strings["%s - click to logout"] = "%s - pulsar para finalizar sesión";
App::$strings["Remote authentication"] = "Acceder desde su servidor";
App::$strings["Click to authenticate to your home hub"] = "Pulsar para identificarse en su servidor de inicio";
-App::$strings["Home Page"] = "Página de inicio";
+App::$strings["Get me home"] = "Volver a la página principal";
+App::$strings["Log me out of this site"] = "Salir de este sitio";
App::$strings["Create an account"] = "Crear una cuenta";
App::$strings["Help and documentation"] = "Ayuda y documentación";
App::$strings["Applications, utilities, links, games"] = "Aplicaciones, utilidades, enlaces, juegos";
@@ -1975,11 +2501,115 @@ App::$strings["Site Setup and Configuration"] = "Ajustes y configuración del si
App::$strings["Loading..."] = "Cargando...";
App::$strings["@name, #tag, ?doc, content"] = "@nombre, #etiqueta, ?ayuda, contenido";
App::$strings["Please wait..."] = "Espere por favor…";
+App::$strings["General Features"] = "Funcionalidades básicas";
+App::$strings["Multiple Profiles"] = "Múltiples perfiles";
+App::$strings["Ability to create multiple profiles"] = "Capacidad de crear múltiples perfiles";
+App::$strings["Advanced Profiles"] = "Perfiles avanzados";
+App::$strings["Additional profile sections and selections"] = "Secciones y selecciones de perfil adicionales";
+App::$strings["Profile Import/Export"] = "Importar/Exportar perfil";
+App::$strings["Save and load profile details across sites/channels"] = "Guardar y cargar detalles del perfil a través de sitios/canales";
+App::$strings["Web Pages"] = "Páginas web";
+App::$strings["Provide managed web pages on your channel"] = "Proveer páginas web gestionadas en su canal";
+App::$strings["Provide a wiki for your channel"] = "Proporcionar un wiki para su canal";
+App::$strings["Private Notes"] = "Notas privadas";
+App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Habilita una herramienta para guardar notas y recordatorios (advertencia: las notas no estarán cifradas)";
+App::$strings["Navigation Channel Select"] = "Navegación por el selector de canales";
+App::$strings["Change channels directly from within the navigation dropdown menu"] = "Cambiar de canales directamente desde el menú de navegación desplegable";
+App::$strings["Photo Location"] = "Ubicación de las fotos";
+App::$strings["If location data is available on uploaded photos, link this to a map."] = "Si los datos de ubicación están disponibles en las fotos subidas, enlazar estas a un mapa.";
+App::$strings["Access Controlled Chatrooms"] = "Salas de chat moderadas";
+App::$strings["Provide chatrooms and chat services with access control."] = "Proporcionar salas y servicios de chat moderados.";
+App::$strings["Smart Birthdays"] = "Cumpleaños inteligentes";
+App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Enlazar los eventos de cumpleaños con el huso horario en el caso de que sus amigos estén dispersos por el mundo.";
+App::$strings["Advanced Directory Search"] = "Búsqueda avanzada en el directorio";
+App::$strings["Allows creation of complex directory search queries"] = "Permitir la creación de consultas complejas en las búsquedas en el directorio";
+App::$strings["Advanced Theme and Layout Settings"] = "Ajustes avanzados de temas y esquemas";
+App::$strings["Allows fine tuning of themes and page layouts"] = "Permitir el ajuste fino de temas y esquemas de páginas";
+App::$strings["Post Composition Features"] = "Opciones para la redacción de entradas";
+App::$strings["Large Photos"] = "Fotos de gran tamaño";
+App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Incluir miniaturas de fotos grandes (1024px) en publicaciones. Si no está habilitado, usar miniaturas pequeñas (640px)";
+App::$strings["Automatically import channel content from other channels or feeds"] = "Importar automáticamente contenido de otros canales o \"feeds\"";
+App::$strings["Even More Encryption"] = "Más cifrado todavía";
+App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Permitir cifrado adicional de contenido \"punto-a-punto\" con una clave secreta compartida.";
+App::$strings["Enable Voting Tools"] = "Permitir entradas con votación";
+App::$strings["Provide a class of post which others can vote on"] = "Proveer una clase de publicación en la que otros puedan votar";
+App::$strings["Disable Comments"] = "Deshabilitar comentarios";
+App::$strings["Provide the option to disable comments for a post"] = "Proporcionar la opción de desactivar los comentarios para una entrada";
+App::$strings["Delayed Posting"] = "Publicación aplazada";
+App::$strings["Allow posts to be published at a later date"] = "Permitir mensajes que se publicarán en una fecha posterior";
+App::$strings["Content Expiration"] = "Caducidad del contenido";
+App::$strings["Remove posts/comments and/or private messages at a future time"] = "Eliminar publicaciones/comentarios y/o mensajes privados más adelante";
+App::$strings["Suppress Duplicate Posts/Comments"] = "Prevenir entradas o comentarios duplicados";
+App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Prevenir que entradas con contenido idéntico se publiquen con menos de dos minutos de intervalo.";
+App::$strings["Network and Stream Filtering"] = "Filtrado del contenido";
+App::$strings["Search by Date"] = "Buscar por fecha";
+App::$strings["Ability to select posts by date ranges"] = "Capacidad de seleccionar entradas por rango de fechas";
+App::$strings["Privacy Groups"] = "Grupos de canales";
+App::$strings["Enable management and selection of privacy groups"] = "Activar la gestión y selección de grupos de canales";
+App::$strings["Saved Searches"] = "Búsquedas guardadas";
+App::$strings["Save search terms for re-use"] = "Guardar términos de búsqueda para su reutilización";
+App::$strings["Network Personal Tab"] = "Actividad personal";
+App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Habilitar una pestaña en la cual se muestren solo las entradas en las que ha participado.";
+App::$strings["Network New Tab"] = "Contenido nuevo";
+App::$strings["Enable tab to display all new Network activity"] = "Habilitar una pestaña en la que se muestre solo el contenido nuevo";
+App::$strings["Affinity Tool"] = "Herramienta de afinidad";
+App::$strings["Filter stream activity by depth of relationships"] = "Filtrar el contenido según la profundidad de las relaciones";
+App::$strings["Show friend and connection suggestions"] = "Mostrar sugerencias de amigos y conexiones";
+App::$strings["Connection Filtering"] = "Filtrado de conexiones";
+App::$strings["Filter incoming posts from connections based on keywords/content"] = "Filtrar publicaciones entrantes de conexiones por palabras clave o contenido";
+App::$strings["Post/Comment Tools"] = "Gestión de entradas y comentarios";
+App::$strings["Community Tagging"] = "Etiquetas de la comunidad";
+App::$strings["Ability to tag existing posts"] = "Capacidad de etiquetar entradas existentes";
+App::$strings["Post Categories"] = "Temas de las entradas";
+App::$strings["Add categories to your posts"] = "Añadir temas a sus publicaciones";
+App::$strings["Emoji Reactions"] = "Emoticonos \"emoji\"";
+App::$strings["Add emoji reaction ability to posts"] = "Activar la capacidad de añadir un emoticono \"emoji\" a las entradas";
+App::$strings["Saved Folders"] = "Carpetas guardadas";
+App::$strings["Ability to file posts under folders"] = "Capacidad de archivar entradas en carpetas";
+App::$strings["Dislike Posts"] = "Desagrado de publicaciones";
+App::$strings["Ability to dislike posts/comments"] = "Capacidad de mostrar desacuerdo con el contenido de entradas y comentarios";
+App::$strings["Star Posts"] = "Entradas destacadas";
+App::$strings["Ability to mark special posts with a star indicator"] = "Capacidad de marcar entradas destacadas con un indicador de estrella";
+App::$strings["Tag Cloud"] = "Nube de etiquetas";
+App::$strings["Provide a personal tag cloud on your channel page"] = "Proveer nube de etiquetas personal en su página de canal";
+App::$strings["Premium Channel"] = "Canal premium";
+App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Le permite configurar restricciones y normas de uso a aquellos que conectan con su canal";
App::$strings["Attachments:"] = "Ficheros adjuntos:";
App::$strings["l F d, Y \\@ g:i A"] = "l d de F, Y \\@ G:i";
App::$strings["\$Projectname event notification:"] = "Notificación de eventos de \$Projectname:";
App::$strings["Starts:"] = "Comienza:";
App::$strings["Finishes:"] = "Finaliza:";
+App::$strings["%1\$s's bookmarks"] = "Marcadores de %1\$s";
+App::$strings["Help:"] = "Ayuda:";
+App::$strings["Not Found"] = "No encontrado";
+App::$strings["Different viewers will see this text differently"] = "Visitantes diferentes verán este texto de forma distinta";
+App::$strings["Invalid data packet"] = "Paquete de datos no válido";
+App::$strings["Unable to verify channel signature"] = "No ha sido posible de verificar la firma del canal";
+App::$strings["Unable to verify site signature for %s"] = "No ha sido posible de verificar la firma del sitio para %s";
+App::$strings["invalid target signature"] = "La firma recibida no es válida";
+App::$strings["New Page"] = "Nueva página";
+App::$strings["Unable to determine sender."] = "No ha sido posible determinar el remitente. ";
+App::$strings["No recipient provided."] = "No se ha especificado ningún destinatario.";
+App::$strings["[no subject]"] = "[sin asunto]";
+App::$strings["Stored post could not be verified."] = "No se han podido verificar las publicaciones guardadas.";
+App::$strings["%d invitation available"] = array(
+ 0 => "%d invitación pendiente",
+ 1 => "%d invitaciones disponibles",
+);
+App::$strings["Find Channels"] = "Encontrar canales";
+App::$strings["Enter name or interest"] = "Introducir nombre o interés";
+App::$strings["Connect/Follow"] = "Conectar/Seguir";
+App::$strings["Examples: Robert Morgenstein, Fishing"] = "Ejemplos: José Fernández, Pesca";
+App::$strings["Random Profile"] = "Perfil aleatorio";
+App::$strings["Invite Friends"] = "Invitar a amigos";
+App::$strings["Advanced example: name=fred and country=iceland"] = "Ejemplo avanzado: nombre=juan y país=españa";
+App::$strings["Everything"] = "Todo";
+App::$strings["Categories"] = "Temas";
+App::$strings["%d connection in common"] = array(
+ 0 => "%d conexión en común",
+ 1 => "%d conexiones en común",
+);
+App::$strings["show more"] = "mostrar más";
App::$strings["Delete this item?"] = "¿Borrar este elemento?";
App::$strings["%s show less"] = "%s mostrar menos";
App::$strings["%s expand"] = "%s expandir";
@@ -2013,7 +2643,18 @@ App::$strings["about a year"] = "alrededor de un año";
App::$strings["%d years"] = "%d años";
App::$strings[" "] = " ";
App::$strings["timeago.numbers"] = "timeago.numbers";
+App::$strings["January"] = "enero";
+App::$strings["February"] = "febrero";
+App::$strings["March"] = "marzo";
+App::$strings["April"] = "abril";
App::$strings["__ctx:long__ May"] = "mayo";
+App::$strings["June"] = "junio";
+App::$strings["July"] = "julio";
+App::$strings["August"] = "agosto";
+App::$strings["September"] = "septiembre";
+App::$strings["October"] = "octubre";
+App::$strings["November"] = "noviembre";
+App::$strings["December"] = "diciembre";
App::$strings["Jan"] = "ene";
App::$strings["Feb"] = "feb";
App::$strings["Mar"] = "mar";
@@ -2026,6 +2667,13 @@ App::$strings["Sep"] = "sep";
App::$strings["Oct"] = "oct";
App::$strings["Nov"] = "nov";
App::$strings["Dec"] = "dic";
+App::$strings["Sunday"] = "domingo";
+App::$strings["Monday"] = "lunes";
+App::$strings["Tuesday"] = "martes";
+App::$strings["Wednesday"] = "miércoles";
+App::$strings["Thursday"] = "jueves";
+App::$strings["Friday"] = "viernes";
+App::$strings["Saturday"] = "sábado";
App::$strings["Sun"] = "dom";
App::$strings["Mon"] = "lun";
App::$strings["Tue"] = "mar";
@@ -2038,6 +2686,131 @@ App::$strings["__ctx:calendar__ month"] = "mes";
App::$strings["__ctx:calendar__ week"] = "semana";
App::$strings["__ctx:calendar__ day"] = "día";
App::$strings["__ctx:calendar__ All day"] = "Todos los días";
+App::$strings["Tags"] = "Etiquetas";
+App::$strings["Keywords"] = "Palabras clave";
+App::$strings["have"] = "tener";
+App::$strings["has"] = "tiene";
+App::$strings["want"] = "quiero";
+App::$strings["wants"] = "quiere";
+App::$strings["likes"] = "gusta de";
+App::$strings["dislikes"] = "no gusta de";
+App::$strings["prev"] = "anterior";
+App::$strings["first"] = "primera";
+App::$strings["last"] = "última";
+App::$strings["next"] = "próxima";
+App::$strings["older"] = "más antiguas";
+App::$strings["newer"] = "más recientes";
+App::$strings["No connections"] = "Sin conexiones";
+App::$strings["View all %s connections"] = "Ver todas las %s conexiones";
+App::$strings["poke"] = "un toque";
+App::$strings["poked"] = "ha dado un toque a";
+App::$strings["ping"] = "un \"ping\"";
+App::$strings["pinged"] = "ha enviado un \"ping\" a";
+App::$strings["prod"] = "una incitación ";
+App::$strings["prodded"] = "ha incitado a ";
+App::$strings["slap"] = "una bofetada ";
+App::$strings["slapped"] = "ha abofeteado a ";
+App::$strings["finger"] = "un \"finger\" ";
+App::$strings["fingered"] = "envió un \"finger\" a";
+App::$strings["rebuff"] = "un reproche";
+App::$strings["rebuffed"] = "ha hecho un reproche a ";
+App::$strings["happy"] = "feliz ";
+App::$strings["sad"] = "triste ";
+App::$strings["mellow"] = "tranquilo/a";
+App::$strings["tired"] = "cansado/a ";
+App::$strings["perky"] = "vivaz";
+App::$strings["angry"] = "enfadado/a";
+App::$strings["stupefied"] = "asombrado/a";
+App::$strings["puzzled"] = "perplejo/a";
+App::$strings["interested"] = "interesado/a";
+App::$strings["bitter"] = "amargado/a";
+App::$strings["cheerful"] = "alegre";
+App::$strings["alive"] = "animado/a";
+App::$strings["annoyed"] = "molesto/a";
+App::$strings["anxious"] = "ansioso/a";
+App::$strings["cranky"] = "de mal humor";
+App::$strings["disturbed"] = "perturbado/a";
+App::$strings["frustrated"] = "frustrado/a";
+App::$strings["depressed"] = "deprimido/a";
+App::$strings["motivated"] = "motivado/a";
+App::$strings["relaxed"] = "relajado/a";
+App::$strings["surprised"] = "sorprendido/a";
+App::$strings["May"] = "mayo";
+App::$strings["Unknown Attachment"] = "Adjunto no reconocido";
+App::$strings["unknown"] = "desconocido";
+App::$strings["remove category"] = "eliminar el tema";
+App::$strings["remove from file"] = "eliminar del fichero";
+App::$strings["default"] = "por defecto";
+App::$strings["Page layout"] = "Plantilla de la página";
+App::$strings["You can create your own with the layouts tool"] = "Puede crear su propia disposición gráfica con la herramienta de plantillas";
+App::$strings["Page content type"] = "Tipo de contenido de la página";
+App::$strings["activity"] = "la actividad";
+App::$strings["Design Tools"] = "Herramientas de diseño web";
+App::$strings["Pages"] = "Páginas";
+App::$strings["Import website..."] = "Importar un sitio web...";
+App::$strings["Select folder to import"] = "Seleccionar la carpeta que se va a importar";
+App::$strings["Import from a zipped folder:"] = "Importar desde una carpeta comprimida: ";
+App::$strings["Import from cloud files:"] = "Importar desde los ficheros en la nube: ";
+App::$strings["/cloud/channel/path/to/folder"] = "/cloud/canal/ruta/a la/carpeta";
+App::$strings["Enter path to website files"] = "Ruta a los ficheros del sitio web";
+App::$strings["Select folder"] = "Seleccionar la carpeta";
+App::$strings["Export website..."] = "Exportar un sitio web...";
+App::$strings["Export to a zip file"] = "Exportar a un fichero comprimido .zip";
+App::$strings["website.zip"] = "sitio_web.zip";
+App::$strings["Enter a name for the zip file."] = "Escriba un nombre para el fichero zip.";
+App::$strings["Export to cloud files"] = "Exportar a la nube de ficheros";
+App::$strings["/path/to/export/folder"] = "/ruta/para/exportar/carpeta";
+App::$strings["Enter a path to a cloud files destination."] = "Escriba una ruta de destino a la nube de ficheros.";
+App::$strings["Specify folder"] = "Especificar una carpeta";
+App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "No se ha podido crear un canal con un identificador que ya existe en este sistema. La importación ha fallado.";
+App::$strings["Channel clone failed. Import failed."] = "La clonación del canal no ha salido bien. La importación ha fallado.";
+App::$strings["Unable to import element \""] = "No se puede importar un elemento \"";
+App::$strings["guest:"] = "invitado: ";
+App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado";
+App::$strings["(Unknown)"] = "(Desconocido)";
+App::$strings["Visible to anybody on the internet."] = "Visible para cualquiera en internet.";
+App::$strings["Visible to you only."] = "Visible sólo para usted.";
+App::$strings["Visible to anybody in this network."] = "Visible para cualquiera en esta red.";
+App::$strings["Visible to anybody authenticated."] = "Visible para cualquiera que esté autenticado.";
+App::$strings["Visible to anybody on %s."] = "Visible para cualquiera en %s.";
+App::$strings["Visible to all connections."] = "Visible para todas las conexiones.";
+App::$strings["Visible to approved connections."] = "Visible para las conexiones permitidas.";
+App::$strings["Visible to specific connections."] = "Visible para conexiones específicas.";
+App::$strings["Privacy group is empty."] = "El grupo de canales está vacío.";
+App::$strings["Privacy group: %s"] = "Grupo de canales: %s";
+App::$strings["Connection not found."] = "Conexión no encontrada";
+App::$strings["profile photo"] = "foto del perfil";
+App::$strings["[Edited %s]"] = "[se ha editado %s]";
+App::$strings["__ctx:edit_activity__ Post"] = "Publicar";
+App::$strings["__ctx:edit_activity__ Comment"] = "Comentar";
+App::$strings["Logged out."] = "Desconectado/a.";
+App::$strings["Failed authentication"] = "Autenticación fallida.";
+App::$strings[" and "] = " y ";
+App::$strings["public profile"] = "el perfil público";
+App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s ha cambiado %2\$s a &ldquo;%3\$s&rdquo;";
+App::$strings["Visit %1\$s's %2\$s"] = "Visitar %2\$s de %1\$s";
+App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s ha actualizado %2\$s, cambiando %3\$s.";
+App::$strings["Item was not found."] = "Elemento no encontrado.";
+App::$strings["No source file."] = "Ningún fichero de origen";
+App::$strings["Cannot locate file to replace"] = "No se puede localizar el fichero que va a ser sustituido.";
+App::$strings["Cannot locate file to revise/update"] = "No se puede localizar el fichero para revisar/actualizar";
+App::$strings["File exceeds size limit of %d"] = "El fichero supera el limite de tamaño de %d";
+App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Ha alcanzado su límite de %1$.0f Mbytes de almacenamiento de adjuntos.";
+App::$strings["File upload failed. Possible system limit or action terminated."] = "Error de carga, posiblemente por limite del sistema o porque la acción ha finalizado.";
+App::$strings["Stored file could not be verified. Upload failed."] = "El fichero almacenado no ha podido ser verificado. El envío ha fallado.";
+App::$strings["Path not available."] = "Ruta no disponible.";
+App::$strings["Empty pathname"] = "Ruta vacía";
+App::$strings["duplicate filename or path"] = "Nombre duplicado de ruta o fichero";
+App::$strings["Path not found."] = "Ruta no encontrada";
+App::$strings["mkdir failed."] = "mkdir ha fallado.";
+App::$strings["database storage failed."] = "el almacenamiento en la base de datos ha fallado.";
+App::$strings["Empty path"] = "Ruta vacía";
+App::$strings["This event has been added to your calendar."] = "Este evento ha sido añadido a su calendario.";
+App::$strings["Not specified"] = "Sin especificar";
+App::$strings["Needs Action"] = "Necesita de una intervención";
+App::$strings["Completed"] = "Completado/a";
+App::$strings["In Process"] = "En proceso";
+App::$strings["Cancelled"] = "Cancelado/a";
App::$strings["Channel is blocked on this site."] = "El canal está bloqueado en este sitio.";
App::$strings["Channel location missing."] = "Falta la dirección del canal.";
App::$strings["Response from remote channel was incomplete."] = "Respuesta incompleta del canal.";
@@ -2045,14 +2818,105 @@ App::$strings["Channel was deleted and no longer exists."] = "El canal ha sido e
App::$strings["Protocol disabled."] = "Protocolo deshabilitado.";
App::$strings["Channel discovery failed."] = "El intento de acceder al canal ha fallado.";
App::$strings["Cannot connect to yourself."] = "No puede conectarse consigo mismo.";
-App::$strings["Image/photo"] = "Imagen/foto";
-App::$strings["Encrypted content"] = "Contenido cifrado";
-App::$strings["Install %s element: "] = "Instalar el elemento %s:";
-App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio.";
-App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s escribió %2\$s siguiente %3\$s";
-App::$strings["Click to open/close"] = "Pulsar para abrir/cerrar";
-App::$strings["spoiler"] = "spoiler";
-App::$strings["$1 wrote:"] = "$1 escribió:";
+App::$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."] = "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posible</strong> que los permisos existentes sean aplicados a este grupo y sus futuros miembros. Si no quiere esto, por favor cree otro grupo con un nombre diferente.";
+App::$strings["Add new connections to this privacy group"] = "Añadir conexiones nuevas a este grupo de canales";
+App::$strings["edit"] = "editar";
+App::$strings["Edit group"] = "Editar grupo";
+App::$strings["Add privacy group"] = "Añadir un grupo de canales";
+App::$strings["Channels not in any privacy group"] = "Sin canales en ningún grupo";
+App::$strings["add"] = "añadir";
+App::$strings["Select an alternate language"] = "Seleccionar un idioma alternativo";
+App::$strings["Image exceeds website size limit of %lu bytes"] = "La imagen excede el límite de %lu bytes del sitio";
+App::$strings["Image file is empty."] = "El fichero de imagen está vacío. ";
+App::$strings["Photo storage failed."] = "La foto no ha podido ser guardada.";
+App::$strings["a new photo"] = "una nueva foto";
+App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s ha publicado %2\$s en %3\$s";
+App::$strings["Photo Albums"] = "Álbumes de fotos";
+App::$strings["Upload New Photos"] = "Subir nuevas fotos";
+App::$strings["Who can see this?"] = "¿Quién puede ver esto?";
+App::$strings["Custom selection"] = "Selección personalizada";
+App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Seleccione \"Mostrar\" para permitir la visualización. La opción \"No mostrar\" le permite anular y limitar el alcance de \"Mostrar\".";
+App::$strings["Show"] = "Mostrar";
+App::$strings["Don't show"] = "No mostrar";
+App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Los permisos de la entrada %s no se pueden cambiar %s una vez que se ha compartido.</br /> Estos permisos establecen quién está autorizado para ver el mensaje.";
+App::$strings[" by "] = "por";
+App::$strings[" on "] = "en";
+App::$strings["Embedded content"] = "Contenido incorporado";
+App::$strings["Embedding disabled"] = "Incrustación deshabilitada";
+App::$strings["System"] = "Sistema";
+App::$strings["New App"] = "Nueva aplicación (app)";
+App::$strings["Suggestions"] = "Sugerencias";
+App::$strings["See more..."] = "Ver más...";
+App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Tiene %1$.0f de %2$.0f conexiones permitidas.";
+App::$strings["Add New Connection"] = "Añadir nueva conexión";
+App::$strings["Enter channel address"] = "Dirección del canal";
+App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Ejemplos: manuel@ejemplo.com, https://ejemplo.com/carmen";
+App::$strings["Notes"] = "Notas";
+App::$strings["Remove term"] = "Eliminar término";
+App::$strings["Archives"] = "Hemeroteca";
+App::$strings["Refresh"] = "Recargar";
+App::$strings["Account settings"] = "Configuración de la cuenta";
+App::$strings["Channel settings"] = "Configuración del canal";
+App::$strings["Additional features"] = "Funcionalidades";
+App::$strings["Feature/Addon settings"] = "Complementos";
+App::$strings["Display settings"] = "Ajustes de visualización";
+App::$strings["Manage locations"] = "Gestión de ubicaciones (clones) del canal";
+App::$strings["Export channel"] = "Exportar canal";
+App::$strings["Connected apps"] = "Aplicaciones (apps) conectadas";
+App::$strings["Premium Channel Settings"] = "Configuración del canal premium";
+App::$strings["Private Mail Menu"] = "Menú de correo privado";
+App::$strings["Combined View"] = "Vista combinada";
+App::$strings["Conversations"] = "Conversaciones";
+App::$strings["Received Messages"] = "Mensajes recibidos";
+App::$strings["Sent Messages"] = "Enviar mensajes";
+App::$strings["No messages."] = "Sin mensajes.";
+App::$strings["Delete conversation"] = "Eliminar conversación";
+App::$strings["Events Tools"] = "Gestión de eventos";
+App::$strings["Export Calendar"] = "Exportar el calendario";
+App::$strings["Import Calendar"] = "Importar un calendario";
+App::$strings["Chatrooms"] = "Salas de chat";
+App::$strings["Overview"] = "Resumen";
+App::$strings["Chat Members"] = "Miembros del chat";
+App::$strings["Wiki List"] = "Lista de wikis";
+App::$strings["Wiki Pages"] = "Páginas del wiki";
+App::$strings["Add new page"] = "Añadir una nueva página";
+App::$strings["Page name"] = "Nombre de la página";
+App::$strings["Bookmarked Chatrooms"] = "Salas de chat preferidas";
+App::$strings["Suggested Chatrooms"] = "Salas de chat sugeridas";
+App::$strings["photo/image"] = "foto/imagen";
+App::$strings["Click to show more"] = "Hacer clic para ver más";
+App::$strings["Rating Tools"] = "Valoraciones";
+App::$strings["Rate Me"] = "Valorar este canal";
+App::$strings["View Ratings"] = "Mostrar las valoraciones";
+App::$strings["Forums"] = "Foros";
+App::$strings["Tasks"] = "Tareas";
+App::$strings["Member registrations waiting for confirmation"] = "Inscripciones de nuevos miembros pendientes de aprobación";
+App::$strings["Inspect queue"] = "Examinar la cola";
+App::$strings["DB updates"] = "Actualizaciones de la base de datos";
+App::$strings["Plugin Features"] = "Extensiones";
+App::$strings["view full size"] = "Ver en el tamaño original";
+App::$strings["No Subject"] = "Sin asunto";
+App::$strings["OStatus"] = "OStatus";
+App::$strings["GNU-Social"] = "GNU Social";
+App::$strings["RSS/Atom"] = "RSS/Atom";
+App::$strings["Facebook"] = "Facebook";
+App::$strings["Zot"] = "Zot";
+App::$strings["LinkedIn"] = "LinkedIn";
+App::$strings["XMPP/IM"] = "XMPP/IM";
+App::$strings["MySpace"] = "MySpace";
+App::$strings["Can view my normal stream and posts"] = "Pueden verse mi actividad y publicaciones normales";
+App::$strings["Can view my webpages"] = "Pueden verse mis páginas web";
+App::$strings["Can post on my channel page (\"wall\")"] = "Pueden crearse entradas en mi página de inicio del canal (“muro”)";
+App::$strings["Can like/dislike stuff"] = "Puede marcarse contenido como me gusta/no me gusta";
+App::$strings["Profiles and things other than posts/comments"] = "Perfiles y otras cosas aparte de publicaciones/comentarios";
+App::$strings["Can forward to all my channel contacts via post @mentions"] = "Puede enviarse una entrada a todos mis contactos del canal mediante una @mención";
+App::$strings["Advanced - useful for creating group forum channels"] = "Avanzado - útil para crear canales de foros de discusión o grupos";
+App::$strings["Can chat with me (when available)"] = "Se puede charlar conmigo (cuando esté disponible)";
+App::$strings["Can write to my file storage and photos"] = "Puede escribirse en mi repositorio de ficheros y fotos";
+App::$strings["Can edit my webpages"] = "Pueden editarse mis páginas web";
+App::$strings["Somewhat advanced - very useful in open communities"] = "Algo avanzado - muy útil en comunidades abiertas";
+App::$strings["Can administer my channel resources"] = "Pueden administrarse mis recursos del canal";
+App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Muy avanzado. Déjelo a no ser que sepa bien lo que está haciendo.";
App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s ahora está conectado/a con %2\$s";
App::$strings["%1\$s poked %2\$s"] = "%1\$s ha dado un toque a %2\$s";
App::$strings["View %s's profile @ %s"] = "Ver el perfil @ %s de %s";
@@ -2088,6 +2952,7 @@ App::$strings["Set your location"] = "Establecer su ubicación";
App::$strings["Clear browser location"] = "Eliminar los datos de localización geográfica del navegador";
App::$strings["Tag term:"] = "Término de la etiqueta:";
App::$strings["Where are you right now?"] = "¿Donde está ahora?";
+App::$strings["Choose a different album..."] = "Elegir un álbum diferente...";
App::$strings["Comments enabled"] = "Comentarios habilitados";
App::$strings["Comments disabled"] = "Comentarios deshabilitados";
App::$strings["Page link name"] = "Nombre del enlace de la página";
@@ -2111,10 +2976,8 @@ App::$strings["Favourite Posts"] = "Publicaciones favoritas";
App::$strings["Spam"] = "Correo basura";
App::$strings["Posts flagged as SPAM"] = "Publicaciones marcadas como basura";
App::$strings["Status Messages and Posts"] = "Mensajes de estado y publicaciones";
-App::$strings["About"] = "Mi perfil";
App::$strings["Profile Details"] = "Detalles del perfil";
App::$strings["Files and Storage"] = "Ficheros y repositorio";
-App::$strings["Chatrooms"] = "Salas de chat";
App::$strings["Saved Bookmarks"] = "Marcadores guardados";
App::$strings["Manage Webpages"] = "Administrar páginas web";
App::$strings["__ctx:noun__ Attending"] = array(
@@ -2141,187 +3004,15 @@ App::$strings["__ctx:noun__ Abstain"] = array(
0 => "se abstiene",
1 => "Se abstienen",
);
-App::$strings["Birthday"] = "Cumpleaños";
-App::$strings["Age: "] = "Edad:";
-App::$strings["YYYY-MM-DD or MM-DD"] = "AAAA-MM-DD o MM-DD";
-App::$strings["never"] = "nunca";
-App::$strings["less than a second ago"] = "hace un instante";
-App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "hace %1\$d %2\$s";
-App::$strings["__ctx:relative_date__ year"] = array(
- 0 => "año",
- 1 => "años",
-);
-App::$strings["__ctx:relative_date__ month"] = array(
- 0 => "mes",
- 1 => "meses",
-);
-App::$strings["__ctx:relative_date__ week"] = array(
- 0 => "semana",
- 1 => "semanas",
-);
-App::$strings["__ctx:relative_date__ day"] = array(
- 0 => "día",
- 1 => "días",
-);
-App::$strings["__ctx:relative_date__ hour"] = array(
- 0 => "hora",
- 1 => "horas",
-);
-App::$strings["__ctx:relative_date__ minute"] = array(
- 0 => "minuto",
- 1 => "minutos",
-);
-App::$strings["__ctx:relative_date__ second"] = array(
- 0 => "segundo",
- 1 => "segundos",
-);
-App::$strings["%1\$s's birthday"] = "Cumpleaños de %1\$s";
-App::$strings["Happy Birthday %1\$s"] = "Feliz cumpleaños %1\$s";
-App::$strings["Directory Options"] = "Opciones del directorio";
-App::$strings["Safe Mode"] = "Modo seguro";
-App::$strings["Public Forums Only"] = "Solo foros públicos";
-App::$strings["This Website Only"] = "Solo este sitio web";
-App::$strings["This event has been added to your calendar."] = "Este evento ha sido añadido a su calendario.";
-App::$strings["Not specified"] = "Sin especificar";
-App::$strings["Needs Action"] = "Necesita de una intervención";
-App::$strings["Completed"] = "Completado/a";
-App::$strings["In Process"] = "En proceso";
-App::$strings["Cancelled"] = "Cancelado/a";
-App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "No se ha podido crear un canal con un identificador que ya existe en este sistema. La importación ha fallado.";
-App::$strings["Channel clone failed. Import failed."] = "La clonación del canal no ha salido bien. La importación ha fallado.";
-App::$strings["Unable to import element \""] = "No se puede importar un elemento \"";
-App::$strings["Logged out."] = "Desconectado/a.";
-App::$strings["Failed authentication"] = "Autenticación fallida.";
-App::$strings["Login failed."] = "El acceso ha fallado.";
-App::$strings[" and "] = " y ";
-App::$strings["public profile"] = "el perfil público";
-App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s ha cambiado %2\$s a &ldquo;%3\$s&rdquo;";
-App::$strings["Visit %1\$s's %2\$s"] = "Visitar %2\$s de %1\$s";
-App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s ha actualizado %2\$s, cambiando %3\$s.";
-App::$strings["view full size"] = "Ver en el tamaño original";
-App::$strings["No Subject"] = "Sin asunto";
-App::$strings["Friendica"] = "Friendica";
-App::$strings["OStatus"] = "OStatus";
-App::$strings["GNU-Social"] = "GNU Social";
-App::$strings["RSS/Atom"] = "RSS/Atom";
-App::$strings["Diaspora"] = "Diaspora";
-App::$strings["Facebook"] = "Facebook";
-App::$strings["Zot"] = "Zot";
-App::$strings["LinkedIn"] = "LinkedIn";
-App::$strings["XMPP/IM"] = "XMPP/IM";
-App::$strings["MySpace"] = "MySpace";
-App::$strings["Categories"] = "Temas";
-App::$strings["Tags"] = "Etiquetas";
-App::$strings["Keywords"] = "Palabras clave";
-App::$strings["have"] = "tener";
-App::$strings["has"] = "tiene";
-App::$strings["want"] = "quiero";
-App::$strings["wants"] = "quiere";
-App::$strings["likes"] = "gusta de";
-App::$strings["dislikes"] = "no gusta de";
-App::$strings["%d invitation available"] = array(
- 0 => "%d invitación pendiente",
- 1 => "%d invitaciones disponibles",
-);
-App::$strings["Find Channels"] = "Encontrar canales";
-App::$strings["Enter name or interest"] = "Introducir nombre o interés";
-App::$strings["Connect/Follow"] = "Conectar/Seguir";
-App::$strings["Examples: Robert Morgenstein, Fishing"] = "Ejemplos: José Fernández, Pesca";
-App::$strings["Random Profile"] = "Perfil aleatorio";
-App::$strings["Invite Friends"] = "Invitar a amigos";
-App::$strings["Advanced example: name=fred and country=iceland"] = "Ejemplo avanzado: nombre=juan y país=españa";
-App::$strings["Everything"] = "Todo";
-App::$strings["%d connection in common"] = array(
- 0 => "%d conexión en común",
- 1 => "%d conexiones en común",
-);
-App::$strings["show more"] = "mostrar más";
-App::$strings["System"] = "Sistema";
-App::$strings["New App"] = "Nueva aplicación (app)";
-App::$strings["Suggestions"] = "Sugerencias";
-App::$strings["See more..."] = "Ver más...";
-App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Tiene %1$.0f de %2$.0f conexiones permitidas.";
-App::$strings["Add New Connection"] = "Añadir nueva conexión";
-App::$strings["Enter channel address"] = "Dirección del canal";
-App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Ejemplos: manuel@ejemplo.com, https://ejemplo.com/carmen";
-App::$strings["Notes"] = "Notas";
-App::$strings["Remove term"] = "Eliminar término";
-App::$strings["Archives"] = "Hemeroteca";
-App::$strings["Refresh"] = "Recargar";
-App::$strings["Account settings"] = "Configuración de la cuenta";
-App::$strings["Channel settings"] = "Configuración del canal";
-App::$strings["Additional features"] = "Funcionalidades";
-App::$strings["Feature/Addon settings"] = "Complementos";
-App::$strings["Display settings"] = "Ajustes de visualización";
-App::$strings["Manage locations"] = "Gestión de ubicaciones (clones) del canal";
-App::$strings["Export channel"] = "Exportar canal";
-App::$strings["Connected apps"] = "Aplicaciones (apps) conectadas";
-App::$strings["Premium Channel Settings"] = "Configuración del canal premium";
-App::$strings["Private Mail Menu"] = "Menú de correo privado";
-App::$strings["Combined View"] = "Vista combinada";
-App::$strings["Inbox"] = "Bandeja de entrada";
-App::$strings["Outbox"] = "Bandeja de salida";
-App::$strings["New Message"] = "Nuevo mensaje";
-App::$strings["Conversations"] = "Conversaciones";
-App::$strings["Received Messages"] = "Mensajes recibidos";
-App::$strings["Sent Messages"] = "Enviar mensajes";
-App::$strings["No messages."] = "Sin mensajes.";
-App::$strings["Delete conversation"] = "Eliminar conversación";
-App::$strings["Events Tools"] = "Gestión de eventos";
-App::$strings["Export Calendar"] = "Exportar el calendario";
-App::$strings["Import Calendar"] = "Importar un calendario";
-App::$strings["Overview"] = "Resumen";
-App::$strings["Chat Members"] = "Miembros del chat";
-App::$strings["Wiki List"] = "Lista de wikis";
-App::$strings["Wiki Pages"] = "Páginas del wiki";
-App::$strings["Bookmarked Chatrooms"] = "Salas de chat preferidas";
-App::$strings["Suggested Chatrooms"] = "Salas de chat sugeridas";
-App::$strings["photo/image"] = "foto/imagen";
-App::$strings["Click to show more"] = "Hacer clic para ver más";
-App::$strings["Rating Tools"] = "Valoraciones";
-App::$strings["Rate Me"] = "Valorar este canal";
-App::$strings["View Ratings"] = "Mostrar las valoraciones";
-App::$strings["Forums"] = "Foros";
-App::$strings["Tasks"] = "Tareas";
-App::$strings["Documentation"] = "Documentación";
-App::$strings["Member registrations waiting for confirmation"] = "Inscripciones de nuevos miembros pendientes de aprobación";
-App::$strings["Inspect queue"] = "Examinar la cola";
-App::$strings["DB updates"] = "Actualizaciones de la base de datos";
-App::$strings["Admin"] = "Administrador";
-App::$strings["Plugin Features"] = "Extensiones";
-App::$strings["Public Timeline"] = "Cronología pública";
-App::$strings[" by "] = "por";
-App::$strings[" on "] = "en";
-App::$strings["Embedded content"] = "Contenido incorporado";
-App::$strings["Embedding disabled"] = "Incrustación deshabilitada";
-App::$strings["(Unknown)"] = "(Desconocido)";
-App::$strings["Visible to anybody on the internet."] = "Visible para cualquiera en internet.";
-App::$strings["Visible to you only."] = "Visible sólo para usted.";
-App::$strings["Visible to anybody in this network."] = "Visible para cualquiera en esta red.";
-App::$strings["Visible to anybody authenticated."] = "Visible para cualquiera que esté autenticado.";
-App::$strings["Visible to anybody on %s."] = "Visible para cualquiera en %s.";
-App::$strings["Visible to all connections."] = "Visible para todas las conexiones.";
-App::$strings["Visible to approved connections."] = "Visible para las conexiones permitidas.";
-App::$strings["Visible to specific connections."] = "Visible para conexiones específicas.";
-App::$strings["Privacy group is empty."] = "El grupo de canales está vacío.";
-App::$strings["Privacy group: %s"] = "Grupo de canales: %s";
-App::$strings["Connection not found."] = "Conexión no encontrada";
-App::$strings["profile photo"] = "foto del perfil";
-App::$strings["Item was not found."] = "Elemento no encontrado.";
-App::$strings["No source file."] = "Ningún fichero de origen";
-App::$strings["Cannot locate file to replace"] = "No se puede localizar el fichero que va a ser sustituido.";
-App::$strings["Cannot locate file to revise/update"] = "No se puede localizar el fichero para revisar/actualizar";
-App::$strings["File exceeds size limit of %d"] = "El fichero supera el limite de tamaño de %d";
-App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Ha alcanzado su límite de %1$.0f Mbytes de almacenamiento de adjuntos.";
-App::$strings["File upload failed. Possible system limit or action terminated."] = "Error de carga, posiblemente por limite del sistema o porque la acción ha finalizado.";
-App::$strings["Stored file could not be verified. Upload failed."] = "El fichero almacenado no ha podido ser verificado. El envío ha fallado.";
-App::$strings["Path not available."] = "Ruta no disponible.";
-App::$strings["Empty pathname"] = "Ruta vacía";
-App::$strings["duplicate filename or path"] = "Nombre duplicado de ruta o fichero";
-App::$strings["Path not found."] = "Ruta no encontrada";
-App::$strings["mkdir failed."] = "mkdir ha fallado.";
-App::$strings["database storage failed."] = "el almacenamiento en la base de datos ha fallado.";
-App::$strings["Empty path"] = "Ruta vacía";
+App::$strings["Image/photo"] = "Imagen/foto";
+App::$strings["Encrypted content"] = "Contenido cifrado";
+App::$strings["Install %s element: "] = "Instalar el elemento %s:";
+App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio.";
+App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s escribió %2\$s siguiente %3\$s";
+App::$strings["Click to open/close"] = "Pulsar para abrir/cerrar";
+App::$strings["spoiler"] = "spoiler";
+App::$strings["$1 wrote:"] = "$1 escribió:";
+App::$strings["Source channel not found."] = "No se ha encontrado el canal de origen.";
App::$strings["Focus (Hubzilla default)"] = "Focus (predefinido)";
App::$strings["Theme settings"] = "Ajustes del tema";
App::$strings["Narrow navbar"] = "Estrechar la barra de navegación";
diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js
index 62a3b6f06..62fc37420 100644
--- a/view/js/autocomplete.js
+++ b/view/js/autocomplete.js
@@ -164,6 +164,7 @@ function string2bb(element) {
else if(element == 'strike') return 's';
else if(element == 'superscript') return 'sup';
else if(element == 'subscript') return 'sub';
+ else if(element == 'highlight') return 'hl';
else return element;
}
@@ -202,7 +203,7 @@ function string2bb(element) {
$.fn.search_autocomplete = function(backend_url) {
// Autocomplete contacts
contacts = {
- match: /(^@)([^\n]{2,})$/,
+ match: /(^@)([^\n]{3,})$/,
index: 2,
search: function(term, callback) { contact_search(term, callback, backend_url, 'x', [], spinelement='#nav-search-spinner'); },
replace: basic_replace,
@@ -269,7 +270,7 @@ function string2bb(element) {
$.fn.bbco_autocomplete = function(type) {
if(type=='bbcode') {
- var open_close_elements = ['bold', 'italic', 'underline', 'overline', 'strike', 'superscript', 'subscript', 'quote', 'code', 'open', 'spoiler', 'map', 'nobb', 'list', 'checklist', 'ul', 'ol', 'dl', 'li', 'table', 'tr', 'th', 'td', 'center', 'color', 'font', 'size', 'zrl', 'zmg', 'rpost', 'qr', 'observer'];
+ var open_close_elements = ['bold', 'italic', 'underline', 'overline', 'strike', 'superscript', 'subscript', 'quote', 'code', 'open', 'spoiler', 'map', 'nobb', 'list', 'checklist', 'ul', 'ol', 'dl', 'li', 'table', 'tr', 'th', 'td', 'center', 'color', 'font', 'size', 'zrl', 'zmg', 'rpost', 'qr', 'observer', 'embed', 'highlight'];
var open_elements = ['observer.baseurl', 'observer.address', 'observer.photo', 'observer.name', 'observer.webname', 'observer.url', '*', 'hr', ];
var elements = open_close_elements.concat(open_elements);
diff --git a/view/js/main.js b/view/js/main.js
index 5435dfd87..a6164e602 100644
--- a/view/js/main.js
+++ b/view/js/main.js
@@ -249,7 +249,7 @@ var divmore_height = 400;
var last_filestorage_id = null;
var mediaPlaying = false;
var contentHeightDiff = 0;
-
+var liveRecurse = 0;
$(function() {
$.ajaxSetup({cache: false});
@@ -444,16 +444,26 @@ function contextualHelp() {
}
function contextualHelpFocus(target, openSidePanel) {
- if (openSidePanel) {
- $("main").addClass('region_1-on'); // Open the side panel to highlight element
- }
- else {
- $("main").removeClass('region_1-on');
- }
- $('html,body').animate({ scrollTop: $(target).offset().top - $('nav').outerHeight(true) - $('#contextual-help-content').outerHeight(true)}, 'slow');
- for (i = 0; i < 3; i++) {
- $(target).fadeTo('slow', 0.1).fadeTo('slow', 1.0);
- }
+ if($(target).length) {
+ if (openSidePanel) {
+ $("main").addClass('region_1-on'); // Open the side panel to highlight element
+ }
+ else {
+ $("main").removeClass('region_1-on');
+ }
+
+ var css_position = $(target).parent().css('position');
+ if (css_position === 'fixed') {
+ $(target).parent().css('position', 'static');
+ }
+
+ $('html,body').animate({ scrollTop: $(target).offset().top - $('nav').outerHeight(true) - $('#contextual-help-content').outerHeight(true)}, 'slow');
+ for (i = 0; i < 3; i++) {
+ $(target).fadeTo('slow', 0.1).fadeTo('slow', 1.0);
+ }
+
+ $(target).parent().css('position', css_position);
+ }
}
function updatePageItems(mode, data) {
@@ -664,6 +674,8 @@ function updateConvItems(mode,data) {
$('.item_' + bParam_mid.substring(0,32)).addClass('item-highlight');
}
+ $(document.body).trigger("sticky_kit:recalc");
+
}
function collapseHeight() {
@@ -754,6 +766,13 @@ function liveUpdate() {
update_mode = 'append';
}
else {
+// if(bParam_static) {
+// in_progress = false;
+// if(timer) clearTimeout(timer);
+// timer = setTimeout(NavUpdate,10000);
+// return;
+// }
+
update_mode = 'update';
var orgHeight = $("#region_2").height();
}
@@ -762,6 +781,27 @@ function liveUpdate() {
var dstart = new Date();
console.log('LOADING data...');
$.get(update_url, function(data) {
+
+ // on shared hosts occasionally the live update process will be killed
+ // leaving an incomplete HTML structure, which leads to conversations getting
+ // truncated and the page messed up if all the divs aren't closed. We will try
+ // again and give up if we can't get a valid HTML response after 10 tries.
+
+ if((data.indexOf("<html>") != (-1)) && (data.indexOf("</html>") == (-1))) {
+ console.log('Incomplete data. Reloading');
+ in_progress = false;
+ liveRecurse ++;
+ if(liveRecurse < 10) {
+ liveUpdate();
+ }
+ else {
+ console.log('Incomplete data. Too many attempts. Giving up.');
+ }
+ }
+
+ // else data was valid - reset the recursion counter
+ liveRecurse = 0;
+
var dready = new Date();
console.log('DATA ready in: ' + (dready - dstart)/1000 + ' seconds.');
@@ -1285,7 +1325,6 @@ $(document).ready(function() {
numbers : aStr['t17'],
};
- $("#toc").toc();
});
function zFormError(elm,x) {
diff --git a/view/nl/hmessages.po b/view/nl/hmessages.po
index 212722caa..a1f9729d0 100644
--- a/view/nl/hmessages.po
+++ b/view/nl/hmessages.po
@@ -1,16 +1,17 @@
-# Hubzilla Project
-# Copyright (C) 2012-2014 the Hubzilla Project
-# This file is distributed under the same license as the Red package.
+# hubzilla
+# Copyright (C) 2012-2016 hubzilla
+# This file is distributed under the same license as the hubzilla package.
#
# Translators:
-# jeroenpraat <jeroenpraat@xs4all.nl>, 2015-2016
+# jeroenpraat <social@jeroenvanrietpaap.nl>, 2015-2016
+# jeroenpraat <social@jeroenvanrietpaap.nl>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-09-30 00:02-0700\n"
-"PO-Revision-Date: 2016-10-05 20:11+0000\n"
-"Last-Translator: jeroenpraat <jeroenpraat@xs4all.nl>\n"
+"POT-Creation-Date: 2016-12-16 00:04-0800\n"
+"PO-Revision-Date: 2016-12-19 15:18+0000\n"
+"Last-Translator: jeroenpraat <social@jeroenvanrietpaap.nl>\n"
"Language-Team: Dutch (http://www.transifex.com/Friendica/red-matrix/language/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,274 +19,294 @@ msgstr ""
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../../Zotlabs/Access/PermissionRoles.php:182
+#: ../../Zotlabs/Access/PermissionRoles.php:227
#: ../../include/permissions.php:945
msgid "Social Networking"
msgstr "Sociaal netwerk"
-#: ../../Zotlabs/Access/PermissionRoles.php:183
+#: ../../Zotlabs/Access/PermissionRoles.php:228
#: ../../include/permissions.php:945
msgid "Social - Mostly Public"
msgstr "Sociaal - Vrijwel alles openbaar"
-#: ../../Zotlabs/Access/PermissionRoles.php:184
+#: ../../Zotlabs/Access/PermissionRoles.php:229
#: ../../include/permissions.php:945
msgid "Social - Restricted"
msgstr "Sociaal - Beperkt zichtbaar"
-#: ../../Zotlabs/Access/PermissionRoles.php:185
+#: ../../Zotlabs/Access/PermissionRoles.php:230
#: ../../include/permissions.php:945
msgid "Social - Private"
msgstr "Sociaal - Verborgen kanaal"
-#: ../../Zotlabs/Access/PermissionRoles.php:188
+#: ../../Zotlabs/Access/PermissionRoles.php:233
#: ../../include/permissions.php:946
msgid "Community Forum"
msgstr "Groepsforum"
-#: ../../Zotlabs/Access/PermissionRoles.php:189
+#: ../../Zotlabs/Access/PermissionRoles.php:234
#: ../../include/permissions.php:946
msgid "Forum - Mostly Public"
msgstr "Forum - Vrijwel alles openbaar"
-#: ../../Zotlabs/Access/PermissionRoles.php:190
+#: ../../Zotlabs/Access/PermissionRoles.php:235
#: ../../include/permissions.php:946
msgid "Forum - Restricted"
msgstr "Forum - Beperkt zichtbaar"
-#: ../../Zotlabs/Access/PermissionRoles.php:191
+#: ../../Zotlabs/Access/PermissionRoles.php:236
#: ../../include/permissions.php:946
msgid "Forum - Private"
msgstr "Forum - Verborgen kanaal"
-#: ../../Zotlabs/Access/PermissionRoles.php:194
+#: ../../Zotlabs/Access/PermissionRoles.php:239
#: ../../include/permissions.php:947
msgid "Feed Republish"
msgstr "Feed herpubliceren"
-#: ../../Zotlabs/Access/PermissionRoles.php:195
+#: ../../Zotlabs/Access/PermissionRoles.php:240
#: ../../include/permissions.php:947
msgid "Feed - Mostly Public"
msgstr "Feed - Vrijwel alles openbaar"
-#: ../../Zotlabs/Access/PermissionRoles.php:196
+#: ../../Zotlabs/Access/PermissionRoles.php:241
#: ../../include/permissions.php:947
msgid "Feed - Restricted"
msgstr "Feed - Beperkt zichtbaar"
-#: ../../Zotlabs/Access/PermissionRoles.php:199
+#: ../../Zotlabs/Access/PermissionRoles.php:244
#: ../../include/permissions.php:948
msgid "Special Purpose"
msgstr "Speciaal doel"
-#: ../../Zotlabs/Access/PermissionRoles.php:200
+#: ../../Zotlabs/Access/PermissionRoles.php:245
#: ../../include/permissions.php:948
msgid "Special - Celebrity/Soapbox"
msgstr "Speciaal - Beroemdheid/alleen volgen"
-#: ../../Zotlabs/Access/PermissionRoles.php:201
+#: ../../Zotlabs/Access/PermissionRoles.php:246
#: ../../include/permissions.php:948
msgid "Special - Group Repository"
msgstr "Speciaal - Groepsopslag"
-#: ../../Zotlabs/Access/PermissionRoles.php:204
-#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Access/PermissionRoles.php:249
#: ../../Zotlabs/Module/Register.php:213
-#: ../../Zotlabs/Module/Settings/Channel.php:442
-#: ../../include/permissions.php:949 ../../include/selectors.php:49
-#: ../../include/selectors.php:66 ../../include/selectors.php:104
-#: ../../include/selectors.php:140
+#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Settings/Channel.php:445
+#: ../../extend/addon/addon/cdav/cdav.php:277
+#: ../../extend/addon/addon/cdav/cdav.php:284
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1148
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+#: ../../include/selectors.php:104 ../../include/selectors.php:140
+#: ../../include/permissions.php:949
msgid "Other"
msgstr "Anders"
-#: ../../Zotlabs/Access/PermissionRoles.php:205
+#: ../../Zotlabs/Access/PermissionRoles.php:250
#: ../../include/permissions.php:949
msgid "Custom/Expert Mode"
msgstr "Expertmodus/handmatig aanpassen"
-#: ../../Zotlabs/Access/Permissions.php:30
+#: ../../Zotlabs/Access/Permissions.php:46
msgid "Can view my channel stream and posts"
msgstr "Kan mijn kanaal en berichten bekijken"
-#: ../../Zotlabs/Access/Permissions.php:31 ../../include/permissions.php:42
+#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
msgid "Can send me their channel stream and posts"
msgstr "Kan mij de inhoud van hun kanaal en berichten sturen"
-#: ../../Zotlabs/Access/Permissions.php:32 ../../include/permissions.php:36
+#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
msgid "Can view my default channel profile"
msgstr "Kan mijn standaard kanaalprofiel bekijken"
-#: ../../Zotlabs/Access/Permissions.php:33 ../../include/permissions.php:37
+#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
msgid "Can view my connections"
msgstr "Kan een lijst met mijn connecties bekijken"
-#: ../../Zotlabs/Access/Permissions.php:34 ../../include/permissions.php:38
+#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
msgid "Can view my file storage and photos"
msgstr "Kan mijn foto's en andere bestanden bekijken"
-#: ../../Zotlabs/Access/Permissions.php:35
+#: ../../Zotlabs/Access/Permissions.php:51
msgid "Can upload/modify my file storage and photos"
msgstr "Kan foto's en andere bestanden aan mijn bestandsopslag toevoegen"
-#: ../../Zotlabs/Access/Permissions.php:36
+#: ../../Zotlabs/Access/Permissions.php:52
msgid "Can view my channel webpages"
msgstr "Kan de webpagina's van mijn kanaal bekijken"
-#: ../../Zotlabs/Access/Permissions.php:37
+#: ../../Zotlabs/Access/Permissions.php:53
msgid "Can create/edit my channel webpages"
msgstr "Kan wegpagina's van mijn kanaal aanmaken en bewerken"
-#: ../../Zotlabs/Access/Permissions.php:38
+#: ../../Zotlabs/Access/Permissions.php:54
msgid "Can post on my channel (wall) page"
msgstr "Kan een bericht in mijn kanaal plaatsen"
-#: ../../Zotlabs/Access/Permissions.php:39 ../../include/permissions.php:44
+#: ../../Zotlabs/Access/Permissions.php:55 ../../include/permissions.php:44
msgid "Can comment on or like my posts"
msgstr "Kan op mijn berichten reageren of deze (niet) leuk vinden"
-#: ../../Zotlabs/Access/Permissions.php:40 ../../include/permissions.php:45
+#: ../../Zotlabs/Access/Permissions.php:56 ../../include/permissions.php:45
msgid "Can send me private mail messages"
msgstr "Kan mij privéberichten sturen"
-#: ../../Zotlabs/Access/Permissions.php:41
+#: ../../Zotlabs/Access/Permissions.php:57
msgid "Can like/dislike profiles and profile things"
msgstr "Kan profielen en profieldingen leuk en niet leuk vinden "
-#: ../../Zotlabs/Access/Permissions.php:42
+#: ../../Zotlabs/Access/Permissions.php:58
msgid "Can forward to all my channel connections via @+ mentions in posts"
msgstr "Kan naar al mijn kanaalconnecties berichten doorsturen met behulp van @vermeldingen+"
-#: ../../Zotlabs/Access/Permissions.php:43
+#: ../../Zotlabs/Access/Permissions.php:59
msgid "Can chat with me"
msgstr "Kan met mij chatten"
-#: ../../Zotlabs/Access/Permissions.php:44 ../../include/permissions.php:53
+#: ../../Zotlabs/Access/Permissions.php:60 ../../include/permissions.php:53
msgid "Can source my public posts in derived channels"
msgstr "Kan mijn openbare berichten als bron voor andere kanalen gebruiken"
-#: ../../Zotlabs/Access/Permissions.php:45
+#: ../../Zotlabs/Access/Permissions.php:61
msgid "Can administer my channel"
msgstr "Kan mijn kanaal beheren"
-#: ../../Zotlabs/Storage/Browser.php:107 ../../Zotlabs/Storage/Browser.php:238
+#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
msgid "parent"
msgstr "omhoog"
-#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2711
+#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2682
msgid "Collection"
msgstr "map"
-#: ../../Zotlabs/Storage/Browser.php:134
+#: ../../Zotlabs/Storage/Browser.php:133
msgid "Principal"
msgstr "principal"
-#: ../../Zotlabs/Storage/Browser.php:137
+#: ../../Zotlabs/Storage/Browser.php:136
msgid "Addressbook"
msgstr "Adresboek"
-#: ../../Zotlabs/Storage/Browser.php:140
+#: ../../Zotlabs/Storage/Browser.php:139
msgid "Calendar"
msgstr "Agenda"
-#: ../../Zotlabs/Storage/Browser.php:143
+#: ../../Zotlabs/Storage/Browser.php:142
msgid "Schedule Inbox"
msgstr "Planning-postvak IN"
-#: ../../Zotlabs/Storage/Browser.php:146
+#: ../../Zotlabs/Storage/Browser.php:145
msgid "Schedule Outbox"
msgstr "Planning-postvak UIT"
-#: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Module/Photos.php:789
+#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Module/Photos.php:789
#: ../../Zotlabs/Module/Photos.php:1249
-#: ../../Zotlabs/Module/Embedphotos.php:147 ../../Zotlabs/Lib/Apps.php:490
-#: ../../Zotlabs/Lib/Apps.php:565 ../../include/conversation.php:1031
-#: ../../include/widgets.php:1683
+#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:526
+#: ../../Zotlabs/Lib/Apps.php:603
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
+#: ../../include/widgets.php:1684 ../../include/conversation.php:1029
msgid "Unknown"
msgstr "Onbekend"
-#: ../../Zotlabs/Storage/Browser.php:225 ../../Zotlabs/Module/Fbrowser.php:85
-#: ../../Zotlabs/Lib/Apps.php:217 ../../include/nav.php:96
-#: ../../include/conversation.php:1679
+#: ../../Zotlabs/Storage/Browser.php:224 ../../Zotlabs/Module/Fbrowser.php:85
+#: ../../Zotlabs/Lib/Apps.php:219 ../../include/nav.php:96
+#: ../../include/conversation.php:1681
msgid "Files"
msgstr "Bestanden"
-#: ../../Zotlabs/Storage/Browser.php:226
+#: ../../Zotlabs/Storage/Browser.php:225
msgid "Total"
msgstr "Totaal"
-#: ../../Zotlabs/Storage/Browser.php:228
+#: ../../Zotlabs/Storage/Browser.php:227
msgid "Shared"
msgstr "Gedeeld"
-#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:321
+#: ../../Zotlabs/Storage/Browser.php:228 ../../Zotlabs/Storage/Browser.php:321
#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/New_channel.php:147
#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Layouts.php:184
#: ../../Zotlabs/Module/Webpages.php:239
+#: ../../extend/addon/addon/cdav/include/widgets.php:127
+#: ../../extend/addon/addon/cdav/include/widgets.php:164
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1151
msgid "Create"
msgstr "Aanmaken"
-#: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:323
+#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:323
#: ../../Zotlabs/Module/Cover_photo.php:357
#: ../../Zotlabs/Module/Photos.php:816 ../../Zotlabs/Module/Photos.php:1370
-#: ../../Zotlabs/Module/Profile_photo.php:390
-#: ../../Zotlabs/Module/Embedphotos.php:159 ../../include/widgets.php:1696
+#: ../../Zotlabs/Module/Profile_photo.php:410
+#: ../../Zotlabs/Module/Embedphotos.php:157
+#: ../../extend/addon/addon/cdav/include/widgets.php:132
+#: ../../extend/addon/addon/cdav/include/widgets.php:168
+#: ../../include/widgets.php:1697
msgid "Upload"
msgstr "Uploaden"
-#: ../../Zotlabs/Storage/Browser.php:234
-#: ../../Zotlabs/Module/Admin/Channels.php:163
-#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Chat.php:250
+#: ../../Zotlabs/Storage/Browser.php:233
+#: ../../Zotlabs/Module/Admin/Channels.php:159
+#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Wiki.php:151
#: ../../Zotlabs/Module/Settings/Oauth.php:89
#: ../../Zotlabs/Module/Settings/Oauth.php:115
+#: ../../Zotlabs/Module/Chat.php:250
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1136
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:164
msgid "Name"
msgstr "Naam"
-#: ../../Zotlabs/Storage/Browser.php:235
+#: ../../Zotlabs/Storage/Browser.php:234 ../../Zotlabs/Module/Wiki.php:152
msgid "Type"
msgstr "Type"
-#: ../../Zotlabs/Storage/Browser.php:236
-#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1372
+#: ../../Zotlabs/Storage/Browser.php:235
+#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1390
msgid "Size"
msgstr "Grootte"
-#: ../../Zotlabs/Storage/Browser.php:237
+#: ../../Zotlabs/Storage/Browser.php:236
#: ../../Zotlabs/Module/Sharedwithme.php:102
msgid "Last Modified"
msgstr "Laatst gewijzigd"
-#: ../../Zotlabs/Storage/Browser.php:239
-#: ../../Zotlabs/Module/Admin/Profs.php:154
+#: ../../Zotlabs/Storage/Browser.php:238
#: ../../Zotlabs/Module/Connections.php:290
#: ../../Zotlabs/Module/Connections.php:310
-#: ../../Zotlabs/Module/Editblock.php:109
+#: ../../Zotlabs/Module/Admin/Profs.php:154
#: ../../Zotlabs/Module/Editlayout.php:114
#: ../../Zotlabs/Module/Editwebpage.php:145 ../../Zotlabs/Module/Menu.php:112
+#: ../../Zotlabs/Module/Editblock.php:109 ../../Zotlabs/Module/Editpost.php:84
#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:192
-#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Editpost.php:84
-#: ../../Zotlabs/Module/Thing.php:260
+#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Wiki.php:144
+#: ../../Zotlabs/Module/Wiki.php:246
#: ../../Zotlabs/Module/Settings/Oauth.php:149
-#: ../../Zotlabs/Lib/ThreadItem.php:106 ../../Zotlabs/Lib/Apps.php:341
-#: ../../include/channel.php:959 ../../include/channel.php:963
+#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Lib/ThreadItem.php:106
+#: ../../Zotlabs/Lib/Apps.php:346
+#: ../../extend/addon/addon/cdav/include/widgets.php:125
+#: ../../extend/addon/addon/cdav/include/widgets.php:161
+#: ../../include/channel.php:961 ../../include/channel.php:965
#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
#: ../../include/menu.php:113
msgid "Edit"
msgstr "Bewerken"
-#: ../../Zotlabs/Storage/Browser.php:240
-#: ../../Zotlabs/Module/Admin/Accounts.php:174
-#: ../../Zotlabs/Module/Admin/Channels.php:153
-#: ../../Zotlabs/Module/Admin/Profs.php:155
+#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Module/Connedit.php:635
#: ../../Zotlabs/Module/Connections.php:263
-#: ../../Zotlabs/Module/Connedit.php:607
-#: ../../Zotlabs/Module/Editblock.php:134
+#: ../../Zotlabs/Module/Admin/Profs.php:155
+#: ../../Zotlabs/Module/Admin/Accounts.php:173
+#: ../../Zotlabs/Module/Admin/Channels.php:149
#: ../../Zotlabs/Module/Editlayout.php:137
-#: ../../Zotlabs/Module/Editwebpage.php:170 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Editwebpage.php:170
+#: ../../Zotlabs/Module/Editblock.php:134 ../../Zotlabs/Module/Group.php:177
#: ../../Zotlabs/Module/Photos.php:1179 ../../Zotlabs/Module/Blocks.php:162
-#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Module/Thing.php:261
+#: ../../Zotlabs/Module/Webpages.php:242
#: ../../Zotlabs/Module/Settings/Oauth.php:150
-#: ../../Zotlabs/Lib/ThreadItem.php:126 ../../Zotlabs/Lib/Apps.php:342
-#: ../../include/conversation.php:660
+#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Lib/ThreadItem.php:126
+#: ../../Zotlabs/Lib/Apps.php:347
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:864
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1153
+#: ../../include/conversation.php:656
msgid "Delete"
msgstr "Verwijderen"
@@ -313,84 +334,92 @@ msgstr "Bestand uploaden"
#: ../../Zotlabs/Storage/Browser.php:335
msgid "Drop files here to immediately upload"
-msgstr "Sleep bestanden hierheen om ze onmiddelijk te uploaden"
+msgstr "Sleep bestanden hierheen om ze onmiddellijk te uploaden"
-#: ../../Zotlabs/Web/Router.php:65 ../../Zotlabs/Web/WebServer.php:128
+#: ../../Zotlabs/Web/Router.php:67 ../../Zotlabs/Web/WebServer.php:128
#: ../../Zotlabs/Module/Achievements.php:34
-#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Channel.php:104
-#: ../../Zotlabs/Module/Channel.php:229 ../../Zotlabs/Module/Channel.php:270
+#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Connedit.php:397
#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Bookmarks.php:61
-#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
-#: ../../Zotlabs/Module/Mail.php:121 ../../Zotlabs/Module/Connections.php:33
+#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Page.php:35
+#: ../../Zotlabs/Module/Page.php:91 ../../Zotlabs/Module/Manage.php:10
+#: ../../Zotlabs/Module/Connections.php:33
#: ../../Zotlabs/Module/Cover_photo.php:277
#: ../../Zotlabs/Module/Cover_photo.php:290
-#: ../../Zotlabs/Module/Connedit.php:395 ../../Zotlabs/Module/Editblock.php:67
#: ../../Zotlabs/Module/Editlayout.php:67
#: ../../Zotlabs/Module/Editlayout.php:90
#: ../../Zotlabs/Module/Editwebpage.php:68
#: ../../Zotlabs/Module/Editwebpage.php:89
#: ../../Zotlabs/Module/Editwebpage.php:104
-#: ../../Zotlabs/Module/Editwebpage.php:126 ../../Zotlabs/Module/Menu.php:78
-#: ../../Zotlabs/Module/Appman.php:75 ../../Zotlabs/Module/Api.php:12
-#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Filestorage.php:23
+#: ../../Zotlabs/Module/Editwebpage.php:126
+#: ../../Zotlabs/Module/Channel.php:107 ../../Zotlabs/Module/Channel.php:237
+#: ../../Zotlabs/Module/Channel.php:277 ../../Zotlabs/Module/Network.php:15
+#: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Appman.php:76
+#: ../../Zotlabs/Module/Filestorage.php:23
#: ../../Zotlabs/Module/Filestorage.php:78
#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Manage.php:10
-#: ../../Zotlabs/Module/Group.php:13 ../../Zotlabs/Module/Block.php:26
-#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Invite.php:17
-#: ../../Zotlabs/Module/Invite.php:91 ../../Zotlabs/Module/Locs.php:87
-#: ../../Zotlabs/Module/Rate.php:113 ../../Zotlabs/Module/Like.php:181
-#: ../../Zotlabs/Module/Profiles.php:203 ../../Zotlabs/Module/Profiles.php:601
+#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Item.php:220
+#: ../../Zotlabs/Module/Item.php:230 ../../Zotlabs/Module/Item.php:1064
+#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Mail.php:163
+#: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76
+#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94
+#: ../../Zotlabs/Module/Editblock.php:67 ../../Zotlabs/Module/Group.php:13
#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Message.php:18
-#: ../../Zotlabs/Module/Setup.php:220 ../../Zotlabs/Module/Mood.php:116
-#: ../../Zotlabs/Module/Photos.php:73 ../../Zotlabs/Module/New_channel.php:77
+#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Photos.php:73
+#: ../../Zotlabs/Module/Setup.php:212 ../../Zotlabs/Module/Editpost.php:17
+#: ../../Zotlabs/Module/New_channel.php:77
#: ../../Zotlabs/Module/New_channel.php:104
-#: ../../Zotlabs/Module/Notifications.php:70 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Profiles.php:197 ../../Zotlabs/Module/Profiles.php:595
#: ../../Zotlabs/Module/Profile.php:68 ../../Zotlabs/Module/Profile.php:76
#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
-#: ../../Zotlabs/Module/Layouts.php:89
-#: ../../Zotlabs/Module/Profile_photo.php:265
-#: ../../Zotlabs/Module/Profile_photo.php:278
-#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Settings.php:59
-#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Regmod.php:21
-#: ../../Zotlabs/Module/Webpages.php:116 ../../Zotlabs/Module/Editpost.php:17
-#: ../../Zotlabs/Module/Events.php:264
+#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Rate.php:113
+#: ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Profile_photo.php:273
+#: ../../Zotlabs/Module/Profile_photo.php:286
+#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Api.php:24
+#: ../../Zotlabs/Module/Regmod.php:21 ../../Zotlabs/Module/Pdledit.php:29
#: ../../Zotlabs/Module/Service_limits.php:11
-#: ../../Zotlabs/Module/Thing.php:274 ../../Zotlabs/Module/Thing.php:294
-#: ../../Zotlabs/Module/Thing.php:335 ../../Zotlabs/Module/Item.php:214
-#: ../../Zotlabs/Module/Item.php:222 ../../Zotlabs/Module/Item.php:1068
-#: ../../Zotlabs/Module/Sharedwithme.php:11
-#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Suggest.php:30
+#: ../../Zotlabs/Module/Webpages.php:116
+#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Wiki.php:189
+#: ../../Zotlabs/Module/Wiki.php:286 ../../Zotlabs/Module/Sources.php:74
+#: ../../Zotlabs/Module/Suggest.php:30 ../../Zotlabs/Module/Thing.php:274
+#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
#: ../../Zotlabs/Module/Viewconnections.php:28
#: ../../Zotlabs/Module/Viewconnections.php:33
#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Chat.php:100
-#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Lib/Chatroom.php:137
-#: ../../include/photos.php:27 ../../include/items.php:3506
-#: ../../include/attach.php:142 ../../include/attach.php:190
-#: ../../include/attach.php:253 ../../include/attach.php:267
-#: ../../include/attach.php:274 ../../include/attach.php:339
-#: ../../include/attach.php:353 ../../include/attach.php:360
-#: ../../include/attach.php:440 ../../include/attach.php:909
-#: ../../include/attach.php:980 ../../include/attach.php:1132
+#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Module/Events.php:267
+#: ../../Zotlabs/Lib/Chatroom.php:137
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:55
+#: ../../extend/addon/addon/keepout/keepout.php:36
+#: ../../extend/addon/addon/pumpio/pumpio.php:40
+#: ../../extend/addon/addon/openid/Mod_Id.php:53
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:58
+#: ../../include/items.php:3422 ../../include/attach.php:142
+#: ../../include/attach.php:189 ../../include/attach.php:253
+#: ../../include/attach.php:267 ../../include/attach.php:274
+#: ../../include/attach.php:341 ../../include/attach.php:355
+#: ../../include/attach.php:362 ../../include/attach.php:439
+#: ../../include/attach.php:906 ../../include/attach.php:977
+#: ../../include/attach.php:1135 ../../include/photos.php:27
msgid "Permission denied."
msgstr "Toegang geweigerd."
-#: ../../Zotlabs/Web/Router.php:146 ../../include/help.php:56
-msgid "Not Found"
-msgstr "Niet gevonden"
-
-#: ../../Zotlabs/Web/Router.php:149 ../../Zotlabs/Module/Page.php:94
-#: ../../Zotlabs/Module/Block.php:79 ../../Zotlabs/Module/Display.php:120
-#: ../../include/help.php:59
+#: ../../Zotlabs/Web/Router.php:157 ../../Zotlabs/Module/Page.php:94
+#: ../../Zotlabs/Module/Display.php:120 ../../Zotlabs/Module/Block.php:79
+#: ../../include/help.php:66
msgid "Page not found."
msgstr "Pagina niet gevonden."
-#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Group.php:72
-#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:66
-#: ../../Zotlabs/Module/Import_items.php:114 ../../Zotlabs/Module/Like.php:283
-#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
-#: ../../include/items.php:403
+#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Dreport.php:10
+#: ../../Zotlabs/Module/Dreport.php:68
+#: ../../Zotlabs/Module/Import_items.php:114 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Like.php:283
+#: ../../Zotlabs/Module/Subthread.php:62
+#: ../../extend/addon/addon/frphotos/frphotos.php:81
+#: ../../extend/addon/addon/redfiles/redfiles.php:109
+#: ../../extend/addon/addon/redphotos/redphotos.php:119
+#: ../../include/items.php:327
msgid "Permission denied"
msgstr "Toegang geweigerd"
@@ -400,19 +429,21 @@ msgid ""
" logout and retry."
msgstr "Authenticatie op afstand geblokkeerd. Je bent lokaal op deze hub ingelogd. Uitloggen en opnieuw proberen."
-#: ../../Zotlabs/Zot/Auth.php:246
+#: ../../Zotlabs/Zot/Auth.php:250
+#: ../../extend/addon/addon/openid/Mod_Openid.php:76
+#: ../../extend/addon/addon/openid/Mod_Openid.php:183
#, php-format
msgid "Welcome %s. Remote authentication successful."
msgstr "Welkom %s. Authenticatie op afstand geslaagd."
#: ../../Zotlabs/Module/Achievements.php:15
-#: ../../Zotlabs/Module/Editblock.php:31
-#: ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editlayout.php:31
#: ../../Zotlabs/Module/Editwebpage.php:32
-#: ../../Zotlabs/Module/Filestorage.php:59 ../../Zotlabs/Module/Connect.php:17
-#: ../../Zotlabs/Module/Hcard.php:12 ../../Zotlabs/Module/Profile.php:20
-#: ../../Zotlabs/Module/Blocks.php:33 ../../Zotlabs/Module/Layouts.php:31
-#: ../../Zotlabs/Module/Webpages.php:33 ../../include/channel.php:859
+#: ../../Zotlabs/Module/Filestorage.php:59
+#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Hcard.php:12
+#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Blocks.php:33
+#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Webpages.php:33
+#: ../../include/channel.php:862
msgid "Requested profile is not available."
msgstr "Opgevraagd profiel is niet beschikbaar"
@@ -428,258 +459,9 @@ msgstr "Afwezig"
msgid "Online"
msgstr "Online"
-#: ../../Zotlabs/Module/Network.php:95
-msgid "No such group"
-msgstr "Collectie niet gevonden"
-
-#: ../../Zotlabs/Module/Network.php:135
-msgid "No such channel"
-msgstr "Niet zo'n kanaal"
-
-#: ../../Zotlabs/Module/Network.php:140
-msgid "forum"
-msgstr "forum"
-
-#: ../../Zotlabs/Module/Network.php:152
-msgid "Search Results For:"
-msgstr "Zoekresultaten voor:"
-
-#: ../../Zotlabs/Module/Network.php:218
-msgid "Privacy group is empty"
-msgstr "Privacygroep is leeg"
-
-#: ../../Zotlabs/Module/Network.php:227
-msgid "Privacy group: "
-msgstr "Privacygroep: "
-
-#: ../../Zotlabs/Module/Network.php:253
-msgid "Invalid connection."
-msgstr "Ongeldige connectie."
-
-#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
-#, php-format
-msgid "Fetching URL returns error: %1$s"
-msgstr "Ophalen URL gaf een foutmelding terug: %1$s"
-
-#: ../../Zotlabs/Module/Acl.php:313
-msgid "network"
-msgstr "netwerk"
-
-#: ../../Zotlabs/Module/Acl.php:323
-msgid "RSS"
-msgstr "RSS"
-
-#: ../../Zotlabs/Module/Channel.php:28 ../../Zotlabs/Module/Wiki.php:20
-#: ../../Zotlabs/Module/Chat.php:25
-msgid "You must be logged in to see this page."
-msgstr "Je moet zijn ingelogd om deze pagina te kunnen bekijken."
-
-#: ../../Zotlabs/Module/Channel.php:40
-msgid "Posts and comments"
-msgstr "Berichten en reacties"
-
-#: ../../Zotlabs/Module/Channel.php:41
-msgid "Only posts"
-msgstr "Alleen berichten"
-
-#: ../../Zotlabs/Module/Channel.php:101
-msgid "Insufficient permissions. Request redirected to profile page."
-msgstr "Onvoldoende permissies. Doorgestuurd naar profielpagina."
-
-#: ../../Zotlabs/Module/Import.php:33
-#, php-format
-msgid "Your service plan only allows %d channels."
-msgstr "Jouw abonnement staat maar %d kanalen toe."
-
-#: ../../Zotlabs/Module/Import.php:71 ../../Zotlabs/Module/Import_items.php:42
-msgid "Nothing to import."
-msgstr "Niets gevonden om te importeren"
-
-#: ../../Zotlabs/Module/Import.php:95 ../../Zotlabs/Module/Import_items.php:66
-msgid "Unable to download data from old server"
-msgstr "Niet in staat om gegevens van de oude hub te downloaden"
-
-#: ../../Zotlabs/Module/Import.php:101
-#: ../../Zotlabs/Module/Import_items.php:72
-msgid "Imported file is empty."
-msgstr "Geïmporteerde bestand is leeg"
-
-#: ../../Zotlabs/Module/Import.php:123
-#: ../../Zotlabs/Module/Import_items.php:88
-#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
-msgstr "Waarschuwing: database-versies lopen %1$d updates achter."
-
-#: ../../Zotlabs/Module/Import.php:153 ../../include/import.php:107
-msgid "Cloned channel not found. Import failed."
-msgstr "Gekloond kanaal niet gevonden. Importeren mislukt."
-
-#: ../../Zotlabs/Module/Import.php:163
-msgid "No channel. Import failed."
-msgstr "Geen kanaal. Importeren mislukt."
-
-#: ../../Zotlabs/Module/Import.php:520
-#: ../../include/Import/import_diaspora.php:142
-msgid "Import completed."
-msgstr "Import voltooid."
-
-#: ../../Zotlabs/Module/Import.php:542
-msgid "You must be logged in to use this feature."
-msgstr "Je moet ingelogd zijn om dit onderdeel te kunnen gebruiken."
-
-#: ../../Zotlabs/Module/Import.php:547
-msgid "Import Channel"
-msgstr "Kanaal importeren"
-
-#: ../../Zotlabs/Module/Import.php:548
-msgid ""
-"Use this form to import an existing channel from a different server/hub. You"
-" may retrieve the channel identity from the old server/hub via the network "
-"or provide an export file."
-msgstr "Gebruik dit formulier om een bestaand kanaal te importeren van een andere hub. Je kan de kanaal-identiteit van de oude hub via het netwerk ontvangen of een exportbestand verstrekken."
-
-#: ../../Zotlabs/Module/Import.php:549
-#: ../../Zotlabs/Module/Import_items.php:121
-msgid "File to Upload"
-msgstr "Bestand om te uploaden"
-
-#: ../../Zotlabs/Module/Import.php:550
-msgid "Or provide the old server/hub details"
-msgstr "Of vul de gegevens van de oude hub in"
-
-#: ../../Zotlabs/Module/Import.php:551
-msgid "Your old identity address (xyz@example.com)"
-msgstr "Jouw oude kanaaladres (xyz@example.com)"
-
-#: ../../Zotlabs/Module/Import.php:552
-msgid "Your old login email address"
-msgstr "Het e-mailadres van je oude account"
-
-#: ../../Zotlabs/Module/Import.php:553
-msgid "Your old login password"
-msgstr "Wachtwoord van jouw oude account"
-
-#: ../../Zotlabs/Module/Import.php:554
-msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be"
-" able to post from either location, but only one can be marked as the "
-"primary location for files, photos, and media."
-msgstr "Voor elke optie geldt dat je moet kiezen of je jouw primaire kanaaladres op deze hub wil instellen of dat jouw oude hub deze rol blijft vervullen."
-
-#: ../../Zotlabs/Module/Import.php:555
-msgid "Make this hub my primary location"
-msgstr "Stel deze hub als mijn primaire locatie in"
-
-#: ../../Zotlabs/Module/Import.php:556
-msgid ""
-"Import existing posts if possible (experimental - limited by available "
-"memory"
-msgstr "Importeer bestaande berichten wanneer mogelijk (experimenteel - afhankelijk van beschikbaar servergeheugen)"
-
-#: ../../Zotlabs/Module/Import.php:557
-msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
-msgstr "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid."
-
-#: ../../Zotlabs/Module/Import.php:560
-#: ../../Zotlabs/Module/Admin/Accounts.php:167
-#: ../../Zotlabs/Module/Admin/Channels.php:151
-#: ../../Zotlabs/Module/Admin/Features.php:66
-#: ../../Zotlabs/Module/Admin/Logs.php:84
-#: ../../Zotlabs/Module/Admin/Plugins.php:429
-#: ../../Zotlabs/Module/Admin/Profs.php:157
-#: ../../Zotlabs/Module/Admin/Security.php:104
-#: ../../Zotlabs/Module/Admin/Site.php:267
-#: ../../Zotlabs/Module/Admin/Themes.php:156 ../../Zotlabs/Module/Mail.php:370
-#: ../../Zotlabs/Module/Connedit.php:779 ../../Zotlabs/Module/Appman.php:126
-#: ../../Zotlabs/Module/Pdledit.php:74
-#: ../../Zotlabs/Module/Filestorage.php:165
-#: ../../Zotlabs/Module/Connect.php:98 ../../Zotlabs/Module/Group.php:85
-#: ../../Zotlabs/Module/Import_items.php:122
-#: ../../Zotlabs/Module/Invite.php:146 ../../Zotlabs/Module/Locs.php:121
-#: ../../Zotlabs/Module/Rate.php:166 ../../Zotlabs/Module/Profiles.php:687
-#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Setup.php:317
-#: ../../Zotlabs/Module/Setup.php:365 ../../Zotlabs/Module/Mood.php:139
-#: ../../Zotlabs/Module/Photos.php:668 ../../Zotlabs/Module/Photos.php:1058
-#: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1216
-#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Pconfig.php:107
-#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:484
-#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
-#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
-#: ../../Zotlabs/Module/Chat.php:196 ../../Zotlabs/Module/Chat.php:241
-#: ../../Zotlabs/Module/Xchan.php:15
-#: ../../Zotlabs/Module/Settings/Account.php:126
-#: ../../Zotlabs/Module/Settings/Channel.php:452
-#: ../../Zotlabs/Module/Settings/Display.php:194
-#: ../../Zotlabs/Module/Settings/Features.php:47
-#: ../../Zotlabs/Module/Settings/Oauth.php:87
-#: ../../Zotlabs/Module/Settings/Tokens.php:167
-#: ../../Zotlabs/Lib/ThreadItem.php:725 ../../include/js_strings.php:22
-#: ../../include/widgets.php:796 ../../view/theme/redbasic/php/config.php:106
-msgid "Submit"
-msgstr "Opslaan"
-
-#: ../../Zotlabs/Module/Wiki.php:100
-msgid ""
-"\"# Wiki Sandbox\\n\\nContent you **edit** and **preview** here *will not be"
-" saved*.\""
-msgstr "\"# Wiki Sandbox\\n\\nWat er hier onder **edit** en **preview** staat *wordt niet opgeslagen*.\""
-
-#: ../../Zotlabs/Module/Wiki.php:169
-msgid "Revision Comparison"
-msgstr "Revisies vergelijken"
-
-#: ../../Zotlabs/Module/Wiki.php:170
-msgid "Revert"
-msgstr "Ongedaan maken"
-
-#: ../../Zotlabs/Module/Admin/Accounts.php:36
-#, php-format
-msgid "%s account blocked/unblocked"
-msgid_plural "%s account blocked/unblocked"
-msgstr[0] "%s account geblokkeerd/gedeblokkeerd"
-msgstr[1] "%s accounts geblokkeerd/gedeblokkeerd"
-
-#: ../../Zotlabs/Module/Admin/Accounts.php:43
-#, php-format
-msgid "%s account deleted"
-msgid_plural "%s accounts deleted"
-msgstr[0] "%s account verwijderd"
-msgstr[1] "%s accounts verwijderd"
-
-#: ../../Zotlabs/Module/Admin/Accounts.php:79
-msgid "Account not found"
-msgstr "Account niet gevonden"
-
-#: ../../Zotlabs/Module/Admin/Accounts.php:90
-#, php-format
-msgid "Account '%s' deleted"
-msgstr "Account '%s' verwijderd"
-
-#: ../../Zotlabs/Module/Admin/Accounts.php:98
-#, php-format
-msgid "Account '%s' blocked"
-msgstr "Account '%s' geblokkeerd"
-
-#: ../../Zotlabs/Module/Admin/Accounts.php:106
-#, php-format
-msgid "Account '%s' unblocked"
-msgstr "Account '%s' gedeblokkeerd"
-
-#: ../../Zotlabs/Module/Admin/Accounts.php:165
-#: ../../Zotlabs/Module/Admin/Channels.php:149
-#: ../../Zotlabs/Module/Admin/Logs.php:82
-#: ../../Zotlabs/Module/Admin/Plugins.php:336
-#: ../../Zotlabs/Module/Admin/Plugins.php:427
-#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin/Site.php:265
-#: ../../Zotlabs/Module/Admin/Themes.php:120
-#: ../../Zotlabs/Module/Admin/Themes.php:154
-#: ../../Zotlabs/Module/Admin.php:141
-msgid "Administration"
-msgstr "Beheer"
+#: ../../Zotlabs/Module/Register.php:49
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Maximum toegestane dagelijkse registraties op deze $Projectname-hub bereikt. Probeer het morgen (UTC) nogmaals."
#: ../../Zotlabs/Module/Admin/Accounts.php:166
#: ../../Zotlabs/Module/Admin/Accounts.php:179 ../../include/widgets.php:1561
@@ -757,147 +539,1182 @@ msgid ""
" on this site will be permanently deleted!\\n\\nAre you sure?"
msgstr "Geselecteerde accounts (met bijbehorende kanalen) worden verwijderd!\\n\\nAlles wat deze accounts op deze hub hebben gepubliceerd wordt definitief verwijderd!\\n\\Weet je het zeker?"
-#: ../../Zotlabs/Module/Admin/Accounts.php:190
-msgid ""
-"The account {0} will be deleted!\\n\\nEverything this account has posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Account {0} (met bijbehorende kanalen) wordt verwijderd !\\n\\nAlles wat dit account op deze hub heeft gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
+#: ../../Zotlabs/Module/Register.php:221 ../../Zotlabs/Module/Siteinfo.php:27
+msgid "Terms of Service"
+msgstr "Gebruiksvoorwaarden"
-#: ../../Zotlabs/Module/Admin/Channels.php:30
+#: ../../Zotlabs/Module/Register.php:227
#, php-format
msgid "%s channel censored/uncensored"
msgid_plural "%s channels censored/uncensored"
msgstr[0] "%s kanaal gecensureerd/ongecensureerd"
msgstr[1] "%s kanalen gecensureerd/ongecensureerd"
-#: ../../Zotlabs/Module/Admin/Channels.php:39
+#: ../../Zotlabs/Module/Register.php:229
#, php-format
-msgid "%s channel code allowed/disallowed"
-msgid_plural "%s channels code allowed/disallowed"
-msgstr[0] "Scripts toegestaan/niet toegestaan voor %s kanaal"
-msgstr[1] "Scripts toegestaan/niet toegestaan voor %s kanalen"
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "Ik ben 13 jaar of ouder en accepteer de %s van deze $Projectname-hub"
+
+#: ../../Zotlabs/Module/Register.php:233
+msgid "Your email address"
+msgstr "Jouw e-mailadres"
+
+#: ../../Zotlabs/Module/Register.php:234
+msgid "Choose a password"
+msgstr "Geef een wachtwoord op"
-#: ../../Zotlabs/Module/Admin/Channels.php:45
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Please re-enter your password"
+msgstr "Geef het wachtwoord opnieuw op"
+
+#: ../../Zotlabs/Module/Register.php:236
+msgid "Please enter your invitation code"
+msgstr "Vul jouw uitnodigingscode in"
+
+#: ../../Zotlabs/Module/Register.php:237
+#: ../../Zotlabs/Module/New_channel.php:134
+msgid "Name or caption"
+msgstr "Naam"
+
+#: ../../Zotlabs/Module/Register.php:237
+#: ../../Zotlabs/Module/New_channel.php:134
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
+msgstr "Voorbeelden: \"Jan Pietersen\", \"Willems weblog\", \"Computerforum\""
+
+#: ../../Zotlabs/Module/Register.php:239
+#: ../../Zotlabs/Module/New_channel.php:136
+msgid "Choose a short nickname"
+msgstr "Korte bijnaam"
+
+#: ../../Zotlabs/Module/Register.php:239
+#: ../../Zotlabs/Module/New_channel.php:136
#, php-format
-msgid "%s channel deleted"
-msgid_plural "%s channels deleted"
-msgstr[0] "%s kanaal verwijderd"
-msgstr[1] "%s kanalen verwijderd"
+msgid "Channel '%s' code disallowed"
+msgstr "Scripts niet toegestaan voor kanaal '%s'"
-#: ../../Zotlabs/Module/Admin/Channels.php:66
-msgid "Channel not found"
-msgstr "Kanaal niet gevonden"
+#: ../../Zotlabs/Module/Register.php:240
+#: ../../Zotlabs/Module/New_channel.php:137
+msgid "Channel role and privacy"
+msgstr "Kanaaltype en privacy"
+
+#: ../../Zotlabs/Module/Register.php:240
+#: ../../Zotlabs/Module/New_channel.php:137
+msgid "Select a channel role with your privacy requirements."
+msgstr "Kies een kanaaltype met het door jou gewenste privacyniveau."
+
+#: ../../Zotlabs/Module/Register.php:240
+#: ../../Zotlabs/Module/New_channel.php:137
+msgid "Read more about roles"
+msgstr "Lees meer over kanaaltypes"
+
+#: ../../Zotlabs/Module/Register.php:241
+msgid "no"
+msgstr "Nee"
+
+#: ../../Zotlabs/Module/Register.php:241
+msgid "yes"
+msgstr "Ja"
+
+#: ../../Zotlabs/Module/Register.php:253
+#: ../../Zotlabs/Module/Admin/Site.php:261
+msgid "Registration"
+msgstr "Registratie"
+
+#: ../../Zotlabs/Module/Register.php:258
+msgid "Membership on this site is by invitation only."
+msgstr "Registreren op deze $Projectname-hub kan alleen op uitnodiging."
+
+#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:150
+#: ../../boot.php:1702
+msgid "Register"
+msgstr "Registreren"
+
+#: ../../Zotlabs/Module/Register.php:271
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Geselecteerde kanalen worden verwijderd!\\n\\nAlles wat in deze kanalen op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
-#: ../../Zotlabs/Module/Admin/Channels.php:76
+#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
#, php-format
-msgid "Channel '%s' deleted"
-msgstr "Kanaal '%s' verwijderd"
+msgid "Fetching URL returns error: %1$s"
+msgstr "Ophalen URL gaf een foutmelding terug: %1$s"
+
+#: ../../Zotlabs/Module/Match.php:26
+msgid "Profile Match"
+msgstr "Profielovereenkomst"
-#: ../../Zotlabs/Module/Admin/Channels.php:88
+#: ../../Zotlabs/Module/Match.php:35
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Je hebt geen trefwoorden waarmee overeenkomsten gevonden kunnen worden. Voeg enkele trefwoorden aan je standaardprofiel toe."
+
+#: ../../Zotlabs/Module/Match.php:67
+msgid "is interested in:"
+msgstr "is geïnteresseerd in:"
+
+#: ../../Zotlabs/Module/Match.php:68 ../../Zotlabs/Module/Directory.php:328
+#: ../../Zotlabs/Module/Suggest.php:56 ../../include/channel.php:1036
+#: ../../include/connections.php:78 ../../include/widgets.php:147
+#: ../../include/widgets.php:184 ../../include/conversation.php:937
+msgid "Connect"
+msgstr "Verbinden"
+
+#: ../../Zotlabs/Module/Match.php:74
+msgid "No matches"
+msgstr "Geen overeenkomsten"
+
+#: ../../Zotlabs/Module/Connedit.php:82
+msgid "Could not access contact record."
+msgstr "Kon geen toegang krijgen tot de connectie-gegevens."
+
+#: ../../Zotlabs/Module/Connedit.php:106
+msgid "Could not locate selected profile."
+msgstr "Kon het gekozen profiel niet vinden."
+
+#: ../../Zotlabs/Module/Connedit.php:258
+msgid "Connection updated."
+msgstr "Connectie bijgewerkt."
+
+#: ../../Zotlabs/Module/Connedit.php:260
+msgid "Failed to update connection record."
+msgstr "Bijwerken van connectie-gegevens mislukt."
+
+#: ../../Zotlabs/Module/Connedit.php:310
+msgid "is now connected to"
+msgstr "is nu verbonden met"
+
+#: ../../Zotlabs/Module/Connedit.php:411 ../../Zotlabs/Module/Connedit.php:716
+#: ../../Zotlabs/Module/Admin/Site.php:218 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
+#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653
+#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:97
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:159
+#: ../../Zotlabs/Module/Settings/Channel.php:289
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+#: ../../extend/addon/addon/libertree/libertree.php:69
+#: ../../extend/addon/addon/libertree/libertree.php:81
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+#: ../../extend/addon/addon/nofed/nofed.php:72
+#: ../../extend/addon/addon/nofed/nofed.php:76
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+#: ../../extend/addon/addon/planets/planets.php:153
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+#: ../../extend/addon/addon/redred/redred.php:95
+#: ../../extend/addon/addon/redred/redred.php:99
+#: ../../extend/addon/addon/rtof/rtof.php:81
+#: ../../extend/addon/addon/rtof/rtof.php:85
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../extend/addon/addon/twitter/twitter.php:246
+#: ../../extend/addon/addon/twitter/twitter.php:255
+#: ../../extend/addon/addon/visage/visage.php:166
+#: ../../extend/addon/addon/wppost/wppost.php:82
+#: ../../extend/addon/addon/wppost/wppost.php:105
+#: ../../extend/addon/addon/wppost/wppost.php:109
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+#: ../../extend/addon/addon/cdav/cdav.php:234 ../../include/dir_fns.php:143
+#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
+#: ../../view/theme/redbasic/php/config.php:111
+#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1724
+msgid "No"
+msgstr "Nee"
+
+#: ../../Zotlabs/Module/Connedit.php:411
+#: ../../Zotlabs/Module/Admin/Site.php:220 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
+#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653
+#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:96
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:159
+#: ../../Zotlabs/Module/Settings/Channel.php:289
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+#: ../../extend/addon/addon/libertree/libertree.php:69
+#: ../../extend/addon/addon/libertree/libertree.php:81
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+#: ../../extend/addon/addon/nofed/nofed.php:72
+#: ../../extend/addon/addon/nofed/nofed.php:76
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+#: ../../extend/addon/addon/planets/planets.php:153
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+#: ../../extend/addon/addon/redred/redred.php:95
+#: ../../extend/addon/addon/redred/redred.php:99
+#: ../../extend/addon/addon/rtof/rtof.php:81
+#: ../../extend/addon/addon/rtof/rtof.php:85
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../extend/addon/addon/twitter/twitter.php:246
+#: ../../extend/addon/addon/twitter/twitter.php:255
+#: ../../extend/addon/addon/visage/visage.php:166
+#: ../../extend/addon/addon/wppost/wppost.php:82
+#: ../../extend/addon/addon/wppost/wppost.php:105
+#: ../../extend/addon/addon/wppost/wppost.php:109
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+#: ../../extend/addon/addon/cdav/cdav.php:234 ../../include/dir_fns.php:143
+#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
+#: ../../view/theme/redbasic/php/config.php:111
+#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1724
+msgid "Yes"
+msgstr "Ja"
+
+#: ../../Zotlabs/Module/Connedit.php:443
+msgid "Could not access address book record."
+msgstr "Kon geen toegang krijgen tot de record van de connectie."
+
+#: ../../Zotlabs/Module/Connedit.php:463
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Vernieuwen mislukt - kanaal is momenteel niet beschikbaar"
+
+#: ../../Zotlabs/Module/Connedit.php:478 ../../Zotlabs/Module/Connedit.php:487
+#: ../../Zotlabs/Module/Connedit.php:496 ../../Zotlabs/Module/Connedit.php:505
+#: ../../Zotlabs/Module/Connedit.php:518
+msgid "Unable to set address book parameters."
+msgstr "Niet in staat om de parameters van connecties in te stellen."
+
+#: ../../Zotlabs/Module/Connedit.php:542
+msgid "Connection has been removed."
+msgstr "Connectie is verwijderd"
+
+#: ../../Zotlabs/Module/Connedit.php:582 ../../Zotlabs/Lib/Apps.php:223
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
+#: ../../include/nav.php:89 ../../include/conversation.php:935
+msgid "View Profile"
+msgstr "Profiel weergeven"
+
+#: ../../Zotlabs/Module/Connedit.php:585
#, php-format
-msgid "Channel '%s' censored"
-msgstr "Kanaal '%s' gecensureerd"
+msgid "View %s's profile"
+msgstr "Profiel van %s weergeven"
+
+#: ../../Zotlabs/Module/Connedit.php:589
+msgid "Refresh Permissions"
+msgstr "Permissies vernieuwen"
+
+#: ../../Zotlabs/Module/Connedit.php:592
+msgid "Fetch updated permissions"
+msgstr "Aangepaste permissies ophalen"
+
+#: ../../Zotlabs/Module/Connedit.php:596
+msgid "Recent Activity"
+msgstr "Recente activiteit/berichten"
+
+#: ../../Zotlabs/Module/Connedit.php:599
+msgid "View recent posts and comments"
+msgstr "Recente berichten en reacties weergeven"
+
+#: ../../Zotlabs/Module/Connedit.php:603
+#: ../../Zotlabs/Module/Admin/Accounts.php:175
+msgid "Unblock"
+msgstr "Deblokkeren"
+
+#: ../../Zotlabs/Module/Connedit.php:603
+#: ../../Zotlabs/Module/Admin/Accounts.php:174
+msgid "Block"
+msgstr "Blokkeren"
+
+#: ../../Zotlabs/Module/Connedit.php:606
+msgid "Block (or Unblock) all communications with this connection"
+msgstr "Blokkeer (of deblokkeer) alle communicatie met deze connectie"
-#: ../../Zotlabs/Module/Admin/Channels.php:88
+#: ../../Zotlabs/Module/Connedit.php:607
+msgid "This connection is blocked!"
+msgstr "Deze connectie is geblokkeerd!"
+
+#: ../../Zotlabs/Module/Connedit.php:611
+msgid "Unignore"
+msgstr "Niet meer negeren"
+
+#: ../../Zotlabs/Module/Connedit.php:611
+#: ../../Zotlabs/Module/Connections.php:277
+msgid "Ignore"
+msgstr "Negeren"
+
+#: ../../Zotlabs/Module/Connedit.php:614
+msgid "Ignore (or Unignore) all inbound communications from this connection"
+msgstr "Negeer (of negeer niet meer) alle inkomende communicatie van deze connectie"
+
+#: ../../Zotlabs/Module/Connedit.php:615
+msgid "This connection is ignored!"
+msgstr "Deze connectie wordt genegeerd!"
+
+#: ../../Zotlabs/Module/Connedit.php:619
+msgid "Unarchive"
+msgstr "Niet meer archiveren"
+
+#: ../../Zotlabs/Module/Connedit.php:619
+msgid "Archive"
+msgstr "Archiveren"
+
+#: ../../Zotlabs/Module/Connedit.php:622
+msgid ""
+"Archive (or Unarchive) this connection - mark channel dead but keep content"
+msgstr "Archiveer (of dearchiveer) deze connectie - markeer het kanaal als dood, maar bewaar de inhoud"
+
+#: ../../Zotlabs/Module/Connedit.php:623
+msgid "This connection is archived!"
+msgstr "Deze connectie is gearchiveerd!"
+
+#: ../../Zotlabs/Module/Connedit.php:627
+msgid "Unhide"
+msgstr "Niet meer verbergen"
+
+#: ../../Zotlabs/Module/Connedit.php:627
+msgid "Hide"
+msgstr "Verbergen"
+
+#: ../../Zotlabs/Module/Connedit.php:630
+msgid "Hide or Unhide this connection from your other connections"
+msgstr "Deze connectie verbergen (of niet meer verbergen) voor jouw andere connecties"
+
+#: ../../Zotlabs/Module/Connedit.php:631
+msgid "This connection is hidden!"
+msgstr "Deze connectie is verborgen!"
+
+#: ../../Zotlabs/Module/Connedit.php:638
+msgid "Delete this connection"
+msgstr "Deze connectie verwijderen"
+
+#: ../../Zotlabs/Module/Connedit.php:655 ../../include/widgets.php:529
+msgid "Me"
+msgstr "Ik"
+
+#: ../../Zotlabs/Module/Connedit.php:656 ../../include/widgets.php:530
+msgid "Family"
+msgstr "Familie"
+
+#: ../../Zotlabs/Module/Connedit.php:657
+#: ../../Zotlabs/Module/Settings/Channel.php:61
+#: ../../Zotlabs/Module/Settings/Channel.php:65
+#: ../../Zotlabs/Module/Settings/Channel.php:66
+#: ../../Zotlabs/Module/Settings/Channel.php:69
+#: ../../Zotlabs/Module/Settings/Channel.php:80
+#: ../../include/selectors.php:123 ../../include/channel.php:402
+#: ../../include/channel.php:403 ../../include/channel.php:410
+#: ../../include/widgets.php:531
+msgid "Friends"
+msgstr "Vrienden"
+
+#: ../../Zotlabs/Module/Connedit.php:658 ../../include/widgets.php:532
+msgid "Acquaintances"
+msgstr "Kennissen"
+
+#: ../../Zotlabs/Module/Connedit.php:659
+#: ../../Zotlabs/Module/Connections.php:92
+#: ../../Zotlabs/Module/Connections.php:107 ../../include/widgets.php:533
+msgid "All"
+msgstr "Alles"
+
+#: ../../Zotlabs/Module/Connedit.php:716
+msgid "Approve this connection"
+msgstr "Deze connectie accepteren"
+
+#: ../../Zotlabs/Module/Connedit.php:716
+msgid "Accept connection to allow communication"
+msgstr "Keur deze connectie goed om communicatie toe te staan"
+
+#: ../../Zotlabs/Module/Connedit.php:721
+msgid "Set Affinity"
+msgstr "Verwantschapsfilter instellen"
+
+#: ../../Zotlabs/Module/Connedit.php:724
+msgid "Set Profile"
+msgstr "Profiel instellen"
+
+#: ../../Zotlabs/Module/Connedit.php:727
+msgid "Set Affinity & Profile"
+msgstr "Verwantschapsfilter en profiel instellen"
+
+#: ../../Zotlabs/Module/Connedit.php:776
+msgid "none"
+msgstr "geen"
+
+#: ../../Zotlabs/Module/Connedit.php:780 ../../include/widgets.php:656
+msgid "Connection Default Permissions"
+msgstr "Standaard permissies voor connecties"
+
+#: ../../Zotlabs/Module/Connedit.php:780 ../../include/items.php:3909
#, php-format
-msgid "Channel '%s' uncensored"
-msgstr "Kanaal '%s' ongecensureerd"
+msgid "Connection: %s"
+msgstr "Connectie: %s"
-#: ../../Zotlabs/Module/Admin/Channels.php:99
+#: ../../Zotlabs/Module/Connedit.php:781
+msgid "Apply these permissions automatically"
+msgstr "Deze permissies automatisch toepassen"
+
+#: ../../Zotlabs/Module/Connedit.php:781
+msgid "Connection requests will be approved without your interaction"
+msgstr "Connectieverzoeken zullen automatisch worden geaccepteerd"
+
+#: ../../Zotlabs/Module/Connedit.php:784
+msgid "This connection's primary address is"
+msgstr "Het primaire kanaaladres van deze connectie is"
+
+#: ../../Zotlabs/Module/Connedit.php:785
+msgid "Available locations:"
+msgstr "Beschikbare locaties:"
+
+#: ../../Zotlabs/Module/Connedit.php:789
+msgid ""
+"The permissions indicated on this page will be applied to all new "
+"connections."
+msgstr "Permissies die op deze pagina staan vermeld worden op alle nieuwe connecties toegepast."
+
+#: ../../Zotlabs/Module/Connedit.php:790
+msgid "Connection Tools"
+msgstr "Hulpmiddelen"
+
+#: ../../Zotlabs/Module/Connedit.php:792
+msgid "Slide to adjust your degree of friendship"
+msgstr "Schuif om te bepalen hoe goed je iemand kent en/of mag"
+
+#: ../../Zotlabs/Module/Connedit.php:793 ../../Zotlabs/Module/Rate.php:155
+#: ../../include/js_strings.php:20
+msgid "Rating"
+msgstr "Beoordeling"
+
+#: ../../Zotlabs/Module/Connedit.php:794
+msgid "Slide to adjust your rating"
+msgstr "Gebruik de schuif om je beoordeling te geven"
+
+#: ../../Zotlabs/Module/Connedit.php:795 ../../Zotlabs/Module/Connedit.php:800
+msgid "Optionally explain your rating"
+msgstr "Verklaar jouw beoordeling (niet verplicht)"
+
+#: ../../Zotlabs/Module/Connedit.php:797
+msgid "Custom Filter"
+msgstr "Berichtenfilter"
+
+#: ../../Zotlabs/Module/Connedit.php:798
+msgid "Only import posts with this text"
+msgstr "Importeer alleen berichten met deze tekst"
+
+#: ../../Zotlabs/Module/Connedit.php:798 ../../Zotlabs/Module/Connedit.php:799
+msgid ""
+"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
+"all posts"
+msgstr "woorden (één per regel), #tags, /regex/ of talen (lang=iso639-1) - laat leeg om alle berichten te importeren"
+
+#: ../../Zotlabs/Module/Connedit.php:799
+msgid "Do not import posts with this text"
+msgstr "Importeer geen berichten met deze tekst"
+
+#: ../../Zotlabs/Module/Connedit.php:801
+msgid "This information is public!"
+msgstr "Deze informatie is openbaar!"
+
+#: ../../Zotlabs/Module/Connedit.php:806
+msgid "Connection Pending Approval"
+msgstr "Connectie moet nog geaccepteerd worden"
+
+#: ../../Zotlabs/Module/Connedit.php:809
+#: ../../Zotlabs/Module/Settings/Tokens.php:163
+msgid "inherited"
+msgstr "geërfd"
+
+#: ../../Zotlabs/Module/Connedit.php:810 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Connect.php:98
+#: ../../Zotlabs/Module/Admin/Features.php:66
+#: ../../Zotlabs/Module/Admin/Logs.php:84
+#: ../../Zotlabs/Module/Admin/Plugins.php:429
+#: ../../Zotlabs/Module/Admin/Profs.php:157
+#: ../../Zotlabs/Module/Admin/Security.php:104
+#: ../../Zotlabs/Module/Admin/Themes.php:156
+#: ../../Zotlabs/Module/Admin/Account_edit.php:74
+#: ../../Zotlabs/Module/Admin/Accounts.php:166
+#: ../../Zotlabs/Module/Admin/Channels.php:147
+#: ../../Zotlabs/Module/Admin/Site.php:260 ../../Zotlabs/Module/Appman.php:127
+#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Mail.php:412
+#: ../../Zotlabs/Module/Import_items.php:122
+#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Group.php:85
+#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Mood.php:139
+#: ../../Zotlabs/Module/Photos.php:668 ../../Zotlabs/Module/Photos.php:1058
+#: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1216
+#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Pconfig.php:107 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Cal.php:342
+#: ../../Zotlabs/Module/Wiki.php:148 ../../Zotlabs/Module/Sources.php:114
+#: ../../Zotlabs/Module/Sources.php:149
+#: ../../Zotlabs/Module/Settings/Features.php:47
+#: ../../Zotlabs/Module/Settings/Oauth.php:87
+#: ../../Zotlabs/Module/Settings/Tokens.php:167
+#: ../../Zotlabs/Module/Settings/Account.php:118
+#: ../../Zotlabs/Module/Settings/Channel.php:455
+#: ../../Zotlabs/Module/Settings/Display.php:196
+#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
+#: ../../Zotlabs/Module/Import.php:543 ../../Zotlabs/Module/Chat.php:196
+#: ../../Zotlabs/Module/Chat.php:241 ../../Zotlabs/Module/Xchan.php:15
+#: ../../Zotlabs/Module/Events.php:484 ../../Zotlabs/Lib/ThreadItem.php:729
+#: ../../extend/addon/addon/chords/Mod_Chords.php:60
+#: ../../extend/addon/addon/diaspora/diaspora.php:710
+#: ../../extend/addon/addon/dwpost/dwpost.php:89
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
+#: ../../extend/addon/addon/friendica/friendica.php:128
+#: ../../extend/addon/addon/frphotos/frphotos.php:96
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
+#: ../../extend/addon/addon/hubwall/hubwall.php:95
+#: ../../extend/addon/addon/ijpost/ijpost.php:89
+#: ../../extend/addon/addon/irc/irc.php:53
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
+#: ../../extend/addon/addon/libertree/libertree.php:85
+#: ../../extend/addon/addon/ljpost/ljpost.php:86
+#: ../../extend/addon/addon/logrot/logrot.php:35
+#: ../../extend/addon/addon/mailhost/mailhost.php:40
+#: ../../extend/addon/addon/nofed/nofed.php:80
+#: ../../extend/addon/addon/nsabait/nsabait.php:161
+#: ../../extend/addon/addon/nsfw/nsfw.php:92
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:52
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:168
+#: ../../extend/addon/addon/pageheader/pageheader.php:48
+#: ../../extend/addon/addon/piwik/piwik.php:95
+#: ../../extend/addon/addon/planets/planets.php:157
+#: ../../extend/addon/addon/pumpio/pumpio.php:237
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
+#: ../../extend/addon/addon/redfiles/redfiles.php:124
+#: ../../extend/addon/addon/redphotos/redphotos.php:136
+#: ../../extend/addon/addon/redred/redred.php:119
+#: ../../extend/addon/addon/rtof/rtof.php:101
+#: ../../extend/addon/addon/skeleton/skeleton.php:65
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
+#: ../../extend/addon/addon/startpage/startpage.php:113
+#: ../../extend/addon/addon/statusnet/statusnet.php:322
+#: ../../extend/addon/addon/statusnet/statusnet.php:380
+#: ../../extend/addon/addon/statusnet/statusnet.php:432
+#: ../../extend/addon/addon/statusnet/statusnet.php:899
+#: ../../extend/addon/addon/superblock/superblock.php:118
+#: ../../extend/addon/addon/twitter/twitter.php:217
+#: ../../extend/addon/addon/twitter/twitter.php:259
+#: ../../extend/addon/addon/visage/visage.php:170
+#: ../../extend/addon/addon/wppost/wppost.php:113
+#: ../../extend/addon/addon/xmpp/xmpp.php:69
+#: ../../extend/addon/addon/cdav/cdav.php:246
+#: ../../extend/addon/addon/likebanner/likebanner.php:57
+#: ../../extend/addon/addon/mailtest/mailtest.php:100
+#: ../../include/js_strings.php:22 ../../include/widgets.php:796
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Submit"
+msgstr "Opslaan"
+
+#: ../../Zotlabs/Module/Connedit.php:811
#, php-format
-msgid "Channel '%s' code allowed"
-msgstr "Scripts toegestaan voor kanaal '%s'"
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Kies het profiel dat je aan %s wil tonen wanneer hij/zij ingelogd jouw profiel wil bekijken."
+
+#: ../../Zotlabs/Module/Connedit.php:813
+#: ../../Zotlabs/Module/Settings/Tokens.php:160
+msgid "Their Settings"
+msgstr "Hun instellingen"
+
+#: ../../Zotlabs/Module/Connedit.php:814
+#: ../../Zotlabs/Module/Settings/Tokens.php:161
+msgid "My Settings"
+msgstr "Mijn instellingen"
-#: ../../Zotlabs/Module/Admin/Channels.php:99
+#: ../../Zotlabs/Module/Connedit.php:816
+#: ../../Zotlabs/Module/Settings/Tokens.php:165
+msgid "Individual Permissions"
+msgstr "Individuele permissies"
+
+#: ../../Zotlabs/Module/Connedit.php:817
+#: ../../Zotlabs/Module/Settings/Tokens.php:166
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can <strong>not</strong> change those"
+" settings here."
+msgstr "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele instellingen. Je kan je deze overgeërfde permissies hier <strong>niet</strong> veranderen."
+
+#: ../../Zotlabs/Module/Connedit.php:818
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can change those settings here but "
+"they wont have any impact unless the inherited setting changes."
+msgstr "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele permissies. Je kan de permissies hier veranderen, maar die hebben geen effect, tenzij de overgeërfde permissies worden veranderd. "
+
+#: ../../Zotlabs/Module/Connedit.php:819
+msgid "Last update:"
+msgstr "Laatste wijziging:"
+
+#: ../../Zotlabs/Module/Dreport.php:45
+msgid "Invalid message"
+msgstr "Ongeldig bericht"
+
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "no results"
+msgstr "geen resultaten"
+
+#: ../../Zotlabs/Module/Dreport.php:93
+msgid "channel sync processed"
+msgstr "kanaalsync verwerkt"
+
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "queued"
+msgstr "in wachtrij"
+
+#: ../../Zotlabs/Module/Dreport.php:101
+msgid "posted"
+msgstr "verstuurd"
+
+#: ../../Zotlabs/Module/Dreport.php:105
+msgid "accepted for delivery"
+msgstr "geaccepteerd om afgeleverd te worden"
+
+#: ../../Zotlabs/Module/Dreport.php:109
+msgid "updated"
+msgstr "geüpdatet"
+
+#: ../../Zotlabs/Module/Dreport.php:112
+msgid "update ignored"
+msgstr "update genegeerd"
+
+#: ../../Zotlabs/Module/Dreport.php:115
+msgid "permission denied"
+msgstr "toegang geweigerd"
+
+#: ../../Zotlabs/Module/Dreport.php:119
+msgid "recipient not found"
+msgstr "ontvanger niet gevonden"
+
+#: ../../Zotlabs/Module/Dreport.php:122
+msgid "mail recalled"
+msgstr "Privébericht ingetrokken"
+
+#: ../../Zotlabs/Module/Dreport.php:125
+msgid "duplicate mail received"
+msgstr "dubbel privébericht ontvangen"
+
+#: ../../Zotlabs/Module/Dreport.php:128
+msgid "mail delivered"
+msgstr "privébericht afgeleverd"
+
+#: ../../Zotlabs/Module/Dreport.php:148
#, php-format
-msgid "Channel '%s' code disallowed"
-msgstr "Scripts niet toegestaan voor kanaal '%s'"
+msgid "Delivery report for %1$s"
+msgstr "Afleveringsrapport voor %1$s"
-#: ../../Zotlabs/Module/Admin/Channels.php:150 ../../include/widgets.php:1562
-msgid "Channels"
-msgstr "Kanalen"
+#: ../../Zotlabs/Module/Dreport.php:151
+msgid "Options"
+msgstr "Opties"
-#: ../../Zotlabs/Module/Admin/Channels.php:154
-msgid "Censor"
-msgstr "Censureren"
+#: ../../Zotlabs/Module/Dreport.php:152
+msgid "Redeliver"
+msgstr "Opnieuw afleveren"
-#: ../../Zotlabs/Module/Admin/Channels.php:155
-msgid "Uncensor"
-msgstr "Niet censureren"
+#: ../../Zotlabs/Module/Bookmarks.php:53
+msgid "Bookmark added"
+msgstr "Bladwijzer toegevoegd"
-#: ../../Zotlabs/Module/Admin/Channels.php:156
-msgid "Allow Code"
-msgstr "Scripts toestaan"
+#: ../../Zotlabs/Module/Bookmarks.php:75
+msgid "My Bookmarks"
+msgstr "Mijn bladwijzers"
-#: ../../Zotlabs/Module/Admin/Channels.php:157
-msgid "Disallow Code"
-msgstr "Scripts niet toestaan"
+#: ../../Zotlabs/Module/Bookmarks.php:86
+msgid "My Connections Bookmarks"
+msgstr "Bladwijzers van mijn connecties"
-#: ../../Zotlabs/Module/Admin/Channels.php:158
-#: ../../include/conversation.php:1651
-msgid "Channel"
-msgstr "Kanaal"
+#: ../../Zotlabs/Module/Acl.php:313
+msgid "network"
+msgstr "netwerk"
-#: ../../Zotlabs/Module/Admin/Channels.php:162
-msgid "UID"
-msgstr "UID"
+#: ../../Zotlabs/Module/Acl.php:323
+msgid "RSS"
+msgstr "RSS"
-#: ../../Zotlabs/Module/Admin/Channels.php:164
-#: ../../Zotlabs/Module/Locs.php:118 ../../Zotlabs/Module/Profiles.php:470
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
+msgstr "Locatie niet gevonden."
+
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
+msgstr "Opzoeken locatie mislukt"
+
+#: ../../Zotlabs/Module/Locs.php:66
+msgid ""
+"Please select another location to become primary before removing the primary"
+" location."
+msgstr "Kies eerst een andere primaire locatie alvorens de huidige primaire locatie te verwijderen."
+
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
+msgstr "Locaties synchronizeren"
+
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
+msgstr "Geen locaties gevonden."
+
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
+msgstr "Kanaallocaties beheren"
+
+#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
+#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:692
+#: ../../Zotlabs/Module/Events.php:468
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839
+#: ../../include/js_strings.php:25
+msgid "Location"
+msgstr "Locatie"
+
+#: ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Profiles.php:464
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143
msgid "Address"
-msgstr "Kanaaladres"
+msgstr "Adres"
+
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
+msgstr "Primair"
-#: ../../Zotlabs/Module/Admin/Channels.php:166
+#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
+msgid "Drop"
+msgstr "Verwijderen"
+
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
+msgstr "Nu synchroniseren"
+
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
+msgstr "Wacht enkele minuten tussen opeenvolgende handelingen."
+
+#: ../../Zotlabs/Module/Locs.php:124
msgid ""
-"Selected channels will be deleted!\\n\\nEverything that was posted in these "
-"channels on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Geselecteerde kanalen worden verwijderd!\\n\\nAlles wat in deze kanalen op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
+"When possible, drop a location by logging into that website/hub and removing"
+" your channel."
+msgstr "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen door op de hub van de kloon in te loggen en het kanaal daar te verwijderen."
+
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
+msgstr "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is."
-#: ../../Zotlabs/Module/Admin/Channels.php:167
+#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
+msgid "Continue"
+msgstr "Ga verder"
+
+#: ../../Zotlabs/Module/Connect.php:90
+msgid "Premium Channel Setup"
+msgstr "Instellen premiumkanaal "
+
+#: ../../Zotlabs/Module/Connect.php:92
+msgid "Enable premium channel connection restrictions"
+msgstr "Restricties voor connecties van premiumkanaal toestaan"
+
+#: ../../Zotlabs/Module/Connect.php:93
msgid ""
-"The channel {0} will be deleted!\\n\\nEverything that was posted in this "
-"channel on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Kanaal {0} wordt verwijderd!\\n\\nAlles wat in dit kanaal op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Vul je restricties of voorwaarden in, zoals een paypal-afschrift, voorschriften voor leden, enz."
-#: ../../Zotlabs/Module/Admin/Dbsync.php:19
-msgid "Update has been marked successful"
-msgstr "Update is als succesvol gemarkeerd"
+#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Dit kanaal kan extra stappen of het accepteren van de volgende voorwaarden vereisen, voordat de connectie wordt geaccepteerd:"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:29
+#: ../../Zotlabs/Module/Connect.php:96
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Mogelijke connecties zullen dan de volgende tekst zien voordat ze verder kunnen:"
+
+#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
+msgid ""
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "Door verder te gaan ga ik automatisch akkoord met alle voorwaarden en aanwijzingen op deze pagina."
+
+#: ../../Zotlabs/Module/Connect.php:106
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(Er zijn geen speciale voorwaarden en aanwijzingen door de kanaal-eigenaar verstrekt) "
+
+#: ../../Zotlabs/Module/Connect.php:114
+msgid "Restricted or Premium Channel"
+msgstr "Beperkt of premiumkanaal"
+
+#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
+msgid "Invalid item."
+msgstr "Ongeldig item."
+
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Chanview.php:96
+#: ../../Zotlabs/Module/Block.php:43 ../../Zotlabs/Module/Cal.php:62
+#: ../../Zotlabs/Module/Wall_upload.php:31
+msgid "Channel not found."
+msgstr "Kanaal niet gevonden."
+
+#: ../../Zotlabs/Module/Page.php:131
+msgid ""
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
+" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
+"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "Save to Folder:"
+msgstr "Bewaar in map: "
+
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "- select -"
+msgstr "- kies map -"
+
+#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin/Profs.php:74
+#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/text.php:987
+#: ../../include/text.php:999 ../../include/widgets.php:201
+msgid "Save"
+msgstr "Opslaan"
+
+#: ../../Zotlabs/Module/Manage.php:136
+#: ../../Zotlabs/Module/New_channel.php:121
#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr "Uitvoeren van %s is mislukt. Controleer systeemlogboek."
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Je hebt %1$.0f van totaal %2$.0f toegestane kanalen aangemaakt."
-#: ../../Zotlabs/Module/Admin/Dbsync.php:32
+#: ../../Zotlabs/Module/Manage.php:143
+msgid "Create a new channel"
+msgstr "Nieuw kanaal aanmaken"
+
+#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:772
+#: ../../Zotlabs/Module/Wiki.php:147 ../../Zotlabs/Module/Chat.php:255
+msgid "Create New"
+msgstr "Nieuwe aanmaken"
+
+#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:216
+#: ../../include/nav.php:209
+msgid "Channel Manager"
+msgstr "Kanaalbeheer"
+
+#: ../../Zotlabs/Module/Manage.php:165
+msgid "Current Channel"
+msgstr "Huidig kanaal"
+
+#: ../../Zotlabs/Module/Manage.php:167
+msgid "Switch to one of your channels by selecting it."
+msgstr "Activeer een van jouw andere kanalen door er op te klikken."
+
+#: ../../Zotlabs/Module/Manage.php:168
+msgid "Default Channel"
+msgstr "Standaardkanaal"
+
+#: ../../Zotlabs/Module/Manage.php:169
+msgid "Make Default"
+msgstr "Als standaard instellen"
+
+#: ../../Zotlabs/Module/Manage.php:172
#, php-format
-msgid "Update %s was successfully applied."
-msgstr "Update %s was geslaagd."
+msgid "%d new messages"
+msgstr "%d nieuwe berichten"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:36
+#: ../../Zotlabs/Module/Manage.php:173
#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr "Update %s gaf geen melding. Het is daarom niet bekend of deze geslaagd is."
+msgid "%d new introductions"
+msgstr "%d nieuwe connectieverzoeken"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:39
+#: ../../Zotlabs/Module/Manage.php:175
+msgid "Delegated Channel"
+msgstr "Uitbesteed kanaal"
+
+#: ../../Zotlabs/Module/Connections.php:56
+#: ../../Zotlabs/Module/Connections.php:161
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Blocked"
+msgstr "Geblokkeerd"
+
+#: ../../Zotlabs/Module/Connections.php:61
+#: ../../Zotlabs/Module/Connections.php:168
+#: ../../Zotlabs/Module/Connections.php:241
+msgid "Ignored"
+msgstr "Genegeerd"
+
+#: ../../Zotlabs/Module/Connections.php:66
+#: ../../Zotlabs/Module/Connections.php:182
+#: ../../Zotlabs/Module/Connections.php:240
+msgid "Hidden"
+msgstr "Verborgen"
+
+#: ../../Zotlabs/Module/Connections.php:71
+#: ../../Zotlabs/Module/Connections.php:175
+#: ../../Zotlabs/Module/Connections.php:239
+msgid "Archived"
+msgstr "Gearchiveerd"
+
+#: ../../Zotlabs/Module/Connections.php:76
+#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1576
+msgid "New"
+msgstr "Nieuw"
+
+#: ../../Zotlabs/Module/Connections.php:138
+msgid "New Connections"
+msgstr "Nieuwe connecties"
+
+#: ../../Zotlabs/Module/Connections.php:141
+msgid "Show pending (new) connections"
+msgstr "Nog te accepteren (nieuwe) connecties weergeven"
+
+#: ../../Zotlabs/Module/Connections.php:145
+#: ../../Zotlabs/Module/Profperm.php:144
+msgid "All Connections"
+msgstr "Alle connecties"
+
+#: ../../Zotlabs/Module/Connections.php:148
+msgid "Show all connections"
+msgstr "Toon alle connecties"
+
+#: ../../Zotlabs/Module/Connections.php:164
+msgid "Only show blocked connections"
+msgstr "Toon alleen geblokkeerde connecties"
+
+#: ../../Zotlabs/Module/Connections.php:171
+msgid "Only show ignored connections"
+msgstr "Toon alleen genegeerde connecties"
+
+#: ../../Zotlabs/Module/Connections.php:178
+msgid "Only show archived connections"
+msgstr "Toon alleen gearchiveerde connecties"
+
+#: ../../Zotlabs/Module/Connections.php:185
+msgid "Only show hidden connections"
+msgstr "Toon alleen verborgen connecties"
+
+#: ../../Zotlabs/Module/Connections.php:238
+msgid "Pending approval"
+msgstr "Moet nog geaccepteerd worden"
+
+#: ../../Zotlabs/Module/Connections.php:254
#, php-format
-msgid "Update function %s could not be found."
-msgstr "Update-functie %s kon niet gevonden worden."
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:55
-msgid "No failed updates."
-msgstr "Geen mislukte updates."
+#: ../../Zotlabs/Module/Connections.php:255
+msgid "Edit connection"
+msgstr "Connectie bewerken"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:59
-msgid "Failed Updates"
-msgstr "Mislukte updates"
+#: ../../Zotlabs/Module/Connections.php:256
+msgid "Delete connection"
+msgstr "Connectie verwijderen"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:61
-msgid "Mark success (if update was manually applied)"
-msgstr "Markeer als geslaagd (wanneer de update handmatig was uitgevoerd)"
+#: ../../Zotlabs/Module/Connections.php:265
+msgid "Channel address"
+msgstr "Kanaaladres"
-#: ../../Zotlabs/Module/Admin/Dbsync.php:62
-msgid "Attempt to execute this update step automatically"
-msgstr "Poging om deze stap van de update automatisch uit te voeren."
+#: ../../Zotlabs/Module/Connections.php:267
+msgid "Network"
+msgstr "Netwerk"
+
+#: ../../Zotlabs/Module/Connections.php:270
+msgid "Status"
+msgstr "Status"
+
+#: ../../Zotlabs/Module/Connections.php:272
+msgid "Connected"
+msgstr "Verbonden"
+
+#: ../../Zotlabs/Module/Connections.php:274
+msgid "Approve connection"
+msgstr "Connectie accepteren"
+
+#: ../../Zotlabs/Module/Connections.php:275
+#: ../../Zotlabs/Module/Admin/Accounts.php:171
+msgid "Approve"
+msgstr "Goedkeuren"
+
+#: ../../Zotlabs/Module/Connections.php:276
+msgid "Ignore connection"
+msgstr "Connectie negeren"
+
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Recent activity"
+msgstr "Recente activiteit"
+
+#: ../../Zotlabs/Module/Connections.php:302 ../../Zotlabs/Lib/Apps.php:211
+#: ../../include/nav.php:189 ../../include/text.php:916
+msgid "Connections"
+msgstr "Connecties"
+
+#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44
+#: ../../Zotlabs/Lib/Apps.php:232 ../../include/nav.php:168
+#: ../../include/text.php:986 ../../include/text.php:998
+#: ../../include/acl_selectors.php:203 ../../include/widgets.php:315
+msgid "Search"
+msgstr "Zoeken"
+
+#: ../../Zotlabs/Module/Connections.php:307
+msgid "Search your connections"
+msgstr "Doorzoek jouw connecties"
+
+#: ../../Zotlabs/Module/Connections.php:308
+msgid "Connections search"
+msgstr "Connecties zoeken"
+
+#: ../../Zotlabs/Module/Connections.php:309
+#: ../../Zotlabs/Module/Directory.php:391
+#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
+msgid "Find"
+msgstr "Vinden"
+
+#: ../../Zotlabs/Module/Cover_photo.php:58
+#: ../../Zotlabs/Module/Profile_photo.php:61
+msgid "Image uploaded but image cropping failed."
+msgstr "Afbeelding geüpload, maar afbeelding kon niet worden bijgesneden. "
+
+#: ../../Zotlabs/Module/Cover_photo.php:134
+#: ../../Zotlabs/Module/Cover_photo.php:181
+msgid "Cover Photos"
+msgstr "Omslagfoto's"
+
+#: ../../Zotlabs/Module/Cover_photo.php:154
+#: ../../Zotlabs/Module/Profile_photo.php:135
+msgid "Image resize failed."
+msgstr "Afbeelding kon niet van grootte veranderd worden."
+
+#: ../../Zotlabs/Module/Cover_photo.php:168
+#: ../../Zotlabs/Module/Profile_photo.php:196 ../../include/photos.php:149
+msgid "Unable to process image"
+msgstr "Afbeelding kan niet verwerkt worden"
+
+#: ../../Zotlabs/Module/Cover_photo.php:192
+#: ../../Zotlabs/Module/Profile_photo.php:231
+msgid "Image upload failed."
+msgstr "Uploaden afbeelding mislukt"
+
+#: ../../Zotlabs/Module/Cover_photo.php:210
+#: ../../Zotlabs/Module/Profile_photo.php:250
+msgid "Unable to process image."
+msgstr "Niet in staat om afbeelding te verwerken."
+
+#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4253
+msgid "female"
+msgstr "vrouw"
+
+#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4254
+#, php-format
+msgid "%1$s updated her %2$s"
+msgstr "%1$s heeft haar %2$s bijgewerkt"
+
+#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4255
+msgid "male"
+msgstr "man"
+
+#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4256
+#, php-format
+msgid "%1$s updated his %2$s"
+msgstr "%1$s heeft zijn %2$s bijgewerkt"
+
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4258
+#, php-format
+msgid "%1$s updated their %2$s"
+msgstr "De %2$s van %1$s is bijgewerkt"
+
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1677
+msgid "cover photo"
+msgstr "omslagfoto"
+
+#: ../../Zotlabs/Module/Cover_photo.php:303
+#: ../../Zotlabs/Module/Cover_photo.php:318
+#: ../../Zotlabs/Module/Profile_photo.php:311
+#: ../../Zotlabs/Module/Profile_photo.php:352
+msgid "Photo not available."
+msgstr "Foto niet beschikbaar."
+
+#: ../../Zotlabs/Module/Cover_photo.php:354
+#: ../../Zotlabs/Module/Profile_photo.php:407
+msgid "Upload File:"
+msgstr "Bestand uploaden:"
+
+#: ../../Zotlabs/Module/Cover_photo.php:355
+#: ../../Zotlabs/Module/Profile_photo.php:408
+msgid "Select a profile:"
+msgstr "Kies een profiel:"
+
+#: ../../Zotlabs/Module/Cover_photo.php:356
+msgid "Upload Cover Photo"
+msgstr "Omslagfoto uploaden"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:416
+#: ../../Zotlabs/Module/Settings/Channel.php:399
+msgid "or"
+msgstr "of"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:416
+msgid "skip this step"
+msgstr "sla deze stap over"
+
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Module/Profile_photo.php:416
+msgid "select a photo from your photo albums"
+msgstr "Kies een foto uit jouw fotoalbums"
+
+#: ../../Zotlabs/Module/Cover_photo.php:377
+#: ../../Zotlabs/Module/Profile_photo.php:435
+msgid "Crop Image"
+msgstr "Afbeelding bijsnijden"
+
+#: ../../Zotlabs/Module/Cover_photo.php:378
+#: ../../Zotlabs/Module/Profile_photo.php:436
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Snij de afbeelding zo uit dat deze optimaal wordt weergegeven."
+
+#: ../../Zotlabs/Module/Cover_photo.php:380
+#: ../../Zotlabs/Module/Profile_photo.php:438
+msgid "Done Editing"
+msgstr "Klaar met bewerken"
#: ../../Zotlabs/Module/Admin/Features.php:55
#: ../../Zotlabs/Module/Admin/Features.php:56
@@ -924,8 +1741,20 @@ msgstr "Beheer - Extra functies"
msgid "Log settings updated."
msgstr "Logboek-instellingen bijgewerkt."
-#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1587
-#: ../../include/widgets.php:1597
+#: ../../Zotlabs/Module/Admin/Logs.php:82
+#: ../../Zotlabs/Module/Admin/Plugins.php:336
+#: ../../Zotlabs/Module/Admin/Plugins.php:427
+#: ../../Zotlabs/Module/Admin/Security.php:86
+#: ../../Zotlabs/Module/Admin/Themes.php:120
+#: ../../Zotlabs/Module/Admin/Themes.php:154
+#: ../../Zotlabs/Module/Admin/Accounts.php:164
+#: ../../Zotlabs/Module/Admin/Channels.php:145
+#: ../../Zotlabs/Module/Admin/Site.php:258 ../../Zotlabs/Module/Admin.php:137
+msgid "Administration"
+msgstr "Beheer"
+
+#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1588
+#: ../../include/widgets.php:1598
msgid "Logs"
msgstr "Logboeken"
@@ -954,8 +1783,8 @@ msgstr "Logniveau"
#: ../../Zotlabs/Module/Admin/Plugins.php:254
#: ../../Zotlabs/Module/Admin/Themes.php:69
#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Display.php:40
-#: ../../Zotlabs/Module/Admin.php:62 ../../Zotlabs/Module/Thing.php:89
-#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3427
+#: ../../Zotlabs/Module/Admin.php:60 ../../Zotlabs/Module/Thing.php:89
+#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3343
msgid "Item not found."
msgstr "Item niet gevonden."
@@ -980,7 +1809,7 @@ msgid "Enable"
msgstr "Inschakelen"
#: ../../Zotlabs/Module/Admin/Plugins.php:337
-#: ../../Zotlabs/Module/Admin/Plugins.php:428 ../../include/widgets.php:1565
+#: ../../Zotlabs/Module/Admin/Plugins.php:428 ../../include/widgets.php:1566
msgid "Plugins"
msgstr "Plugins"
@@ -990,8 +1819,8 @@ msgid "Toggle"
msgstr "Omschakelen"
#: ../../Zotlabs/Module/Admin/Plugins.php:339
-#: ../../Zotlabs/Module/Admin/Themes.php:123 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/nav.php:213 ../../include/widgets.php:680
+#: ../../Zotlabs/Module/Admin/Themes.php:123 ../../Zotlabs/Lib/Apps.php:218
+#: ../../include/nav.php:211 ../../include/widgets.php:680
msgid "Settings"
msgstr "Instellingen"
@@ -1054,17 +1883,21 @@ msgstr "Plugin-repository downloaden"
msgid "Install new repo"
msgstr "Nieuwe repository installeren"
-#: ../../Zotlabs/Module/Admin/Plugins.php:413 ../../Zotlabs/Lib/Apps.php:334
+#: ../../Zotlabs/Module/Admin/Plugins.php:413 ../../Zotlabs/Lib/Apps.php:339
msgid "Install"
msgstr "Installeren"
#: ../../Zotlabs/Module/Admin/Plugins.php:414
#: ../../Zotlabs/Module/Fbrowser.php:66 ../../Zotlabs/Module/Fbrowser.php:88
-#: ../../Zotlabs/Module/Wiki.php:171 ../../Zotlabs/Module/Wiki.php:211
-#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
+#: ../../Zotlabs/Module/Wiki.php:238 ../../Zotlabs/Module/Wiki.php:261
#: ../../Zotlabs/Module/Settings/Oauth.php:88
#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../include/conversation.php:1248 ../../include/conversation.php:1297
+#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
+#: ../../extend/addon/addon/friendica/dfrn_request.php:879
+#: ../../extend/addon/addon/js_upload/js_upload.php:46
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154
+#: ../../include/conversation.php:1246 ../../include/conversation.php:1295
msgid "Cancel"
msgstr "Annuleren"
@@ -1082,7 +1915,8 @@ msgstr "Nieuwe plugin-repository toevoegen"
#: ../../Zotlabs/Module/Admin/Plugins.php:443
#: ../../Zotlabs/Module/Settings/Oauth.php:42
-#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:334
+#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:339
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152
msgid "Update"
msgstr "Bijwerken"
@@ -1092,6 +1926,7 @@ msgstr "Branch veranderen"
#: ../../Zotlabs/Module/Admin/Plugins.php:445
#: ../../Zotlabs/Module/Photos.php:989 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../extend/addon/addon/superblock/superblock.php:114
msgid "Remove"
msgstr "Verwijderen"
@@ -1134,14 +1969,6 @@ msgstr "Helptekst"
msgid "Additional info (optional)"
msgstr "Extra informatie (optioneel)"
-#: ../../Zotlabs/Module/Admin/Profs.php:74
-#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Filer.php:53
-#: ../../Zotlabs/Module/Rbmark.php:32 ../../Zotlabs/Module/Rbmark.php:104
-#: ../../include/text.php:972 ../../include/text.php:984
-#: ../../include/widgets.php:201
-msgid "Save"
-msgstr "Opslaan"
-
#: ../../Zotlabs/Module/Admin/Profs.php:83
msgid "Field definition not found"
msgstr "Velddefinitie niet gevonden"
@@ -1150,7 +1977,7 @@ msgstr "Velddefinitie niet gevonden"
msgid "Edit Profile Field"
msgstr "Profielveld bewerken"
-#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1568
+#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1569
msgid "Profile Fields"
msgstr "Profielvelden"
@@ -1230,7 +2057,7 @@ msgid ""
"embedded content from that site is explicitly blocked."
msgstr "Alle andere ingesloten (embedded) inhoud wordt gefilterd, <strong>tenzij</strong> ingesloten (embedded) inhoud van een website expliciet wordt geblokkeerd."
-#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1563
+#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1564
msgid "Security"
msgstr "Beveiliging"
@@ -1318,1162 +2145,732 @@ msgstr "Eén website per regel. Standaard wordt ingesloten (embedded) inhoud gef
msgid "Block embedded HTML from these domains"
msgstr "Ingesloten (embedded) HTML vanaf deze domeinen blokkeren"
-#: ../../Zotlabs/Module/Admin/Site.php:135
+#: ../../Zotlabs/Module/Admin/Themes.php:18
+msgid "Theme settings updated."
+msgstr "Thema-instellingen bijgewerkt."
+
+#: ../../Zotlabs/Module/Admin/Themes.php:58
+msgid "No themes found."
+msgstr "Geen thema's gevonden"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:114
+msgid "Screenshot"
+msgstr "Schermafdruk"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:121
+#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1567
+msgid "Themes"
+msgstr "Thema's"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:160
+msgid "[Experimental]"
+msgstr "[Experimenteel]"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:161
+msgid "[Unsupported]"
+msgstr "[Niet ondersteund]"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:29
+#, php-format
+msgid "Password changed for account %d."
+msgstr "Wachtwoord veranderd voor account %d."
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:46
+msgid "Account settings updated."
+msgstr "Account-instellingen bijgewerkt."
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:61
+msgid "Account not found."
+msgstr "Account niet gevonden."
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:68
+msgid "Account Edit"
+msgstr "Account bewerken"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:69
+msgid "New Password"
+msgstr "Nieuw wachtwoord"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:70
+msgid "New Password again"
+msgstr "Nieuw wachtwoord bevestigen"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:71
+msgid "Technical skill level"
+msgstr "Technisch niveau"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:72
+msgid "Account language (for emails)"
+msgstr "Taal van account (voor e-mails)"
+
+#: ../../Zotlabs/Module/Admin/Account_edit.php:73
+msgid "Service class"
+msgstr "Abonnement"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:36
+#, php-format
+msgid "%s account blocked/unblocked"
+msgid_plural "%s account blocked/unblocked"
+msgstr[0] "%s account geblokkeerd/gedeblokkeerd"
+msgstr[1] "%s accounts geblokkeerd/gedeblokkeerd"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:43
+#, php-format
+msgid "%s account deleted"
+msgid_plural "%s accounts deleted"
+msgstr[0] "%s account verwijderd"
+msgstr[1] "%s accounts verwijderd"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:79
+msgid "Account not found"
+msgstr "Account niet gevonden"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:90
+#, php-format
+msgid "Account '%s' deleted"
+msgstr "Account '%s' verwijderd"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:98
+#, php-format
+msgid "Account '%s' blocked"
+msgstr "Account '%s' geblokkeerd"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:106
+#, php-format
+msgid "Account '%s' unblocked"
+msgstr "Account '%s' gedeblokkeerd"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:165
+#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1562
+msgid "Accounts"
+msgstr "Accounts"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:167
+#: ../../Zotlabs/Module/Admin/Channels.php:148
+msgid "select all"
+msgstr "alles selecteren"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:168
+msgid "Registrations waiting for confirm"
+msgstr "Accounts die op goedkeuring wachten"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:169
+msgid "Request date"
+msgstr "Tijd/datum verzoek"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:169
+#: ../../Zotlabs/Module/Admin/Accounts.php:181
+#: ../../extend/addon/addon/redred/redred.php:107
+#: ../../extend/addon/addon/rtof/rtof.php:93
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1140
+#: ../../extend/addon/addon/openid/MysqlProvider.php:56
+#: ../../extend/addon/addon/openid/MysqlProvider.php:57
+#: ../../include/network.php:2237
+msgid "Email"
+msgstr "E-mail"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:170
+msgid "No registrations."
+msgstr "Geen verzoeken."
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:172
+msgid "Deny"
+msgstr "Afkeuren"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:180
+msgid "ID"
+msgstr "ID"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:267
+msgid "All Channels"
+msgstr "Alle kanalen"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:183
+msgid "Register date"
+msgstr "Geregistreerd"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:184
+msgid "Last login"
+msgstr "Laatste keer ingelogd"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:185
+msgid "Expires"
+msgstr "Verloopt"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:186
+msgid "Service Class"
+msgstr "Abonnement"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:188
+msgid ""
+"Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
+" on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Geselecteerde accounts (met bijbehorende kanalen) worden verwijderd!\\n\\nAlles wat deze accounts op deze hub hebben gepubliceerd wordt definitief verwijderd!\\n\\Weet je het zeker?"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:189
+msgid ""
+"The account {0} will be deleted!\\n\\nEverything this account has posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Account {0} (met bijbehorende kanalen) wordt verwijderd !\\n\\nAlles wat dit account op deze hub heeft gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:31
+#, php-format
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channels censored/uncensored"
+msgstr[0] "%s kanaal gecensureerd/ongecensureerd"
+msgstr[1] "%s kanalen gecensureerd/ongecensureerd"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:40
+#, php-format
+msgid "%s channel code allowed/disallowed"
+msgid_plural "%s channels code allowed/disallowed"
+msgstr[0] "Scripts toegestaan/niet toegestaan voor %s kanaal"
+msgstr[1] "Scripts toegestaan/niet toegestaan voor %s kanalen"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:46
+#, php-format
+msgid "%s channel deleted"
+msgid_plural "%s channels deleted"
+msgstr[0] "%s kanaal verwijderd"
+msgstr[1] "%s kanalen verwijderd"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:65
+msgid "Channel not found"
+msgstr "Kanaal niet gevonden"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:75
+#, php-format
+msgid "Channel '%s' deleted"
+msgstr "Kanaal '%s' verwijderd"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:87
+#, php-format
+msgid "Channel '%s' censored"
+msgstr "Kanaal '%s' gecensureerd"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:87
+#, php-format
+msgid "Channel '%s' uncensored"
+msgstr "Kanaal '%s' ongecensureerd"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:98
+#, php-format
+msgid "Channel '%s' code allowed"
+msgstr "Scripts toegestaan voor kanaal '%s'"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:98
+#, php-format
+msgid "Channel '%s' code disallowed"
+msgstr "Scripts niet toegestaan voor kanaal '%s'"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1563
+msgid "Channels"
+msgstr "Kanalen"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:150
+msgid "Censor"
+msgstr "Censureren"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:151
+msgid "Uncensor"
+msgstr "Niet censureren"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:152
+msgid "Allow Code"
+msgstr "Scripts toestaan"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:153
+msgid "Disallow Code"
+msgstr "Scripts niet toestaan"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:154
+#: ../../include/conversation.php:1653
+msgid "Channel"
+msgstr "Kanaal"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:158
+msgid "UID"
+msgstr "UID"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:162
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Geselecteerde kanalen worden verwijderd!\\n\\nAlles wat in deze kanalen op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
+
+#: ../../Zotlabs/Module/Admin/Channels.php:163
+msgid ""
+"The channel {0} will be deleted!\\n\\nEverything that was posted in this "
+"channel on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Kanaal {0} wordt verwijderd!\\n\\nAlles wat in dit kanaal op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:19
+msgid "Update has been marked successful"
+msgstr "Update is als succesvol gemarkeerd"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:29
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "Uitvoeren van %s is mislukt. Controleer systeemlogboek."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:32
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "Update %s was geslaagd."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:36
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "Update %s gaf geen melding. Het is daarom niet bekend of deze geslaagd is."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:39
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "Update-functie %s kon niet gevonden worden."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:55
+msgid "No failed updates."
+msgstr "Geen mislukte updates."
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:59
+msgid "Failed Updates"
+msgstr "Mislukte updates"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:61
+msgid "Mark success (if update was manually applied)"
+msgstr "Markeer als geslaagd (wanneer de update handmatig was uitgevoerd)"
+
+#: ../../Zotlabs/Module/Admin/Dbsync.php:62
+msgid "Attempt to execute this update step automatically"
+msgstr "Poging om deze stap van de update automatisch uit te voeren."
+
+#: ../../Zotlabs/Module/Admin/Site.php:133
msgid "Site settings updated."
msgstr "Hub-instellingen bijgewerkt."
-#: ../../Zotlabs/Module/Admin/Site.php:162 ../../include/text.php:2942
+#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2918
msgid "Default"
msgstr "Standaard"
-#: ../../Zotlabs/Module/Admin/Site.php:172
-#: ../../Zotlabs/Module/Settings/Display.php:141
+#: ../../Zotlabs/Module/Admin/Site.php:169
+#: ../../Zotlabs/Module/Settings/Display.php:143
msgid "mobile"
msgstr "mobiel"
-#: ../../Zotlabs/Module/Admin/Site.php:174
+#: ../../Zotlabs/Module/Admin/Site.php:171
msgid "experimental"
msgstr "experimenteel"
-#: ../../Zotlabs/Module/Admin/Site.php:176
+#: ../../Zotlabs/Module/Admin/Site.php:173
msgid "unsupported"
msgstr "Niet ondersteund"
-#: ../../Zotlabs/Module/Admin/Site.php:221
-#: ../../Zotlabs/Module/Connedit.php:408 ../../Zotlabs/Module/Connedit.php:686
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-#: ../../Zotlabs/Module/Api.php:85 ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168
-#: ../../Zotlabs/Module/Profiles.php:647 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Photos.php:653 ../../Zotlabs/Module/Events.php:462
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:472
-#: ../../Zotlabs/Module/Settings/Channel.php:289
-#: ../../Zotlabs/Module/Settings/Display.php:101 ../../include/dir_fns.php:143
-#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
-#: ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1743
-msgid "No"
-msgstr "Nee"
-
-#: ../../Zotlabs/Module/Admin/Site.php:222
+#: ../../Zotlabs/Module/Admin/Site.php:219
msgid "Yes - with approval"
msgstr "Ja - met goedkeuring"
-#: ../../Zotlabs/Module/Admin/Site.php:223
-#: ../../Zotlabs/Module/Connedit.php:408 ../../Zotlabs/Module/Menu.php:100
-#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Api.php:84
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168
-#: ../../Zotlabs/Module/Profiles.php:647 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Photos.php:653 ../../Zotlabs/Module/Events.php:462
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:472
-#: ../../Zotlabs/Module/Settings/Channel.php:289
-#: ../../Zotlabs/Module/Settings/Display.php:101 ../../include/dir_fns.php:143
-#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
-#: ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1743
-msgid "Yes"
-msgstr "Ja"
-
-#: ../../Zotlabs/Module/Admin/Site.php:228
+#: ../../Zotlabs/Module/Admin/Site.php:225
msgid "My site is not a public server"
msgstr "Mijn $Projectname-hub is niet openbaar"
-#: ../../Zotlabs/Module/Admin/Site.php:229
+#: ../../Zotlabs/Module/Admin/Site.php:226
msgid "My site has paid access only"
msgstr "Mijn $Projectname-hub kent alleen betaalde toegang"
-#: ../../Zotlabs/Module/Admin/Site.php:230
+#: ../../Zotlabs/Module/Admin/Site.php:227
msgid "My site has free access only"
msgstr "Mijn $Projectname-hub kent alleen gratis toegang"
-#: ../../Zotlabs/Module/Admin/Site.php:231
+#: ../../Zotlabs/Module/Admin/Site.php:228
msgid "My site offers free accounts with optional paid upgrades"
msgstr "Mijn $Projectname-hub biedt gratis accounts aan met betaalde uitbreidingen als optie"
-#: ../../Zotlabs/Module/Admin/Site.php:242 ../../Zotlabs/Module/Setup.php:336
+#: ../../Zotlabs/Module/Admin/Site.php:239 ../../Zotlabs/Module/Setup.php:328
msgid "Basic/Minimal Social Networking"
msgstr "Basic/eenvoudig sociaal netwerk"
-#: ../../Zotlabs/Module/Admin/Site.php:243 ../../Zotlabs/Module/Setup.php:337
+#: ../../Zotlabs/Module/Admin/Site.php:240 ../../Zotlabs/Module/Setup.php:329
msgid "Standard Configuration (default)"
msgstr "Standaard (standaard)"
-#: ../../Zotlabs/Module/Admin/Site.php:244 ../../Zotlabs/Module/Setup.php:338
+#: ../../Zotlabs/Module/Admin/Site.php:241 ../../Zotlabs/Module/Setup.php:330
msgid "Professional"
msgstr "Professioneel "
-#: ../../Zotlabs/Module/Admin/Site.php:249
-#: ../../Zotlabs/Module/Settings/Account.php:105
+#: ../../Zotlabs/Module/Admin/Site.php:245 ../../Zotlabs/Lib/Techlevels.php:10
msgid "Beginner/Basic"
msgstr "Beginner/basic"
-#: ../../Zotlabs/Module/Admin/Site.php:250
-#: ../../Zotlabs/Module/Settings/Account.php:106
+#: ../../Zotlabs/Module/Admin/Site.php:246 ../../Zotlabs/Lib/Techlevels.php:11
msgid "Novice - not skilled but willing to learn"
msgstr "Onervaren - niet bekwaam, maar wil graag leren"
-#: ../../Zotlabs/Module/Admin/Site.php:251
-#: ../../Zotlabs/Module/Settings/Account.php:107
+#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Lib/Techlevels.php:12
msgid "Intermediate - somewhat comfortable"
msgstr "Ervaren - voelt zich enigszins comfortabel"
-#: ../../Zotlabs/Module/Admin/Site.php:252
-#: ../../Zotlabs/Module/Settings/Account.php:108
+#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Lib/Techlevels.php:13
msgid "Advanced - very comfortable"
msgstr "Gevorderd - voelt zich comfortabel"
-#: ../../Zotlabs/Module/Admin/Site.php:253
-#: ../../Zotlabs/Module/Settings/Account.php:109
+#: ../../Zotlabs/Module/Admin/Site.php:249 ../../Zotlabs/Lib/Techlevels.php:14
msgid "Expert - I can write computer code"
msgstr "Expert - kan programmeren"
-#: ../../Zotlabs/Module/Admin/Site.php:254
-#: ../../Zotlabs/Module/Settings/Account.php:110
+#: ../../Zotlabs/Module/Admin/Site.php:250 ../../Zotlabs/Lib/Techlevels.php:15
msgid "Wizard - I probably know more than you do"
msgstr "Tovenaar - ik weet waarschijnlijk meer dan jij"
-#: ../../Zotlabs/Module/Admin/Site.php:266 ../../include/widgets.php:1560
+#: ../../Zotlabs/Module/Admin/Site.php:259 ../../include/widgets.php:1561
msgid "Site"
msgstr "Hub-instellingen"
-#: ../../Zotlabs/Module/Admin/Site.php:268
-#: ../../Zotlabs/Module/Register.php:253
-msgid "Registration"
-msgstr "Registratie"
-
-#: ../../Zotlabs/Module/Admin/Site.php:269
+#: ../../Zotlabs/Module/Admin/Site.php:262
msgid "File upload"
msgstr "Bestand uploaden"
-#: ../../Zotlabs/Module/Admin/Site.php:270
+#: ../../Zotlabs/Module/Admin/Site.php:263
msgid "Policies"
msgstr "Beleid"
-#: ../../Zotlabs/Module/Admin/Site.php:271
+#: ../../Zotlabs/Module/Admin/Site.php:264
#: ../../include/contact_widgets.php:16
msgid "Advanced"
msgstr "Geavanceerd"
-#: ../../Zotlabs/Module/Admin/Site.php:275
+#: ../../Zotlabs/Module/Admin/Site.php:268
+#: ../../extend/addon/addon/statusnet/statusnet.php:890
msgid "Site name"
-msgstr "Naam van deze $Projectname-hub"
+msgstr "Hubnaam"
-#: ../../Zotlabs/Module/Admin/Site.php:277 ../../Zotlabs/Module/Setup.php:359
+#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Module/Setup.php:351
msgid "Server Configuration/Role"
msgstr "Configuratietype hub"
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:272
msgid "Site default technical skill level"
msgstr "Standaard technisch niveau voor deze hub"
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:272
msgid "Used to provide a member experience matched to technical comfort level"
msgstr "Wordt gebruikt om leden een gebruikerservaring te bieden die met hun technisch niveau overeenkomt"
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:274
msgid "Lock the technical skill level setting"
msgstr "Vergrendel de functie 'Standaard technisch niveau voor deze hub'"
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:274
msgid "Members can set their own technical comfort level by default"
msgstr "Leden kunnen hun eigen technisch niveau standaard instellen"
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:276
msgid "Banner/Logo"
msgstr "Banner/logo"
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:277
msgid "Administrator Information"
msgstr "Informatie over de beheerder"
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:277
msgid ""
"Contact information for site administrators. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Contactinformatie voor hub-beheerders. Getoond op pagina met hub-informatie. Er kan hier bbcode gebruikt worden."
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Siteinfo.php:23
+msgid "Site Information"
+msgstr "Hub-informatie"
+
+#: ../../Zotlabs/Module/Admin/Site.php:278
+msgid ""
+"Publicly visible description of this site. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Openbaar zichtbare beschrijving van deze hub. Getoond op pagina met hub-informatie. Er kan hier bbcode gebruikt worden."
+
+#: ../../Zotlabs/Module/Admin/Site.php:279
msgid "System language"
msgstr "Standaardtaal"
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:280
msgid "System theme"
msgstr "Standaardthema"
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:280
msgid ""
"Default system theme - may be over-ridden by user profiles - <a href='#' "
"id='cnftheme'>change theme settings</a>"
msgstr "Standaardthema voor $Projectname-hub (kan door lid veranderd worden) - <a href='#' id='cnftheme'>verander thema-instellingen</a>"
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Mobile system theme"
msgstr "Standaardthema voor mobiel"
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Theme for mobile devices"
msgstr "Thema voor mobiele apparaten"
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "Allow Feeds as Connections"
msgstr "Sta feeds toe als connecties"
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "(Heavy system resource usage)"
msgstr "(sterk negatieve invloed op systeembronnen hub)"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:284
msgid "Maximum image size"
msgstr "Maximale grootte van afbeeldingen"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:284
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr "Maximale grootte in bytes voor afbeeldingen die worden geüpload. Standaard is 0, wat geen limiet betekend."
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:285
msgid "Does this site allow new member registration?"
msgstr "Staat deze hub nieuwe accounts toe?"
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid "Invitation only"
msgstr "Alleen op uitnodiging"
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid ""
"Only allow new member registrations with an invitation code. Above register "
"policy must be set to Yes."
msgstr "Sta alleen nieuwe registraties toe van mensen die een uitnodigingscode hebben. Bovenstaand accountbeleid moet op Ja staan."
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:287
msgid "Which best describes the types of account offered by this hub?"
msgstr "Wat voor soort accounts biedt deze $Projectname-hub aan? Kies wat het meest in de buurt komt."
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:288
msgid "Register text"
msgstr "Tekst tijdens registratie"
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:288
msgid "Will be displayed prominently on the registration page."
msgstr "Tekst dat op de pagina voor het registreren van nieuwe accounts wordt getoond."
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid "Site homepage to show visitors (default: login box)"
msgstr "Homepagina van deze hub die aan bezoekers wordt getoond (standaard: inlogformulier)"
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid ""
"example: 'public' to show public stream, 'page/sys/home' to show a system "
"webpage called 'home' or 'include:home.html' to include a file."
msgstr "voorbeeld: 'public' om de openbare stream te tonen, 'page/sys/home' om de webpagina 'home' van het systeemkanaal te tonen of 'include:home.html' om een gewoon bestand te gebruiken."
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid "Preserve site homepage URL"
msgstr "Behoudt de URL van de hub (/)"
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid ""
"Present the site homepage in a frame at the original location instead of "
"redirecting"
msgstr "Toon de homepagina van de hub in een frame op de oorspronkelijke locatie (/), i.p.v. een doorverwijzing naar een andere locatie (bv. .../home.html)"
-#: ../../Zotlabs/Module/Admin/Site.php:298
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Accounts abandoned after x days"
msgstr "Accounts als verlaten beschouwen na zoveel aantal dagen:"
-#: ../../Zotlabs/Module/Admin/Site.php:298
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr "Zal geen systeembronnen verspillen door polling van externe hubs voor verlaten accounts. Vul 0 in voor geen tijdslimiet."
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid "Allowed friend domains"
msgstr "Toegestane domeinen"
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid ""
"Comma separated list of domains which are allowed to establish friendships "
"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr "Komma-gescheiden lijst van domeinen waarvan kanalen connecties kunnen aangaan met kanalen op deze $Projectname-hub. Wildcards zijn toegestaan.\nLaat leeg om alle domeinen toe te laten."
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Verify Email Addresses"
msgstr "E-mailadres verifieren"
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid ""
"Check to verify email addresses used in account registration (recommended)."
msgstr "Inschakelen om e-mailadressen te verifiëren die tijdens de accountregistratie worden gebruikt (aanbevolen)."
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:294
msgid "Force publish"
msgstr "Dwing kanaalvermelding af"
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:294
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr "Vink dit aan om af te dwingen dat alle kanalen op deze hub in de kanalengids worden vermeld."
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid "Import Public Streams"
msgstr "Openbare streams importeren"
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid ""
"Import and allow access to public content pulled from other sites. Warning: "
"this content is unmoderated."
msgstr "Toegang verlenen tot openbare berichten die vanuit andere hubs worden geïmporteerd. Waarschuwing: de inhoud van deze berichten wordt niet gemodereerd."
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Login on Homepage"
msgstr "Inlogformulier op de homepagina"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid ""
"Present a login box to visitors on the home page if no other content has "
"been configured."
msgstr "Toon een inlogformulier voor bezoekers op de homepagina wanneer geen andere inhoud is geconfigureerd. "
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid "Enable context help"
msgstr "Schakel contextuele hulp in"
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid ""
"Display contextual help for the current page when the help button is "
"pressed."
msgstr "Toon hulp en documentatie voor de op dat moment getoonde pagina, wanneer op de hulp-knop wordt geklikt."
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "Directory Server URL"
msgstr "Server-URL voor de kanalengids"
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "Default directory server"
msgstr "Standaardserver voor de kanalengids"
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:301
msgid "Proxy user"
msgstr "Gebruikersnaam proxy"
-#: ../../Zotlabs/Module/Admin/Site.php:309
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "Proxy URL"
msgstr "Proxy-URL"
-#: ../../Zotlabs/Module/Admin/Site.php:310
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Network timeout"
msgstr "Netwerktimeout"
-#: ../../Zotlabs/Module/Admin/Site.php:310
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr "Waarde is in seconden. Zet op 0 voor onbeperkt (niet aanbevolen)"
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid "Delivery interval"
msgstr "Afleveringsinterval"
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid ""
"Delay background delivery processes by this many seconds to reduce system "
"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
"for large dedicated servers."
msgstr "Vertraag de achtergrondprocessen voor het afleveren met een aantal seconden om de systeembelasting te verminderen. Aanbevolen: 4-5 voor shared hosts, 2-3 voor virtual private servers (VPS) en 0-1 voor grote dedicated servers."
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid "Deliveries per process"
msgstr "Leveringen per serverproces"
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid ""
"Number of deliveries to attempt in a single operating system process. Adjust"
" if necessary to tune system performance. Recommend: 1-5."
msgstr "Aantal leveringen die aan één serverproces worden meegegeven. Pas dit aan wanneer het nodig is om systeemprestaties te verbeteren. Aangeraden: 1-5"
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid "Poll interval"
msgstr "Poll-interval"
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid ""
"Delay background polling processes by this many seconds to reduce system "
"load. If 0, use delivery interval."
msgstr "De achtergrondprocessen voor het afleveren met zoveel seconden vertragen om de systeembelasting te verminderen. 0 om de afleveringsinterval te gebruiken."
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Maximum Load Average"
msgstr "Maximaal gemiddelde systeembelasting"
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default 50."
msgstr "Maximale systeembelasting voordat de afleverings- en polllingsprocessen worden uitgesteld. Standaard is 50."
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "Expiration period in days for imported (grid/network) content"
msgstr "Aantal dagen waarna geïmporteerde inhoud uit iemands grid/netwerk-pagina wordt verwijderd."
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "0 for no expiration of imported content"
msgstr "Dit geldt alleen voor inhoud van andere kanalen, dus niet voor iemands eigen kanaal. 0 voor het niet verwijderen van geïmporteerde inhoud."
-#: ../../Zotlabs/Module/Admin/Themes.php:18
-msgid "Theme settings updated."
-msgstr "Thema-instellingen bijgewerkt."
-
-#: ../../Zotlabs/Module/Admin/Themes.php:58
-msgid "No themes found."
-msgstr "Geen thema's gevonden"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:114
-msgid "Screenshot"
-msgstr "Schermafdruk"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:121
-#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1566
-msgid "Themes"
-msgstr "Thema's"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:160
-msgid "[Experimental]"
-msgstr "[Experimenteel]"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:161
-msgid "[Unsupported]"
-msgstr "[Niet ondersteund]"
-
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:222
-#: ../../include/nav.php:95 ../../include/conversation.php:1672
-msgid "Photos"
-msgstr "Foto's"
-
-#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
-msgid "Invalid item."
-msgstr "Ongeldig item."
-
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Block.php:43
-#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Wall_upload.php:33
-msgid "Channel not found."
-msgstr "Kanaal niet gevonden."
-
-#: ../../Zotlabs/Module/Page.php:131
-msgid ""
-"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
-"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
-" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
-"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
-"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
-"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "Save to Folder:"
-msgstr "Bewaar in map: "
-
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "- select -"
-msgstr "- kies map -"
-
-#: ../../Zotlabs/Module/Mail.php:38
-msgid "Unable to lookup recipient."
-msgstr "Niet in staat om ontvanger op te zoeken."
-
-#: ../../Zotlabs/Module/Mail.php:45
-msgid "Unable to communicate with requested channel."
-msgstr "Niet in staat om met het aangevraagde kanaal te communiceren."
-
-#: ../../Zotlabs/Module/Mail.php:52
-msgid "Cannot verify requested channel."
-msgstr "Kan opgevraagd kanaal niet verifieren"
-
-#: ../../Zotlabs/Module/Mail.php:70
-msgid "Selected channel has private message restrictions. Send failed."
-msgstr "Gekozen kanaal heeft restricties voor privéberichten. Verzenden mislukt."
-
-#: ../../Zotlabs/Module/Mail.php:135
-msgid "Messages"
-msgstr "Berichten"
-
-#: ../../Zotlabs/Module/Mail.php:170
-msgid "Message recalled."
-msgstr "Bericht ingetrokken."
-
-#: ../../Zotlabs/Module/Mail.php:183
-msgid "Conversation removed."
-msgstr "Conversatie verwijderd"
-
-#: ../../Zotlabs/Module/Mail.php:197 ../../Zotlabs/Module/Mail.php:306
-#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1184
-msgid "Please enter a link URL:"
-msgstr "Vul een URL in:"
-
-#: ../../Zotlabs/Module/Mail.php:198 ../../Zotlabs/Module/Mail.php:307
-msgid "Expires YYYY-MM-DD HH:MM"
-msgstr "Verloopt op DD-MM-YYYY om HH:MM"
-
-#: ../../Zotlabs/Module/Mail.php:226
-msgid "Requested channel is not in this network"
-msgstr "Opgevraagd kanaal is niet in dit netwerk beschikbaar"
-
-#: ../../Zotlabs/Module/Mail.php:234
-msgid "Send Private Message"
-msgstr "Privébericht versturen"
-
-#: ../../Zotlabs/Module/Mail.php:235 ../../Zotlabs/Module/Mail.php:360
-msgid "To:"
-msgstr "Aan:"
-
-#: ../../Zotlabs/Module/Mail.php:238 ../../Zotlabs/Module/Mail.php:362
-msgid "Subject:"
-msgstr "Onderwerp:"
-
-#: ../../Zotlabs/Module/Mail.php:241 ../../Zotlabs/Module/Invite.php:135
-msgid "Your message:"
-msgstr "Jouw bericht:"
-
-#: ../../Zotlabs/Module/Mail.php:243 ../../Zotlabs/Module/Mail.php:368
-#: ../../include/conversation.php:1244
-msgid "Attach file"
-msgstr "Bestand toevoegen"
-
-#: ../../Zotlabs/Module/Mail.php:244 ../../Zotlabs/Module/Mail.php:369
-#: ../../Zotlabs/Module/Editblock.php:111
-#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Chat.php:207
-#: ../../include/conversation.php:1149
-msgid "Insert web link"
-msgstr "Weblink invoegen"
-
-#: ../../Zotlabs/Module/Mail.php:245
-msgid "Send"
-msgstr "Verzenden"
-
-#: ../../Zotlabs/Module/Mail.php:248 ../../Zotlabs/Module/Mail.php:373
-#: ../../include/conversation.php:1289
-msgid "Set expiration date"
-msgstr "Verloopdatum instellen"
-
-#: ../../Zotlabs/Module/Mail.php:250 ../../Zotlabs/Module/Mail.php:375
-#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:737
-#: ../../include/conversation.php:1294
-msgid "Encrypt text"
-msgstr "Tekst versleutelen"
-
-#: ../../Zotlabs/Module/Mail.php:332
-msgid "Delete message"
-msgstr "Bericht verwijderen"
-
-#: ../../Zotlabs/Module/Mail.php:333
-msgid "Delivery report"
-msgstr "Afleveringsrapport"
-
-#: ../../Zotlabs/Module/Mail.php:334
-msgid "Recall message"
-msgstr "Bericht intrekken"
-
-#: ../../Zotlabs/Module/Mail.php:336
-msgid "Message has been recalled."
-msgstr "Bericht is ingetrokken."
-
-#: ../../Zotlabs/Module/Mail.php:353
-msgid "Delete Conversation"
-msgstr "Verwijder conversatie"
-
-#: ../../Zotlabs/Module/Mail.php:355
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Geen veilige communicatie beschikbaar. <strong>Mogelijk</strong> kan je reageren op de kanaalpagina van de afzender."
-
-#: ../../Zotlabs/Module/Mail.php:359
-msgid "Send Reply"
-msgstr "Antwoord versturen"
-
-#: ../../Zotlabs/Module/Mail.php:364
-#, php-format
-msgid "Your message for %s (%s):"
-msgstr "Jouw privébericht aan %s (%s):"
-
-#: ../../Zotlabs/Module/Connections.php:56
-#: ../../Zotlabs/Module/Connections.php:161
-#: ../../Zotlabs/Module/Connections.php:242
-msgid "Blocked"
-msgstr "Geblokkeerd"
-
-#: ../../Zotlabs/Module/Connections.php:61
-#: ../../Zotlabs/Module/Connections.php:168
-#: ../../Zotlabs/Module/Connections.php:241
-msgid "Ignored"
-msgstr "Genegeerd"
-
-#: ../../Zotlabs/Module/Connections.php:66
-#: ../../Zotlabs/Module/Connections.php:182
-#: ../../Zotlabs/Module/Connections.php:240
-msgid "Hidden"
-msgstr "Verborgen"
-
-#: ../../Zotlabs/Module/Connections.php:71
-#: ../../Zotlabs/Module/Connections.php:175
-#: ../../Zotlabs/Module/Connections.php:239
-msgid "Archived"
-msgstr "Gearchiveerd"
-
-#: ../../Zotlabs/Module/Connections.php:76
-#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1573
-msgid "New"
-msgstr "Nieuw"
-
-#: ../../Zotlabs/Module/Connections.php:92
-#: ../../Zotlabs/Module/Connections.php:107
-#: ../../Zotlabs/Module/Connedit.php:629 ../../include/widgets.php:533
-msgid "All"
-msgstr "Alles"
-
-#: ../../Zotlabs/Module/Connections.php:138
-msgid "New Connections"
-msgstr "Nieuwe connecties"
-
-#: ../../Zotlabs/Module/Connections.php:141
-msgid "Show pending (new) connections"
-msgstr "Nog te accepteren (nieuwe) connecties weergeven"
-
-#: ../../Zotlabs/Module/Connections.php:145
-#: ../../Zotlabs/Module/Profperm.php:144
-msgid "All Connections"
-msgstr "Alle connecties"
-
-#: ../../Zotlabs/Module/Connections.php:148
-msgid "Show all connections"
-msgstr "Toon alle connecties"
-
-#: ../../Zotlabs/Module/Connections.php:164
-msgid "Only show blocked connections"
-msgstr "Toon alleen geblokkeerde connecties"
-
-#: ../../Zotlabs/Module/Connections.php:171
-msgid "Only show ignored connections"
-msgstr "Toon alleen genegeerde connecties"
-
-#: ../../Zotlabs/Module/Connections.php:178
-msgid "Only show archived connections"
-msgstr "Toon alleen gearchiveerde connecties"
-
-#: ../../Zotlabs/Module/Connections.php:185
-msgid "Only show hidden connections"
-msgstr "Toon alleen verborgen connecties"
-
-#: ../../Zotlabs/Module/Connections.php:238
-msgid "Pending approval"
-msgstr "Moet nog geaccepteerd worden"
-
-#: ../../Zotlabs/Module/Connections.php:254
-#, php-format
-msgid "%1$s [%2$s]"
-msgstr "%1$s [%2$s]"
-
-#: ../../Zotlabs/Module/Connections.php:255
-msgid "Edit connection"
-msgstr "Connectie bewerken"
-
-#: ../../Zotlabs/Module/Connections.php:256
-msgid "Delete connection"
-msgstr "Connectie verwijderen"
-
-#: ../../Zotlabs/Module/Connections.php:265
-msgid "Channel address"
-msgstr "Kanaaladres"
-
-#: ../../Zotlabs/Module/Connections.php:267
-msgid "Network"
-msgstr "Netwerk"
-
-#: ../../Zotlabs/Module/Connections.php:270
-msgid "Status"
-msgstr "Status"
-
-#: ../../Zotlabs/Module/Connections.php:272
-msgid "Connected"
-msgstr "Verbonden"
-
-#: ../../Zotlabs/Module/Connections.php:274
-msgid "Approve connection"
-msgstr "Connectie accepteren"
-
-#: ../../Zotlabs/Module/Connections.php:276
-msgid "Ignore connection"
-msgstr "Connectie negeren"
-
-#: ../../Zotlabs/Module/Connections.php:277
-#: ../../Zotlabs/Module/Connedit.php:583
-#: ../../Zotlabs/Module/Notifications.php:55
-msgid "Ignore"
-msgstr "Negeren"
-
-#: ../../Zotlabs/Module/Connections.php:278
-msgid "Recent activity"
-msgstr "Recente activiteit"
-
-#: ../../Zotlabs/Module/Connections.php:302 ../../Zotlabs/Lib/Apps.php:209
-#: ../../include/text.php:901 ../../include/nav.php:191
-msgid "Connections"
-msgstr "Connecties"
-
-#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44
-#: ../../Zotlabs/Lib/Apps.php:230 ../../include/text.php:971
-#: ../../include/text.php:983 ../../include/acl_selectors.php:174
-#: ../../include/nav.php:170 ../../include/widgets.php:315
-msgid "Search"
-msgstr "Zoeken"
-
-#: ../../Zotlabs/Module/Connections.php:307
-msgid "Search your connections"
-msgstr "Doorzoek jouw connecties"
-
-#: ../../Zotlabs/Module/Connections.php:308
-msgid "Connections search"
-msgstr "Connecties zoeken"
-
-#: ../../Zotlabs/Module/Connections.php:309
-#: ../../Zotlabs/Module/Directory.php:388
-#: ../../Zotlabs/Module/Directory.php:393 ../../include/contact_widgets.php:23
-msgid "Find"
-msgstr "Vinden"
-
-#: ../../Zotlabs/Module/Cover_photo.php:58
-#: ../../Zotlabs/Module/Profile_photo.php:61
-msgid "Image uploaded but image cropping failed."
-msgstr "Afbeelding geüpload, maar afbeelding kon niet worden bijgesneden. "
-
-#: ../../Zotlabs/Module/Cover_photo.php:134
-#: ../../Zotlabs/Module/Cover_photo.php:181
-msgid "Cover Photos"
-msgstr "Omslagfoto's"
-
-#: ../../Zotlabs/Module/Cover_photo.php:154
-#: ../../Zotlabs/Module/Profile_photo.php:135
-msgid "Image resize failed."
-msgstr "Afbeelding kon niet van grootte veranderd worden."
-
-#: ../../Zotlabs/Module/Cover_photo.php:168
-#: ../../Zotlabs/Module/Profile_photo.php:196 ../../include/photos.php:148
-msgid "Unable to process image"
-msgstr "Afbeelding kan niet verwerkt worden"
-
-#: ../../Zotlabs/Module/Cover_photo.php:192
-#: ../../Zotlabs/Module/Profile_photo.php:223
-msgid "Image upload failed."
-msgstr "Uploaden afbeelding mislukt"
-
-#: ../../Zotlabs/Module/Cover_photo.php:210
-#: ../../Zotlabs/Module/Profile_photo.php:242
-msgid "Unable to process image."
-msgstr "Niet in staat om afbeelding te verwerken."
-
-#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4341
-msgid "female"
-msgstr "vrouw"
-
-#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4342
-#, php-format
-msgid "%1$s updated her %2$s"
-msgstr "%1$s heeft haar %2$s bijgewerkt"
-
-#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4343
-msgid "male"
-msgstr "man"
-
-#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4344
-#, php-format
-msgid "%1$s updated his %2$s"
-msgstr "%1$s heeft zijn %2$s bijgewerkt"
-
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4346
-#, php-format
-msgid "%1$s updated their %2$s"
-msgstr "De %2$s van %1$s is bijgewerkt"
-
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1731
-msgid "cover photo"
-msgstr "omslagfoto"
-
-#: ../../Zotlabs/Module/Cover_photo.php:303
-#: ../../Zotlabs/Module/Cover_photo.php:318
-#: ../../Zotlabs/Module/Profile_photo.php:300
-#: ../../Zotlabs/Module/Profile_photo.php:341
-msgid "Photo not available."
-msgstr "Foto niet beschikbaar."
-
-#: ../../Zotlabs/Module/Cover_photo.php:354
-#: ../../Zotlabs/Module/Profile_photo.php:387
-msgid "Upload File:"
-msgstr "Bestand uploaden:"
-
-#: ../../Zotlabs/Module/Cover_photo.php:355
-#: ../../Zotlabs/Module/Profile_photo.php:388
-msgid "Select a profile:"
-msgstr "Kies een profiel:"
-
-#: ../../Zotlabs/Module/Cover_photo.php:356
-msgid "Upload Cover Photo"
-msgstr "Omslagfoto uploaden"
-
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:396
-#: ../../Zotlabs/Module/Settings/Channel.php:399
-msgid "or"
-msgstr "of"
-
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:396
-msgid "skip this step"
-msgstr "sla deze stap over"
-
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:396
-msgid "select a photo from your photo albums"
-msgstr "Kies een foto uit jouw fotoalbums"
-
-#: ../../Zotlabs/Module/Cover_photo.php:377
-#: ../../Zotlabs/Module/Profile_photo.php:415
-msgid "Crop Image"
-msgstr "Afbeelding bijsnijden"
-
-#: ../../Zotlabs/Module/Cover_photo.php:378
-#: ../../Zotlabs/Module/Profile_photo.php:416
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Snij de afbeelding zo uit dat deze optimaal wordt weergegeven."
-
-#: ../../Zotlabs/Module/Cover_photo.php:380
-#: ../../Zotlabs/Module/Profile_photo.php:418
-msgid "Done Editing"
-msgstr "Klaar met bewerken"
-
-#: ../../Zotlabs/Module/Rpost.php:138 ../../Zotlabs/Module/Editpost.php:106
-msgid "Edit post"
-msgstr "Bericht bewerken"
-
-#: ../../Zotlabs/Module/Connedit.php:80
-msgid "Could not access contact record."
-msgstr "Kon geen toegang krijgen tot de connectie-gegevens."
-
-#: ../../Zotlabs/Module/Connedit.php:104
-msgid "Could not locate selected profile."
-msgstr "Kon het gekozen profiel niet vinden."
-
-#: ../../Zotlabs/Module/Connedit.php:256
-msgid "Connection updated."
-msgstr "Connectie bijgewerkt."
-
-#: ../../Zotlabs/Module/Connedit.php:258
-msgid "Failed to update connection record."
-msgstr "Bijwerken van connectie-gegevens mislukt."
-
-#: ../../Zotlabs/Module/Connedit.php:308
-msgid "is now connected to"
-msgstr "is nu verbonden met"
-
-#: ../../Zotlabs/Module/Connedit.php:440
-msgid "Could not access address book record."
-msgstr "Kon geen toegang krijgen tot de record van de connectie."
-
-#: ../../Zotlabs/Module/Connedit.php:460
-msgid "Refresh failed - channel is currently unavailable."
-msgstr "Vernieuwen mislukt - kanaal is momenteel niet beschikbaar"
-
-#: ../../Zotlabs/Module/Connedit.php:475 ../../Zotlabs/Module/Connedit.php:484
-#: ../../Zotlabs/Module/Connedit.php:493 ../../Zotlabs/Module/Connedit.php:502
-#: ../../Zotlabs/Module/Connedit.php:515
-msgid "Unable to set address book parameters."
-msgstr "Niet in staat om de parameters van connecties in te stellen."
-
-#: ../../Zotlabs/Module/Connedit.php:538
-msgid "Connection has been removed."
-msgstr "Connectie is verwijderd"
-
-#: ../../Zotlabs/Module/Connedit.php:554 ../../Zotlabs/Lib/Apps.php:221
-#: ../../include/nav.php:89 ../../include/conversation.php:953
-msgid "View Profile"
-msgstr "Profiel weergeven"
-
-#: ../../Zotlabs/Module/Connedit.php:557
-#, php-format
-msgid "View %s's profile"
-msgstr "Profiel van %s weergeven"
-
-#: ../../Zotlabs/Module/Connedit.php:561
-msgid "Refresh Permissions"
-msgstr "Permissies vernieuwen"
-
-#: ../../Zotlabs/Module/Connedit.php:564
-msgid "Fetch updated permissions"
-msgstr "Aangepaste permissies ophalen"
-
-#: ../../Zotlabs/Module/Connedit.php:568
-msgid "Recent Activity"
-msgstr "Recente activiteit/berichten"
-
-#: ../../Zotlabs/Module/Connedit.php:571
-msgid "View recent posts and comments"
-msgstr "Recente berichten en reacties weergeven"
-
-#: ../../Zotlabs/Module/Connedit.php:578
-msgid "Block (or Unblock) all communications with this connection"
-msgstr "Blokkeer (of deblokkeer) alle communicatie met deze connectie"
-
-#: ../../Zotlabs/Module/Connedit.php:579
-msgid "This connection is blocked!"
-msgstr "Deze connectie is geblokkeerd!"
-
-#: ../../Zotlabs/Module/Connedit.php:583
-msgid "Unignore"
-msgstr "Niet meer negeren"
-
-#: ../../Zotlabs/Module/Connedit.php:586
-msgid "Ignore (or Unignore) all inbound communications from this connection"
-msgstr "Negeer (of negeer niet meer) alle inkomende communicatie van deze connectie"
-
-#: ../../Zotlabs/Module/Connedit.php:587
-msgid "This connection is ignored!"
-msgstr "Deze connectie wordt genegeerd!"
-
-#: ../../Zotlabs/Module/Connedit.php:591
-msgid "Unarchive"
-msgstr "Niet meer archiveren"
-
-#: ../../Zotlabs/Module/Connedit.php:591
-msgid "Archive"
-msgstr "Archiveren"
-
-#: ../../Zotlabs/Module/Connedit.php:594
-msgid ""
-"Archive (or Unarchive) this connection - mark channel dead but keep content"
-msgstr "Archiveer (of dearchiveer) deze connectie - markeer het kanaal als dood, maar bewaar de inhoud"
-
-#: ../../Zotlabs/Module/Connedit.php:595
-msgid "This connection is archived!"
-msgstr "Deze connectie is gearchiveerd!"
-
-#: ../../Zotlabs/Module/Connedit.php:599
-msgid "Unhide"
-msgstr "Niet meer verbergen"
-
-#: ../../Zotlabs/Module/Connedit.php:599
-msgid "Hide"
-msgstr "Verbergen"
-
-#: ../../Zotlabs/Module/Connedit.php:602
-msgid "Hide or Unhide this connection from your other connections"
-msgstr "Deze connectie verbergen (of niet meer verbergen) voor jouw andere connecties"
-
-#: ../../Zotlabs/Module/Connedit.php:603
-msgid "This connection is hidden!"
-msgstr "Deze connectie is verborgen!"
-
-#: ../../Zotlabs/Module/Connedit.php:610
-msgid "Delete this connection"
-msgstr "Deze connectie verwijderen"
-
-#: ../../Zotlabs/Module/Connedit.php:625 ../../include/widgets.php:529
-msgid "Me"
-msgstr "Ik"
-
-#: ../../Zotlabs/Module/Connedit.php:626 ../../include/widgets.php:530
-msgid "Family"
-msgstr "Familie"
-
-#: ../../Zotlabs/Module/Connedit.php:627
-#: ../../Zotlabs/Module/Settings/Channel.php:61
-#: ../../Zotlabs/Module/Settings/Channel.php:65
-#: ../../Zotlabs/Module/Settings/Channel.php:66
-#: ../../Zotlabs/Module/Settings/Channel.php:69
-#: ../../Zotlabs/Module/Settings/Channel.php:80
-#: ../../include/selectors.php:123 ../../include/channel.php:402
-#: ../../include/channel.php:403 ../../include/channel.php:410
-#: ../../include/widgets.php:531
-msgid "Friends"
-msgstr "Vrienden"
-
-#: ../../Zotlabs/Module/Connedit.php:628 ../../include/widgets.php:532
-msgid "Acquaintances"
-msgstr "Kennissen"
-
-#: ../../Zotlabs/Module/Connedit.php:686
-msgid "Approve this connection"
-msgstr "Deze connectie accepteren"
-
-#: ../../Zotlabs/Module/Connedit.php:686
-msgid "Accept connection to allow communication"
-msgstr "Keur deze connectie goed om communicatie toe te staan"
-
-#: ../../Zotlabs/Module/Connedit.php:691
-msgid "Set Affinity"
-msgstr "Verwantschapsfilter instellen"
-
-#: ../../Zotlabs/Module/Connedit.php:694
-msgid "Set Profile"
-msgstr "Profiel instellen"
-
-#: ../../Zotlabs/Module/Connedit.php:697
-msgid "Set Affinity & Profile"
-msgstr "Verwantschapsfilter en profiel instellen"
-
-#: ../../Zotlabs/Module/Connedit.php:746
-msgid "none"
-msgstr "geen"
-
-#: ../../Zotlabs/Module/Connedit.php:750 ../../include/widgets.php:656
-msgid "Connection Default Permissions"
-msgstr "Standaard permissies voor connecties"
-
-#: ../../Zotlabs/Module/Connedit.php:750 ../../include/items.php:3993
-#, php-format
-msgid "Connection: %s"
-msgstr "Connectie: %s"
-
-#: ../../Zotlabs/Module/Connedit.php:751
-msgid "Apply these permissions automatically"
-msgstr "Deze permissies automatisch toepassen"
-
-#: ../../Zotlabs/Module/Connedit.php:751
-msgid "Connection requests will be approved without your interaction"
-msgstr "Connectieverzoeken zullen automatisch worden geaccepteerd"
-
-#: ../../Zotlabs/Module/Connedit.php:753
-msgid "This connection's primary address is"
-msgstr "Het primaire kanaaladres van deze connectie is"
-
-#: ../../Zotlabs/Module/Connedit.php:754
-msgid "Available locations:"
-msgstr "Beschikbare locaties:"
-
-#: ../../Zotlabs/Module/Connedit.php:758
-msgid ""
-"The permissions indicated on this page will be applied to all new "
-"connections."
-msgstr "Permissies die op deze pagina staan vermeld worden op alle nieuwe connecties toegepast."
-
-#: ../../Zotlabs/Module/Connedit.php:759
-msgid "Connection Tools"
-msgstr "Hulpmiddelen"
-
-#: ../../Zotlabs/Module/Connedit.php:761
-msgid "Slide to adjust your degree of friendship"
-msgstr "Schuif om te bepalen hoe goed je iemand kent en/of mag"
-
-#: ../../Zotlabs/Module/Connedit.php:762 ../../Zotlabs/Module/Rate.php:155
-#: ../../include/js_strings.php:20
-msgid "Rating"
-msgstr "Beoordeling"
-
-#: ../../Zotlabs/Module/Connedit.php:763
-msgid "Slide to adjust your rating"
-msgstr "Gebruik de schuif om je beoordeling te geven"
-
-#: ../../Zotlabs/Module/Connedit.php:764 ../../Zotlabs/Module/Connedit.php:769
-msgid "Optionally explain your rating"
-msgstr "Verklaar jouw beoordeling (niet verplicht)"
-
-#: ../../Zotlabs/Module/Connedit.php:766
-msgid "Custom Filter"
-msgstr "Berichtenfilter"
-
-#: ../../Zotlabs/Module/Connedit.php:767
-msgid "Only import posts with this text"
-msgstr "Importeer alleen berichten met deze tekst"
+#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1385
+msgid "Public Hubs"
+msgstr "Openbare hubs"
-#: ../../Zotlabs/Module/Connedit.php:767 ../../Zotlabs/Module/Connedit.php:768
+#: ../../Zotlabs/Module/Pubsites.php:27
msgid ""
-"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
-"all posts"
-msgstr "woorden (één per regel), #tags, /regex/ of talen (lang=iso639-1) - laat leeg om alle berichten te importeren"
-
-#: ../../Zotlabs/Module/Connedit.php:768
-msgid "Do not import posts with this text"
-msgstr "Importeer geen berichten met deze tekst"
-
-#: ../../Zotlabs/Module/Connedit.php:770
-msgid "This information is public!"
-msgstr "Deze informatie is openbaar!"
-
-#: ../../Zotlabs/Module/Connedit.php:775
-msgid "Connection Pending Approval"
-msgstr "Connectie moet nog geaccepteerd worden"
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
+msgstr "Op de hier weergegeven hubs kan iedereen zich voor het $Projectname-netwerk aanmelden. Alle hubs in het netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen een financiële tegemoetkoming voor bepaalde uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven."
-#: ../../Zotlabs/Module/Connedit.php:778
-#: ../../Zotlabs/Module/Settings/Tokens.php:163
-msgid "inherited"
-msgstr "geërfd"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Hub URL"
+msgstr "Hub-URL"
-#: ../../Zotlabs/Module/Connedit.php:780
-#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Kies het profiel dat je aan %s wil tonen wanneer hij/zij ingelogd jouw profiel wil bekijken."
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Access Type"
+msgstr "Toegangs-<br/>&nbsp;type"
-#: ../../Zotlabs/Module/Connedit.php:782
-#: ../../Zotlabs/Module/Settings/Tokens.php:160
-msgid "Their Settings"
-msgstr "Hun instellingen"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Registration Policy"
+msgstr "Registratie-<br/>&nbsp;beleid"
-#: ../../Zotlabs/Module/Connedit.php:783
-#: ../../Zotlabs/Module/Settings/Tokens.php:161
-msgid "My Settings"
-msgstr "Mijn instellingen"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Stats"
+msgstr "Stats"
-#: ../../Zotlabs/Module/Connedit.php:785
-#: ../../Zotlabs/Module/Settings/Tokens.php:165
-msgid "Individual Permissions"
-msgstr "Individuele permissies"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Software"
+msgstr "Software"
-#: ../../Zotlabs/Module/Connedit.php:786
-#: ../../Zotlabs/Module/Settings/Tokens.php:166
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can <strong>not</strong> change those"
-" settings here."
-msgstr "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele instellingen. Je kan je deze overgeërfde permissies hier <strong>niet</strong> veranderen."
+#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
+#: ../../include/conversation.php:940
+msgid "Ratings"
+msgstr "Beoordelingen"
-#: ../../Zotlabs/Module/Connedit.php:787
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can change those settings here but "
-"they wont have any impact unless the inherited setting changes."
-msgstr "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele permissies. Je kan de permissies hier veranderen, maar die hebben geen effect, tenzij de overgeërfde permissies worden veranderd. "
+#: ../../Zotlabs/Module/Pubsites.php:48
+msgid "Rate"
+msgstr "Beoordeel"
-#: ../../Zotlabs/Module/Connedit.php:788
-msgid "Last update:"
-msgstr "Laatste wijziging:"
+#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166
+#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Webpages.php:246
+#: ../../Zotlabs/Module/Wiki.php:146 ../../Zotlabs/Module/Events.php:685
+#: ../../include/page_widgets.php:42
+msgid "View"
+msgstr "Weergeven"
-#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
#: ../../Zotlabs/Module/Editlayout.php:79
#: ../../Zotlabs/Module/Editwebpage.php:80
+#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
#: ../../Zotlabs/Module/Editpost.php:24
msgid "Item not found"
msgstr "Item niet gevonden"
-#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
-#: ../../Zotlabs/Module/Blocks.php:155
-msgid "Block Name"
-msgstr "Bloknaam"
-
-#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1260
-msgid "Title (optional)"
-msgstr "Titel (optioneel)"
-
-#: ../../Zotlabs/Module/Editblock.php:133
-msgid "Edit Block"
-msgstr "Blok bewerken"
-
#: ../../Zotlabs/Module/Editlayout.php:127
#: ../../Zotlabs/Module/Layouts.php:128 ../../Zotlabs/Module/Layouts.php:188
msgid "Layout Name"
@@ -2492,10 +2889,67 @@ msgstr "Lay-out bewerken"
msgid "Page link"
msgstr "Paginalink"
+#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:286
+#: ../../Zotlabs/Module/Mail.php:411 ../../Zotlabs/Module/Editblock.php:111
+#: ../../Zotlabs/Module/Chat.php:207 ../../include/conversation.php:1147
+msgid "Insert web link"
+msgstr "Weblink invoegen"
+
#: ../../Zotlabs/Module/Editwebpage.php:169
msgid "Edit Webpage"
msgstr "Webpagina bewerken"
+#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:224
+#: ../../include/nav.php:95 ../../include/conversation.php:1674
+msgid "Photos"
+msgstr "Foto's"
+
+#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Wiki.php:20
+#: ../../Zotlabs/Module/Chat.php:25
+#: ../../extend/addon/addon/chess/chess.php:400
+msgid "You must be logged in to see this page."
+msgstr "Je moet zijn ingelogd om deze pagina te kunnen bekijken."
+
+#: ../../Zotlabs/Module/Channel.php:44
+msgid "Posts and comments"
+msgstr "Berichten en reacties"
+
+#: ../../Zotlabs/Module/Channel.php:45
+msgid "Only posts"
+msgstr "Alleen berichten"
+
+#: ../../Zotlabs/Module/Channel.php:104
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Onvoldoende permissies. Doorgestuurd naar profielpagina."
+
+#: ../../Zotlabs/Module/Network.php:96
+msgid "No such group"
+msgstr "Collectie niet gevonden"
+
+#: ../../Zotlabs/Module/Network.php:136
+msgid "No such channel"
+msgstr "Niet zo'n kanaal"
+
+#: ../../Zotlabs/Module/Network.php:141
+msgid "forum"
+msgstr "forum"
+
+#: ../../Zotlabs/Module/Network.php:153
+msgid "Search Results For:"
+msgstr "Zoekresultaten voor:"
+
+#: ../../Zotlabs/Module/Network.php:221
+msgid "Privacy group is empty"
+msgstr "Privacygroep is leeg"
+
+#: ../../Zotlabs/Module/Network.php:230
+msgid "Privacy group: "
+msgstr "Privacygroep: "
+
+#: ../../Zotlabs/Module/Network.php:256
+msgid "Invalid connection."
+msgstr "Ongeldige connectie."
+
#: ../../Zotlabs/Module/Menu.php:49
msgid "Unable to update menu."
msgstr "Niet in staat om menu aan te passen"
@@ -2532,14 +2986,10 @@ msgstr "Menu kan gebruikt worden om bladwijzers in op te slaan"
msgid "Submit and proceed"
msgstr "Opslaan en doorgaan"
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2309
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2271
msgid "Menus"
msgstr "Menu's"
-#: ../../Zotlabs/Module/Menu.php:113 ../../Zotlabs/Module/Locs.php:120
-msgid "Drop"
-msgstr "Verwijderen"
-
#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Blocks.php:157
#: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Webpages.php:251
#: ../../include/page_widgets.php:47
@@ -2572,6 +3022,10 @@ msgstr "Dit menu bewerken"
msgid "Menu could not be deleted."
msgstr "Menu kon niet verwijderd worden."
+#: ../../Zotlabs/Module/Menu.php:144 ../../Zotlabs/Module/Mitem.php:28
+msgid "Menu not found."
+msgstr "Menu niet gevonden."
+
#: ../../Zotlabs/Module/Menu.php:149
msgid "Edit Menu"
msgstr "Menu bewerken"
@@ -2613,137 +3067,99 @@ msgstr "App geïnstalleerd"
msgid "Malformed app."
msgstr "Misvormde app."
-#: ../../Zotlabs/Module/Appman.php:104
+#: ../../Zotlabs/Module/Appman.php:105
msgid "Embed code"
msgstr "Insluitcode"
-#: ../../Zotlabs/Module/Appman.php:110 ../../include/widgets.php:107
+#: ../../Zotlabs/Module/Appman.php:111 ../../include/widgets.php:107
msgid "Edit App"
msgstr "App bewerken"
-#: ../../Zotlabs/Module/Appman.php:110
+#: ../../Zotlabs/Module/Appman.php:111
msgid "Create App"
msgstr "App maken"
-#: ../../Zotlabs/Module/Appman.php:115
+#: ../../Zotlabs/Module/Appman.php:116
msgid "Name of app"
msgstr "Naam van app"
-#: ../../Zotlabs/Module/Appman.php:115 ../../Zotlabs/Module/Appman.php:116
-#: ../../Zotlabs/Module/Profiles.php:709 ../../Zotlabs/Module/Profiles.php:713
-#: ../../Zotlabs/Module/Events.php:452 ../../Zotlabs/Module/Events.php:457
-#: ../../include/datetime.php:257
+#: ../../Zotlabs/Module/Appman.php:116 ../../Zotlabs/Module/Appman.php:117
+#: ../../Zotlabs/Module/Profiles.php:703 ../../Zotlabs/Module/Profiles.php:707
+#: ../../Zotlabs/Module/Events.php:453 ../../Zotlabs/Module/Events.php:458
+#: ../../include/datetime.php:259
msgid "Required"
msgstr "Vereist"
-#: ../../Zotlabs/Module/Appman.php:116
+#: ../../Zotlabs/Module/Appman.php:117
msgid "Location (URL) of app"
msgstr "Locatie (URL) van app"
-#: ../../Zotlabs/Module/Appman.php:117 ../../Zotlabs/Module/Rbmark.php:101
-#: ../../Zotlabs/Module/Events.php:465
+#: ../../Zotlabs/Module/Appman.php:118 ../../Zotlabs/Module/Rbmark.php:101
+#: ../../Zotlabs/Module/Events.php:466
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:165
msgid "Description"
msgstr "Omschrijving"
-#: ../../Zotlabs/Module/Appman.php:118
+#: ../../Zotlabs/Module/Appman.php:119
msgid "Photo icon URL"
msgstr "URL van pictogram"
-#: ../../Zotlabs/Module/Appman.php:118
+#: ../../Zotlabs/Module/Appman.php:119
msgid "80 x 80 pixels - optional"
msgstr "80 x 80 pixels (optioneel)"
-#: ../../Zotlabs/Module/Appman.php:119
+#: ../../Zotlabs/Module/Appman.php:120
msgid "Categories (optional, comma separated list)"
msgstr "Categorieën (optioneel, door komma's gescheiden lijst)"
-#: ../../Zotlabs/Module/Appman.php:120
+#: ../../Zotlabs/Module/Appman.php:121
msgid "Version ID"
msgstr "Versie-ID"
-#: ../../Zotlabs/Module/Appman.php:121
+#: ../../Zotlabs/Module/Appman.php:122
msgid "Price of app"
msgstr "Prijs van de app"
-#: ../../Zotlabs/Module/Appman.php:122
+#: ../../Zotlabs/Module/Appman.php:123
msgid "Location (URL) to purchase app"
msgstr "Locatie (URL) om de app aan te schaffen"
-#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1392
-msgid "Public Hubs"
-msgstr "Openbare hubs"
-
-#: ../../Zotlabs/Module/Pubsites.php:27
-msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
-msgstr "Op de hier weergegeven hubs kan iedereen zich voor het $Projectname-netwerk aanmelden. Alle hubs in het netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen een financiële tegemoetkoming voor bepaalde uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven."
-
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Hub URL"
-msgstr "Hub-URL"
-
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Access Type"
-msgstr "Toegangs-<br/>&nbsp;type"
-
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Registration Policy"
-msgstr "Registratie-<br/>&nbsp;beleid"
-
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Stats"
-msgstr "Stats"
-
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Software"
-msgstr "Software"
-
-#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
-#: ../../include/conversation.php:958
-msgid "Ratings"
-msgstr "Beoordelingen"
+#: ../../Zotlabs/Module/Rpost.php:138 ../../Zotlabs/Module/Editpost.php:107
+msgid "Edit post"
+msgstr "Bericht bewerken"
-#: ../../Zotlabs/Module/Pubsites.php:48
-msgid "Rate"
-msgstr "Beoordeel"
+#: ../../Zotlabs/Module/Help.php:23
+msgid "Documentation Search"
+msgstr "Zoek documentatie"
-#: ../../Zotlabs/Module/Pubsites.php:51 ../../Zotlabs/Module/Locs.php:117
-#: ../../Zotlabs/Module/Profiles.php:477 ../../Zotlabs/Module/Profiles.php:698
-#: ../../Zotlabs/Module/Events.php:467 ../../include/js_strings.php:25
-msgid "Location"
-msgstr "Locatie"
+#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1665
+msgid "About"
+msgstr "Over"
-#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166
-#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Webpages.php:246
-#: ../../Zotlabs/Module/Events.php:680 ../../include/page_widgets.php:42
-msgid "View"
-msgstr "Weergeven"
+#: ../../Zotlabs/Module/Help.php:81 ../../Zotlabs/Module/Group.php:197
+msgid "Members"
+msgstr "Kanalen"
-#: ../../Zotlabs/Module/Attach.php:13
-msgid "Item not available."
-msgstr "Item is niet aanwezig."
+#: ../../Zotlabs/Module/Help.php:82
+msgid "Administrators"
+msgstr "Beheerders"
-#: ../../Zotlabs/Module/Api.php:60 ../../Zotlabs/Module/Api.php:81
-msgid "Authorize application connection"
-msgstr "Geef toestemming voor applicatiekoppeling"
+#: ../../Zotlabs/Module/Help.php:83
+msgid "Developers"
+msgstr "Ontwikkelaars"
-#: ../../Zotlabs/Module/Api.php:61
-msgid "Return to your app and insert this Security Code:"
-msgstr "Ga terug naar je app en voeg deze beveiligingscode in:"
+#: ../../Zotlabs/Module/Help.php:84
+msgid "Tutorials"
+msgstr "Zelfstudie"
-#: ../../Zotlabs/Module/Api.php:71
-msgid "Please login to continue."
-msgstr "Inloggen om verder te kunnen gaan."
+#: ../../Zotlabs/Module/Help.php:93
+msgid "$Projectname Documentation"
+msgstr "$Projectname-documentatie"
-#: ../../Zotlabs/Module/Api.php:83
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "Wil je deze applicatie toestemming geven om jouw berichten en connecties te zien, en/of nieuwe berichten voor jou te plaatsen?"
+#: ../../Zotlabs/Module/Help.php:94
+msgid "Contents"
+msgstr "Inhoud"
#: ../../Zotlabs/Module/Ffsapi.php:12
msgid "Share content from Firefox to $Projectname"
@@ -2753,32 +3169,12 @@ msgstr "Deel webpagina's vanuit Firefox met "
msgid "Activate the Firefox $Projectname provider"
msgstr "Activeer de $Projectname-service in Firefox"
-#: ../../Zotlabs/Module/Pdledit.php:21
-msgid "Layout updated."
-msgstr "Lay-out bijgewerkt."
-
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:218
-msgid "Feature disabled."
-msgstr "Functie uitgeschakeld."
-
-#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
-msgid "Edit System Page Description"
-msgstr "Systeempagina's bewerken"
-
-#: ../../Zotlabs/Module/Pdledit.php:64
-msgid "Layout not found."
-msgstr "Lay-out niet gevonden."
-
-#: ../../Zotlabs/Module/Pdledit.php:70
-msgid "Module Name:"
-msgstr "Modulenaam:"
-
-#: ../../Zotlabs/Module/Pdledit.php:71
-msgid "Layout Help"
-msgstr "Lay-out-hulp"
+#: ../../Zotlabs/Module/Apps.php:46 ../../include/nav.php:166
+#: ../../include/widgets.php:102
+msgid "Apps"
+msgstr "Apps"
#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
-#: ../../Zotlabs/Module/Siteinfo.php:48
msgid "$Projectname"
msgstr "$Projectname"
@@ -2787,14 +3183,6 @@ msgstr "$Projectname"
msgid "Welcome to %s"
msgstr "Welkom op %s"
-#: ../../Zotlabs/Module/Lockview.php:75
-msgid "Remote privacy information not available."
-msgstr "Privacy-informatie op afstand niet beschikbaar."
-
-#: ../../Zotlabs/Module/Lockview.php:96
-msgid "Visible to:"
-msgstr "Zichtbaar voor:"
-
#: ../../Zotlabs/Module/Filestorage.php:87
msgid "Permission Denied."
msgstr "Toegang geweigerd"
@@ -2810,7 +3198,7 @@ msgstr "Bestandsrechten bewerken"
#: ../../Zotlabs/Module/Filestorage.php:152
#: ../../Zotlabs/Module/Photos.php:658 ../../Zotlabs/Module/Photos.php:1047
#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
-#: ../../Zotlabs/Module/Chat.php:234 ../../include/acl_selectors.php:179
+#: ../../Zotlabs/Module/Chat.php:234 ../../include/acl_selectors.php:208
msgid "Permissions"
msgstr "Permissies"
@@ -2846,230 +3234,287 @@ msgstr "Toon URL van dit bestand"
msgid "Notify your contacts about this file"
msgstr "Jouw connecties over dit bestand berichten"
-#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
-msgid "Continue"
-msgstr "Ga verder"
+#: ../../Zotlabs/Module/Directory.php:64 ../../Zotlabs/Module/Display.php:17
+#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Photos.php:509
+#: ../../Zotlabs/Module/Search.php:17
+#: ../../Zotlabs/Module/Viewconnections.php:23
+#: ../../extend/addon/addon/friendica/dfrn_request.php:794
+msgid "Public access denied."
+msgstr "Openbare toegang geweigerd."
-#: ../../Zotlabs/Module/Connect.php:90
-msgid "Premium Channel Setup"
-msgstr "Instellen premiumkanaal "
+#: ../../Zotlabs/Module/Directory.php:245
+#, php-format
+msgid "%d rating"
+msgid_plural "%d ratings"
+msgstr[0] "%d beoordeling"
+msgstr[1] "%d beoordelingen"
-#: ../../Zotlabs/Module/Connect.php:92
-msgid "Enable premium channel connection restrictions"
-msgstr "Restricties voor connecties van premiumkanaal toestaan"
+#: ../../Zotlabs/Module/Directory.php:256
+msgid "Gender: "
+msgstr "Geslacht:"
-#: ../../Zotlabs/Module/Connect.php:93
-msgid ""
-"Please enter your restrictions or conditions, such as paypal receipt, usage "
-"guidelines, etc."
-msgstr "Vul je restricties of voorwaarden in, zoals een paypal-afschrift, voorschriften voor leden, enz."
+#: ../../Zotlabs/Module/Directory.php:258
+msgid "Status: "
+msgstr "Status: "
-#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
-msgid ""
-"This channel may require additional steps or acknowledgement of the "
-"following conditions prior to connecting:"
-msgstr "Dit kanaal kan extra stappen of het accepteren van de volgende voorwaarden vereisen, voordat de connectie wordt geaccepteerd:"
+#: ../../Zotlabs/Module/Directory.php:260
+msgid "Homepage: "
+msgstr "Homepage: "
-#: ../../Zotlabs/Module/Connect.php:96
-msgid ""
-"Potential connections will then see the following text before proceeding:"
-msgstr "Mogelijke connecties zullen dan de volgende tekst zien voordat ze verder kunnen:"
+#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1215
+msgid "Age:"
+msgstr "Leeftijd:"
-#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
-msgid ""
-"By continuing, I certify that I have complied with any instructions provided"
-" on this page."
-msgstr "Door verder te gaan ga ik automatisch akkoord met alle voorwaarden en aanwijzingen op deze pagina."
+#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1051
+#: ../../include/bb2diaspora.php:521 ../../include/event.php:52
+#: ../../include/event.php:84
+msgid "Location:"
+msgstr "Plaats:"
-#: ../../Zotlabs/Module/Connect.php:106
-msgid "(No specific instructions have been provided by the channel owner.)"
-msgstr "(Er zijn geen speciale voorwaarden en aanwijzingen door de kanaal-eigenaar verstrekt) "
+#: ../../Zotlabs/Module/Directory.php:320
+msgid "Description:"
+msgstr "Omschrijving:"
-#: ../../Zotlabs/Module/Connect.php:114
-msgid "Restricted or Premium Channel"
-msgstr "Beperkt of premiumkanaal"
+#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1231
+msgid "Hometown:"
+msgstr "Oorspronkelijk uit:"
-#: ../../Zotlabs/Module/Manage.php:136
-#: ../../Zotlabs/Module/New_channel.php:121
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
-msgstr "Je hebt %1$.0f van totaal %2$.0f toegestane kanalen aangemaakt."
+#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1239
+msgid "About:"
+msgstr "Over:"
-#: ../../Zotlabs/Module/Manage.php:143
-msgid "Create a new channel"
-msgstr "Nieuw kanaal aanmaken"
+#: ../../Zotlabs/Module/Directory.php:329
+msgid "Public Forum:"
+msgstr "Openbaar forum:"
-#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:778
-#: ../../Zotlabs/Module/Chat.php:255
-msgid "Create New"
-msgstr "Nieuwe aanmaken"
+#: ../../Zotlabs/Module/Directory.php:332
+msgid "Keywords: "
+msgstr "Trefwoorden: "
-#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:214
-#: ../../include/nav.php:211
-msgid "Channel Manager"
-msgstr "Kanaalbeheer"
+#: ../../Zotlabs/Module/Directory.php:335
+msgid "Don't suggest"
+msgstr "Niet voorstellen"
-#: ../../Zotlabs/Module/Manage.php:165
-msgid "Current Channel"
-msgstr "Huidig kanaal"
+#: ../../Zotlabs/Module/Directory.php:337
+msgid "Common connections:"
+msgstr "Gemeenschappelijke connecties:"
-#: ../../Zotlabs/Module/Manage.php:167
-msgid "Switch to one of your channels by selecting it."
-msgstr "Activeer een van jouw andere kanalen door er op te klikken."
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Global Directory"
+msgstr "Volledige kanalengids"
-#: ../../Zotlabs/Module/Manage.php:168
-msgid "Default Channel"
-msgstr "Standaardkanaal"
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Local Directory"
+msgstr "Lokale kanalengids"
-#: ../../Zotlabs/Module/Manage.php:169
-msgid "Make Default"
-msgstr "Als standaard instellen"
+#: ../../Zotlabs/Module/Directory.php:392
+msgid "Finding:"
+msgstr "Gezocht naar:"
-#: ../../Zotlabs/Module/Manage.php:172
+#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:64
+#: ../../include/contact_widgets.php:24
+msgid "Channel Suggestions"
+msgstr "Voorgestelde kanalen"
+
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "next page"
+msgstr "volgende pagina"
+
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "previous page"
+msgstr "vorige pagina"
+
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "Sort options"
+msgstr "Sorteeropties"
+
+#: ../../Zotlabs/Module/Directory.php:399
+msgid "Alphabetic"
+msgstr "Alfabetisch"
+
+#: ../../Zotlabs/Module/Directory.php:400
+msgid "Reverse Alphabetic"
+msgstr "Omgekeerd alfabetisch"
+
+#: ../../Zotlabs/Module/Directory.php:401
+msgid "Newest to Oldest"
+msgstr "Nieuw naar oud"
+
+#: ../../Zotlabs/Module/Directory.php:402
+msgid "Oldest to Newest"
+msgstr "Oud naar nieuw"
+
+#: ../../Zotlabs/Module/Directory.php:419
+msgid "No entries (some entries may be hidden)."
+msgstr "Niets gevonden (sommige kanalen kunnen verborgen zijn)."
+
+#: ../../Zotlabs/Module/Item.php:184
+msgid "Unable to locate original post."
+msgstr "Niet in staat om de originele locatie van het bericht te vinden. "
+
+#: ../../Zotlabs/Module/Item.php:447
+msgid "Empty post discarded."
+msgstr "Leeg bericht geannuleerd"
+
+#: ../../Zotlabs/Module/Item.php:489
+msgid "Executable content type not permitted to this channel."
+msgstr "Uitvoerbare bestanden zijn niet toegestaan op dit kanaal."
+
+#: ../../Zotlabs/Module/Item.php:837
+msgid "Duplicate post suppressed."
+msgstr "Dubbel bericht tegengehouden."
+
+#: ../../Zotlabs/Module/Item.php:979
+msgid "System error. Post not saved."
+msgstr "Systeemfout. Bericht niet opgeslagen."
+
+#: ../../Zotlabs/Module/Item.php:1111
+msgid "Unable to obtain post information from database."
+msgstr "Niet in staat om informatie over dit bericht uit de database te verkrijgen."
+
+#: ../../Zotlabs/Module/Item.php:1118
#, php-format
-msgid "%d new messages"
-msgstr "%d nieuwe berichten"
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Je hebt jouw limiet van %1$.0f berichten bereikt."
-#: ../../Zotlabs/Module/Manage.php:173
+#: ../../Zotlabs/Module/Item.php:1125
#, php-format
-msgid "%d new introductions"
-msgstr "%d nieuwe connectieverzoeken"
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Je hebt jouw limiet van %1$.0f webpagina's bereikt."
-#: ../../Zotlabs/Module/Manage.php:175
-msgid "Delegated Channel"
-msgstr "Uitbesteed kanaal"
+#: ../../Zotlabs/Module/Chanview.php:134
+msgid "toggle full screen mode"
+msgstr "Volledig scherm"
-#: ../../Zotlabs/Module/Group.php:24
-msgid "Privacy group created."
-msgstr "Privacygroep aangemaakt"
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
+msgstr "Kanaal toegevoegd."
-#: ../../Zotlabs/Module/Group.php:30
-msgid "Could not create privacy group."
-msgstr "Kon privacygroep niet aanmaken"
+#: ../../Zotlabs/Module/Mail.php:66
+msgid "Unable to lookup recipient."
+msgstr "Niet in staat om ontvanger op te zoeken."
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3960
-msgid "Privacy group not found."
-msgstr "Privacygroep niet gevonden"
+#: ../../Zotlabs/Module/Mail.php:73
+msgid "Unable to communicate with requested channel."
+msgstr "Niet in staat om met het aangevraagde kanaal te communiceren."
-#: ../../Zotlabs/Module/Group.php:58
-msgid "Privacy group updated."
-msgstr "Privacygroep bijgewerkt"
+#: ../../Zotlabs/Module/Mail.php:80
+msgid "Cannot verify requested channel."
+msgstr "Kan opgevraagd kanaal niet verifieren"
-#: ../../Zotlabs/Module/Group.php:90
-msgid "Create a group of channels."
-msgstr "Privacygroep met kanalen aanmaken"
+#: ../../Zotlabs/Module/Mail.php:98
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Gekozen kanaal heeft restricties voor privéberichten. Verzenden mislukt."
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
-msgid "Privacy group name: "
-msgstr "Naam privacygroep: "
+#: ../../Zotlabs/Module/Mail.php:177
+msgid "Messages"
+msgstr "Berichten"
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
-msgid "Members are visible to other channels"
-msgstr "Kanalen in deze privacygroep zijn zichtbaar voor andere kanalen"
+#: ../../Zotlabs/Module/Mail.php:212
+msgid "Message recalled."
+msgstr "Bericht ingetrokken."
-#: ../../Zotlabs/Module/Group.php:111
-msgid "Privacy group removed."
-msgstr "Privacygroep verwijderd."
+#: ../../Zotlabs/Module/Mail.php:225
+msgid "Conversation removed."
+msgstr "Conversatie verwijderd"
-#: ../../Zotlabs/Module/Group.php:113
-msgid "Unable to remove privacy group."
-msgstr "Verwijderen privacygroep mislukt"
+#: ../../Zotlabs/Module/Mail.php:239 ../../Zotlabs/Module/Mail.php:348
+#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1182
+msgid "Please enter a link URL:"
+msgstr "Vul een URL in:"
-#: ../../Zotlabs/Module/Group.php:183
-msgid "Privacy group editor"
-msgstr "Privacygroep bewerken"
+#: ../../Zotlabs/Module/Mail.php:240 ../../Zotlabs/Module/Mail.php:349
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Verloopt op DD-MM-YYYY om HH:MM"
-#: ../../Zotlabs/Module/Group.php:197
-msgid "Members"
-msgstr "Kanalen"
+#: ../../Zotlabs/Module/Mail.php:268
+msgid "Requested channel is not in this network"
+msgstr "Opgevraagd kanaal is niet in dit netwerk beschikbaar"
-#: ../../Zotlabs/Module/Group.php:199
-msgid "All Connected Channels"
-msgstr "Alle kanaalconnecties"
+#: ../../Zotlabs/Module/Mail.php:276
+msgid "Send Private Message"
+msgstr "Privébericht versturen"
-#: ../../Zotlabs/Module/Group.php:231
-msgid "Click on a channel to add or remove."
-msgstr "Klik op een kanaal om deze toe te voegen of te verwijderen."
+#: ../../Zotlabs/Module/Mail.php:277 ../../Zotlabs/Module/Mail.php:402
+msgid "To:"
+msgstr "Aan:"
-#: ../../Zotlabs/Module/Dreport.php:44
-msgid "Invalid message"
-msgstr "Ongeldig bericht"
+#: ../../Zotlabs/Module/Mail.php:280 ../../Zotlabs/Module/Mail.php:404
+msgid "Subject:"
+msgstr "Onderwerp:"
-#: ../../Zotlabs/Module/Dreport.php:76
-msgid "no results"
-msgstr "geen resultaten"
+#: ../../Zotlabs/Module/Mail.php:283 ../../Zotlabs/Module/Invite.php:138
+msgid "Your message:"
+msgstr "Jouw bericht:"
-#: ../../Zotlabs/Module/Dreport.php:91
-msgid "channel sync processed"
-msgstr "kanaalsync verwerkt"
+#: ../../Zotlabs/Module/Mail.php:285 ../../Zotlabs/Module/Mail.php:410
+#: ../../include/conversation.php:1242
+msgid "Attach file"
+msgstr "Bestand toevoegen"
-#: ../../Zotlabs/Module/Dreport.php:95
-msgid "queued"
-msgstr "in wachtrij"
+#: ../../Zotlabs/Module/Mail.php:287
+msgid "Send"
+msgstr "Verzenden"
-#: ../../Zotlabs/Module/Dreport.php:99
-msgid "posted"
-msgstr "verstuurd"
+#: ../../Zotlabs/Module/Mail.php:290 ../../Zotlabs/Module/Mail.php:415
+#: ../../include/conversation.php:1287
+msgid "Set expiration date"
+msgstr "Verloopdatum instellen"
-#: ../../Zotlabs/Module/Dreport.php:103
-msgid "accepted for delivery"
-msgstr "geaccepteerd om afgeleverd te worden"
+#: ../../Zotlabs/Module/Mail.php:292 ../../Zotlabs/Module/Mail.php:417
+#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:741
+#: ../../include/conversation.php:1292
+msgid "Encrypt text"
+msgstr "Tekst versleutelen"
-#: ../../Zotlabs/Module/Dreport.php:107
-msgid "updated"
-msgstr "geüpdatet"
+#: ../../Zotlabs/Module/Mail.php:374
+msgid "Delete message"
+msgstr "Bericht verwijderen"
-#: ../../Zotlabs/Module/Dreport.php:110
-msgid "update ignored"
-msgstr "update genegeerd"
+#: ../../Zotlabs/Module/Mail.php:375
+msgid "Delivery report"
+msgstr "Afleveringsrapport"
-#: ../../Zotlabs/Module/Dreport.php:113
-msgid "permission denied"
-msgstr "toegang geweigerd"
+#: ../../Zotlabs/Module/Mail.php:376
+msgid "Recall message"
+msgstr "Bericht intrekken"
-#: ../../Zotlabs/Module/Dreport.php:117
-msgid "recipient not found"
-msgstr "ontvanger niet gevonden"
+#: ../../Zotlabs/Module/Mail.php:378
+msgid "Message has been recalled."
+msgstr "Bericht is ingetrokken."
-#: ../../Zotlabs/Module/Dreport.php:120
-msgid "mail recalled"
-msgstr "Privébericht ingetrokken"
+#: ../../Zotlabs/Module/Mail.php:395
+msgid "Delete Conversation"
+msgstr "Verwijder conversatie"
-#: ../../Zotlabs/Module/Dreport.php:123
-msgid "duplicate mail received"
-msgstr "dubbel privébericht ontvangen"
+#: ../../Zotlabs/Module/Mail.php:397
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Geen veilige communicatie beschikbaar. <strong>Mogelijk</strong> kan je reageren op de kanaalpagina van de afzender."
-#: ../../Zotlabs/Module/Dreport.php:126
-msgid "mail delivered"
-msgstr "privébericht afgeleverd"
+#: ../../Zotlabs/Module/Mail.php:401
+msgid "Send Reply"
+msgstr "Antwoord versturen"
-#: ../../Zotlabs/Module/Dreport.php:146
+#: ../../Zotlabs/Module/Mail.php:406
#, php-format
-msgid "Delivery report for %1$s"
-msgstr "Afleveringsrapport voor %1$s"
-
-#: ../../Zotlabs/Module/Dreport.php:149
-msgid "Options"
-msgstr "Opties"
-
-#: ../../Zotlabs/Module/Dreport.php:150
-msgid "Redeliver"
-msgstr "Opnieuw afleveren"
+msgid "Your message for %s (%s):"
+msgstr "Jouw privébericht aan %s (%s):"
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:192
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
msgid "webpage"
msgstr "Webpagina"
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:198
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
msgid "block"
msgstr "blok"
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:195
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
msgid "layout"
msgstr "lay-out"
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:201
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
msgid "menu"
msgstr "menu"
@@ -3083,6 +3528,26 @@ msgstr "%s onderdeel geïnstalleerd"
msgid "%s element installation failed"
msgstr "Installatie %s-element mislukt"
+#: ../../Zotlabs/Module/Import_items.php:42 ../../Zotlabs/Module/Import.php:71
+msgid "Nothing to import."
+msgstr "Niets gevonden om te importeren"
+
+#: ../../Zotlabs/Module/Import_items.php:66 ../../Zotlabs/Module/Import.php:83
+#: ../../Zotlabs/Module/Import.php:98
+msgid "Unable to download data from old server"
+msgstr "Niet in staat om gegevens van de oude hub te downloaden"
+
+#: ../../Zotlabs/Module/Import_items.php:72
+#: ../../Zotlabs/Module/Import.php:105
+msgid "Imported file is empty."
+msgstr "Geïmporteerde bestand is leeg"
+
+#: ../../Zotlabs/Module/Import_items.php:88
+#: ../../Zotlabs/Module/Import.php:127
+#, php-format
+msgid "Warning: Database versions differ by %1$d updates."
+msgstr "Waarschuwing: database-versies lopen %1$d updates achter."
+
#: ../../Zotlabs/Module/Import_items.php:104
msgid "Import completed"
msgstr "Importeren voltooid"
@@ -3096,6 +3561,11 @@ msgid ""
"Use this form to import existing posts and content from an export file."
msgstr "Gebruik dit formulier om bestaande berichten en andere inhoud vanuit een exportbestand te importeren."
+#: ../../Zotlabs/Module/Import_items.php:121
+#: ../../Zotlabs/Module/Import.php:532
+msgid "File to Upload"
+msgstr "Bestand om te uploaden"
+
#: ../../Zotlabs/Module/Invite.php:29
msgid "Total invitation limit exceeded."
msgstr "Limiet voor aantal uitnodigingen overschreden."
@@ -3105,503 +3575,148 @@ msgstr "Limiet voor aantal uitnodigingen overschreden."
msgid "%s : Not a valid email address."
msgstr "%s : Geen geldig e-mailadres."
-#: ../../Zotlabs/Module/Invite.php:63
+#: ../../Zotlabs/Module/Invite.php:67
msgid "Please join us on $Projectname"
msgstr "Uitnodiging voor $Projectname"
-#: ../../Zotlabs/Module/Invite.php:74
+#: ../../Zotlabs/Module/Invite.php:77
msgid "Invitation limit exceeded. Please contact your site administrator."
msgstr "Limiet voor aantal uitnodigingen overschreden. Neem contact op met je hub-beheerder."
-#: ../../Zotlabs/Module/Invite.php:79
+#: ../../Zotlabs/Module/Invite.php:82
#, php-format
msgid "%s : Message delivery failed."
msgstr "%s: Aflevering bericht mislukt."
-#: ../../Zotlabs/Module/Invite.php:83
+#: ../../Zotlabs/Module/Invite.php:86
#, php-format
msgid "%d message sent."
msgid_plural "%d messages sent."
msgstr[0] "%d bericht verzonden."
msgstr[1] "%d berichten verzonden."
-#: ../../Zotlabs/Module/Invite.php:102
+#: ../../Zotlabs/Module/Invite.php:105
msgid "You have no more invitations available"
msgstr "Je hebt geen uitnodigingen meer beschikbaar"
-#: ../../Zotlabs/Module/Invite.php:133
+#: ../../Zotlabs/Module/Invite.php:136
msgid "Send invitations"
msgstr "Uitnodigingen verzenden"
-#: ../../Zotlabs/Module/Invite.php:134
+#: ../../Zotlabs/Module/Invite.php:137
msgid "Enter email addresses, one per line:"
msgstr "Voer e-mailadressen in, één per regel:"
-#: ../../Zotlabs/Module/Invite.php:136
+#: ../../Zotlabs/Module/Invite.php:139
msgid "Please join my community on $Projectname."
msgstr "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op $Projectname te vergezellen. Lees meer over $Projectname op http://hubzilla.org"
-#: ../../Zotlabs/Module/Invite.php:138
+#: ../../Zotlabs/Module/Invite.php:141
msgid "You will need to supply this invitation code:"
msgstr "Je moet deze uitnodigingscode opgeven:"
-#: ../../Zotlabs/Module/Invite.php:139
+#: ../../Zotlabs/Module/Invite.php:142
msgid ""
"1. Register at any $Projectname location (they are all inter-connected)"
msgstr "1. Registreer je op een willekeurige $Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):"
-#: ../../Zotlabs/Module/Invite.php:141
+#: ../../Zotlabs/Module/Invite.php:144
msgid "2. Enter my $Projectname network address into the site searchbar."
msgstr "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn $Projectname-kanaaladres in het zoekveld invullen:"
-#: ../../Zotlabs/Module/Invite.php:142
+#: ../../Zotlabs/Module/Invite.php:145
msgid "or visit"
msgstr "of bezoek"
-#: ../../Zotlabs/Module/Invite.php:144
+#: ../../Zotlabs/Module/Invite.php:147
msgid "3. Click [Connect]"
msgstr "3. Klik op [+ Verbinden]"
-#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
-msgid "Location not found."
-msgstr "Locatie niet gevonden."
-
-#: ../../Zotlabs/Module/Locs.php:62
-msgid "Location lookup failed."
-msgstr "Opzoeken locatie mislukt"
-
-#: ../../Zotlabs/Module/Locs.php:66
-msgid ""
-"Please select another location to become primary before removing the primary"
-" location."
-msgstr "Kies eerst een andere primaire locatie alvorens de huidige primaire locatie te verwijderen."
-
-#: ../../Zotlabs/Module/Locs.php:95
-msgid "Syncing locations"
-msgstr "Locaties synchronizeren"
-
-#: ../../Zotlabs/Module/Locs.php:105
-msgid "No locations found."
-msgstr "Geen locaties gevonden."
-
-#: ../../Zotlabs/Module/Locs.php:116
-msgid "Manage Channel Locations"
-msgstr "Kanaallocaties beheren"
-
-#: ../../Zotlabs/Module/Locs.php:119
-msgid "Primary"
-msgstr "Primair"
-
-#: ../../Zotlabs/Module/Locs.php:122
-msgid "Sync Now"
-msgstr "Nu synchroniseren"
-
-#: ../../Zotlabs/Module/Locs.php:123
-msgid "Please wait several minutes between consecutive operations."
-msgstr "Wacht enkele minuten tussen opeenvolgende handelingen."
-
-#: ../../Zotlabs/Module/Locs.php:124
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing"
-" your channel."
-msgstr "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen door op de hub van de kloon in te loggen en het kanaal daar te verwijderen."
-
-#: ../../Zotlabs/Module/Locs.php:125
-msgid "Use this form to drop the location if the hub is no longer operating."
-msgstr "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is."
-
-#: ../../Zotlabs/Module/Rate.php:156
-msgid "Website:"
-msgstr "Website:"
-
-#: ../../Zotlabs/Module/Rate.php:159
-#, php-format
-msgid "Remote Channel [%s] (not yet known on this site)"
-msgstr "Kanaal op afstand [%s] (nog niet op deze hub bekend)"
-
-#: ../../Zotlabs/Module/Rate.php:160
-msgid "Rating (this information is public)"
-msgstr "Beoordeling (deze informatie is openbaar)"
-
-#: ../../Zotlabs/Module/Rate.php:161
-msgid "Optionally explain your rating (this information is public)"
-msgstr "Verklaar jouw beoordeling (niet verplicht, deze informatie is openbaar)"
-
-#: ../../Zotlabs/Module/Like.php:19
-msgid "Like/Dislike"
-msgstr "Leuk/niet leuk"
-
-#: ../../Zotlabs/Module/Like.php:24
-msgid "This action is restricted to members."
-msgstr "Deze actie kan alleen door $Projectname-leden worden uitgevoerd."
-
-#: ../../Zotlabs/Module/Like.php:25
-msgid ""
-"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
-"href=\"register\">register as a new $Projectname member</a> to continue."
-msgstr "Je dient <a href=\"rmagic\">in te loggen met je $Projectname-account</a> of <a href=\"register\">een nieuw $Projectname-account aan te maken</a> om verder te kunnen gaan."
-
-#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
-#: ../../Zotlabs/Module/Like.php:169
-msgid "Invalid request."
-msgstr "Ongeldig verzoek"
-
-#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
-msgid "channel"
-msgstr "kanaal"
-
-#: ../../Zotlabs/Module/Like.php:146
-msgid "thing"
-msgstr "ding"
-
-#: ../../Zotlabs/Module/Like.php:192
-msgid "Channel unavailable."
-msgstr "Kanaal niet beschikbaar."
-
-#: ../../Zotlabs/Module/Like.php:240
-msgid "Previous action reversed."
-msgstr "Vorige actie omgedraaid"
-
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../Zotlabs/Module/Tagger.php:47 ../../include/text.php:1991
-#: ../../include/conversation.php:120
-msgid "photo"
-msgstr "foto"
-
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../include/text.php:1997 ../../include/conversation.php:148
-msgid "status"
-msgstr "bericht"
-
-#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Events.php:253
-#: ../../Zotlabs/Module/Tagger.php:51 ../../include/text.php:1994
-#: ../../include/conversation.php:123 ../../include/event.php:961
-msgid "event"
-msgstr "gebeurtenis"
-
-#: ../../Zotlabs/Module/Like.php:419 ../../include/conversation.php:164
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s vindt %3$s van %2$s leuk"
-
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s vindt %3$s van %2$s niet leuk"
-
-#: ../../Zotlabs/Module/Like.php:423
-#, php-format
-msgid "%1$s agrees with %2$s's %3$s"
-msgstr "%1$s is het eens met %2$s's %3$s"
-
-#: ../../Zotlabs/Module/Like.php:425
-#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
-msgstr "%1$s is het niet eens met %2$s's %3$s"
-
-#: ../../Zotlabs/Module/Like.php:427
-#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
-msgstr "%1$s onthoudt zich van een besluit over %2$s's %3$s"
-
-#: ../../Zotlabs/Module/Like.php:429
-#, php-format
-msgid "%1$s is attending %2$s's %3$s"
-msgstr "%1$s is aanwezig op %2$s's %3$s"
-
-#: ../../Zotlabs/Module/Like.php:431
-#, php-format
-msgid "%1$s is not attending %2$s's %3$s"
-msgstr "%1$s is niet aanwezig op %2$s's %3$s"
-
-#: ../../Zotlabs/Module/Like.php:433
-#, php-format
-msgid "%1$s may attend %2$s's %3$s"
-msgstr "%1$s is mogelijk aanwezig op %2$s's %3$s"
-
-#: ../../Zotlabs/Module/Like.php:538
-msgid "Action completed."
-msgstr "Actie voltooid"
-
-#: ../../Zotlabs/Module/Like.php:539
-msgid "Thank you."
-msgstr "Bedankt"
-
-#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:189
-#: ../../Zotlabs/Module/Profiles.php:246 ../../Zotlabs/Module/Profiles.php:625
-msgid "Profile not found."
-msgstr "Profiel niet gevonden."
-
-#: ../../Zotlabs/Module/Profiles.php:44
-msgid "Profile deleted."
-msgstr "Profiel verwijderd."
-
-#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:104
-msgid "Profile-"
-msgstr "Profiel-"
-
-#: ../../Zotlabs/Module/Profiles.php:89 ../../Zotlabs/Module/Profiles.php:132
-msgid "New profile created."
-msgstr "Nieuw profiel aangemaakt."
-
-#: ../../Zotlabs/Module/Profiles.php:110
-msgid "Profile unavailable to clone."
-msgstr "Profiel niet beschikbaar om te klonen"
-
-#: ../../Zotlabs/Module/Profiles.php:151
-msgid "Profile unavailable to export."
-msgstr "Geen profiel beschikbaar om te exporteren"
-
-#: ../../Zotlabs/Module/Profiles.php:256
-msgid "Profile Name is required."
-msgstr "Profielnaam is vereist"
-
-#: ../../Zotlabs/Module/Profiles.php:427
-msgid "Marital Status"
-msgstr "Huwelijke status"
-
-#: ../../Zotlabs/Module/Profiles.php:431
-msgid "Romantic Partner"
-msgstr "Romantische partner"
-
-#: ../../Zotlabs/Module/Profiles.php:435 ../../Zotlabs/Module/Profiles.php:736
-msgid "Likes"
-msgstr "Houdt van"
-
-#: ../../Zotlabs/Module/Profiles.php:439 ../../Zotlabs/Module/Profiles.php:737
-msgid "Dislikes"
-msgstr "Houdt niet van"
-
-#: ../../Zotlabs/Module/Profiles.php:443 ../../Zotlabs/Module/Profiles.php:744
-msgid "Work/Employment"
-msgstr "Werk/arbeid"
-
-#: ../../Zotlabs/Module/Profiles.php:446
-msgid "Religion"
-msgstr "Religie"
-
-#: ../../Zotlabs/Module/Profiles.php:450
-msgid "Political Views"
-msgstr "Politieke overtuigingen"
-
-#: ../../Zotlabs/Module/Profiles.php:454
-msgid "Gender"
-msgstr "Geslacht"
-
-#: ../../Zotlabs/Module/Profiles.php:458
-msgid "Sexual Preference"
-msgstr "Seksuele voorkeur"
-
-#: ../../Zotlabs/Module/Profiles.php:462
-msgid "Homepage"
-msgstr "Homepage"
-
-#: ../../Zotlabs/Module/Profiles.php:466
-msgid "Interests"
-msgstr "Interesses"
-
-#: ../../Zotlabs/Module/Profiles.php:560
-msgid "Profile updated."
-msgstr "Profiel bijgewerkt"
-
-#: ../../Zotlabs/Module/Profiles.php:644
-msgid "Hide your connections list from viewers of this profile"
-msgstr "Laat de lijst met connecties niet aan bezoekers van dit profiel zien."
-
-#: ../../Zotlabs/Module/Profiles.php:686
-msgid "Edit Profile Details"
-msgstr "Profiel bewerken"
-
-#: ../../Zotlabs/Module/Profiles.php:688
-msgid "View this profile"
-msgstr "Profiel weergeven"
-
-#: ../../Zotlabs/Module/Profiles.php:689 ../../Zotlabs/Module/Profiles.php:771
-#: ../../include/channel.php:981
-msgid "Edit visibility"
-msgstr "Zichtbaarheid bewerken"
-
-#: ../../Zotlabs/Module/Profiles.php:690
-msgid "Profile Tools"
-msgstr "Hulpmiddelen"
-
-#: ../../Zotlabs/Module/Profiles.php:691
-msgid "Change cover photo"
-msgstr "Omslagfoto wijzigen"
-
-#: ../../Zotlabs/Module/Profiles.php:692 ../../include/channel.php:952
-msgid "Change profile photo"
-msgstr "Profielfoto veranderen"
-
-#: ../../Zotlabs/Module/Profiles.php:693
-msgid "Create a new profile using these settings"
-msgstr "Een nieuw profiel aanmaken met dit profiel als basis"
-
-#: ../../Zotlabs/Module/Profiles.php:694
-msgid "Clone this profile"
-msgstr "Dit profiel klonen"
-
-#: ../../Zotlabs/Module/Profiles.php:695
-msgid "Delete this profile"
-msgstr "Dit profiel verwijderen"
-
-#: ../../Zotlabs/Module/Profiles.php:696
-msgid "Add profile things"
-msgstr "Dingen aan je profiel toevoegen"
-
-#: ../../Zotlabs/Module/Profiles.php:697 ../../include/conversation.php:1564
-#: ../../include/widgets.php:105
-msgid "Personal"
-msgstr "Persoonlijk"
-
-#: ../../Zotlabs/Module/Profiles.php:699
-msgid "Relation"
-msgstr "Relatie"
-
-#: ../../Zotlabs/Module/Profiles.php:700 ../../include/datetime.php:55
-msgid "Miscellaneous"
-msgstr "Diversen"
-
-#: ../../Zotlabs/Module/Profiles.php:702
-msgid "Import profile from file"
-msgstr "Profiel vanuit bestand importeren"
-
-#: ../../Zotlabs/Module/Profiles.php:703
-msgid "Export profile to file"
-msgstr "Profiel naar bestand exporteren"
-
-#: ../../Zotlabs/Module/Profiles.php:704
-msgid "Your gender"
-msgstr "Jouw geslacht"
-
-#: ../../Zotlabs/Module/Profiles.php:705
-msgid "Marital status"
-msgstr "Burgerlijke staat"
-
-#: ../../Zotlabs/Module/Profiles.php:706
-msgid "Sexual preference"
-msgstr "Seksuele voorkeur"
-
-#: ../../Zotlabs/Module/Profiles.php:709
-msgid "Profile name"
-msgstr "Profielnaam"
-
-#: ../../Zotlabs/Module/Profiles.php:711
-msgid "This is your default profile."
-msgstr "Dit is jouw standaardprofiel"
-
-#: ../../Zotlabs/Module/Profiles.php:713
-msgid "Your full name"
-msgstr "Jouw volledige naam"
-
-#: ../../Zotlabs/Module/Profiles.php:714
-msgid "Title/Description"
-msgstr "Titel/omschrijving"
-
-#: ../../Zotlabs/Module/Profiles.php:717
-msgid "Street address"
-msgstr "Straat en huisnummer"
-
-#: ../../Zotlabs/Module/Profiles.php:718
-msgid "Locality/City"
-msgstr "Woonplaats"
-
-#: ../../Zotlabs/Module/Profiles.php:719
-msgid "Region/State"
-msgstr "Provincie/gewest/deelstaat"
-
-#: ../../Zotlabs/Module/Profiles.php:720
-msgid "Postal/Zip code"
-msgstr "Postcode"
-
-#: ../../Zotlabs/Module/Profiles.php:721
-msgid "Country"
-msgstr "Land"
-
-#: ../../Zotlabs/Module/Profiles.php:726
-msgid "Who (if applicable)"
-msgstr "Wie (wanneer van toepassing)"
+#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
+#: ../../Zotlabs/Module/Blocks.php:155
+msgid "Block Name"
+msgstr "Bloknaam"
-#: ../../Zotlabs/Module/Profiles.php:726
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Voorbeelden: petra123, Petra Jansen, petra@voorbeeld.nl"
+#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1258
+msgid "Title (optional)"
+msgstr "Titel (optioneel)"
-#: ../../Zotlabs/Module/Profiles.php:727
-msgid "Since (date)"
-msgstr "Sinds (datum)"
+#: ../../Zotlabs/Module/Editblock.php:133
+msgid "Edit Block"
+msgstr "Blok bewerken"
-#: ../../Zotlabs/Module/Profiles.php:730
-msgid "Tell us about yourself"
-msgstr "Vertel ons iets over jezelf"
+#: ../../Zotlabs/Module/Group.php:24
+msgid "Privacy group created."
+msgstr "Privacygroep aangemaakt"
-#: ../../Zotlabs/Module/Profiles.php:731
-msgid "Homepage URL"
-msgstr "URL homepagina"
+#: ../../Zotlabs/Module/Group.php:30
+msgid "Could not create privacy group."
+msgstr "Kon privacygroep niet aanmaken"
-#: ../../Zotlabs/Module/Profiles.php:732
-msgid "Hometown"
-msgstr "Oorspronkelijk uit"
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
+#: ../../include/items.php:3876
+msgid "Privacy group not found."
+msgstr "Privacygroep niet gevonden"
-#: ../../Zotlabs/Module/Profiles.php:733
-msgid "Political views"
-msgstr "Politieke overtuigingen"
+#: ../../Zotlabs/Module/Group.php:58
+msgid "Privacy group updated."
+msgstr "Privacygroep bijgewerkt"
-#: ../../Zotlabs/Module/Profiles.php:734
-msgid "Religious views"
-msgstr "Religieuze overtuigingen"
+#: ../../Zotlabs/Module/Group.php:90
+msgid "Create a group of channels."
+msgstr "Privacygroep met kanalen aanmaken"
-#: ../../Zotlabs/Module/Profiles.php:735
-msgid "Keywords used in directory listings"
-msgstr "Trefwoorden voor in de kanalengids"
+#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+msgid "Privacy group name: "
+msgstr "Naam privacygroep: "
-#: ../../Zotlabs/Module/Profiles.php:735
-msgid "Example: fishing photography software"
-msgstr "Voorbeeld: muziek, fotografie, software"
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+msgid "Members are visible to other channels"
+msgstr "Kanalen in deze privacygroep zijn zichtbaar voor andere kanalen"
-#: ../../Zotlabs/Module/Profiles.php:738
-msgid "Musical interests"
-msgstr "Muzikale interesses"
+#: ../../Zotlabs/Module/Group.php:111
+msgid "Privacy group removed."
+msgstr "Privacygroep verwijderd."
-#: ../../Zotlabs/Module/Profiles.php:739
-msgid "Books, literature"
-msgstr "Boeken/literatuur"
+#: ../../Zotlabs/Module/Group.php:113
+msgid "Unable to remove privacy group."
+msgstr "Verwijderen privacygroep mislukt"
-#: ../../Zotlabs/Module/Profiles.php:740
-msgid "Television"
-msgstr "Televisie"
+#: ../../Zotlabs/Module/Group.php:183
+msgid "Privacy group editor"
+msgstr "Privacygroep bewerken"
-#: ../../Zotlabs/Module/Profiles.php:741
-msgid "Film/Dance/Culture/Entertainment"
-msgstr "Film/dans/cultuur/entertainment"
+#: ../../Zotlabs/Module/Group.php:199
+msgid "All Connected Channels"
+msgstr "Alle kanaalconnecties"
-#: ../../Zotlabs/Module/Profiles.php:742
-msgid "Hobbies/Interests"
-msgstr "Hobby's/interesses"
+#: ../../Zotlabs/Module/Group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Klik op een kanaal om deze toe te voegen of te verwijderen."
-#: ../../Zotlabs/Module/Profiles.php:743
-msgid "Love/Romance"
-msgstr "Liefde/romantiek"
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
+msgstr "Ongeldige profiel-identificator"
-#: ../../Zotlabs/Module/Profiles.php:745
-msgid "School/Education"
-msgstr "School/opleiding"
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Profile Visibility Editor"
+msgstr "Zichtbaarheid profiel "
-#: ../../Zotlabs/Module/Profiles.php:746
-msgid "Contact information and social networks"
-msgstr "Contactinformatie en sociale netwerken"
+#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1282
+msgid "Profile"
+msgstr "Profiel"
-#: ../../Zotlabs/Module/Profiles.php:747
-msgid "My other channels"
-msgstr "Mijn andere kanalen"
+#: ../../Zotlabs/Module/Profperm.php:119
+msgid "Click on a contact to add or remove."
+msgstr "Klik op een connectie om deze toe te voegen of te verwijderen"
-#: ../../Zotlabs/Module/Profiles.php:767 ../../include/channel.php:977
-msgid "Profile Image"
-msgstr "Profielfoto"
+#: ../../Zotlabs/Module/Profperm.php:128
+msgid "Visible To"
+msgstr "Zichtbaar voor"
-#: ../../Zotlabs/Module/Profiles.php:777 ../../include/channel.php:959
-#: ../../include/nav.php:91
-msgid "Edit Profiles"
-msgstr "Bewerk profielen"
+#: ../../Zotlabs/Module/Magic.php:71
+msgid "Hub not found."
+msgstr "Hub niet gevonden."
#: ../../Zotlabs/Module/Mitem.php:52
msgid "Unable to create element."
@@ -3620,7 +3735,7 @@ msgid "Menu Item Permissions"
msgstr "Permissies menu-item"
#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:489
msgid "(click to open/close)"
msgstr "(klik om te openen/sluiten)"
@@ -3720,1035 +3835,1132 @@ msgstr "Menu-element bewerken"
msgid "Link text"
msgstr "Linktekst"
-#: ../../Zotlabs/Module/Setup.php:184
+#: ../../Zotlabs/Module/Ratings.php:70
+msgid "No ratings"
+msgstr "Geen beoordelingen"
+
+#: ../../Zotlabs/Module/Ratings.php:98
+msgid "Rating: "
+msgstr "Beoordeling: "
+
+#: ../../Zotlabs/Module/Ratings.php:99
+msgid "Website: "
+msgstr "Website: "
+
+#: ../../Zotlabs/Module/Ratings.php:101
+msgid "Description: "
+msgstr "Omschrijving: "
+
+#: ../../Zotlabs/Module/Attach.php:13
+msgid "Item not available."
+msgstr "Item is niet aanwezig."
+
+#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
+#, php-format
+msgctxt "mood"
+msgid "%1$s is %2$s"
+msgstr "%1$s is %2$s"
+
+#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:229
+msgid "Mood"
+msgstr "Stemming"
+
+#: ../../Zotlabs/Module/Mood.php:136
+msgid "Set your current mood and tell your friends"
+msgstr "Noteer je huidige stemming en toon het aan je connecties"
+
+#: ../../Zotlabs/Module/Notify.php:57
+#: ../../Zotlabs/Module/Notifications.php:35
+msgid "No more system notifications."
+msgstr "Geen systeemnotificaties meer."
+
+#: ../../Zotlabs/Module/Notify.php:61
+#: ../../Zotlabs/Module/Notifications.php:39
+msgid "System Notifications"
+msgstr "Systeemnotificaties"
+
+#: ../../Zotlabs/Module/Photos.php:82
+msgid "Page owner information could not be retrieved."
+msgstr "Informatie over de pagina-eigenaar werd niet ontvangen."
+
+#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:734
+#: ../../Zotlabs/Module/Profile_photo.php:115
+#: ../../Zotlabs/Module/Profile_photo.php:219
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:225
+#: ../../include/photo/photo_driver.php:728
+msgid "Profile Photos"
+msgstr "Profielfoto's"
+
+#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
+msgid "Album not found."
+msgstr "Album niet gevonden."
+
+#: ../../Zotlabs/Module/Photos.php:112
+msgid "Delete Album"
+msgstr "Verwijder album"
+
+#: ../../Zotlabs/Module/Photos.php:133
+msgid ""
+"Multiple storage folders exist with this album name, but within different "
+"directories. Please remove the desired folder or folders using the Files "
+"manager"
+msgstr "Er bestaan meerdere submappen met deze albumnaam, maar verspreidt over verschillende mappen. Verwijder de gewenste map(pen) met de bestandsbeheerder."
+
+#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1059
+msgid "Delete Photo"
+msgstr "Verwijder foto"
+
+#: ../../Zotlabs/Module/Photos.php:520
+msgid "No photos selected"
+msgstr "Geen foto's geselecteerd"
+
+#: ../../Zotlabs/Module/Photos.php:569
+msgid "Access to this item is restricted."
+msgstr "Toegang tot dit item is beperkt."
+
+#: ../../Zotlabs/Module/Photos.php:608
+#, php-format
+msgid "%1$.2f MB of %2$.2f MB photo storage used."
+msgstr "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt."
+
+#: ../../Zotlabs/Module/Photos.php:611
+#, php-format
+msgid "%1$.2f MB photo storage used."
+msgstr "%1$.2f MB aan foto-opslag gebruikt."
+
+#: ../../Zotlabs/Module/Photos.php:647
+msgid "Upload Photos"
+msgstr "Foto's uploaden"
+
+#: ../../Zotlabs/Module/Photos.php:651
+msgid "Enter an album name"
+msgstr "Vul een albumnaam in"
+
+#: ../../Zotlabs/Module/Photos.php:652
+msgid "or select an existing album (doubleclick)"
+msgstr "of kies een bestaand album (dubbelklikken)"
+
+#: ../../Zotlabs/Module/Photos.php:653
+msgid "Create a status post for this upload"
+msgstr "Plaats een bericht voor deze upload."
+
+#: ../../Zotlabs/Module/Photos.php:654
+msgid "Caption (optional):"
+msgstr "Bijschrift (optioneel):"
+
+#: ../../Zotlabs/Module/Photos.php:655
+msgid "Description (optional):"
+msgstr "Omschrijving (optioneel):"
+
+#: ../../Zotlabs/Module/Photos.php:686
+msgid "Album name could not be decoded"
+msgstr "Albumnaam kon niet gedecodeerd worden"
+
+#: ../../Zotlabs/Module/Photos.php:734
+msgid "Contact Photos"
+msgstr "Connectiefoto's"
+
+#: ../../Zotlabs/Module/Photos.php:757
+msgid "Show Newest First"
+msgstr "Nieuwste eerst weergeven"
+
+#: ../../Zotlabs/Module/Photos.php:759
+msgid "Show Oldest First"
+msgstr "Oudste eerst weergeven"
+
+#: ../../Zotlabs/Module/Photos.php:783 ../../Zotlabs/Module/Photos.php:1337
+#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1678
+msgid "View Photo"
+msgstr "Foto weergeven"
+
+#: ../../Zotlabs/Module/Photos.php:814
+#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1695
+msgid "Edit Album"
+msgstr "Album bewerken"
+
+#: ../../Zotlabs/Module/Photos.php:861
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Toegang geweigerd. Toegang tot dit item kan zijn beperkt."
+
+#: ../../Zotlabs/Module/Photos.php:863
+msgid "Photo not available"
+msgstr "Foto niet aanwezig"
+
+#: ../../Zotlabs/Module/Photos.php:921
+msgid "Use as profile photo"
+msgstr "Als profielfoto gebruiken"
+
+#: ../../Zotlabs/Module/Photos.php:922
+msgid "Use as cover photo"
+msgstr "Als omslagfoto gebruiken"
+
+#: ../../Zotlabs/Module/Photos.php:929
+msgid "Private Photo"
+msgstr "Privéfoto"
+
+#: ../../Zotlabs/Module/Photos.php:940 ../../Zotlabs/Module/Cal.php:336
+#: ../../Zotlabs/Module/Cal.php:343 ../../Zotlabs/Module/Events.php:680
+#: ../../Zotlabs/Module/Events.php:689
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846
+msgid "Previous"
+msgstr "Vorige"
+
+#: ../../Zotlabs/Module/Photos.php:944
+msgid "View Full Size"
+msgstr "Volledige grootte weergeven"
+
+#: ../../Zotlabs/Module/Photos.php:949 ../../Zotlabs/Module/Setup.php:264
+#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
+#: ../../Zotlabs/Module/Events.php:681 ../../Zotlabs/Module/Events.php:690
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847
+msgid "Next"
+msgstr "Volgende"
+
+#: ../../Zotlabs/Module/Photos.php:1033
+msgid "Edit photo"
+msgstr "Foto bewerken"
+
+#: ../../Zotlabs/Module/Photos.php:1035
+msgid "Rotate CW (right)"
+msgstr "Draai met de klok mee (naar rechts)"
+
+#: ../../Zotlabs/Module/Photos.php:1036
+msgid "Rotate CCW (left)"
+msgstr "Draai tegen de klok in (naar links)"
+
+#: ../../Zotlabs/Module/Photos.php:1039
+msgid "Move photo to album"
+msgstr "Verplaatst foto naar album"
+
+#: ../../Zotlabs/Module/Photos.php:1040
+msgid "Enter a new album name"
+msgstr "Vul een nieuwe albumnaam in"
+
+#: ../../Zotlabs/Module/Photos.php:1041
+msgid "or select an existing one (doubleclick)"
+msgstr "of kies een bestaand album (dubbelklikken)"
+
+#: ../../Zotlabs/Module/Photos.php:1044
+msgid "Caption"
+msgstr "Bijschrift"
+
+#: ../../Zotlabs/Module/Photos.php:1046
+msgid "Add a Tag"
+msgstr "Tag toevoegen"
+
+#: ../../Zotlabs/Module/Photos.php:1054
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
+msgstr "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl"
+
+#: ../../Zotlabs/Module/Photos.php:1057
+msgid "Flag as adult in album view"
+msgstr "Markeer als voor volwassenen in albumweergave"
+
+#: ../../Zotlabs/Module/Photos.php:1076 ../../Zotlabs/Lib/ThreadItem.php:268
+msgid "I like this (toggle)"
+msgstr "Vind ik leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1077 ../../Zotlabs/Lib/ThreadItem.php:269
+msgid "I don't like this (toggle)"
+msgstr "Vind ik niet leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1078 ../../Zotlabs/Module/Blocks.php:161
+#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Webpages.php:241
+#: ../../extend/addon/addon/cdav/include/widgets.php:123
+#: ../../include/conversation.php:1230
+msgid "Share"
+msgstr "Delen"
+
+#: ../../Zotlabs/Module/Photos.php:1079 ../../Zotlabs/Lib/ThreadItem.php:409
+#: ../../include/conversation.php:737
+msgid "Please wait"
+msgstr "Even wachten"
+
+#: ../../Zotlabs/Module/Photos.php:1095 ../../Zotlabs/Module/Photos.php:1213
+#: ../../Zotlabs/Lib/ThreadItem.php:726
+msgid "This is you"
+msgstr "Dit ben jij"
+
+#: ../../Zotlabs/Module/Photos.php:1097 ../../Zotlabs/Module/Photos.php:1215
+#: ../../Zotlabs/Lib/ThreadItem.php:728 ../../include/js_strings.php:6
+msgid "Comment"
+msgstr "Reactie"
+
+#: ../../Zotlabs/Module/Photos.php:1099 ../../Zotlabs/Module/Webpages.php:247
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Lib/ThreadItem.php:738
+#: ../../include/page_widgets.php:43 ../../include/conversation.php:1199
+msgid "Preview"
+msgstr "Voorvertoning"
+
+#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
+msgctxt "title"
+msgid "Likes"
+msgstr "vinden dit leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
+msgctxt "title"
+msgid "Dislikes"
+msgstr "vinden dit niet leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
+msgctxt "title"
+msgid "Agree"
+msgstr "eens"
+
+#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
+msgctxt "title"
+msgid "Disagree"
+msgstr "oneens"
+
+#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
+msgctxt "title"
+msgid "Abstain"
+msgstr "onthoudingen"
+
+#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
+msgctxt "title"
+msgid "Attending"
+msgstr "aanwezig"
+
+#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
+msgctxt "title"
+msgid "Not attending"
+msgstr "niet aanwezig"
+
+#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
+msgctxt "title"
+msgid "Might attend"
+msgstr "mogelijk aanwezig"
+
+#: ../../Zotlabs/Module/Photos.php:1132 ../../Zotlabs/Module/Photos.php:1144
+#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
+#: ../../include/conversation.php:1765
+msgid "View all"
+msgstr "Toon alles"
+
+#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:190
+#: ../../include/channel.php:1190 ../../include/taxonomy.php:403
+#: ../../include/conversation.php:1789
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] "vindt dit leuk"
+msgstr[1] "vinden dit leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1141 ../../Zotlabs/Lib/ThreadItem.php:195
+#: ../../include/conversation.php:1792
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] "vindt dit niet leuk"
+msgstr[1] "vinden dit niet leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1241
+msgid "Photo Tools"
+msgstr "Hulpmiddelen"
+
+#: ../../Zotlabs/Module/Photos.php:1250
+msgid "In This Photo:"
+msgstr "Op deze foto:"
+
+#: ../../Zotlabs/Module/Photos.php:1255
+msgid "Map"
+msgstr "Kaart"
+
+#: ../../Zotlabs/Module/Photos.php:1263 ../../Zotlabs/Lib/ThreadItem.php:398
+msgctxt "noun"
+msgid "Likes"
+msgstr "vinden dit leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:399
+msgctxt "noun"
+msgid "Dislikes"
+msgstr "vinden dit niet leuk"
+
+#: ../../Zotlabs/Module/Photos.php:1269 ../../Zotlabs/Lib/ThreadItem.php:404
+#: ../../include/acl_selectors.php:210
+msgid "Close"
+msgstr "Sluiten"
+
+#: ../../Zotlabs/Module/Photos.php:1343
+msgid "View Album"
+msgstr "Album weergeven"
+
+#: ../../Zotlabs/Module/Photos.php:1354 ../../Zotlabs/Module/Photos.php:1367
+#: ../../Zotlabs/Module/Photos.php:1368
+msgid "Recent Photos"
+msgstr "Recente foto's"
+
+#: ../../Zotlabs/Module/Setup.php:176
msgid "$Projectname Server - Setup"
msgstr "$Projectname Hub - Setup"
-#: ../../Zotlabs/Module/Setup.php:188
+#: ../../Zotlabs/Module/Setup.php:180
msgid "Could not connect to database."
msgstr "Could not connect to database."
-#: ../../Zotlabs/Module/Setup.php:192
+#: ../../Zotlabs/Module/Setup.php:184
msgid ""
"Could not connect to specified site URL. Possible SSL certificate or DNS "
"issue."
msgstr "Could not connect to specified hub URL. Possible SSL certificate or DNS issue."
-#: ../../Zotlabs/Module/Setup.php:199
+#: ../../Zotlabs/Module/Setup.php:191
msgid "Could not create table."
msgstr "Could not create table."
-#: ../../Zotlabs/Module/Setup.php:204
+#: ../../Zotlabs/Module/Setup.php:196
msgid "Your site database has been installed."
msgstr "Your hub database has been installed."
-#: ../../Zotlabs/Module/Setup.php:208
+#: ../../Zotlabs/Module/Setup.php:200
msgid ""
"You may need to import the file \"install/schema_xxx.sql\" manually using a "
"database client."
msgstr "You may need to import the file \"install/schema_xxx.sql\" manually using a database client."
-#: ../../Zotlabs/Module/Setup.php:209 ../../Zotlabs/Module/Setup.php:271
-#: ../../Zotlabs/Module/Setup.php:734
+#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Setup.php:745
msgid "Please see the file \"install/INSTALL.txt\"."
msgstr "Please see the file \"install/INSTALL.txt\"."
-#: ../../Zotlabs/Module/Setup.php:268
+#: ../../Zotlabs/Module/Setup.php:260
msgid "System check"
msgstr "System check"
-#: ../../Zotlabs/Module/Setup.php:272 ../../Zotlabs/Module/Photos.php:949
-#: ../../Zotlabs/Module/Cal.php:333 ../../Zotlabs/Module/Cal.php:340
-#: ../../Zotlabs/Module/Events.php:676 ../../Zotlabs/Module/Events.php:685
-msgid "Next"
-msgstr "Volgende"
-
-#: ../../Zotlabs/Module/Setup.php:273
+#: ../../Zotlabs/Module/Setup.php:265
msgid "Check again"
msgstr "Check again"
-#: ../../Zotlabs/Module/Setup.php:295
+#: ../../Zotlabs/Module/Setup.php:287
msgid "Database connection"
msgstr "Database connection"
-#: ../../Zotlabs/Module/Setup.php:296
+#: ../../Zotlabs/Module/Setup.php:288
msgid ""
"In order to install $Projectname we need to know how to connect to your "
"database."
msgstr "In order to install $Projectname we need to know how to connect to your database."
-#: ../../Zotlabs/Module/Setup.php:297
+#: ../../Zotlabs/Module/Setup.php:289
msgid ""
"Please contact your hosting provider or site administrator if you have "
"questions about these settings."
msgstr "Please contact your hosting provider or server administrator if you have questions about these settings."
-#: ../../Zotlabs/Module/Setup.php:298
+#: ../../Zotlabs/Module/Setup.php:290
msgid ""
"The database you specify below should already exist. If it does not, please "
"create it before continuing."
msgstr "The database you specify below should already exist. If it does not, please create it before continuing."
-#: ../../Zotlabs/Module/Setup.php:302
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Database Server Name"
msgstr "Database Server Name"
-#: ../../Zotlabs/Module/Setup.php:302
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Default is 127.0.0.1"
msgstr "Default is 127.0.0.1"
-#: ../../Zotlabs/Module/Setup.php:303
+#: ../../Zotlabs/Module/Setup.php:295
msgid "Database Port"
msgstr "Database Port"
-#: ../../Zotlabs/Module/Setup.php:303
+#: ../../Zotlabs/Module/Setup.php:295
msgid "Communication port number - use 0 for default"
msgstr "Communication port number - use 0 for default"
-#: ../../Zotlabs/Module/Setup.php:304
+#: ../../Zotlabs/Module/Setup.php:296
msgid "Database Login Name"
msgstr "Database Login Name"
-#: ../../Zotlabs/Module/Setup.php:305
+#: ../../Zotlabs/Module/Setup.php:297
msgid "Database Login Password"
msgstr "Database Login Password"
-#: ../../Zotlabs/Module/Setup.php:306
+#: ../../Zotlabs/Module/Setup.php:298
msgid "Database Name"
msgstr "Database Name"
-#: ../../Zotlabs/Module/Setup.php:307
+#: ../../Zotlabs/Module/Setup.php:299
msgid "Database Type"
msgstr "Database Type"
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:355
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
msgid "Site administrator email address"
msgstr "Hub administrator email address"
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:355
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
msgid ""
"Your account email address must match this in order to use the web admin "
"panel."
msgstr "Your account email address must match this in order to use the web admin panel."
-#: ../../Zotlabs/Module/Setup.php:310 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
msgid "Website URL"
msgstr "Hub URL"
-#: ../../Zotlabs/Module/Setup.php:310 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
msgid "Please use SSL (https) URL if available."
msgstr "Please use SSL (https) URL if available."
-#: ../../Zotlabs/Module/Setup.php:311 ../../Zotlabs/Module/Setup.php:361
+#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
msgid "Please select a default timezone for your website"
msgstr "Please select a default timezone for your hub"
-#: ../../Zotlabs/Module/Setup.php:344
+#: ../../Zotlabs/Module/Setup.php:336
msgid "Site settings"
msgstr "Hub settings"
-#: ../../Zotlabs/Module/Setup.php:400
+#: ../../Zotlabs/Module/Setup.php:392
msgid "PHP version 5.5 or greater is required."
msgstr "PHP version 5.5 or greater is required."
-#: ../../Zotlabs/Module/Setup.php:401
+#: ../../Zotlabs/Module/Setup.php:393
msgid "PHP version"
msgstr "PHP version"
-#: ../../Zotlabs/Module/Setup.php:416
+#: ../../Zotlabs/Module/Setup.php:409
msgid "Could not find a command line version of PHP in the web server PATH."
msgstr "Could not find a command line version of PHP in the web server PATH."
-#: ../../Zotlabs/Module/Setup.php:417
+#: ../../Zotlabs/Module/Setup.php:410
msgid ""
"If you don't have a command line version of PHP installed on server, you "
"will not be able to run background polling via cron."
msgstr "If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."
-#: ../../Zotlabs/Module/Setup.php:421
+#: ../../Zotlabs/Module/Setup.php:414
msgid "PHP executable path"
msgstr "PHP executable path"
-#: ../../Zotlabs/Module/Setup.php:421
+#: ../../Zotlabs/Module/Setup.php:414
msgid ""
"Enter full path to php executable. You can leave this blank to continue the "
"installation."
msgstr "Enter full path to php executable. You can leave this blank to continue the installation."
-#: ../../Zotlabs/Module/Setup.php:426
+#: ../../Zotlabs/Module/Setup.php:419
msgid "Command line PHP"
msgstr "Command line PHP"
-#: ../../Zotlabs/Module/Setup.php:435
+#: ../../Zotlabs/Module/Setup.php:429
msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "The command line version of PHP on your system does not have \"register_argc_argv\" enabled."
+"Unable to check command line PHP, as shell_exec() is disabled. This is "
+"required."
+msgstr "Unable to check command line PHP, as shell_exec() is disabled. This is required."
-#: ../../Zotlabs/Module/Setup.php:436
+#: ../../Zotlabs/Module/Setup.php:432
+msgid ""
+"Contact information for site administrators. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Contactinformatie voor hub-beheerders. Getoond op pagina met hub-informatie. Er kan hier bbcode gebruikt worden."
+
+#: ../../Zotlabs/Module/Setup.php:433
msgid "This is required for message delivery to work."
msgstr "This is required for message delivery to work."
-#: ../../Zotlabs/Module/Setup.php:439
+#: ../../Zotlabs/Module/Setup.php:436
msgid "PHP register_argc_argv"
msgstr "PHP register_argc_argv"
-#: ../../Zotlabs/Module/Setup.php:457
+#: ../../Zotlabs/Module/Setup.php:454
#, php-format
msgid ""
-"Your max allowed total upload size is set to %s. Maximum size of one file to"
-" upload is set to %s. You are allowed to upload up to %d files at once."
-msgstr "Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
+msgstr "Standaardthema voor $Projectname-hub (kan door lid veranderd worden) - <a href='#' id='cnftheme'>verander thema-instellingen</a>"
-#: ../../Zotlabs/Module/Setup.php:462
-msgid "You can adjust these settings in the servers php.ini."
-msgstr "You can adjust these settings in the servers php.ini."
+#: ../../Zotlabs/Module/Setup.php:459
+msgid "You can adjust these settings in the server php.ini file."
+msgstr "You can adjust these settings in the server php.ini file."
-#: ../../Zotlabs/Module/Setup.php:464
+#: ../../Zotlabs/Module/Setup.php:461
msgid "PHP upload limits"
msgstr "PHP upload limits"
-#: ../../Zotlabs/Module/Setup.php:487
+#: ../../Zotlabs/Module/Setup.php:484
msgid ""
"Error: the \"openssl_pkey_new\" function on this system is not able to "
"generate encryption keys"
msgstr "Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"
-#: ../../Zotlabs/Module/Setup.php:488
+#: ../../Zotlabs/Module/Setup.php:485
msgid ""
"If running under Windows, please see "
"\"http://www.php.net/manual/en/openssl.installation.php\"."
msgstr "If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."
-#: ../../Zotlabs/Module/Setup.php:491
+#: ../../Zotlabs/Module/Setup.php:488
msgid "Generate encryption keys"
msgstr "Generate encryption keys"
-#: ../../Zotlabs/Module/Setup.php:503
+#: ../../Zotlabs/Module/Setup.php:500
msgid "libCurl PHP module"
msgstr "libCurl PHP module"
-#: ../../Zotlabs/Module/Setup.php:504
+#: ../../Zotlabs/Module/Setup.php:501
msgid "GD graphics PHP module"
msgstr "GD graphics PHP module"
-#: ../../Zotlabs/Module/Setup.php:505
+#: ../../Zotlabs/Module/Setup.php:502
msgid "OpenSSL PHP module"
msgstr "OpenSSL PHP module"
-#: ../../Zotlabs/Module/Setup.php:506
-msgid "mysqli or postgres PHP module"
-msgstr "mysqli or postgres PHP module"
+#: ../../Zotlabs/Module/Setup.php:503
+msgid "PDO database PHP module"
+msgstr "PDO database PHP module"
-#: ../../Zotlabs/Module/Setup.php:507
+#: ../../Zotlabs/Module/Setup.php:504
msgid "mb_string PHP module"
msgstr "mb_string PHP module"
-#: ../../Zotlabs/Module/Setup.php:508
+#: ../../Zotlabs/Module/Setup.php:505
msgid "xml PHP module"
msgstr "xml PHP module"
-#: ../../Zotlabs/Module/Setup.php:512 ../../Zotlabs/Module/Setup.php:514
+#: ../../Zotlabs/Module/Setup.php:509 ../../Zotlabs/Module/Setup.php:511
msgid "Apache mod_rewrite module"
msgstr "Apache mod_rewrite module"
-#: ../../Zotlabs/Module/Setup.php:512
+#: ../../Zotlabs/Module/Setup.php:509
msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Error: Apache webserver mod-rewrite module is required but not installed."
+"example: 'public' to show public stream, 'page/sys/home' to show a system "
+"webpage called 'home' or 'include:home.html' to include a file."
+msgstr "voorbeeld: 'public' om de openbare stream te tonen, 'page/sys/home' om de webpagina 'home' van het systeemkanaal te tonen of 'include:home.html' om een gewoon bestand te gebruiken."
-#: ../../Zotlabs/Module/Setup.php:518 ../../Zotlabs/Module/Setup.php:521
-msgid "proc_open"
-msgstr "proc_open"
+#: ../../Zotlabs/Module/Setup.php:515 ../../Zotlabs/Module/Setup.php:518
+msgid "exec"
+msgstr "exec"
-#: ../../Zotlabs/Module/Setup.php:518
+#: ../../Zotlabs/Module/Setup.php:515
msgid ""
-"Error: proc_open is required but is either not installed or has been "
+"Error: exec is required but is either not installed or has been disabled in "
+"php.ini"
+msgstr "Error: exec is required but is either not installed or has been disabled in php.ini"
+
+#: ../../Zotlabs/Module/Setup.php:521 ../../Zotlabs/Module/Setup.php:524
+msgid "shell_exec"
+msgstr "shell_exec"
+
+#: ../../Zotlabs/Module/Setup.php:521
+msgid ""
+"Error: shell_exec is required but is either not installed or has been "
"disabled in php.ini"
-msgstr "Error: proc_open is required but is either not installed or has been disabled in php.ini"
+msgstr "Error: shell_exec is required but is either not installed or has been disabled in php.ini"
-#: ../../Zotlabs/Module/Setup.php:526
+#: ../../Zotlabs/Module/Setup.php:529
msgid "Error: libCURL PHP module required but not installed."
msgstr "Error: libCURL PHP module required but not installed."
-#: ../../Zotlabs/Module/Setup.php:530
+#: ../../Zotlabs/Module/Setup.php:533
msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Error: GD graphics PHP module with JPEG support required but not installed."
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
+msgstr "Zal geen systeembronnen verspillen door polling van externe hubs voor verlaten accounts. Vul 0 in voor geen tijdslimiet."
-#: ../../Zotlabs/Module/Setup.php:534
+#: ../../Zotlabs/Module/Setup.php:537
msgid "Error: openssl PHP module required but not installed."
msgstr "Error: openssl PHP module required but not installed."
-#: ../../Zotlabs/Module/Setup.php:538
-msgid ""
-"Error: mysqli or postgres PHP module required but neither are installed."
-msgstr "Error: mysqli or postgres PHP module required but neither are installed."
+#: ../../Zotlabs/Module/Setup.php:541
+msgid "Error: PDO database PHP module required but not installed."
+msgstr "Error: PDO database PHP module required but not installed."
-#: ../../Zotlabs/Module/Setup.php:542
+#: ../../Zotlabs/Module/Setup.php:545
msgid "Error: mb_string PHP module required but not installed."
msgstr "Error: mb_string PHP module required but not installed."
-#: ../../Zotlabs/Module/Setup.php:546
+#: ../../Zotlabs/Module/Setup.php:549
msgid "Error: xml PHP module required for DAV but not installed."
msgstr "Error: xml PHP module required for DAV but not installed."
-#: ../../Zotlabs/Module/Setup.php:564
+#: ../../Zotlabs/Module/Setup.php:567
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 "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."
+"Check to verify email addresses used in account registration (recommended)."
+msgstr "Inschakelen om e-mailadressen te verifiëren die tijdens de accountregistratie worden gebruikt (aanbevolen)."
-#: ../../Zotlabs/Module/Setup.php:565
+#: ../../Zotlabs/Module/Setup.php:568
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 "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."
-#: ../../Zotlabs/Module/Setup.php:566
+#: ../../Zotlabs/Module/Setup.php:569
msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Red top folder."
-msgstr "At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."
+"Check to force all profiles on this site to be listed in the site directory."
+msgstr "Vink dit aan om af te dwingen dat alle kanalen op deze hub in de kanalengids worden vermeld."
-#: ../../Zotlabs/Module/Setup.php:567
+#: ../../Zotlabs/Module/Setup.php:570
msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"install/INSTALL.txt\" for instructions."
-msgstr "You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."
+"Import and allow access to public content pulled from other sites. Warning: "
+"this content is unmoderated."
+msgstr "Toegang verlenen tot openbare berichten die vanuit andere hubs worden geïmporteerd. Waarschuwing: de inhoud van deze berichten wordt niet gemodereerd."
-#: ../../Zotlabs/Module/Setup.php:570
+#: ../../Zotlabs/Module/Setup.php:573
msgid ".htconfig.php is writable"
msgstr ".htconfig.php is writable"
-#: ../../Zotlabs/Module/Setup.php:584
+#: ../../Zotlabs/Module/Setup.php:587
msgid ""
-"Red uses the Smarty3 template engine to render its web views. Smarty3 "
-"compiles templates to PHP to speed up rendering."
-msgstr "Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."
+"This software uses the Smarty3 template engine to render its web views. "
+"Smarty3 compiles templates to PHP to speed up rendering."
+msgstr "This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."
-#: ../../Zotlabs/Module/Setup.php:585
+#: ../../Zotlabs/Module/Setup.php:588
#, php-format
msgid ""
"In order to store these compiled templates, the web server needs to have "
"write access to the directory %s under the top level web folder."
msgstr "In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."
-#: ../../Zotlabs/Module/Setup.php:586 ../../Zotlabs/Module/Setup.php:607
+#: ../../Zotlabs/Module/Setup.php:589 ../../Zotlabs/Module/Setup.php:610
msgid ""
"Please ensure that the user that your web server runs as (e.g. www-data) has"
" write access to this folder."
msgstr "Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."
-#: ../../Zotlabs/Module/Setup.php:587
+#: ../../Zotlabs/Module/Setup.php:590
#, php-format
msgid ""
"Note: as a security measure, you should give the web server write access to "
"%s only--not the template files (.tpl) that it contains."
msgstr "Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."
-#: ../../Zotlabs/Module/Setup.php:590
+#: ../../Zotlabs/Module/Setup.php:593
#, php-format
msgid "%s is writable"
msgstr "%s is writable"
-#: ../../Zotlabs/Module/Setup.php:606
+#: ../../Zotlabs/Module/Setup.php:609
msgid ""
"This software uses the store directory to save uploaded files. The web "
-"server needs to have write access to the store directory under the Red top "
-"level folder"
-msgstr "This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"
+"server needs to have write access to the store directory under the top level"
+" web folder"
+msgstr "This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"
-#: ../../Zotlabs/Module/Setup.php:610
+#: ../../Zotlabs/Module/Setup.php:613
msgid "store is writable"
msgstr "store is writable"
-#: ../../Zotlabs/Module/Setup.php:643
+#: ../../Zotlabs/Module/Setup.php:646
msgid ""
"SSL certificate cannot be validated. Fix certificate or disable https access"
" to this site."
msgstr "SSL certificate cannot be validated. Fix certificate or disable https access to this hub."
-#: ../../Zotlabs/Module/Setup.php:644
+#: ../../Zotlabs/Module/Setup.php:647
msgid ""
"If you have https access to your website or allow connections to TCP port "
"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
"NOT use self-signed certificates!"
msgstr "If you have https access to your hub or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"
-#: ../../Zotlabs/Module/Setup.php:645
+#: ../../Zotlabs/Module/Setup.php:648
msgid ""
"This restriction is incorporated because public posts from you may for "
"example contain references to images on your own hub."
msgstr "This restriction is incorporated because public posts from you may for example contain references to images on your own hub."
-#: ../../Zotlabs/Module/Setup.php:646
+#: ../../Zotlabs/Module/Setup.php:649
msgid ""
"If your certificate is not recognized, members of other sites (who may "
"themselves have valid certificates) will get a warning message on their own "
"site complaining about security issues."
msgstr "If your certificate is not recognized, members of other hubs (who may themselves have valid certificates) will get a warning message on their own hub complaining about security issues."
-#: ../../Zotlabs/Module/Setup.php:647
+#: ../../Zotlabs/Module/Setup.php:650
msgid ""
-"This can cause usability issues elsewhere (not just on your own site) so we "
-"must insist on this requirement."
-msgstr "This can cause usability issues elsewhere (not just on your own hub) so we must insist on this requirement."
+"Delay background delivery processes by this many seconds to reduce system "
+"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
+"for large dedicated servers."
+msgstr "Vertraag de achtergrondprocessen voor het afleveren met een aantal seconden om de systeembelasting te verminderen. Aanbevolen: 4-5 voor shared hosts, 2-3 voor virtual private servers (VPS) en 0-1 voor grote dedicated servers."
-#: ../../Zotlabs/Module/Setup.php:648
+#: ../../Zotlabs/Module/Setup.php:651
msgid ""
"Providers are available that issue free certificates which are browser-"
"valid."
msgstr "Providers are available that issue free certificates which are browser-valid."
-#: ../../Zotlabs/Module/Setup.php:650
+#: ../../Zotlabs/Module/Setup.php:653
msgid ""
-"If you are confident that the certificate is valid and signed by a trusted "
-"authority, check to see if you have failed to install an intermediate cert. "
-"These are not normally required by browsers, but are required for server-to-"
-"server communications."
-msgstr "If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."
+"Number of deliveries to attempt in a single operating system process. Adjust"
+" if necessary to tune system performance. Recommend: 1-5."
+msgstr "Aantal leveringen die aan één serverproces worden meegegeven. Pas dit aan wanneer het nodig is om systeemprestaties te verbeteren. Aangeraden: 1-5"
-#: ../../Zotlabs/Module/Setup.php:653
+#: ../../Zotlabs/Module/Setup.php:655
msgid "SSL certificate validation"
msgstr "SSL certificate validation"
-#: ../../Zotlabs/Module/Setup.php:659
+#: ../../Zotlabs/Module/Setup.php:661
msgid ""
-"Url rewrite in .htaccess is not working. Check your server "
-"configuration.Test: "
-msgstr "Url rewrite in .htaccess is not working. Check your server configuration.Test: "
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
+msgstr "De achtergrondprocessen voor het afleveren met zoveel seconden vertragen om de systeembelasting te verminderen. 0 om de afleveringsinterval te gebruiken."
-#: ../../Zotlabs/Module/Setup.php:662
+#: ../../Zotlabs/Module/Setup.php:664
msgid "Url rewrite is working"
msgstr "Url rewrite is working"
-#: ../../Zotlabs/Module/Setup.php:671
+#: ../../Zotlabs/Module/Setup.php:678
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 "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."
-#: ../../Zotlabs/Module/Setup.php:695
+#: ../../Zotlabs/Module/Setup.php:702
+#: ../../extend/addon/addon/cdav/cdav.php:41
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:385
msgid "Errors encountered creating database tables."
msgstr "Errors encountered creating database tables."
-#: ../../Zotlabs/Module/Setup.php:732
+#: ../../Zotlabs/Module/Setup.php:743
msgid "<h1>What next</h1>"
msgstr "<h1>What next</h1>"
-#: ../../Zotlabs/Module/Setup.php:733
+#: ../../Zotlabs/Module/Setup.php:744
msgid ""
"IMPORTANT: You will need to [manually] setup a scheduled task for the "
"poller."
msgstr "IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
-#: ../../Zotlabs/Module/Lostpass.php:19
-msgid "No valid account found."
-msgstr "Geen geldige account gevonden."
-
-#: ../../Zotlabs/Module/Lostpass.php:33
-msgid "Password reset request issued. Check your email."
-msgstr "Het verzoek om je wachtwoord opnieuw in te stellen is behandeld. Controleer je e-mail."
-
-#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:107
-#, php-format
-msgid "Site Member (%s)"
-msgstr "Lid van hub (%s)"
-
-#: ../../Zotlabs/Module/Lostpass.php:44
-#, php-format
-msgid "Password reset requested at %s"
-msgstr "Verzoek tot het opnieuw instellen van een wachtwoord op %s is ingediend"
-
-#: ../../Zotlabs/Module/Lostpass.php:67
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "Het verzoek kon niet worden geverifieerd. (Mogelijk heb je al eerder een verzoek ingediend.) Opnieuw instellen van wachtwoord is mislukt."
-
-#: ../../Zotlabs/Module/Lostpass.php:90 ../../boot.php:1747
-msgid "Password Reset"
-msgstr "Wachtwoord vergeten?"
-
-#: ../../Zotlabs/Module/Lostpass.php:91
-msgid "Your password has been reset as requested."
-msgstr "Jouw wachtwoord is opnieuw ingesteld zoals je had verzocht."
-
-#: ../../Zotlabs/Module/Lostpass.php:92
-msgid "Your new password is"
-msgstr "Jouw nieuwe wachtwoord is"
-
-#: ../../Zotlabs/Module/Lostpass.php:93
-msgid "Save or copy your new password - and then"
-msgstr "Kopieer of sla je nieuwe wachtwoord op - en"
-
-#: ../../Zotlabs/Module/Lostpass.php:94
-msgid "click here to login"
-msgstr "klik dan hier om in te loggen"
-
-#: ../../Zotlabs/Module/Lostpass.php:95
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Jouw wachtwoord kan worden veranderd onder <em>instellingen</em>, nadat je succesvol bent ingelogd."
-
-#: ../../Zotlabs/Module/Lostpass.php:112
-#, php-format
-msgid "Your password has changed at %s"
-msgstr "Jouw wachtwoord op %s is veranderd"
-
-#: ../../Zotlabs/Module/Lostpass.php:127
-msgid "Forgot your Password?"
-msgstr "Wachtwoord vergeten?"
-
-#: ../../Zotlabs/Module/Lostpass.php:128
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Voer je e-mailadres in en verstuur deze om je wachtwoord opnieuw in te stellen. Controleer hierna hier je e-mail voor verdere instructies."
-
-#: ../../Zotlabs/Module/Lostpass.php:129
-msgid "Email Address"
-msgstr "E-mailadres"
-
-#: ../../Zotlabs/Module/Lostpass.php:130
-msgid "Reset"
-msgstr "Opnieuw instellen"
-
-#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
-#, php-format
-msgctxt "mood"
-msgid "%1$s is %2$s"
-msgstr "%1$s is %2$s"
-
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:227
-msgid "Mood"
-msgstr "Stemming"
-
-#: ../../Zotlabs/Module/Mood.php:136
-msgid "Set your current mood and tell your friends"
-msgstr "Noteer je huidige stemming en toon het aan je connecties"
-
-#: ../../Zotlabs/Module/Removeme.php:35
-msgid ""
-"Channel removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "Het verwijderen van een kanaal is niet toegestaan binnen 48 uur nadat het wachtwoord van het account is veranderd."
-
-#: ../../Zotlabs/Module/Removeme.php:60
-msgid "Remove This Channel"
-msgstr "Verwijder dit kanaal"
-
-#: ../../Zotlabs/Module/Removeme.php:61
-#: ../../Zotlabs/Module/Removeaccount.php:58
-msgid "WARNING: "
-msgstr "WAARSCHUWING: "
-
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This channel will be completely removed from the network. "
-msgstr "Dit kanaal wordt volledig uit het $Projectname-netwerk verwijderd."
-
-#: ../../Zotlabs/Module/Removeme.php:61
-#: ../../Zotlabs/Module/Removeaccount.php:58
-msgid "This action is permanent and can not be undone!"
-msgstr "Deze handeling is van permanente aard en kan niet meer worden teruggedraaid!"
-
-#: ../../Zotlabs/Module/Removeme.php:62
-#: ../../Zotlabs/Module/Removeaccount.php:59
-msgid "Please enter your password for verification:"
-msgstr "Vul je wachtwoord in ter verificatie:"
-
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid "Remove this channel and all its clones from the network"
-msgstr "Dit kanaal en alle klonen hiervan uit het $Projectname-netwerk verwijderen"
-
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid ""
-"By default only the instance of the channel located on this hub will be "
-"removed from the network"
-msgstr "Standaard wordt alleen het kanaal dat zich op deze hub bevindt uit het $Projectname-netwerk verwijderd"
-
-#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:544
-msgid "Remove Channel"
-msgstr "Kanaal verwijderen"
-
-#: ../../Zotlabs/Module/Notify.php:57
-#: ../../Zotlabs/Module/Notifications.php:98
-msgid "No more system notifications."
-msgstr "Geen systeemnotificaties meer."
-
-#: ../../Zotlabs/Module/Notify.php:61
-#: ../../Zotlabs/Module/Notifications.php:102
-msgid "System Notifications"
-msgstr "Systeemnotificaties"
-
-#: ../../Zotlabs/Module/Match.php:26
-msgid "Profile Match"
-msgstr "Profielovereenkomst"
-
-#: ../../Zotlabs/Module/Match.php:35
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Je hebt geen trefwoorden waarmee overeenkomsten gevonden kunnen worden. Voeg enkele trefwoorden aan je standaardprofiel toe."
-
-#: ../../Zotlabs/Module/Match.php:67
-msgid "is interested in:"
-msgstr "is geïnteresseerd in:"
-
-#: ../../Zotlabs/Module/Match.php:68 ../../Zotlabs/Module/Suggest.php:56
-#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1034
-#: ../../include/connections.php:78 ../../include/conversation.php:955
-#: ../../include/widgets.php:147 ../../include/widgets.php:184
-msgid "Connect"
-msgstr "Verbinden"
-
-#: ../../Zotlabs/Module/Match.php:74
-msgid "No matches"
-msgstr "Geen overeenkomsten"
+#: ../../Zotlabs/Module/Editpost.php:35
+msgid "Item is not editable"
+msgstr "Item is niet te bewerken"
-#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49
+#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
msgid "This site is not a directory server"
msgstr "Deze hub is geen kanalengidshub (directoryserver)"
-#: ../../Zotlabs/Module/Dirsearch.php:33
-msgid "This directory server requires an access token"
-msgstr "Deze kanalengidshub (directoryserver) heeft een toegangs-token nodig"
-
-#: ../../Zotlabs/Module/Magic.php:71
-msgid "Hub not found."
-msgstr "Hub niet gevonden."
-
-#: ../../Zotlabs/Module/Photos.php:82
-msgid "Page owner information could not be retrieved."
-msgstr "Informatie over de pagina-eigenaar werd niet ontvangen."
-
-#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:734
-#: ../../Zotlabs/Module/Profile_photo.php:115
-#: ../../Zotlabs/Module/Profile_photo.php:212
-#: ../../Zotlabs/Module/Profile_photo.php:311
-#: ../../include/photo/photo_driver.php:728
-msgid "Profile Photos"
-msgstr "Profielfoto's"
-
-#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
-msgid "Album not found."
-msgstr "Album niet gevonden."
-
-#: ../../Zotlabs/Module/Photos.php:112
-msgid "Delete Album"
-msgstr "Verwijder album"
+#: ../../Zotlabs/Module/New_channel.php:140
+msgid "Create Channel"
+msgstr "Kanaal aanmaken"
-#: ../../Zotlabs/Module/Photos.php:133
+#: ../../Zotlabs/Module/New_channel.php:141
msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
-msgstr "Er bestaan meerdere submappen met deze albumnaam, maar verspreidt over verschillende mappen. Verwijder de gewenste map(pen) met de bestandsbeheerder."
-
-#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1059
-msgid "Delete Photo"
-msgstr "Verwijder foto"
-
-#: ../../Zotlabs/Module/Photos.php:509 ../../Zotlabs/Module/Display.php:17
-#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Search.php:17
-#: ../../Zotlabs/Module/Viewconnections.php:23
-#: ../../Zotlabs/Module/Directory.php:63
-msgid "Public access denied."
-msgstr "Openbare toegang geweigerd."
-
-#: ../../Zotlabs/Module/Photos.php:520
-msgid "No photos selected"
-msgstr "Geen foto's geselecteerd"
-
-#: ../../Zotlabs/Module/Photos.php:569
-msgid "Access to this item is restricted."
-msgstr "Toegang tot dit item is beperkt."
-
-#: ../../Zotlabs/Module/Photos.php:608
-#, php-format
-msgid "%1$.2f MB of %2$.2f MB photo storage used."
-msgstr "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt."
-
-#: ../../Zotlabs/Module/Photos.php:611
-#, php-format
-msgid "%1$.2f MB photo storage used."
-msgstr "%1$.2f MB aan foto-opslag gebruikt."
-
-#: ../../Zotlabs/Module/Photos.php:647
-msgid "Upload Photos"
-msgstr "Foto's uploaden"
-
-#: ../../Zotlabs/Module/Photos.php:651
-msgid "Enter an album name"
-msgstr "Vul een albumnaam in"
-
-#: ../../Zotlabs/Module/Photos.php:652
-msgid "or select an existing album (doubleclick)"
-msgstr "of kies een bestaand album (dubbelklikken)"
-
-#: ../../Zotlabs/Module/Photos.php:653
-msgid "Create a status post for this upload"
-msgstr "Plaats een bericht voor deze upload."
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
+msgstr "Een kanaal is jouw identiteit in dit netwerk. Het kan bijvoorbeeld een persoon, een blog of een forum vertegenwoordigen. Door met elkaar te verbinden kunnen kanalen, met behulp van uitgebreide permissies, informatie uitwisselen."
-#: ../../Zotlabs/Module/Photos.php:654
-msgid "Caption (optional):"
-msgstr "Bijschrift (optioneel):"
+#: ../../Zotlabs/Module/New_channel.php:142
+msgid ""
+"or <a href=\"import\">import an existing channel</a> from another location."
+msgstr "Of <a href=\"import\">importeer een bestaand kanaal</a> vanaf een andere locatie"
-#: ../../Zotlabs/Module/Photos.php:655
-msgid "Description (optional):"
-msgstr "Omschrijving (optioneel):"
+#: ../../Zotlabs/Module/Notifications.php:40 ../../include/nav.php:194
+msgid "Mark all system notifications seen"
+msgstr "Markeer alle systeemnotificaties als bekeken"
-#: ../../Zotlabs/Module/Photos.php:686
-msgid "Album name could not be decoded"
-msgstr "Albumnaam kon niet gedecodeerd worden"
+#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:230
+#: ../../include/conversation.php:941
+msgid "Poke"
+msgstr "Aanstoten"
-#: ../../Zotlabs/Module/Photos.php:734
-msgid "Contact Photos"
-msgstr "Connectiefoto's"
+#: ../../Zotlabs/Module/Poke.php:169
+msgid "Poke somebody"
+msgstr "Iemand aanstoten"
-#: ../../Zotlabs/Module/Photos.php:757
-msgid "Show Newest First"
-msgstr "Nieuwste eerst weergeven"
+#: ../../Zotlabs/Module/Poke.php:172
+msgid "Poke/Prod"
+msgstr "Aanstoten/porren"
-#: ../../Zotlabs/Module/Photos.php:759
-msgid "Show Oldest First"
-msgstr "Oudste eerst weergeven"
+#: ../../Zotlabs/Module/Poke.php:173
+msgid "Poke, prod or do other things to somebody"
+msgstr "Iemand bijvoorbeeld aanstoten of poren"
-#: ../../Zotlabs/Module/Photos.php:783 ../../Zotlabs/Module/Photos.php:1337
-#: ../../Zotlabs/Module/Embedphotos.php:141 ../../include/widgets.php:1677
-msgid "View Photo"
-msgstr "Foto weergeven"
+#: ../../Zotlabs/Module/Poke.php:180
+msgid "Recipient"
+msgstr "Ontvanger"
-#: ../../Zotlabs/Module/Photos.php:814
-#: ../../Zotlabs/Module/Embedphotos.php:157 ../../include/widgets.php:1694
-msgid "Edit Album"
-msgstr "Album bewerken"
+#: ../../Zotlabs/Module/Poke.php:181
+msgid "Choose what you wish to do to recipient"
+msgstr "Kies wat je met de ontvanger wil doen"
-#: ../../Zotlabs/Module/Photos.php:861
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Toegang geweigerd. Toegang tot dit item kan zijn beperkt."
+#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+msgid "Make this post private"
+msgstr "Maak dit bericht privé"
-#: ../../Zotlabs/Module/Photos.php:863
-msgid "Photo not available"
-msgstr "Foto niet aanwezig"
+#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:183
+#: ../../Zotlabs/Module/Profiles.php:240 ../../Zotlabs/Module/Profiles.php:619
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62
+msgid "Profile not found."
+msgstr "Profiel niet gevonden."
-#: ../../Zotlabs/Module/Photos.php:921
-msgid "Use as profile photo"
-msgstr "Als profielfoto gebruiken"
+#: ../../Zotlabs/Module/Profiles.php:44
+msgid "Profile deleted."
+msgstr "Profiel verwijderd."
-#: ../../Zotlabs/Module/Photos.php:922
-msgid "Use as cover photo"
-msgstr "Als omslagfoto gebruiken"
+#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:104
+msgid "Profile-"
+msgstr "Profiel-"
-#: ../../Zotlabs/Module/Photos.php:929
-msgid "Private Photo"
-msgstr "Privéfoto"
+#: ../../Zotlabs/Module/Profiles.php:89 ../../Zotlabs/Module/Profiles.php:126
+msgid "New profile created."
+msgstr "Nieuw profiel aangemaakt."
-#: ../../Zotlabs/Module/Photos.php:940 ../../Zotlabs/Module/Cal.php:332
-#: ../../Zotlabs/Module/Cal.php:339 ../../Zotlabs/Module/Events.php:675
-#: ../../Zotlabs/Module/Events.php:684
-msgid "Previous"
-msgstr "Vorige"
+#: ../../Zotlabs/Module/Profiles.php:110
+msgid "Profile unavailable to clone."
+msgstr "Profiel niet beschikbaar om te klonen"
-#: ../../Zotlabs/Module/Photos.php:944
-msgid "View Full Size"
-msgstr "Volledige grootte weergeven"
+#: ../../Zotlabs/Module/Profiles.php:145
+msgid "Profile unavailable to export."
+msgstr "Geen profiel beschikbaar om te exporteren"
-#: ../../Zotlabs/Module/Photos.php:1033
-msgid "Edit photo"
-msgstr "Foto bewerken"
+#: ../../Zotlabs/Module/Profiles.php:250
+msgid "Profile Name is required."
+msgstr "Profielnaam is vereist"
-#: ../../Zotlabs/Module/Photos.php:1035
-msgid "Rotate CW (right)"
-msgstr "Draai met de klok mee (naar rechts)"
+#: ../../Zotlabs/Module/Profiles.php:421
+msgid "Marital Status"
+msgstr "Huwelijke status"
-#: ../../Zotlabs/Module/Photos.php:1036
-msgid "Rotate CCW (left)"
-msgstr "Draai tegen de klok in (naar links)"
+#: ../../Zotlabs/Module/Profiles.php:425
+msgid "Romantic Partner"
+msgstr "Romantische partner"
-#: ../../Zotlabs/Module/Photos.php:1039
-msgid "Move photo to album"
-msgstr "Verplaatst foto naar album"
+#: ../../Zotlabs/Module/Profiles.php:429 ../../Zotlabs/Module/Profiles.php:730
+msgid "Likes"
+msgstr "Houdt van"
-#: ../../Zotlabs/Module/Photos.php:1040
-msgid "Enter a new album name"
-msgstr "Vul een nieuwe albumnaam in"
+#: ../../Zotlabs/Module/Profiles.php:433 ../../Zotlabs/Module/Profiles.php:731
+msgid "Dislikes"
+msgstr "Houdt niet van"
-#: ../../Zotlabs/Module/Photos.php:1041
-msgid "or select an existing one (doubleclick)"
-msgstr "of kies een bestaand album (dubbelklikken)"
+#: ../../Zotlabs/Module/Profiles.php:437 ../../Zotlabs/Module/Profiles.php:738
+msgid "Work/Employment"
+msgstr "Werk/arbeid"
-#: ../../Zotlabs/Module/Photos.php:1044
-msgid "Caption"
-msgstr "Bijschrift"
+#: ../../Zotlabs/Module/Profiles.php:440
+msgid "Religion"
+msgstr "Religie"
-#: ../../Zotlabs/Module/Photos.php:1046
-msgid "Add a Tag"
-msgstr "Tag toevoegen"
+#: ../../Zotlabs/Module/Profiles.php:444
+msgid "Political Views"
+msgstr "Politieke overtuigingen"
-#: ../../Zotlabs/Module/Photos.php:1054
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
-msgstr "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl"
+#: ../../Zotlabs/Module/Profiles.php:448
+#: ../../extend/addon/addon/openid/MysqlProvider.php:74
+msgid "Gender"
+msgstr "Geslacht"
-#: ../../Zotlabs/Module/Photos.php:1057
-msgid "Flag as adult in album view"
-msgstr "Markeer als voor volwassenen in albumweergave"
+#: ../../Zotlabs/Module/Profiles.php:452
+msgid "Sexual Preference"
+msgstr "Seksuele voorkeur"
-#: ../../Zotlabs/Module/Photos.php:1076 ../../Zotlabs/Lib/ThreadItem.php:268
-msgid "I like this (toggle)"
-msgstr "Vind ik leuk"
+#: ../../Zotlabs/Module/Profiles.php:456
+msgid "Homepage"
+msgstr "Homepage"
-#: ../../Zotlabs/Module/Photos.php:1077 ../../Zotlabs/Lib/ThreadItem.php:269
-msgid "I don't like this (toggle)"
-msgstr "Vind ik niet leuk"
+#: ../../Zotlabs/Module/Profiles.php:460
+msgid "Interests"
+msgstr "Interesses"
-#: ../../Zotlabs/Module/Photos.php:1078 ../../Zotlabs/Module/Blocks.php:161
-#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Webpages.php:241
-#: ../../include/conversation.php:1232
-msgid "Share"
-msgstr "Delen"
+#: ../../Zotlabs/Module/Profiles.php:554
+msgid "Profile updated."
+msgstr "Profiel bijgewerkt"
-#: ../../Zotlabs/Module/Photos.php:1079 ../../Zotlabs/Lib/ThreadItem.php:405
-#: ../../include/conversation.php:741
-msgid "Please wait"
-msgstr "Even wachten"
+#: ../../Zotlabs/Module/Profiles.php:638
+msgid "Hide your connections list from viewers of this profile"
+msgstr "Laat de lijst met connecties niet aan bezoekers van dit profiel zien."
-#: ../../Zotlabs/Module/Photos.php:1095 ../../Zotlabs/Module/Photos.php:1213
-#: ../../Zotlabs/Lib/ThreadItem.php:722
-msgid "This is you"
-msgstr "Dit ben jij"
+#: ../../Zotlabs/Module/Profiles.php:680
+msgid "Edit Profile Details"
+msgstr "Profiel bewerken"
-#: ../../Zotlabs/Module/Photos.php:1097 ../../Zotlabs/Module/Photos.php:1215
-#: ../../Zotlabs/Lib/ThreadItem.php:724 ../../include/js_strings.php:6
-msgid "Comment"
-msgstr "Reactie"
+#: ../../Zotlabs/Module/Profiles.php:682
+msgid "View this profile"
+msgstr "Profiel weergeven"
-#: ../../Zotlabs/Module/Photos.php:1099 ../../Zotlabs/Module/Webpages.php:247
-#: ../../Zotlabs/Module/Events.php:473 ../../Zotlabs/Lib/ThreadItem.php:734
-#: ../../include/page_widgets.php:43 ../../include/conversation.php:1201
-msgid "Preview"
-msgstr "Voorvertoning"
+#: ../../Zotlabs/Module/Profiles.php:683 ../../Zotlabs/Module/Profiles.php:765
+#: ../../include/channel.php:983
+msgid "Edit visibility"
+msgstr "Zichtbaarheid bewerken"
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Likes"
-msgstr "vinden dit leuk"
+#: ../../Zotlabs/Module/Profiles.php:684
+msgid "Profile Tools"
+msgstr "Hulpmiddelen"
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Dislikes"
-msgstr "vinden dit niet leuk"
+#: ../../Zotlabs/Module/Profiles.php:685
+msgid "Change cover photo"
+msgstr "Omslagfoto wijzigen"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Agree"
-msgstr "eens"
+#: ../../Zotlabs/Module/Profiles.php:686 ../../include/channel.php:954
+msgid "Change profile photo"
+msgstr "Profielfoto veranderen"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Disagree"
-msgstr "oneens"
+#: ../../Zotlabs/Module/Profiles.php:687
+msgid "Create a new profile using these settings"
+msgstr "Een nieuw profiel aanmaken met dit profiel als basis"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Abstain"
-msgstr "onthoudingen"
+#: ../../Zotlabs/Module/Profiles.php:688
+msgid "Clone this profile"
+msgstr "Dit profiel klonen"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Attending"
-msgstr "aanwezig"
+#: ../../Zotlabs/Module/Profiles.php:689
+msgid "Delete this profile"
+msgstr "Dit profiel verwijderen"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Not attending"
-msgstr "niet aanwezig"
+#: ../../Zotlabs/Module/Profiles.php:690
+msgid "Add profile things"
+msgstr "Dingen aan je profiel toevoegen"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Might attend"
-msgstr "mogelijk aanwezig"
+#: ../../Zotlabs/Module/Profiles.php:691 ../../include/widgets.php:105
+#: ../../include/conversation.php:1567
+msgid "Personal"
+msgstr "Persoonlijk"
-#: ../../Zotlabs/Module/Photos.php:1132 ../../Zotlabs/Module/Photos.php:1144
-#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
-#: ../../include/conversation.php:1763
-msgid "View all"
-msgstr "Toon alles"
+#: ../../Zotlabs/Module/Profiles.php:693
+msgid "Relation"
+msgstr "Relatie"
-#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:190
-#: ../../include/channel.php:1182 ../../include/conversation.php:1787
-#: ../../include/taxonomy.php:403
-msgctxt "noun"
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] "vindt dit leuk"
-msgstr[1] "vinden dit leuk"
+#: ../../Zotlabs/Module/Profiles.php:694 ../../include/datetime.php:55
+msgid "Miscellaneous"
+msgstr "Diversen"
-#: ../../Zotlabs/Module/Photos.php:1141 ../../Zotlabs/Lib/ThreadItem.php:195
-#: ../../include/conversation.php:1790
-msgctxt "noun"
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] "vindt dit niet leuk"
-msgstr[1] "vinden dit niet leuk"
+#: ../../Zotlabs/Module/Profiles.php:696
+msgid "Import profile from file"
+msgstr "Profiel vanuit bestand importeren"
-#: ../../Zotlabs/Module/Photos.php:1241
-msgid "Photo Tools"
-msgstr "Hulpmiddelen"
+#: ../../Zotlabs/Module/Profiles.php:697
+msgid "Export profile to file"
+msgstr "Profiel naar bestand exporteren"
-#: ../../Zotlabs/Module/Photos.php:1250
-msgid "In This Photo:"
-msgstr "Op deze foto:"
+#: ../../Zotlabs/Module/Profiles.php:698
+msgid "Your gender"
+msgstr "Jouw geslacht"
-#: ../../Zotlabs/Module/Photos.php:1255
-msgid "Map"
-msgstr "Kaart"
+#: ../../Zotlabs/Module/Profiles.php:699
+msgid "Marital status"
+msgstr "Burgerlijke staat"
-#: ../../Zotlabs/Module/Photos.php:1263 ../../Zotlabs/Lib/ThreadItem.php:394
-msgctxt "noun"
-msgid "Likes"
-msgstr "vinden dit leuk"
+#: ../../Zotlabs/Module/Profiles.php:700
+msgid "Sexual preference"
+msgstr "Seksuele voorkeur"
-#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:395
-msgctxt "noun"
-msgid "Dislikes"
-msgstr "vinden dit niet leuk"
+#: ../../Zotlabs/Module/Profiles.php:703
+msgid "Profile name"
+msgstr "Profielnaam"
-#: ../../Zotlabs/Module/Photos.php:1269 ../../Zotlabs/Lib/ThreadItem.php:400
-#: ../../include/acl_selectors.php:181
-msgid "Close"
-msgstr "Sluiten"
+#: ../../Zotlabs/Module/Profiles.php:705
+msgid "This is your default profile."
+msgstr "Dit is jouw standaardprofiel"
-#: ../../Zotlabs/Module/Photos.php:1343
-msgid "View Album"
-msgstr "Album weergeven"
+#: ../../Zotlabs/Module/Profiles.php:707
+msgid "Your full name"
+msgstr "Jouw volledige naam"
-#: ../../Zotlabs/Module/Photos.php:1354 ../../Zotlabs/Module/Photos.php:1367
-#: ../../Zotlabs/Module/Photos.php:1368
-msgid "Recent Photos"
-msgstr "Recente foto's"
+#: ../../Zotlabs/Module/Profiles.php:708
+msgid "Title/Description"
+msgstr "Titel/omschrijving"
-#: ../../Zotlabs/Module/New_channel.php:134
-#: ../../Zotlabs/Module/Register.php:237
-msgid "Name or caption"
-msgstr "Naam"
+#: ../../Zotlabs/Module/Profiles.php:711
+msgid "Street address"
+msgstr "Straat en huisnummer"
-#: ../../Zotlabs/Module/New_channel.php:134
-#: ../../Zotlabs/Module/Register.php:237
-msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
-msgstr "Voorbeelden: \"Jan Pietersen\", \"Willems weblog\", \"Computerforum\""
+#: ../../Zotlabs/Module/Profiles.php:712
+msgid "Locality/City"
+msgstr "Woonplaats"
-#: ../../Zotlabs/Module/New_channel.php:136
-#: ../../Zotlabs/Module/Register.php:239
-msgid "Choose a short nickname"
-msgstr "Korte bijnaam"
+#: ../../Zotlabs/Module/Profiles.php:713
+msgid "Region/State"
+msgstr "Provincie/gewest/deelstaat"
-#: ../../Zotlabs/Module/New_channel.php:136
-#: ../../Zotlabs/Module/Register.php:239
-#, php-format
-msgid ""
-"Your nickname will be used to create an easy to remember channel address "
-"e.g. nickname%s"
-msgstr "Deze bijnaam wordt gebruikt om een makkelijk te onthouden kanaaladres van jouw kanaal aan te maken, die je dan met anderen kunt delen. Bijvoorbeeld: bijnaam%s"
+#: ../../Zotlabs/Module/Profiles.php:714
+msgid "Postal/Zip code"
+msgstr "Postcode"
-#: ../../Zotlabs/Module/New_channel.php:137
-#: ../../Zotlabs/Module/Register.php:240
-msgid "Channel role and privacy"
-msgstr "Kanaaltype en privacy"
+#: ../../Zotlabs/Module/Profiles.php:715
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161
+msgid "Country"
+msgstr "Land"
-#: ../../Zotlabs/Module/New_channel.php:137
-#: ../../Zotlabs/Module/Register.php:240
-msgid "Select a channel role with your privacy requirements."
-msgstr "Kies een kanaaltype met het door jou gewenste privacyniveau."
+#: ../../Zotlabs/Module/Profiles.php:720
+msgid "Who (if applicable)"
+msgstr "Wie (wanneer van toepassing)"
-#: ../../Zotlabs/Module/New_channel.php:137
-#: ../../Zotlabs/Module/Register.php:240
-msgid "Read more about roles"
-msgstr "Lees meer over kanaaltypes"
+#: ../../Zotlabs/Module/Profiles.php:720
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Voorbeelden: petra123, Petra Jansen, petra@voorbeeld.nl"
-#: ../../Zotlabs/Module/New_channel.php:140
-msgid "Create Channel"
-msgstr "Kanaal aanmaken"
+#: ../../Zotlabs/Module/Profiles.php:721
+msgid "Since (date)"
+msgstr "Sinds (datum)"
-#: ../../Zotlabs/Module/New_channel.php:141
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
-msgstr "Een kanaal is jouw identiteit in dit netwerk. Het kan bijvoorbeeld een persoon, een blog of een forum vertegenwoordigen. Door met elkaar te verbinden kunnen kanalen, met behulp van uitgebreide permissies, informatie uitwisselen."
+#: ../../Zotlabs/Module/Profiles.php:724
+msgid "Tell us about yourself"
+msgstr "Vertel ons iets over jezelf"
-#: ../../Zotlabs/Module/New_channel.php:142
-msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
-msgstr "Of <a href=\"import\">importeer een bestaand kanaal</a> vanaf een andere locatie"
+#: ../../Zotlabs/Module/Profiles.php:725
+#: ../../extend/addon/addon/openid/MysqlProvider.php:68
+msgid "Homepage URL"
+msgstr "URL homepagina"
-#: ../../Zotlabs/Module/Ping.php:265
-msgid "sent you a private message"
-msgstr "stuurde jou een privébericht"
+#: ../../Zotlabs/Module/Profiles.php:726
+msgid "Hometown"
+msgstr "Oorspronkelijk uit"
-#: ../../Zotlabs/Module/Ping.php:313
-msgid "added your channel"
-msgstr "voegde jouw kanaal toe"
+#: ../../Zotlabs/Module/Profiles.php:727
+msgid "Political views"
+msgstr "Politieke overtuigingen"
-#: ../../Zotlabs/Module/Ping.php:323
-msgid "g A l F d"
-msgstr "G:i, l d F"
+#: ../../Zotlabs/Module/Profiles.php:728
+msgid "Religious views"
+msgstr "Religieuze overtuigingen"
-#: ../../Zotlabs/Module/Ping.php:346
-msgid "[today]"
-msgstr "[vandaag]"
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Keywords used in directory listings"
+msgstr "Trefwoorden voor in de kanalengids"
-#: ../../Zotlabs/Module/Ping.php:355
-msgid "posted an event"
-msgstr "plaatste een gebeurtenis"
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Example: fishing photography software"
+msgstr "Voorbeeld: muziek, fotografie, software"
-#: ../../Zotlabs/Module/Notifications.php:30
-msgid "Invalid request identifier."
-msgstr "Ongeldige verzoek identificator (request identifier)"
+#: ../../Zotlabs/Module/Profiles.php:732
+msgid "Musical interests"
+msgstr "Muzikale interesses"
-#: ../../Zotlabs/Module/Notifications.php:39
-msgid "Discard"
-msgstr "Annuleren"
+#: ../../Zotlabs/Module/Profiles.php:733
+msgid "Books, literature"
+msgstr "Boeken/literatuur"
-#: ../../Zotlabs/Module/Notifications.php:103 ../../include/nav.php:196
-msgid "Mark all system notifications seen"
-msgstr "Markeer alle systeemnotificaties als bekeken"
+#: ../../Zotlabs/Module/Profiles.php:734
+msgid "Television"
+msgstr "Televisie"
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:228
-#: ../../include/conversation.php:959
-msgid "Poke"
-msgstr "Aanstoten"
+#: ../../Zotlabs/Module/Profiles.php:735
+msgid "Film/Dance/Culture/Entertainment"
+msgstr "Film/dans/cultuur/entertainment"
-#: ../../Zotlabs/Module/Poke.php:169
-msgid "Poke somebody"
-msgstr "Iemand aanstoten"
+#: ../../Zotlabs/Module/Profiles.php:736
+msgid "Hobbies/Interests"
+msgstr "Hobby's/interesses"
-#: ../../Zotlabs/Module/Poke.php:172
-msgid "Poke/Prod"
-msgstr "Aanstoten/porren"
+#: ../../Zotlabs/Module/Profiles.php:737
+msgid "Love/Romance"
+msgstr "Liefde/romantiek"
-#: ../../Zotlabs/Module/Poke.php:173
-msgid "Poke, prod or do other things to somebody"
-msgstr "Iemand bijvoorbeeld aanstoten of poren"
+#: ../../Zotlabs/Module/Profiles.php:739
+msgid "School/Education"
+msgstr "School/opleiding"
-#: ../../Zotlabs/Module/Poke.php:180
-msgid "Recipient"
-msgstr "Ontvanger"
+#: ../../Zotlabs/Module/Profiles.php:740
+msgid "Contact information and social networks"
+msgstr "Contactinformatie en sociale netwerken"
-#: ../../Zotlabs/Module/Poke.php:181
-msgid "Choose what you wish to do to recipient"
-msgstr "Kies wat je met de ontvanger wil doen"
+#: ../../Zotlabs/Module/Profiles.php:741
+msgid "My other channels"
+msgstr "Mijn andere kanalen"
-#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
-msgid "Make this post private"
-msgstr "Maak dit bericht privé"
+#: ../../Zotlabs/Module/Profiles.php:761 ../../include/channel.php:979
+msgid "Profile Image"
+msgstr "Profielfoto"
-#: ../../Zotlabs/Module/Apps.php:46 ../../include/nav.php:168
-#: ../../include/widgets.php:102
-msgid "Apps"
-msgstr "Apps"
+#: ../../Zotlabs/Module/Profiles.php:771 ../../include/channel.php:961
+#: ../../include/nav.php:91
+msgid "Edit Profiles"
+msgstr "Bewerk profielen"
#: ../../Zotlabs/Module/Oexchange.php:27
msgid "Unable to find your hub."
@@ -4758,26 +4970,6 @@ msgstr "Niet in staat om je hub te vinden"
msgid "Post successful."
msgstr "Verzenden bericht geslaagd."
-#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
-msgid "Invalid profile identifier."
-msgstr "Ongeldige profiel-identificator"
-
-#: ../../Zotlabs/Module/Profperm.php:115
-msgid "Profile Visibility Editor"
-msgstr "Zichtbaarheid profiel "
-
-#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1274
-msgid "Profile"
-msgstr "Profiel"
-
-#: ../../Zotlabs/Module/Profperm.php:119
-msgid "Click on a contact to add or remove."
-msgstr "Klik op een connectie om deze toe te voegen of te verwijderen"
-
-#: ../../Zotlabs/Module/Profperm.php:128
-msgid "Visible To"
-msgstr "Zichtbaar voor"
-
#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
msgid "This setting requires special processing and editing has been blocked."
msgstr "Deze instelling vereist een speciaal proces en bewerken is geblokkeerd."
@@ -4793,66 +4985,7 @@ msgid ""
" to correctly use this feature."
msgstr "Waarschuwing: het veranderen van sommige instellingen kunnen jouw kanaal onklaar maken. Verlaat deze pagina, tenzij je weet waar je mee bezig bent en voldoende kennis bezit over hoe je deze functies moet gebruiken. "
-#: ../../Zotlabs/Module/Siteinfo.php:19
-#, php-format
-msgid "Version %s"
-msgstr "Versie %s"
-
-#: ../../Zotlabs/Module/Siteinfo.php:34
-msgid "Installed plugins/addons/apps:"
-msgstr "Ingeschakelde plugins en apps:"
-
-#: ../../Zotlabs/Module/Siteinfo.php:36
-msgid "No installed plugins/addons/apps"
-msgstr "Geen ingeschakelde plugins en apps"
-
-#: ../../Zotlabs/Module/Siteinfo.php:49
-msgid ""
-"This is a hub of $Projectname - a global cooperative network of "
-"decentralized privacy enhanced websites."
-msgstr "Dit is een $Projectname-hub - $Projectname is een wereldwijd coöperatief netwerk van gedecentraliseerde websites (hubs) met verbeterde privacy."
-
-#: ../../Zotlabs/Module/Siteinfo.php:51
-msgid "Tag: "
-msgstr "Tag: "
-
-#: ../../Zotlabs/Module/Siteinfo.php:53
-msgid "Last background fetch: "
-msgstr "Meest recente achtergrond-fetch:"
-
-#: ../../Zotlabs/Module/Siteinfo.php:55
-msgid "Current load average: "
-msgstr "Gemiddelde systeembelasting is nu:"
-
-#: ../../Zotlabs/Module/Siteinfo.php:58
-msgid "Running at web location"
-msgstr "Draaiend op weblocatie"
-
-#: ../../Zotlabs/Module/Siteinfo.php:59
-msgid ""
-"Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more "
-"about $Projectname."
-msgstr "Bezoek <a href=\"http://hubzilla.org\">hubzilla.org</a> "
-
-#: ../../Zotlabs/Module/Siteinfo.php:60
-msgid "Bug reports and issues: please visit"
-msgstr "Bugrapporten en andere kwesties: bezoek"
-
-#: ../../Zotlabs/Module/Siteinfo.php:62
-msgid "$projectname issues"
-msgstr "$projectname-issues"
-
-#: ../../Zotlabs/Module/Siteinfo.php:63
-msgid ""
-"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
-"com"
-msgstr "Voorstellen, lofbetuigingen, enz. - e-mail \"redmatrix\" at librelist - dot com"
-
-#: ../../Zotlabs/Module/Siteinfo.php:65
-msgid "Site Administrators"
-msgstr "Hubbeheerders: "
-
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2308
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2270
msgid "Blocks"
msgstr "Blokken"
@@ -4860,13 +4993,13 @@ msgstr "Blokken"
msgid "Block Title"
msgstr "Bloktitel"
-#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2310
+#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2272
msgid "Layouts"
msgstr "Lay-outs"
-#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:225
-#: ../../include/help.php:47 ../../include/help.php:52
-#: ../../include/nav.php:164
+#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:227
+#: ../../include/nav.php:162 ../../include/help.php:53
+#: ../../include/help.php:59
msgid "Help"
msgstr "Hulp"
@@ -4882,116 +5015,158 @@ msgstr "Lay-out-omschrijving"
msgid "Download PDL file"
msgstr "Download PDL-bestand"
-#: ../../Zotlabs/Module/Admin.php:97
-msgid "# Accounts"
-msgstr "# accounts"
+#: ../../Zotlabs/Module/Rate.php:156
+msgid "Website:"
+msgstr "Website:"
-#: ../../Zotlabs/Module/Admin.php:98
-msgid "# blocked accounts"
-msgstr "# geblokkeerde accounts"
+#: ../../Zotlabs/Module/Rate.php:159
+#, php-format
+msgid "Remote Channel [%s] (not yet known on this site)"
+msgstr "Kanaal op afstand [%s] (nog niet op deze hub bekend)"
-#: ../../Zotlabs/Module/Admin.php:99
-msgid "# expired accounts"
-msgstr "# verlopen accounts"
+#: ../../Zotlabs/Module/Rate.php:160
+msgid "Rating (this information is public)"
+msgstr "Beoordeling (deze informatie is openbaar)"
-#: ../../Zotlabs/Module/Admin.php:100
-msgid "# expiring accounts"
-msgstr "# accounts die nog moeten verlopen"
+#: ../../Zotlabs/Module/Rate.php:161
+msgid "Optionally explain your rating (this information is public)"
+msgstr "Verklaar jouw beoordeling (niet verplicht, deze informatie is openbaar)"
-#: ../../Zotlabs/Module/Admin.php:111
-msgid "# Channels"
-msgstr "# Kanalen"
+#: ../../Zotlabs/Module/Like.php:19
+msgid "Like/Dislike"
+msgstr "Leuk/niet leuk"
-#: ../../Zotlabs/Module/Admin.php:112
-msgid "# primary"
-msgstr "# primair"
+#: ../../Zotlabs/Module/Like.php:24
+msgid "This action is restricted to members."
+msgstr "Deze actie kan alleen door $Projectname-leden worden uitgevoerd."
-#: ../../Zotlabs/Module/Admin.php:113
-msgid "# clones"
-msgstr "# klonen"
+#: ../../Zotlabs/Module/Like.php:25
+msgid ""
+"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
+"href=\"register\">register as a new $Projectname member</a> to continue."
+msgstr "Je dient <a href=\"rmagic\">in te loggen met je $Projectname-account</a> of <a href=\"register\">een nieuw $Projectname-account aan te maken</a> om verder te kunnen gaan."
-#: ../../Zotlabs/Module/Admin.php:119
-msgid "Message queues"
-msgstr "Berichtenwachtrij"
+#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
+#: ../../Zotlabs/Module/Like.php:169
+msgid "Invalid request."
+msgstr "Ongeldig verzoek"
-#: ../../Zotlabs/Module/Admin.php:136
-msgid "Your software should be updated"
-msgstr "Jouw software moet worden bijgewerkt "
+#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
+msgid "channel"
+msgstr "kanaal"
-#: ../../Zotlabs/Module/Admin.php:142
-msgid "Summary"
-msgstr "Samenvatting"
+#: ../../Zotlabs/Module/Like.php:146
+msgid "thing"
+msgstr "ding"
-#: ../../Zotlabs/Module/Admin.php:145
-msgid "Registered accounts"
-msgstr "Geregistreerde accounts"
+#: ../../Zotlabs/Module/Like.php:192
+msgid "Channel unavailable."
+msgstr "Kanaal niet beschikbaar."
-#: ../../Zotlabs/Module/Admin.php:146
-msgid "Pending registrations"
-msgstr "Accounts die op goedkeuring wachten"
+#: ../../Zotlabs/Module/Like.php:240
+msgid "Previous action reversed."
+msgstr "Vorige actie omgedraaid"
-#: ../../Zotlabs/Module/Admin.php:147
-msgid "Registered channels"
-msgstr "Geregistreerde kanalen"
+#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
+#: ../../Zotlabs/Module/Tagger.php:47
+#: ../../extend/addon/addon/diaspora/inbound.php:1794
+#: ../../extend/addon/addon/redphotos/redphotohelper.php:74
+#: ../../include/text.php:1940 ../../include/conversation.php:120
+msgid "photo"
+msgstr "foto"
-#: ../../Zotlabs/Module/Admin.php:148
-msgid "Active plugins"
-msgstr "Ingeschakelde plugins"
+#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
+#: ../../extend/addon/addon/diaspora/inbound.php:1794
+#: ../../include/text.php:1946 ../../include/conversation.php:148
+msgid "status"
+msgstr "bericht"
-#: ../../Zotlabs/Module/Admin.php:149
-msgid "Version"
-msgstr "Versie"
+#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Tagger.php:51
+#: ../../Zotlabs/Module/Events.php:256 ../../include/text.php:1943
+#: ../../include/event.php:961 ../../include/conversation.php:123
+msgid "event"
+msgstr "gebeurtenis"
-#: ../../Zotlabs/Module/Admin.php:150
-msgid "Repository version (master)"
-msgstr "Versie repository (master)"
+#: ../../Zotlabs/Module/Like.php:419
+#: ../../extend/addon/addon/diaspora/inbound.php:1823
+#: ../../include/conversation.php:164
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s vindt %3$s van %2$s leuk"
-#: ../../Zotlabs/Module/Admin.php:151
-msgid "Repository version (dev)"
-msgstr "Versie repository (dev)"
+#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s vindt %3$s van %2$s niet leuk"
+
+#: ../../Zotlabs/Module/Like.php:423
+#, php-format
+msgid "%1$s agrees with %2$s's %3$s"
+msgstr "%1$s is het eens met %2$s's %3$s"
+
+#: ../../Zotlabs/Module/Like.php:425
+#, php-format
+msgid "%1$s doesn't agree with %2$s's %3$s"
+msgstr "%1$s is het niet eens met %2$s's %3$s"
+
+#: ../../Zotlabs/Module/Like.php:427
+#, php-format
+msgid "%1$s abstains from a decision on %2$s's %3$s"
+msgstr "%1$s onthoudt zich van een besluit over %2$s's %3$s"
+
+#: ../../Zotlabs/Module/Like.php:429
+#, php-format
+msgid "%1$s is attending %2$s's %3$s"
+msgstr "%1$s is aanwezig op %2$s's %3$s"
+
+#: ../../Zotlabs/Module/Like.php:431
+#, php-format
+msgid "%1$s is not attending %2$s's %3$s"
+msgstr "%1$s is niet aanwezig op %2$s's %3$s"
+
+#: ../../Zotlabs/Module/Like.php:433
+#, php-format
+msgid "%1$s may attend %2$s's %3$s"
+msgstr "%1$s is mogelijk aanwezig op %2$s's %3$s"
+
+#: ../../Zotlabs/Module/Like.php:538
+msgid "Action completed."
+msgstr "Actie voltooid"
+
+#: ../../Zotlabs/Module/Like.php:539
+msgid "Thank you."
+msgstr "Bedankt"
#: ../../Zotlabs/Module/Profile_photo.php:186
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:293
msgid ""
"Shift-reload the page or clear browser cache if the new photo does not "
"display immediately."
msgstr "Vernieuw de pagina met shift+R of shift+F5, of leeg je browserbuffer, wanneer de nieuwe foto niet meteen wordt weergegeven."
-#: ../../Zotlabs/Module/Profile_photo.php:389
+#: ../../Zotlabs/Module/Profile_photo.php:409
+msgid "Use Photo for Profile"
+msgstr "Als profielfoto gebruiken"
+
+#: ../../Zotlabs/Module/Profile_photo.php:409
msgid "Upload Profile Photo"
msgstr "Profielfoto uploaden"
-#: ../../Zotlabs/Module/Cal.php:69
-msgid "Permissions denied."
-msgstr "Permissies niet toegestaan"
-
-#: ../../Zotlabs/Module/Cal.php:259 ../../Zotlabs/Module/Events.php:597
-msgid "l, F j"
-msgstr "l j F"
-
-#: ../../Zotlabs/Module/Cal.php:308 ../../Zotlabs/Module/Events.php:646
-#: ../../include/text.php:1762
-msgid "Link to Source"
-msgstr "Originele locatie"
-
-#: ../../Zotlabs/Module/Cal.php:331 ../../Zotlabs/Module/Events.php:674
-msgid "Edit Event"
-msgstr "Gebeurtenis bewerken"
+#: ../../Zotlabs/Module/Profile_photo.php:410
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:181
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:193
+msgid "Use"
+msgstr "Gebruiken"
-#: ../../Zotlabs/Module/Cal.php:331 ../../Zotlabs/Module/Events.php:674
-msgid "Create Event"
-msgstr "Gebeurtenis aanmaken"
-
-#: ../../Zotlabs/Module/Cal.php:334 ../../Zotlabs/Module/Events.php:677
-msgid "Export"
-msgstr "Exporteren"
-
-#: ../../Zotlabs/Module/Cal.php:337 ../../include/text.php:2332
-msgid "Import"
-msgstr "Importeren"
+#: ../../Zotlabs/Module/Search.php:223
+#, php-format
+msgid "Items tagged with: %s"
+msgstr "Items getagd met %s"
-#: ../../Zotlabs/Module/Cal.php:341 ../../Zotlabs/Module/Events.php:686
-msgid "Today"
-msgstr "Vandaag"
+#: ../../Zotlabs/Module/Search.php:225
+#, php-format
+msgid "Search results for: %s"
+msgstr "Zoekresultaten voor %s"
#: ../../Zotlabs/Module/Common.php:14
msgid "No channel."
@@ -5005,127 +5180,154 @@ msgstr "Veel voorkomende connecties"
msgid "No connections in common."
msgstr "Geen gemeenschappelijke connecties."
-#: ../../Zotlabs/Module/Ratings.php:70
-msgid "No ratings"
-msgstr "Geen beoordelingen"
+#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
+msgid "Authorize application connection"
+msgstr "Geef toestemming voor applicatiekoppeling"
-#: ../../Zotlabs/Module/Ratings.php:98
-msgid "Rating: "
-msgstr "Beoordeling: "
+#: ../../Zotlabs/Module/Api.php:73
+msgid "Return to your app and insert this Security Code:"
+msgstr "Ga terug naar je app en voeg deze beveiligingscode in:"
-#: ../../Zotlabs/Module/Ratings.php:99
-msgid "Website: "
-msgstr "Website: "
+#: ../../Zotlabs/Module/Api.php:83
+msgid "Please login to continue."
+msgstr "Inloggen om verder te kunnen gaan."
-#: ../../Zotlabs/Module/Ratings.php:101
-msgid "Description: "
-msgstr "Omschrijving: "
+#: ../../Zotlabs/Module/Api.php:95
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Wil je deze applicatie toestemming geven om jouw berichten en connecties te zien, en/of nieuwe berichten voor jou te plaatsen?"
-#: ../../Zotlabs/Module/Register.php:49
-msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
-msgstr "Maximum toegestane dagelijkse registraties op deze $Projectname-hub bereikt. Probeer het morgen (UTC) nogmaals."
+#: ../../Zotlabs/Module/Ping.php:254
+msgid "sent you a private message"
+msgstr "stuurde jou een privébericht"
-#: ../../Zotlabs/Module/Register.php:55
-msgid ""
-"Please indicate acceptance of the Terms of Service. Registration failed."
-msgstr "Registratie mislukt. De gebruiksvoorwaarden dienen wel geaccepteerd te worden."
+#: ../../Zotlabs/Module/Ping.php:302
+msgid "added your channel"
+msgstr "voegde jouw kanaal toe"
-#: ../../Zotlabs/Module/Register.php:89
-msgid "Passwords do not match."
-msgstr "Wachtwoorden komen niet met elkaar overeen."
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "g A l F d"
+msgstr "G:i, l d F"
-#: ../../Zotlabs/Module/Register.php:131
-msgid ""
-"Registration successful. Please check your email for validation "
-"instructions."
-msgstr "Registratie geslaagd. Controleer je e-mail voor instructies."
+#: ../../Zotlabs/Module/Ping.php:330
+msgid "[today]"
+msgstr "[vandaag]"
-#: ../../Zotlabs/Module/Register.php:137
-msgid "Your registration is pending approval by the site owner."
-msgstr "Jouw accountregistratie wacht op goedkeuring van de beheerder van deze $Projectname-hub."
+#: ../../Zotlabs/Module/Ping.php:339
+msgid "posted an event"
+msgstr "plaatste een gebeurtenis"
-#: ../../Zotlabs/Module/Register.php:140
-msgid "Your registration can not be processed."
-msgstr "Jouw registratie kan niet verwerkt worden."
+#: ../../Zotlabs/Module/Siteinfo.php:20
+msgid "About this site"
+msgstr "Over deze hub"
-#: ../../Zotlabs/Module/Register.php:184
-msgid "Registration on this hub is disabled."
-msgstr "Registreren van nieuwe accounts is op deze hub uitgeschakeld."
+#: ../../Zotlabs/Module/Siteinfo.php:21
+msgid "Site Name"
+msgstr "Hubnaam"
-#: ../../Zotlabs/Module/Register.php:193
-msgid "Registration on this hub is by approval only."
-msgstr "Registraties op deze hub moeten eerst worden goedgekeurd."
+#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1962
+msgid "Administrator"
+msgstr "Beheerder"
-#: ../../Zotlabs/Module/Register.php:194
-msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
-msgstr "<a href=\"pubsites\">Registreer op een andere hub</a>."
+#: ../../Zotlabs/Module/Siteinfo.php:28
+msgid "Software and Project information"
+msgstr "Software- en projectinformatie"
-#: ../../Zotlabs/Module/Register.php:204
+#: ../../Zotlabs/Module/Siteinfo.php:29
+msgid "This site is powered by $Projectname"
+msgstr "Dit is een $Projectname-hub"
+
+#: ../../Zotlabs/Module/Siteinfo.php:30
msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Deze $Projectname-hub heeft het maximum aantal dagelijks toegestane registraties bereikt. Probeer het morgen (UTC) nogmaals."
+"Federated and decentralised networking and identity services provided by Zot"
+msgstr "Federatieve en gedecentraliseerde netwerk- en identiteitsdiensten, mogelijk gemaakt door Zot"
-#: ../../Zotlabs/Module/Register.php:221
-msgid "Terms of Service"
-msgstr "Gebruiksvoorwaarden"
+#: ../../Zotlabs/Module/Siteinfo.php:32
+#, php-format
+msgid "Version %s"
+msgstr "Versie %s"
-#: ../../Zotlabs/Module/Register.php:227
+#: ../../Zotlabs/Module/Siteinfo.php:33
+msgid "Project homepage"
+msgstr "Projectwebsite"
+
+#: ../../Zotlabs/Module/Siteinfo.php:34
+msgid "Developer homepage"
+msgstr "Ontwikkelaarswebsite"
+
+#: ../../Zotlabs/Module/Lostpass.php:19
+msgid "No valid account found."
+msgstr "Geen geldige account gevonden."
+
+#: ../../Zotlabs/Module/Lostpass.php:33
+msgid "Password reset request issued. Check your email."
+msgstr "Het verzoek om je wachtwoord opnieuw in te stellen is behandeld. Controleer je e-mail."
+
+#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
#, php-format
-msgid "I accept the %s for this website"
-msgstr "Ik accepteer de %s van deze $Projectname-hub"
+msgid "Site Member (%s)"
+msgstr "Lid van hub (%s)"
-#: ../../Zotlabs/Module/Register.php:229
+#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
#, php-format
-msgid "I am over 13 years of age and accept the %s for this website"
-msgstr "Ik ben 13 jaar of ouder en accepteer de %s van deze $Projectname-hub"
+msgid "Password reset requested at %s"
+msgstr "Verzoek tot het opnieuw instellen van een wachtwoord op %s is ingediend"
-#: ../../Zotlabs/Module/Register.php:233
-msgid "Your email address"
-msgstr "Jouw e-mailadres"
+#: ../../Zotlabs/Module/Lostpass.php:68
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "Het verzoek kon niet worden geverifieerd. (Mogelijk heb je al eerder een verzoek ingediend.) Opnieuw instellen van wachtwoord is mislukt."
-#: ../../Zotlabs/Module/Register.php:234
-msgid "Choose a password"
-msgstr "Geef een wachtwoord op"
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1728
+msgid "Password Reset"
+msgstr "Wachtwoord vergeten?"
-#: ../../Zotlabs/Module/Register.php:235
-msgid "Please re-enter your password"
-msgstr "Geef het wachtwoord opnieuw op"
+#: ../../Zotlabs/Module/Lostpass.php:92
+msgid "Your password has been reset as requested."
+msgstr "Jouw wachtwoord is opnieuw ingesteld zoals je had verzocht."
-#: ../../Zotlabs/Module/Register.php:236
-msgid "Please enter your invitation code"
-msgstr "Vul jouw uitnodigingscode in"
+#: ../../Zotlabs/Module/Lostpass.php:93
+msgid "Your new password is"
+msgstr "Jouw nieuwe wachtwoord is"
-#: ../../Zotlabs/Module/Register.php:241
-msgid "no"
-msgstr "Nee"
+#: ../../Zotlabs/Module/Lostpass.php:94
+msgid "Save or copy your new password - and then"
+msgstr "Kopieer of sla je nieuwe wachtwoord op - en"
-#: ../../Zotlabs/Module/Register.php:241
-msgid "yes"
-msgstr "Ja"
+#: ../../Zotlabs/Module/Lostpass.php:95
+msgid "click here to login"
+msgstr "klik dan hier om in te loggen"
-#: ../../Zotlabs/Module/Register.php:258
-msgid "Membership on this site is by invitation only."
-msgstr "Registreren op deze $Projectname-hub kan alleen op uitnodiging."
+#: ../../Zotlabs/Module/Lostpass.php:96
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Jouw wachtwoord kan worden veranderd onder <em>instellingen</em>, nadat je succesvol bent ingelogd."
-#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:152
-#: ../../boot.php:1721
-msgid "Register"
-msgstr "Registreren"
+#: ../../Zotlabs/Module/Lostpass.php:117
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Jouw wachtwoord op %s is veranderd"
-#: ../../Zotlabs/Module/Register.php:271
+#: ../../Zotlabs/Module/Lostpass.php:130
+msgid "Forgot your Password?"
+msgstr "Wachtwoord vergeten?"
+
+#: ../../Zotlabs/Module/Lostpass.php:131
msgid ""
-"This site may require email verification after submitting this form. If you "
-"are returned to a login page, please check your email for instructions."
-msgstr "Mogelijk moet op deze hub eerst jouw e-mail geverifieerd worden. Wanneer je na het indienen van dit formulier op de inlogpagina terecht komt, dan dien je jouw e-mail te controleren voor instructies. Controleer eventueel ook jouw spamfolder."
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Voer je e-mailadres in en verstuur deze om je wachtwoord opnieuw in te stellen. Controleer hierna hier je e-mail voor verdere instructies."
-#: ../../Zotlabs/Module/Help.php:27
-msgid "Documentation Search"
-msgstr "Zoek documentatie"
+#: ../../Zotlabs/Module/Lostpass.php:132
+msgid "Email Address"
+msgstr "E-mailadres"
-#: ../../Zotlabs/Module/Help.php:57
-msgid "$Projectname Documentation"
-msgstr "$Projectname-documentatie"
+#: ../../Zotlabs/Module/Lostpass.php:133
+msgid "Reset"
+msgstr "Opnieuw instellen"
#: ../../Zotlabs/Module/Rbmark.php:94
msgid "Select a bookmark folder"
@@ -5143,6 +5345,10 @@ msgstr "URL van bladwijzer"
msgid "Or enter new bookmark folder name"
msgstr "Of geef de naam op van een nieuwe bladwijzermap"
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
+msgstr "Deze kanalengidshub (directoryserver) heeft een toegangs-token nodig"
+
#: ../../Zotlabs/Module/Rmagic.php:35
msgid "Authentication failed."
msgstr "Authenticatie mislukt."
@@ -5174,11 +5380,26 @@ msgid "Remove This Account"
msgstr "Verwijder dit account"
#: ../../Zotlabs/Module/Removeaccount.php:58
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "WARNING: "
+msgstr "WAARSCHUWING: "
+
+#: ../../Zotlabs/Module/Removeaccount.php:58
msgid ""
"This account and all its channels will be completely removed from the "
"network. "
msgstr "Dit account en al zijn kanalen worden volledig uit het $Projectname-netwerk verwijderd."
+#: ../../Zotlabs/Module/Removeaccount.php:58
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "This action is permanent and can not be undone!"
+msgstr "Deze handeling is van permanente aard en kan niet meer worden teruggedraaid!"
+
+#: ../../Zotlabs/Module/Removeaccount.php:59
+#: ../../Zotlabs/Module/Removeme.php:62
+msgid "Please enter your password for verification:"
+msgstr "Vul je wachtwoord in ter verificatie:"
+
#: ../../Zotlabs/Module/Removeaccount.php:60
msgid ""
"Remove this account, all its channels and all its channel clones from the "
@@ -5192,62 +5413,33 @@ msgid ""
msgstr "Standaard worden alleen de kanalen die zich op deze hub bevinden uit het $Projectname-netwerk verwijderd"
#: ../../Zotlabs/Module/Removeaccount.php:61
-#: ../../Zotlabs/Module/Settings/Account.php:128
+#: ../../Zotlabs/Module/Settings/Account.php:120
msgid "Remove Account"
msgstr "Account verwijderen"
-#: ../../Zotlabs/Module/Webpages.php:52
-msgid "Import Webpage Elements"
-msgstr "Webpagina-elementen importeren"
-
-#: ../../Zotlabs/Module/Webpages.php:53
-msgid "Import selected"
-msgstr "Importbestand geselecteerd"
-
-#: ../../Zotlabs/Module/Webpages.php:76
-msgid "Export Webpage Elements"
-msgstr "Webpagina-elementen exporteren"
-
-#: ../../Zotlabs/Module/Webpages.php:77
-msgid "Export selected"
-msgstr "Selectie exporteren"
-
-#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:218
-#: ../../include/nav.php:109 ../../include/conversation.php:1725
-msgid "Webpages"
-msgstr "Webpagina's"
-
-#: ../../Zotlabs/Module/Webpages.php:248 ../../include/page_widgets.php:44
-msgid "Actions"
-msgstr "Acties"
-
-#: ../../Zotlabs/Module/Webpages.php:249 ../../include/page_widgets.php:45
-msgid "Page Link"
-msgstr "Paginalink"
-
-#: ../../Zotlabs/Module/Webpages.php:250
-msgid "Page Title"
-msgstr "Paginatitel"
+#: ../../Zotlabs/Module/Pdledit.php:21
+msgid "Layout updated."
+msgstr "Lay-out bijgewerkt."
-#: ../../Zotlabs/Module/Webpages.php:280
-msgid "Invalid file type."
-msgstr "Ongeldig bestandsformaat"
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:218
+msgid "Feature disabled."
+msgstr "Functie uitgeschakeld."
-#: ../../Zotlabs/Module/Webpages.php:292
-msgid "Error opening zip file"
-msgstr "Fout met openen zipbestand"
+#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
+msgid "Edit System Page Description"
+msgstr "Systeempagina's bewerken"
-#: ../../Zotlabs/Module/Webpages.php:303
-msgid "Invalid folder path."
-msgstr "Ongeldige maplocatie"
+#: ../../Zotlabs/Module/Pdledit.php:64
+msgid "Layout not found."
+msgstr "Lay-out niet gevonden."
-#: ../../Zotlabs/Module/Webpages.php:330
-msgid "No webpage elements detected."
-msgstr "Geen webpagina-elementen gedecteerd"
+#: ../../Zotlabs/Module/Pdledit.php:70
+msgid "Module Name:"
+msgstr "Modulenaam:"
-#: ../../Zotlabs/Module/Webpages.php:405
-msgid "Import complete."
-msgstr "Importeren voltooid."
+#: ../../Zotlabs/Module/Pdledit.php:71
+msgid "Layout Help"
+msgstr "Lay-out-hulp"
#: ../../Zotlabs/Module/Uexport.php:55 ../../Zotlabs/Module/Uexport.php:56
msgid "Export Channel"
@@ -5307,241 +5499,201 @@ msgid ""
" please import or restore these in date order (oldest first)."
msgstr "Deze back-up-bestanden kunnen geïmporteerd of hersteld worden door op jouw hub en met jouw kanaal <a href=\"%1$s\">%2$s</a> te bezoeken. Voor het beste resultaat kan je de bestanden in chronologische volgorde importeren of herstellen."
-#: ../../Zotlabs/Module/Editpost.php:35
-msgid "Item is not editable"
-msgstr "Item is niet te bewerken"
-
-#: ../../Zotlabs/Module/Search.php:216
-#, php-format
-msgid "Items tagged with: %s"
-msgstr "Items getagd met %s"
-
-#: ../../Zotlabs/Module/Search.php:218
-#, php-format
-msgid "Search results for: %s"
-msgstr "Zoekresultaten voor %s"
-
-#: ../../Zotlabs/Module/Events.php:25
-msgid "Calendar entries imported."
-msgstr "Agenda-items geïmporteerd."
-
-#: ../../Zotlabs/Module/Events.php:27
-msgid "No calendar entries found."
-msgstr "Geen agenda-items gevonden."
-
-#: ../../Zotlabs/Module/Events.php:104
-msgid "Event can not end before it has started."
-msgstr "Gebeurtenis kan niet eindigen voordat het is begonnen"
-
-#: ../../Zotlabs/Module/Events.php:106 ../../Zotlabs/Module/Events.php:115
-#: ../../Zotlabs/Module/Events.php:135
-msgid "Unable to generate preview."
-msgstr "Niet in staat om voorvertoning te genereren"
-
-#: ../../Zotlabs/Module/Events.php:113
-msgid "Event title and start time are required."
-msgstr "Titel en begintijd van gebeurtenis zijn vereist."
+#: ../../Zotlabs/Module/Cal.php:69
+msgid "Permissions denied."
+msgstr "Permissies niet toegestaan"
-#: ../../Zotlabs/Module/Events.php:133 ../../Zotlabs/Module/Events.php:258
-msgid "Event not found."
-msgstr "Gebeurtenis niet gevonden"
+#: ../../Zotlabs/Module/Cal.php:263 ../../Zotlabs/Module/Events.php:596
+msgid "l, F j"
+msgstr "l j F"
-#: ../../Zotlabs/Module/Events.php:452
-msgid "Edit event title"
-msgstr "Titel bewerken"
+#: ../../Zotlabs/Module/Cal.php:312 ../../Zotlabs/Module/Events.php:651
+#: ../../include/text.php:1748
+msgid "Link to Source"
+msgstr "Originele locatie"
-#: ../../Zotlabs/Module/Events.php:452
-msgid "Event title"
-msgstr "Titel"
+#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679
+msgid "Edit Event"
+msgstr "Gebeurtenis bewerken"
-#: ../../Zotlabs/Module/Events.php:454
-msgid "Categories (comma-separated list)"
-msgstr "Categorieën (door komma's gescheiden lijst)"
+#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679
+msgid "Create Event"
+msgstr "Gebeurtenis aanmaken"
-#: ../../Zotlabs/Module/Events.php:455
-msgid "Edit Category"
-msgstr "Categorie"
+#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:682
+msgid "Export"
+msgstr "Exporteren"
-#: ../../Zotlabs/Module/Events.php:455
-msgid "Category"
-msgstr "Categorie"
+#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2294
+msgid "Import"
+msgstr "Importeren"
-#: ../../Zotlabs/Module/Events.php:458
-msgid "Edit start date and time"
-msgstr "Begindatum en -tijd bewerken"
+#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Events.php:691
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848
+msgid "Today"
+msgstr "Vandaag"
-#: ../../Zotlabs/Module/Events.php:458
-msgid "Start date and time"
-msgstr "Begindatum en -tijd"
+#: ../../Zotlabs/Module/Admin.php:94
+msgid "# Accounts"
+msgstr "# accounts"
-#: ../../Zotlabs/Module/Events.php:459 ../../Zotlabs/Module/Events.php:462
-msgid "Finish date and time are not known or not relevant"
-msgstr "Einddatum en -tijd zijn niet bekend of niet van toepassing"
+#: ../../Zotlabs/Module/Admin.php:95
+msgid "# blocked accounts"
+msgstr "# geblokkeerde accounts"
-#: ../../Zotlabs/Module/Events.php:461
-msgid "Edit finish date and time"
-msgstr "Einddatum en -tijd bewerken"
+#: ../../Zotlabs/Module/Admin.php:96
+msgid "# expired accounts"
+msgstr "# verlopen accounts"
-#: ../../Zotlabs/Module/Events.php:461
-msgid "Finish date and time"
-msgstr "Einddatum en -tijd"
+#: ../../Zotlabs/Module/Admin.php:97
+msgid "# expiring accounts"
+msgstr "# accounts die nog moeten verlopen"
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
-msgid "Adjust for viewer timezone"
-msgstr "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt"
+#: ../../Zotlabs/Module/Admin.php:108
+msgid "# Channels"
+msgstr "# Kanalen"
-#: ../../Zotlabs/Module/Events.php:463
-msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
-msgstr "Belangrijk voor gebeurtenissen die op een bepaalde locatie plaatsvinden. Niet praktisch voor wereldwijde feestdagen."
+#: ../../Zotlabs/Module/Admin.php:109
+msgid "# primary"
+msgstr "# primair"
-#: ../../Zotlabs/Module/Events.php:465
-msgid "Edit Description"
-msgstr "Omschrijving bewerken"
+#: ../../Zotlabs/Module/Admin.php:110
+msgid "# clones"
+msgstr "# klonen"
-#: ../../Zotlabs/Module/Events.php:467
-msgid "Edit Location"
-msgstr "Locatie bewerken"
+#: ../../Zotlabs/Module/Admin.php:116
+msgid "Message queues"
+msgstr "Berichtenwachtrij"
-#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:472
-msgid "Share this event"
-msgstr "Deel deze gebeurtenis"
+#: ../../Zotlabs/Module/Admin.php:133
+msgid "Your software should be updated"
+msgstr "Jouw software moet worden bijgewerkt "
-#: ../../Zotlabs/Module/Events.php:474 ../../include/conversation.php:1264
-msgid "Permission settings"
-msgstr "Permissies"
+#: ../../Zotlabs/Module/Admin.php:138
+msgid "Summary"
+msgstr "Samenvatting"
-#: ../../Zotlabs/Module/Events.php:485
-msgid "Advanced Options"
-msgstr "Geavanceerde opties"
+#: ../../Zotlabs/Module/Admin.php:141
+msgid "Registered accounts"
+msgstr "Geregistreerde accounts"
-#: ../../Zotlabs/Module/Events.php:619
-msgid "Edit event"
-msgstr "Gebeurtenis bewerken"
+#: ../../Zotlabs/Module/Admin.php:142
+msgid "Pending registrations"
+msgstr "Accounts die op goedkeuring wachten"
-#: ../../Zotlabs/Module/Events.php:621
-msgid "Delete event"
-msgstr "Gebeurtenis verwijderen"
+#: ../../Zotlabs/Module/Admin.php:143
+msgid "Registered channels"
+msgstr "Geregistreerde kanalen"
-#: ../../Zotlabs/Module/Events.php:655
-msgid "calendar"
-msgstr "agenda"
+#: ../../Zotlabs/Module/Admin.php:144
+msgid "Active plugins"
+msgstr "Ingeschakelde plugins"
-#: ../../Zotlabs/Module/Events.php:681
-msgid "Month"
-msgstr "Maand"
+#: ../../Zotlabs/Module/Admin.php:145
+msgid "Version"
+msgstr "Versie"
-#: ../../Zotlabs/Module/Events.php:682
-msgid "Week"
-msgstr "Week"
+#: ../../Zotlabs/Module/Admin.php:146
+msgid "Repository version (master)"
+msgstr "Versie repository (master)"
-#: ../../Zotlabs/Module/Events.php:683
-msgid "Day"
-msgstr "Dag"
+#: ../../Zotlabs/Module/Admin.php:147
+msgid "Repository version (dev)"
+msgstr "Versie repository (dev)"
-#: ../../Zotlabs/Module/Events.php:717
-msgid "Event removed"
-msgstr "Gebeurtenis verwijderd"
+#: ../../Zotlabs/Module/Lockview.php:75
+msgid "Remote privacy information not available."
+msgstr "Privacy-informatie op afstand niet beschikbaar."
-#: ../../Zotlabs/Module/Events.php:720
-msgid "Failed to remove event"
-msgstr "Verwijderen gebeurtenis mislukt"
+#: ../../Zotlabs/Module/Lockview.php:96
+msgid "Visible to:"
+msgstr "Zichtbaar voor:"
#: ../../Zotlabs/Module/Service_limits.php:23
msgid "No service class restrictions found."
msgstr "Geen abonnementsbeperkingen gevonden."
-#: ../../Zotlabs/Module/Thing.php:114
-msgid "Thing updated"
-msgstr "Ding bijgewerkt"
-
-#: ../../Zotlabs/Module/Thing.php:166
-msgid "Object store: failed"
-msgstr "Opslaan van ding mislukt"
-
-#: ../../Zotlabs/Module/Thing.php:170
-msgid "Thing added"
-msgstr "Ding toegevoegd"
-
-#: ../../Zotlabs/Module/Thing.php:196
-#, php-format
-msgid "OBJ: %1$s %2$s %3$s"
-msgstr "OBJ: %1$s %2$s %3$s"
+#: ../../Zotlabs/Module/Webpages.php:52
+msgid "Import Webpage Elements"
+msgstr "Webpagina-elementen importeren"
-#: ../../Zotlabs/Module/Thing.php:259
-msgid "Show Thing"
-msgstr "Ding weergeven"
+#: ../../Zotlabs/Module/Webpages.php:53
+msgid "Import selected"
+msgstr "Importbestand geselecteerd"
-#: ../../Zotlabs/Module/Thing.php:266
-msgid "item not found."
-msgstr "Item niet gevonden"
+#: ../../Zotlabs/Module/Webpages.php:76
+msgid "Export Webpage Elements"
+msgstr "Webpagina-elementen exporteren"
-#: ../../Zotlabs/Module/Thing.php:299
-msgid "Edit Thing"
-msgstr "Ding bewerken"
+#: ../../Zotlabs/Module/Webpages.php:77
+msgid "Export selected"
+msgstr "Selectie exporteren"
-#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
-msgid "Select a profile"
-msgstr "Kies een profiel"
+#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:220
+#: ../../include/nav.php:109 ../../include/conversation.php:1727
+msgid "Webpages"
+msgstr "Webpagina's"
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Post an activity"
-msgstr "Plaats een bericht"
+#: ../../Zotlabs/Module/Webpages.php:248 ../../include/page_widgets.php:44
+msgid "Actions"
+msgstr "Acties"
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Only sends to viewers of the applicable profile"
-msgstr "Toont dit alleen aan diegene die het gekozen profiel mogen zien."
+#: ../../Zotlabs/Module/Webpages.php:249 ../../include/page_widgets.php:45
+msgid "Page Link"
+msgstr "Paginalink"
-#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
-msgid "Name of thing e.g. something"
-msgstr "Naam van ding"
+#: ../../Zotlabs/Module/Webpages.php:250
+msgid "Page Title"
+msgstr "Paginatitel"
-#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
-msgid "URL of thing (optional)"
-msgstr "URL van ding (optioneel)"
+#: ../../Zotlabs/Module/Webpages.php:280
+msgid "Invalid file type."
+msgstr "Ongeldig bestandsformaat"
-#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
-msgid "URL for photo of thing (optional)"
-msgstr "URL voor foto van ding (optioneel)"
+#: ../../Zotlabs/Module/Webpages.php:292
+msgid "Error opening zip file"
+msgstr "Fout tijdens openen zipbestand"
-#: ../../Zotlabs/Module/Thing.php:353
-msgid "Add Thing to your Profile"
-msgstr "Ding aan je profiel toevoegen"
+#: ../../Zotlabs/Module/Webpages.php:303
+msgid "Invalid folder path."
+msgstr "Ongeldige maplocatie"
-#: ../../Zotlabs/Module/Item.php:180
-msgid "Unable to locate original post."
-msgstr "Niet in staat om de originele locatie van het bericht te vinden. "
+#: ../../Zotlabs/Module/Webpages.php:330
+msgid "No webpage elements detected."
+msgstr "Geen webpagina-elementen gedecteerd"
-#: ../../Zotlabs/Module/Item.php:433
-msgid "Empty post discarded."
-msgstr "Leeg bericht geannuleerd"
+#: ../../Zotlabs/Module/Webpages.php:405
+msgid "Import complete."
+msgstr "Importeren voltooid."
-#: ../../Zotlabs/Module/Item.php:473
-msgid "Executable content type not permitted to this channel."
-msgstr "Uitvoerbare bestanden zijn niet toegestaan op dit kanaal."
+#: ../../Zotlabs/Module/Removeme.php:35
+msgid ""
+"Channel removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "Het verwijderen van een kanaal is niet toegestaan binnen 48 uur nadat het wachtwoord van het account is veranderd."
-#: ../../Zotlabs/Module/Item.php:851
-msgid "Duplicate post suppressed."
-msgstr "Dubbel bericht tegengehouden."
+#: ../../Zotlabs/Module/Removeme.php:60
+msgid "Remove This Channel"
+msgstr "Verwijder dit kanaal"
-#: ../../Zotlabs/Module/Item.php:986
-msgid "System error. Post not saved."
-msgstr "Systeemfout. Bericht niet opgeslagen."
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "This channel will be completely removed from the network. "
+msgstr "Dit kanaal wordt volledig uit het $Projectname-netwerk verwijderd."
-#: ../../Zotlabs/Module/Item.php:1107
-msgid "Unable to obtain post information from database."
-msgstr "Niet in staat om informatie over dit bericht uit de database te verkrijgen."
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid "Remove this channel and all its clones from the network"
+msgstr "Dit kanaal en alle klonen hiervan uit het $Projectname-netwerk verwijderen"
-#: ../../Zotlabs/Module/Item.php:1114
-#, php-format
-msgid "You have reached your limit of %1$.0f top level posts."
-msgstr "Je hebt jouw limiet van %1$.0f berichten bereikt."
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Standaard wordt alleen het kanaal dat zich op deze hub bevindt uit het $Projectname-netwerk verwijderd"
-#: ../../Zotlabs/Module/Item.php:1121
-#, php-format
-msgid "You have reached your limit of %1$.0f webpages."
-msgstr "Je hebt jouw limiet van %1$.0f webpagina's bereikt."
+#: ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings/Channel.php:549
+msgid "Remove Channel"
+msgstr "Kanaal verwijderen"
#: ../../Zotlabs/Module/Sharedwithme.php:98
msgid "Files: shared with me"
@@ -5563,78 +5715,123 @@ msgstr "Verwijder dit bestand"
msgid "Not found"
msgstr "Niet gevonden"
-#: ../../Zotlabs/Module/Wiki.php:97 ../../Zotlabs/Lib/Apps.php:219
-#: ../../include/features.php:99 ../../include/nav.php:111
-#: ../../include/conversation.php:1735 ../../include/conversation.php:1738
-msgid "Wiki"
-msgstr "Wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:98
-msgid "Sandbox"
-msgstr "Zandbak"
+#: ../../Zotlabs/Module/Wiki.php:55
+msgid "Invalid channel"
+msgstr "Onbekend kanaal"
#: ../../Zotlabs/Module/Wiki.php:100
-msgid ""
-"\"# Wiki Sandbox\\n\\nContent you **edit** and **preview** here *will not be"
-" saved*.\""
-msgstr "\"# Wiki Sandbox\\n\\nWat er hier onder **edit** en **preview** staat *wordt niet opgeslagen*.\""
+msgid "Error retrieving wiki"
+msgstr "Fout tijdens ophalen wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:107
+msgid "Error creating zip file export folder"
+msgstr "Fout tijdens aanmaken exportmap zipbestand"
+
+#: ../../Zotlabs/Module/Wiki.php:125
+msgid "Error downloading wiki: "
+msgstr "Fout tijdens downloaden wiki: "
+
+#: ../../Zotlabs/Module/Wiki.php:139 ../../include/nav.php:111
+#: ../../include/conversation.php:1737
+msgid "Wikis"
+msgstr "Wiki's"
+
+#: ../../Zotlabs/Module/Wiki.php:145
+msgid "Download"
+msgstr "Download"
-#: ../../Zotlabs/Module/Wiki.php:169
+#: ../../Zotlabs/Module/Wiki.php:149
+msgid "Wiki name"
+msgstr "Naam wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:150
+msgid "Content type"
+msgstr "Opmaaktype"
+
+#: ../../Zotlabs/Module/Wiki.php:159
+msgid "Create a status post for this wiki"
+msgstr "Plaats een bericht over deze wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:178
+msgid "Wiki not found"
+msgstr "Wiki is niet gevonden"
+
+#: ../../Zotlabs/Module/Wiki.php:203
+msgid "Rename page"
+msgstr "Pagina hernoemen"
+
+#: ../../Zotlabs/Module/Wiki.php:207
+msgid "Error retrieving page content"
+msgstr "Fout tijdens ophalen inhoud pagina"
+
+#: ../../Zotlabs/Module/Wiki.php:236
msgid "Revision Comparison"
msgstr "Revisies vergelijken"
-#: ../../Zotlabs/Module/Wiki.php:170
+#: ../../Zotlabs/Module/Wiki.php:237
msgid "Revert"
msgstr "Ongedaan maken"
-#: ../../Zotlabs/Module/Wiki.php:201
-msgid "Enter the name of your new wiki:"
-msgstr "Vul de naam in van jouw nieuwe wiki:"
+#: ../../Zotlabs/Module/Wiki.php:246
+msgid "Source"
+msgstr "Bron"
-#: ../../Zotlabs/Module/Wiki.php:202
-msgid "Enter the name of the new page:"
-msgstr "Vul de naam in van de nieuwe pagina:"
-
-#: ../../Zotlabs/Module/Wiki.php:203
-msgid "Enter the new name:"
-msgstr "Vul de nieuwe naam in:"
+#: ../../Zotlabs/Module/Wiki.php:254
+msgid "New page name"
+msgstr "Nieuwe paginanaam"
-#: ../../Zotlabs/Module/Wiki.php:209 ../../include/conversation.php:1153
+#: ../../Zotlabs/Module/Wiki.php:259 ../../include/conversation.php:1151
msgid "Embed image from photo albums"
msgstr "Afbeelding uit een fotoalbum invoegen"
-#: ../../Zotlabs/Module/Wiki.php:210 ../../include/conversation.php:1247
+#: ../../Zotlabs/Module/Wiki.php:260 ../../include/conversation.php:1245
msgid "Embed an image from your albums"
msgstr "Afbeelding uit jouw albums invoegen"
-#: ../../Zotlabs/Module/Wiki.php:212 ../../include/conversation.php:1249
-#: ../../include/conversation.php:1296
+#: ../../Zotlabs/Module/Wiki.php:262 ../../include/conversation.php:1247
+#: ../../include/conversation.php:1294
msgid "OK"
msgstr "OK"
-#: ../../Zotlabs/Module/Wiki.php:213 ../../include/conversation.php:1189
+#: ../../Zotlabs/Module/Wiki.php:263 ../../include/conversation.php:1187
msgid "Choose images to embed"
msgstr "Kies afbeeldingen om in te voegen"
-#: ../../Zotlabs/Module/Wiki.php:214 ../../include/conversation.php:1190
+#: ../../Zotlabs/Module/Wiki.php:264 ../../include/conversation.php:1188
msgid "Choose an album"
msgstr "Kies een album"
-#: ../../Zotlabs/Module/Wiki.php:215 ../../include/conversation.php:1191
-msgid "Choose a different album..."
-msgstr "Kies een ander album..."
+#: ../../Zotlabs/Module/Wiki.php:265
+msgid "Choose a different album"
+msgstr "Kies een ander album"
-#: ../../Zotlabs/Module/Wiki.php:216 ../../include/conversation.php:1192
+#: ../../Zotlabs/Module/Wiki.php:266 ../../include/conversation.php:1190
msgid "Error getting album list"
-msgstr "Fout met ophalen albumlijst"
+msgstr "Fout tijdens ophalen albumlijst"
-#: ../../Zotlabs/Module/Wiki.php:217 ../../include/conversation.php:1193
+#: ../../Zotlabs/Module/Wiki.php:267 ../../include/conversation.php:1191
msgid "Error getting photo link"
-msgstr "Fout met ophalen fotolink"
+msgstr "Fout tijdens ophalen fotolink"
-#: ../../Zotlabs/Module/Wiki.php:218 ../../include/conversation.php:1194
+#: ../../Zotlabs/Module/Wiki.php:268 ../../include/conversation.php:1192
msgid "Error getting album"
-msgstr "Fout met ophalen album"
+msgstr "Fout tijdens ophalen album"
+
+#: ../../Zotlabs/Module/Wiki.php:332
+msgid "Error creating wiki. Invalid name."
+msgstr "Fout tijdens aanmaken wiki. Ongeldige naam."
+
+#: ../../Zotlabs/Module/Wiki.php:343
+msgid "Wiki created, but error creating Home page."
+msgstr "Wiki aangemaakt, maar fout tijdens aanmaken homepagina."
+
+#: ../../Zotlabs/Module/Wiki.php:348
+msgid "Error creating wiki"
+msgstr "Fout tijdens aanmaken wiki."
+
+#: ../../Zotlabs/Module/Wiki.php:394
+msgid "New page created"
+msgstr "Nieuwe pagina aangemaakt"
#: ../../Zotlabs/Module/Sources.php:37
msgid "Failed to create source. No channel selected."
@@ -5734,16 +5931,11 @@ msgstr "Geen voorgestelde kanalen gevonden. Wanneer dit een nieuwe hub is, probe
msgid "Ignore/Hide"
msgstr "Negeren/Verbergen"
-#: ../../Zotlabs/Module/Suggest.php:64 ../../Zotlabs/Module/Directory.php:392
-#: ../../include/contact_widgets.php:24
-msgid "Channel Suggestions"
-msgstr "Voorgestelde kanalen"
-
-#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:263
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
msgid "post"
msgstr "bericht"
-#: ../../Zotlabs/Module/Tagger.php:57 ../../include/text.php:1999
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/text.php:1948
#: ../../include/conversation.php:150
msgid "comment"
msgstr "reactie"
@@ -5753,200 +5945,125 @@ msgstr "reactie"
msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr "%1$s heeft het %3$s van %2$s getagd met %4$s"
-#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
-msgid "Tag removed"
-msgstr "Tag verwijderd"
-
-#: ../../Zotlabs/Module/Tagrm.php:123
-msgid "Remove Item Tag"
-msgstr "Verwijder item-tag"
-
-#: ../../Zotlabs/Module/Tagrm.php:125
-msgid "Select a tag to remove: "
-msgstr "Kies een tag om te verwijderen"
-
-#: ../../Zotlabs/Module/Follow.php:34
-msgid "Channel added."
-msgstr "Kanaal toegevoegd."
-
-#: ../../Zotlabs/Module/Viewconnections.php:65
-msgid "No connections."
-msgstr "Geen connecties."
-
-#: ../../Zotlabs/Module/Viewconnections.php:78
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Bezoek het profiel van %s [%s]"
-
-#: ../../Zotlabs/Module/Viewconnections.php:107
-msgid "View Connections"
-msgstr "Connecties weergeven"
-
-#: ../../Zotlabs/Module/Viewsrc.php:44
-msgid "Source of Item"
-msgstr "Bron van item"
+#: ../../Zotlabs/Module/Settings/Features.php:45
+msgid "Additional Features"
+msgstr "Extra functies"
-#: ../../Zotlabs/Module/Chat.php:181
-msgid "Room not found"
-msgstr "Chatkanaal niet gevonden"
+#: ../../Zotlabs/Module/Settings/Oauth.php:34
+msgid "Name is required"
+msgstr "Naam is vereist"
-#: ../../Zotlabs/Module/Chat.php:197
-msgid "Leave Room"
-msgstr "Chatkanaal verlaten"
+#: ../../Zotlabs/Module/Settings/Oauth.php:38
+msgid "Key and Secret are required"
+msgstr "Key en secret zijn vereist"
-#: ../../Zotlabs/Module/Chat.php:198
-msgid "Delete Room"
-msgstr "Chatkanaal verwijderen"
+#: ../../Zotlabs/Module/Settings/Oauth.php:86
+#: ../../Zotlabs/Module/Settings/Oauth.php:112
+#: ../../Zotlabs/Module/Settings/Oauth.php:148
+msgid "Add application"
+msgstr "Applicatie toevoegen"
-#: ../../Zotlabs/Module/Chat.php:199
-msgid "I am away right now"
-msgstr "Ik ben momenteel afwezig"
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+msgid "Name of application"
+msgstr "Naam van applicatie"
-#: ../../Zotlabs/Module/Chat.php:200
-msgid "I am online"
-msgstr "Ik ben online"
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:116
+#: ../../extend/addon/addon/statusnet/statusnet.php:893
+#: ../../extend/addon/addon/twitter/twitter.php:775
+msgid "Consumer Key"
+msgstr "Consumer key"
-#: ../../Zotlabs/Module/Chat.php:202
-msgid "Bookmark this room"
-msgstr "Chatkanaal aan bladwijzers toevoegen"
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Automatische gegenereerd - verander wanneer gewenst. Maximale lengte is 20"
-#: ../../Zotlabs/Module/Chat.php:231
-msgid "New Chatroom"
-msgstr "Nieuw chatkanaal"
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+#: ../../Zotlabs/Module/Settings/Oauth.php:117
+#: ../../extend/addon/addon/statusnet/statusnet.php:892
+#: ../../extend/addon/addon/twitter/twitter.php:776
+msgid "Consumer Secret"
+msgstr "Consumer secret"
-#: ../../Zotlabs/Module/Chat.php:232
-msgid "Chatroom name"
-msgstr "Naam chatkanaal"
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+#: ../../Zotlabs/Module/Settings/Oauth.php:118
+msgid "Redirect"
+msgstr "Redirect/doorverwijzing"
-#: ../../Zotlabs/Module/Chat.php:233
-msgid "Expiration of chats (minutes)"
-msgstr "Aantal minuten voordat chatberichten worden verwijderd"
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "URI voor redirect - laat leeg, behalve wanneer de applicatie dit vereist"
-#: ../../Zotlabs/Module/Chat.php:249
-#, php-format
-msgid "%1$s's Chatrooms"
-msgstr "Chatkanalen van %1$s"
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Settings/Oauth.php:119
+msgid "Icon url"
+msgstr "Pictogram-URL"
-#: ../../Zotlabs/Module/Chat.php:254
-msgid "No chatrooms available"
-msgstr "Geen chatkanalen beschikbaar"
+#: ../../Zotlabs/Module/Settings/Oauth.php:104
+msgid "Application not found."
+msgstr "Applicatie niet gevonden."
-#: ../../Zotlabs/Module/Chat.php:258
-msgid "Expiration"
-msgstr "Verloopt na"
+#: ../../Zotlabs/Module/Settings/Oauth.php:147
+msgid "Connected Apps"
+msgstr "Verbonden applicaties"
-#: ../../Zotlabs/Module/Chat.php:259
-msgid "min"
-msgstr "min"
+#: ../../Zotlabs/Module/Settings/Oauth.php:151
+msgid "Client key starts with"
+msgstr "Client key begint met"
-#: ../../Zotlabs/Module/Xchan.php:10
-msgid "Xchan Lookup"
-msgstr "Xchan opzoeken"
+#: ../../Zotlabs/Module/Settings/Oauth.php:152
+msgid "No name"
+msgstr "Geen naam"
-#: ../../Zotlabs/Module/Xchan.php:13
-msgid "Lookup xchan beginning with (or webbie): "
-msgstr "Zoek een xchan (of webbie) die begint met:"
+#: ../../Zotlabs/Module/Settings/Oauth.php:153
+msgid "Remove authorization"
+msgstr "Autorisatie verwijderen"
-#: ../../Zotlabs/Module/Directory.php:243
+#: ../../Zotlabs/Module/Settings/Tokens.php:31
#, php-format
-msgid "%d rating"
-msgid_plural "%d ratings"
-msgstr[0] "%d beoordeling"
-msgstr[1] "%d beoordelingen"
-
-#: ../../Zotlabs/Module/Directory.php:254
-msgid "Gender: "
-msgstr "Geslacht:"
-
-#: ../../Zotlabs/Module/Directory.php:256
-msgid "Status: "
-msgstr "Status: "
-
-#: ../../Zotlabs/Module/Directory.php:258
-msgid "Homepage: "
-msgstr "Homepage: "
-
-#: ../../Zotlabs/Module/Directory.php:306 ../../include/channel.php:1207
-msgid "Age:"
-msgstr "Leeftijd:"
-
-#: ../../Zotlabs/Module/Directory.php:311 ../../include/channel.php:1049
-#: ../../include/bb2diaspora.php:507 ../../include/event.php:52
-#: ../../include/event.php:84
-msgid "Location:"
-msgstr "Plaats:"
-
-#: ../../Zotlabs/Module/Directory.php:317
-msgid "Description:"
-msgstr "Omschrijving:"
-
-#: ../../Zotlabs/Module/Directory.php:322 ../../include/channel.php:1223
-msgid "Hometown:"
-msgstr "Oorspronkelijk uit:"
-
-#: ../../Zotlabs/Module/Directory.php:324 ../../include/channel.php:1231
-msgid "About:"
-msgstr "Over:"
-
-#: ../../Zotlabs/Module/Directory.php:326
-msgid "Public Forum:"
-msgstr "Openbaar forum:"
-
-#: ../../Zotlabs/Module/Directory.php:329
-msgid "Keywords: "
-msgstr "Trefwoorden: "
-
-#: ../../Zotlabs/Module/Directory.php:332
-msgid "Don't suggest"
-msgstr "Niet voorstellen"
-
-#: ../../Zotlabs/Module/Directory.php:334
-msgid "Common connections:"
-msgstr "Gemeenschappelijke connecties:"
-
-#: ../../Zotlabs/Module/Directory.php:383
-msgid "Global Directory"
-msgstr "Volledige kanalengids"
-
-#: ../../Zotlabs/Module/Directory.php:383
-msgid "Local Directory"
-msgstr "Lokale kanalengids"
-
-#: ../../Zotlabs/Module/Directory.php:389
-msgid "Finding:"
-msgstr "Gezocht naar:"
+msgid "This channel is limited to %d tokens"
+msgstr "Dit kanaal heeft een limiet van %d tokens"
-#: ../../Zotlabs/Module/Directory.php:394
-msgid "next page"
-msgstr "volgende pagina"
+#: ../../Zotlabs/Module/Settings/Tokens.php:37
+msgid "Name and Password are required."
+msgstr "Naam en wachtwoord zijn vereist"
-#: ../../Zotlabs/Module/Directory.php:394
-msgid "previous page"
-msgstr "vorige pagina"
+#: ../../Zotlabs/Module/Settings/Tokens.php:77
+msgid "Token saved."
+msgstr "Token opgeslagen."
-#: ../../Zotlabs/Module/Directory.php:395
-msgid "Sort options"
-msgstr "Sorteeropties"
+#: ../../Zotlabs/Module/Settings/Tokens.php:113
+msgid ""
+"Use this form to create temporary access identifiers to share things with "
+"non-members. These identities may be used in Access Control Lists and "
+"visitors may login using these credentials to access private content."
+msgstr "Gebruik dit formulier om tijdelijke identiteiten aan te maken, waarmee je bepaalde informatie met niet-leden kan delen. Deze identiteiten kunnen onder Permissies (handmatige selectie) worden gebruikt. Gasten kunnen inloggen met onderstaande gegevens om zo toegang te krijgen tot privéinhoud."
-#: ../../Zotlabs/Module/Directory.php:396
-msgid "Alphabetic"
-msgstr "Alfabetisch"
+#: ../../Zotlabs/Module/Settings/Tokens.php:115
+msgid ""
+"You may also provide <em>dropbox</em> style access links to friends and "
+"associates by adding the Login Password to any specific site URL as shown. "
+"Examples:"
+msgstr "Je kan ook <em>dropbox</em>-achtige links aan mensen geven door bovenstaand wachtwoord op onderstaande manier aan een hub-URL toe te voegen. Voorbeelden:"
-#: ../../Zotlabs/Module/Directory.php:397
-msgid "Reverse Alphabetic"
-msgstr "Omgekeerd alfabetisch"
+#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:647
+msgid "Guest Access Tokens"
+msgstr "Gasttoegang"
-#: ../../Zotlabs/Module/Directory.php:398
-msgid "Newest to Oldest"
-msgstr "Nieuw naar oud"
+#: ../../Zotlabs/Module/Settings/Tokens.php:157
+msgid "Login Name"
+msgstr "Inlognaam"
-#: ../../Zotlabs/Module/Directory.php:399
-msgid "Oldest to Newest"
-msgstr "Oud naar nieuw"
+#: ../../Zotlabs/Module/Settings/Tokens.php:158
+msgid "Login Password"
+msgstr "Wachtwoord:"
-#: ../../Zotlabs/Module/Directory.php:416
-msgid "No entries (some entries may be hidden)."
-msgstr "Niets gevonden (sommige kanalen kunnen verborgen zijn)."
+#: ../../Zotlabs/Module/Settings/Tokens.php:159
+msgid "Expires (yyyy-mm-dd)"
+msgstr "Geldig t/m (yyyy-mm-dd)"
#: ../../Zotlabs/Module/Settings/Account.php:20
msgid "Not valid email."
@@ -5984,44 +6101,51 @@ msgstr "Wachtwoord veranderd."
msgid "Password update failed. Please try again."
msgstr "Bijwerken wachtwoord mislukt. Probeer opnieuw."
-#: ../../Zotlabs/Module/Settings/Account.php:120
+#: ../../Zotlabs/Module/Settings/Account.php:112
msgid "Account Settings"
msgstr "Account-instellingen"
-#: ../../Zotlabs/Module/Settings/Account.php:121
+#: ../../Zotlabs/Module/Settings/Account.php:113
msgid "Current Password"
msgstr "Huidig wachtwoord"
-#: ../../Zotlabs/Module/Settings/Account.php:122
+#: ../../Zotlabs/Module/Settings/Account.php:114
msgid "Enter New Password"
msgstr "Nieuw wachtwoord invoeren"
-#: ../../Zotlabs/Module/Settings/Account.php:123
+#: ../../Zotlabs/Module/Settings/Account.php:115
msgid "Confirm New Password"
msgstr "Nieuw wachtwoord bevestigen"
-#: ../../Zotlabs/Module/Settings/Account.php:123
+#: ../../Zotlabs/Module/Settings/Account.php:115
msgid "Leave password fields blank unless changing"
msgstr "Laat de wachtwoordvelden leeg, behalve wanneer je deze wil veranderen"
-#: ../../Zotlabs/Module/Settings/Account.php:124
+#: ../../Zotlabs/Module/Settings/Account.php:116
msgid "Your technical skill level"
msgstr "Jouw technisch niveau"
-#: ../../Zotlabs/Module/Settings/Account.php:124
+#: ../../Zotlabs/Module/Settings/Account.php:116
msgid "Used to provide a member experience matched to your comfort level"
msgstr "Wordt gebruikt om je een gebruikerservaring te bieden die met jouw technisch niveau overeenkomt"
-#: ../../Zotlabs/Module/Settings/Account.php:127
-#: ../../Zotlabs/Module/Settings/Channel.php:459
+#: ../../Zotlabs/Module/Settings/Account.php:119
+#: ../../Zotlabs/Module/Settings/Channel.php:462
msgid "Email Address:"
msgstr "E-mailadres:"
-#: ../../Zotlabs/Module/Settings/Account.php:129
+#: ../../Zotlabs/Module/Settings/Account.php:121
msgid "Remove this account including all its channels"
msgstr "Dit account en al zijn kanalen verwijderen"
#: ../../Zotlabs/Module/Settings/Channel.php:246
+#: ../../extend/addon/addon/logrot/logrot.php:54
+#: ../../extend/addon/addon/msgfooter/msgfooter.php:54
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:184
+#: ../../extend/addon/addon/piwik/piwik.php:116
+#: ../../extend/addon/addon/twitter/twitter.php:766
+#: ../../extend/addon/addon/xmpp/xmpp.php:102
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:82
msgid "Settings updated."
msgstr "Instellingen bijgewerkt."
@@ -6069,421 +6193,434 @@ msgstr "Sta ons toe om jouw kanaal als mogelijke connectie voor te stellen aan n
msgid "Your channel address is"
msgstr "Jouw kanaaladres is"
-#: ../../Zotlabs/Module/Settings/Channel.php:450
+#: ../../Zotlabs/Module/Settings/Channel.php:407
+msgid "Your files/photos are accessible via WebDAV at"
+msgstr "Jouw bestanden/foto's zijn beschikbaar via WebDAV op"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:453
msgid "Channel Settings"
msgstr "Kanaal-instellingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:457
+#: ../../Zotlabs/Module/Settings/Channel.php:460
msgid "Basic Settings"
msgstr "Basis-instellingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:458
-#: ../../include/channel.php:1164
+#: ../../Zotlabs/Module/Settings/Channel.php:461
+#: ../../include/channel.php:1172
msgid "Full Name:"
msgstr "Volledige naam:"
-#: ../../Zotlabs/Module/Settings/Channel.php:460
+#: ../../Zotlabs/Module/Settings/Channel.php:463
msgid "Your Timezone:"
msgstr "Jouw tijdzone:"
-#: ../../Zotlabs/Module/Settings/Channel.php:461
+#: ../../Zotlabs/Module/Settings/Channel.php:464
msgid "Default Post Location:"
msgstr "Standaardlocatie bericht:"
-#: ../../Zotlabs/Module/Settings/Channel.php:461
+#: ../../Zotlabs/Module/Settings/Channel.php:464
msgid "Geographical location to display on your posts"
msgstr "Geografische locatie die bij het bericht moet worden vermeld"
-#: ../../Zotlabs/Module/Settings/Channel.php:462
+#: ../../Zotlabs/Module/Settings/Channel.php:465
msgid "Use Browser Location:"
msgstr "Locatie van webbrowser gebruiken:"
-#: ../../Zotlabs/Module/Settings/Channel.php:464
+#: ../../Zotlabs/Module/Settings/Channel.php:467
msgid "Adult Content"
msgstr "Inhoud voor volwassenen"
-#: ../../Zotlabs/Module/Settings/Channel.php:464
+#: ../../Zotlabs/Module/Settings/Channel.php:467
msgid ""
-"Channel removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "Het verwijderen van een kanaal is niet toegestaan binnen 48 uur nadat het wachtwoord van het account is veranderd."
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
+msgstr "Dit kanaal publiceert regelmatig of vaak materiaal dat alleen geschikt is voor volwassenen. (Gebruik de tag #NSFW in berichten met een seksueel getinte inhoud of ander voor minderjarigen ongeschikt materiaal)"
-#: ../../Zotlabs/Module/Settings/Channel.php:466
+#: ../../Zotlabs/Module/Settings/Channel.php:469
msgid "Security and Privacy Settings"
msgstr "Veiligheids- en privacy-instellingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:469
+#: ../../Zotlabs/Module/Settings/Channel.php:472
msgid "Your permissions are already configured. Click to view/adjust"
msgstr "Jouw permissies zijn al ingesteld. Klik om ze te bekijken of aan te passen."
-#: ../../Zotlabs/Module/Settings/Channel.php:471
+#: ../../Zotlabs/Module/Settings/Channel.php:474
msgid "Hide my online presence"
msgstr "Verberg mijn aanwezigheid"
-#: ../../Zotlabs/Module/Settings/Channel.php:471
+#: ../../Zotlabs/Module/Settings/Channel.php:474
msgid "Prevents displaying in your profile that you are online"
msgstr "Voorkomt dat op je kanaalpagina te zien valt dat je momenteel op $Projectname aanwezig bent"
-#: ../../Zotlabs/Module/Settings/Channel.php:473
+#: ../../Zotlabs/Module/Settings/Channel.php:476
msgid "Simple Privacy Settings:"
msgstr "Eenvoudige privacy-instellingen:"
-#: ../../Zotlabs/Module/Settings/Channel.php:474
+#: ../../Zotlabs/Module/Settings/Channel.php:477
msgid ""
"Very Public - <em>extremely permissive (should be used with caution)</em>"
msgstr "Zeer openbaar <em>(kanaal staat volledig open - moet met grote zorgvuldigheid gebruikt worden)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:475
+#: ../../Zotlabs/Module/Settings/Channel.php:478
msgid ""
-"Export your basic channel information to a file. This acts as a backup of "
-"your connections, permissions, profile and basic data, which can be used to "
-"import your data to a new server hub, but does not contain your content."
-msgstr "Exporteer de basisinformatie van jouw kanaal naar een bestand. Dit fungeert als een back-up van jouw connecties, permissies, profiel en basisgegevens, die gebruikt kan worden om op een nieuwe hub jouw gegevens te importeren. Deze back-up bevat echter niet de inhoud van jouw kanaal."
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr "Normaal <em>(standaard openbaar, maar privacy wanneer noodzakelijk - vergelijkbaar met die van sociale netwerken, maar met verbeterde privacy)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Channel.php:479
msgid "Private - <em>default private, never open or public</em>"
msgstr "Privé <em>(standaard privé en nooit openbaar)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:477
+#: ../../Zotlabs/Module/Settings/Channel.php:480
msgid "Blocked - <em>default blocked to/from everybody</em>"
msgstr "Geblokkeerd <em>(standaard geblokkeerd naar/van iedereen)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:479
+#: ../../Zotlabs/Module/Settings/Channel.php:482
msgid "Allow others to tag your posts"
msgstr "Anderen toestaan om je berichten te taggen"
-#: ../../Zotlabs/Module/Settings/Channel.php:479
+#: ../../Zotlabs/Module/Settings/Channel.php:482
msgid ""
"Often used by the community to retro-actively flag inappropriate content"
msgstr "Vaak in groepen/forums gebruikt om met terugwerkende kracht ongepast materiaal te markeren"
-#: ../../Zotlabs/Module/Settings/Channel.php:481
+#: ../../Zotlabs/Module/Settings/Channel.php:484
msgid "Channel Permission Limits"
msgstr "Geavanceerde permissies"
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "Expire other channel content after this many days"
msgstr "Inhoud van andere kanalen na zoveel aantal dagen laten verlopen:"
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "0 or blank to use the website limit."
msgstr "0 of leeg om het standaard aantal dagen van deze hub te gebruiken."
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
#, php-format
-msgid ""
-"These content files may be imported or restored by visiting <a "
-"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
-" please import or restore these in date order (oldest first)."
-msgstr "Deze back-up-bestanden kunnen geïmporteerd of hersteld worden door op jouw hub en met jouw kanaal <a href=\"%1$s\">%2$s</a> te bezoeken. Voor het beste resultaat kan je de bestanden in chronologische volgorde importeren of herstellen."
+msgid "This website expires after %d days."
+msgstr "Deze hub laat de inhoud van andere kanalen na %d dagen verlopen."
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "This website does not expire imported content."
msgstr "Deze hub laat de inhoud van andere kanalen niet verlopen."
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "The website limit takes precedence if lower than your limit."
msgstr "Wanneer de standaard aantal dagen van deze hub lager ligt dan jouw aantal, dan heeft de limiet van deze hub voorrang."
-#: ../../Zotlabs/Module/Settings/Channel.php:484
+#: ../../Zotlabs/Module/Settings/Channel.php:487
msgid "Maximum Friend Requests/Day:"
msgstr "Maximum aantal connectieverzoeken per dag:"
-#: ../../Zotlabs/Module/Settings/Channel.php:484
+#: ../../Zotlabs/Module/Settings/Channel.php:487
msgid "May reduce spam activity"
msgstr "Kan eventuele spam verminderen"
-#: ../../Zotlabs/Module/Settings/Channel.php:485
+#: ../../Zotlabs/Module/Settings/Channel.php:488
msgid "Default Access Control List (ACL)"
msgstr "Standaard permissies voor nieuwe berichten"
-#: ../../Zotlabs/Module/Settings/Channel.php:487
+#: ../../Zotlabs/Module/Settings/Channel.php:490
msgid "Use my default audience setting for the type of object published"
msgstr "Gebruik mijn standaard privacy-instelling voor dit type publicatie"
-#: ../../Zotlabs/Module/Settings/Channel.php:494
+#: ../../Zotlabs/Module/Settings/Channel.php:497
msgid "Channel permissions category:"
msgstr "Kanaaltype en -permissies:"
-#: ../../Zotlabs/Module/Settings/Channel.php:500
+#: ../../Zotlabs/Module/Settings/Channel.php:503
msgid "Maximum private messages per day from unknown people:"
msgstr "Maximum aantal privé-berichten per dag van onbekende personen:"
-#: ../../Zotlabs/Module/Settings/Channel.php:500
+#: ../../Zotlabs/Module/Settings/Channel.php:503
msgid "Useful to reduce spamming"
msgstr "Kan eventuele spam verminderen"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Settings/Channel.php:506
msgid "Notification Settings"
msgstr "Notificatie-instellingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:504
+#: ../../Zotlabs/Module/Settings/Channel.php:507
msgid "By default post a status message when:"
msgstr "Plaats automatisch een bericht wanneer:"
-#: ../../Zotlabs/Module/Settings/Channel.php:505
+#: ../../Zotlabs/Module/Settings/Channel.php:508
msgid "accepting a friend request"
msgstr "Een connectieverzoek wordt geaccepteerd"
-#: ../../Zotlabs/Module/Settings/Channel.php:506
+#: ../../Zotlabs/Module/Settings/Channel.php:509
msgid "joining a forum/community"
msgstr "Je lid wordt van een forum/groep"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:510
msgid "making an <em>interesting</em> profile change"
msgstr "Er sprake is van een <em>interessante</em> profielwijziging"
-#: ../../Zotlabs/Module/Settings/Channel.php:508
+#: ../../Zotlabs/Module/Settings/Channel.php:511
msgid "Send a notification email when:"
msgstr "Verzend een notificatie per e-mail wanneer:"
-#: ../../Zotlabs/Module/Settings/Channel.php:509
+#: ../../Zotlabs/Module/Settings/Channel.php:512
msgid "You receive a connection request"
msgstr "Je een connectieverzoek ontvangt"
-#: ../../Zotlabs/Module/Settings/Channel.php:510
+#: ../../Zotlabs/Module/Settings/Channel.php:513
msgid "Your connections are confirmed"
msgstr "Jouw connecties zijn bevestigd"
-#: ../../Zotlabs/Module/Settings/Channel.php:511
+#: ../../Zotlabs/Module/Settings/Channel.php:514
msgid "Someone writes on your profile wall"
msgstr "Iemand iets op jouw kanaal heeft geschreven"
-#: ../../Zotlabs/Module/Settings/Channel.php:512
+#: ../../Zotlabs/Module/Settings/Channel.php:515
msgid "Someone writes a followup comment"
msgstr "Iemand een reactie schrijft"
-#: ../../Zotlabs/Module/Settings/Channel.php:513
+#: ../../Zotlabs/Module/Settings/Channel.php:516
msgid "You receive a private message"
msgstr "Je een privé-bericht ontvangt"
-#: ../../Zotlabs/Module/Settings/Channel.php:514
+#: ../../Zotlabs/Module/Settings/Channel.php:517
msgid "You receive a friend suggestion"
msgstr "Je een kanaalvoorstel ontvangt"
-#: ../../Zotlabs/Module/Settings/Channel.php:515
+#: ../../Zotlabs/Module/Settings/Channel.php:518
msgid "You are tagged in a post"
msgstr "Je expliciet in een bericht bent genoemd"
-#: ../../Zotlabs/Module/Settings/Channel.php:516
+#: ../../Zotlabs/Module/Settings/Channel.php:519
msgid "You are poked/prodded/etc. in a post"
msgstr "Je bent in een bericht aangestoten/gepord/etc."
-#: ../../Zotlabs/Module/Settings/Channel.php:519
+#: ../../Zotlabs/Module/Settings/Channel.php:521
+msgid "Someone likes your post/comment"
+msgstr "Iemand jouw bericht/reactie leuk vindt"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:524
msgid "Show visual notifications including:"
msgstr "Toon de volgende zichtbare notificaties:"
-#: ../../Zotlabs/Module/Settings/Channel.php:521
+#: ../../Zotlabs/Module/Settings/Channel.php:526
msgid "Unseen grid activity"
msgstr "Niet bekeken grid-activiteit"
-#: ../../Zotlabs/Module/Settings/Channel.php:522
+#: ../../Zotlabs/Module/Settings/Channel.php:527
msgid "Unseen channel activity"
msgstr "Niet bekeken kanaal-activiteit"
-#: ../../Zotlabs/Module/Settings/Channel.php:523
+#: ../../Zotlabs/Module/Settings/Channel.php:528
msgid "Unseen private messages"
msgstr "Niet bekeken privéberichten"
-#: ../../Zotlabs/Module/Settings/Channel.php:523
#: ../../Zotlabs/Module/Settings/Channel.php:528
-#: ../../Zotlabs/Module/Settings/Channel.php:529
-#: ../../Zotlabs/Module/Settings/Channel.php:530
+#: ../../Zotlabs/Module/Settings/Channel.php:533
+#: ../../Zotlabs/Module/Settings/Channel.php:534
+#: ../../Zotlabs/Module/Settings/Channel.php:535
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
msgid "Recommended"
msgstr "Aanbevolen"
-#: ../../Zotlabs/Module/Settings/Channel.php:524
+#: ../../Zotlabs/Module/Settings/Channel.php:529
msgid "Upcoming events"
msgstr "Aankomende gebeurtenissen"
-#: ../../Zotlabs/Module/Settings/Channel.php:525
+#: ../../Zotlabs/Module/Settings/Channel.php:530
msgid "Events today"
msgstr "Gebeurtenissen van vandaag"
-#: ../../Zotlabs/Module/Settings/Channel.php:526
+#: ../../Zotlabs/Module/Settings/Channel.php:531
msgid "Upcoming birthdays"
msgstr "Aankomende verjaardagen"
-#: ../../Zotlabs/Module/Settings/Channel.php:526
+#: ../../Zotlabs/Module/Settings/Channel.php:531
msgid "Not available in all themes"
msgstr "Niet in alle thema's beschikbaar"
-#: ../../Zotlabs/Module/Settings/Channel.php:527
+#: ../../Zotlabs/Module/Settings/Channel.php:532
msgid "System (personal) notifications"
msgstr "(Persoonlijke) systeemnotificaties"
-#: ../../Zotlabs/Module/Settings/Channel.php:528
+#: ../../Zotlabs/Module/Settings/Channel.php:533
msgid "System info messages"
msgstr "Systeemmededelingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:529
+#: ../../Zotlabs/Module/Settings/Channel.php:534
msgid "System critical alerts"
msgstr "Kritische systeemwaarschuwingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:530
+#: ../../Zotlabs/Module/Settings/Channel.php:535
msgid "New connections"
msgstr "Nieuwe connecties"
-#: ../../Zotlabs/Module/Settings/Channel.php:531
+#: ../../Zotlabs/Module/Settings/Channel.php:536
msgid "System Registrations"
msgstr "Nieuwe accountregistraties op deze hub"
-#: ../../Zotlabs/Module/Settings/Channel.php:532
+#: ../../Zotlabs/Module/Settings/Channel.php:537
msgid ""
"Also show new wall posts, private messages and connections under Notices"
msgstr "Toon tevens nieuwe kanaalberichten, privéberichten en connecties onder Notificaties"
-#: ../../Zotlabs/Module/Settings/Channel.php:534
+#: ../../Zotlabs/Module/Settings/Channel.php:539
msgid "Notify me of events this many days in advance"
msgstr "Herinner mij zoveel dagen van te voren aan gebeurtenissen"
-#: ../../Zotlabs/Module/Settings/Channel.php:534
+#: ../../Zotlabs/Module/Settings/Channel.php:539
msgid "Must be greater than 0"
msgstr "Moet hoger dan 0 zijn"
-#: ../../Zotlabs/Module/Settings/Channel.php:536
+#: ../../Zotlabs/Module/Settings/Channel.php:541
msgid "Advanced Account/Page Type Settings"
msgstr "Instellingen geavanceerd account/paginatype"
-#: ../../Zotlabs/Module/Settings/Channel.php:537
+#: ../../Zotlabs/Module/Settings/Channel.php:542
msgid "Change the behaviour of this account for special situations"
msgstr "Verander het gedrag van dit account voor speciale situaties"
-#: ../../Zotlabs/Module/Settings/Channel.php:539
+#: ../../Zotlabs/Module/Settings/Channel.php:544
msgid "Miscellaneous Settings"
msgstr "Diverse instellingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:540
+#: ../../Zotlabs/Module/Settings/Channel.php:545
msgid "Default photo upload folder"
msgstr "Standaard fotoalbum voor uploads"
-#: ../../Zotlabs/Module/Settings/Channel.php:540
-#: ../../Zotlabs/Module/Settings/Channel.php:541
+#: ../../Zotlabs/Module/Settings/Channel.php:545
+#: ../../Zotlabs/Module/Settings/Channel.php:546
msgid "%Y - current year, %m - current month"
msgstr "%Y - dit jaar, %m - deze maand"
-#: ../../Zotlabs/Module/Settings/Channel.php:541
+#: ../../Zotlabs/Module/Settings/Channel.php:546
msgid "Default file upload folder"
msgstr "Standaard bestandsmap voor uploads"
-#: ../../Zotlabs/Module/Settings/Channel.php:543
+#: ../../Zotlabs/Module/Settings/Channel.php:548
msgid "Personal menu to display in your channel pages"
msgstr "Persoonlijk menu om op je kanaalpagina's weer te geven"
-#: ../../Zotlabs/Module/Settings/Channel.php:545
+#: ../../Zotlabs/Module/Settings/Channel.php:550
msgid "Remove this channel."
msgstr "Verwijder dit kanaal."
-#: ../../Zotlabs/Module/Settings/Channel.php:546
+#: ../../Zotlabs/Module/Settings/Channel.php:551
msgid "Firefox Share $Projectname provider"
msgstr "$Projectname-service voor Firefox Share"
-#: ../../Zotlabs/Module/Settings/Channel.php:547
+#: ../../Zotlabs/Module/Settings/Channel.php:552
msgid "Start calendar week on monday"
msgstr "Begin in de agenda de week op maandag"
-#: ../../Zotlabs/Module/Settings/Display.php:135
+#: ../../Zotlabs/Module/Settings/Display.php:137
msgid "No special theme for mobile devices"
msgstr "Geen speciaal thema voor mobiele apparaten"
-#: ../../Zotlabs/Module/Settings/Display.php:138
+#: ../../Zotlabs/Module/Settings/Display.php:140
#, php-format
msgid "%s - (Experimental)"
msgstr "%s - (experimenteel)"
-#: ../../Zotlabs/Module/Settings/Display.php:189
+#: ../../Zotlabs/Module/Settings/Display.php:191
msgid "Display Settings"
msgstr "Weergave-instellingen"
-#: ../../Zotlabs/Module/Settings/Display.php:190
+#: ../../Zotlabs/Module/Settings/Display.php:192
msgid "Theme Settings"
msgstr "Thema-instellingen"
-#: ../../Zotlabs/Module/Settings/Display.php:191
+#: ../../Zotlabs/Module/Settings/Display.php:193
msgid "Custom Theme Settings"
msgstr "Handmatige thema-instellingen"
-#: ../../Zotlabs/Module/Settings/Display.php:192
+#: ../../Zotlabs/Module/Settings/Display.php:194
msgid "Content Settings"
msgstr "Inhoudsinstellingen"
-#: ../../Zotlabs/Module/Settings/Display.php:198
+#: ../../Zotlabs/Module/Settings/Display.php:200
msgid "Display Theme:"
msgstr "Gebruik thema:"
-#: ../../Zotlabs/Module/Settings/Display.php:199
+#: ../../Zotlabs/Module/Settings/Display.php:201
msgid "Select scheme"
msgstr "Kies schema van thema"
-#: ../../Zotlabs/Module/Settings/Display.php:201
+#: ../../Zotlabs/Module/Settings/Display.php:203
msgid "Mobile Theme:"
msgstr "Mobiel thema:"
-#: ../../Zotlabs/Module/Settings/Display.php:202
+#: ../../Zotlabs/Module/Settings/Display.php:204
msgid "Preload images before rendering the page"
msgstr "Afbeeldingen laden voordat de pagina wordt weergegeven"
-#: ../../Zotlabs/Module/Settings/Display.php:202
+#: ../../Zotlabs/Module/Settings/Display.php:204
msgid ""
"The subjective page load time will be longer but the page will be ready when"
" displayed"
msgstr "De laadtijd van een pagina lijkt langer, maar de pagina is wel meteen helemaal geladen wanneer deze wordt weergeven"
-#: ../../Zotlabs/Module/Settings/Display.php:203
+#: ../../Zotlabs/Module/Settings/Display.php:205
msgid "Enable user zoom on mobile devices"
msgstr "Inzoomen op smartphones en tablets toestaan"
-#: ../../Zotlabs/Module/Settings/Display.php:204
+#: ../../Zotlabs/Module/Settings/Display.php:206
msgid "Update browser every xx seconds"
msgstr "Ververs de webbrowser om de zoveel seconde"
-#: ../../Zotlabs/Module/Settings/Display.php:204
+#: ../../Zotlabs/Module/Settings/Display.php:206
msgid "Minimum of 10 seconds, no maximum"
msgstr "Minimaal 10 seconde, geen maximum"
-#: ../../Zotlabs/Module/Settings/Display.php:205
+#: ../../Zotlabs/Module/Settings/Display.php:207
msgid "Maximum number of conversations to load at any time:"
msgstr "Maximaal aantal conversaties die per keer geladen worden:"
-#: ../../Zotlabs/Module/Settings/Display.php:205
+#: ../../Zotlabs/Module/Settings/Display.php:207
msgid "Maximum of 100 items"
msgstr "Maximaal 100 conversaties"
-#: ../../Zotlabs/Module/Settings/Display.php:206
+#: ../../Zotlabs/Module/Settings/Display.php:208
msgid "Show emoticons (smilies) as images"
msgstr "Toon emoticons (smilies) als afbeeldingen"
-#: ../../Zotlabs/Module/Settings/Display.php:207
+#: ../../Zotlabs/Module/Settings/Display.php:209
+msgid "Manual conversation updates"
+msgstr "Handmatige conversatie-updates"
+
+#: ../../Zotlabs/Module/Settings/Display.php:209
+msgid "Default is automatic, which may increase screen jumping"
+msgstr "Standaard is automatisch, maar soms kan het zorgen voor het verspringen van items"
+
+#: ../../Zotlabs/Module/Settings/Display.php:210
msgid "Link post titles to source"
msgstr "Berichtkoppen naar originele locatie linken"
-#: ../../Zotlabs/Module/Settings/Display.php:208
+#: ../../Zotlabs/Module/Settings/Display.php:211
msgid "System Page Layout Editor - (advanced)"
msgstr "Lay-out bewerken van systeempagina's (geavanceerd)"
-#: ../../Zotlabs/Module/Settings/Display.php:211
+#: ../../Zotlabs/Module/Settings/Display.php:214
msgid "Use blog/list mode on channel page"
msgstr "Gebruik blog/lijst-modus op kanaalpagina"
-#: ../../Zotlabs/Module/Settings/Display.php:211
-#: ../../Zotlabs/Module/Settings/Display.php:212
+#: ../../Zotlabs/Module/Settings/Display.php:214
+#: ../../Zotlabs/Module/Settings/Display.php:215
msgid "(comments displayed separately)"
msgstr "(reacties worden afzonderlijk weergeven)"
-#: ../../Zotlabs/Module/Settings/Display.php:212
+#: ../../Zotlabs/Module/Settings/Display.php:215
msgid "Use blog/list mode on grid page"
msgstr "Gebruik blog/lijst-modus op gridpagina"
-#: ../../Zotlabs/Module/Settings/Display.php:213
+#: ../../Zotlabs/Module/Settings/Display.php:216
msgid "Channel page max height of content (in pixels)"
msgstr "Maximale hoogte berichtinhoud op kanaalpagina (in pixels)"
-#: ../../Zotlabs/Module/Settings/Display.php:213
-#: ../../Zotlabs/Module/Settings/Display.php:214
+#: ../../Zotlabs/Module/Settings/Display.php:216
+#: ../../Zotlabs/Module/Settings/Display.php:217
msgid "click to expand content exceeding this height"
msgstr "klik om inhoud uit te klappen die deze hoogte overschrijdt"
-#: ../../Zotlabs/Module/Settings/Display.php:214
+#: ../../Zotlabs/Module/Settings/Display.php:217
msgid "Grid page max height of content (in pixels)"
msgstr "Maximale hoogte berichtinhoud op gridpagina (in pixels)"
@@ -6495,352 +6632,442 @@ msgstr "Geen plugin-instellingen aanwezig"
msgid "Feature/Addon Settings"
msgstr "Plugin-instellingen"
-#: ../../Zotlabs/Module/Settings/Features.php:45
-msgid "Additional Features"
-msgstr "Extra functies"
+#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
+msgid "Tag removed"
+msgstr "Tag verwijderd"
-#: ../../Zotlabs/Module/Settings/Oauth.php:34
-msgid "Name is required"
-msgstr "Naam is vereist"
+#: ../../Zotlabs/Module/Tagrm.php:123
+msgid "Remove Item Tag"
+msgstr "Verwijder item-tag"
-#: ../../Zotlabs/Module/Settings/Oauth.php:38
-msgid "Key and Secret are required"
-msgstr "Key en secret zijn vereist"
+#: ../../Zotlabs/Module/Tagrm.php:125
+msgid "Select a tag to remove: "
+msgstr "Kies een tag om te verwijderen"
-#: ../../Zotlabs/Module/Settings/Oauth.php:86
-#: ../../Zotlabs/Module/Settings/Oauth.php:112
-#: ../../Zotlabs/Module/Settings/Oauth.php:148
-msgid "Add application"
-msgstr "Applicatie toevoegen"
+#: ../../Zotlabs/Module/Thing.php:114
+msgid "Thing updated"
+msgstr "Ding bijgewerkt"
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-msgid "Name of application"
-msgstr "Naam van applicatie"
+#: ../../Zotlabs/Module/Thing.php:166
+msgid "Object store: failed"
+msgstr "Opslaan van ding mislukt"
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:116
-msgid "Consumer Key"
-msgstr "Consumer key"
+#: ../../Zotlabs/Module/Thing.php:170
+msgid "Thing added"
+msgstr "Ding toegevoegd"
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-msgid "Automatically generated - change if desired. Max length 20"
-msgstr "Automatische gegenereerd - verander wanneer gewenst. Maximale lengte is 20"
+#: ../../Zotlabs/Module/Thing.php:196
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-#: ../../Zotlabs/Module/Settings/Oauth.php:117
-msgid "Consumer Secret"
-msgstr "Consumer secret"
+#: ../../Zotlabs/Module/Thing.php:259
+msgid "Show Thing"
+msgstr "Ding weergeven"
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-#: ../../Zotlabs/Module/Settings/Oauth.php:118
-msgid "Redirect"
-msgstr "Redirect/doorverwijzing"
+#: ../../Zotlabs/Module/Thing.php:266
+msgid "item not found."
+msgstr "Item niet gevonden"
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-msgid ""
-"Redirect URI - leave blank unless your application specifically requires "
-"this"
-msgstr "URI voor redirect - laat leeg, behalve wanneer de applicatie dit vereist"
+#: ../../Zotlabs/Module/Thing.php:299
+msgid "Edit Thing"
+msgstr "Ding bewerken"
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-#: ../../Zotlabs/Module/Settings/Oauth.php:119
-msgid "Icon url"
-msgstr "Pictogram-URL"
+#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
+msgid "Select a profile"
+msgstr "Kies een profiel"
-#: ../../Zotlabs/Module/Settings/Oauth.php:104
-msgid "Application not found."
-msgstr "Applicatie niet gevonden."
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Post an activity"
+msgstr "Plaats een bericht"
-#: ../../Zotlabs/Module/Settings/Oauth.php:147
-msgid "Connected Apps"
-msgstr "Verbonden applicaties"
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Toont dit alleen aan diegene die het gekozen profiel mogen zien."
-#: ../../Zotlabs/Module/Settings/Oauth.php:151
-msgid "Client key starts with"
-msgstr "Client key begint met"
+#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
+msgid "Name of thing e.g. something"
+msgstr "Naam van ding"
-#: ../../Zotlabs/Module/Settings/Oauth.php:152
-msgid "No name"
-msgstr "Geen naam"
+#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
+msgid "URL of thing (optional)"
+msgstr "URL van ding (optioneel)"
-#: ../../Zotlabs/Module/Settings/Oauth.php:153
-msgid "Remove authorization"
-msgstr "Autorisatie verwijderen"
+#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
+msgid "URL for photo of thing (optional)"
+msgstr "URL voor foto van ding (optioneel)"
-#: ../../Zotlabs/Module/Settings/Tokens.php:31
+#: ../../Zotlabs/Module/Thing.php:353
+msgid "Add Thing to your Profile"
+msgstr "Ding aan je profiel toevoegen"
+
+#: ../../Zotlabs/Module/Import.php:33
#, php-format
-msgid "This channel is limited to %d tokens"
-msgstr "Dit kanaal heeft een limiet van %d tokens"
+msgid "Your service plan only allows %d channels."
+msgstr "Jouw abonnement staat maar %d kanalen toe."
-#: ../../Zotlabs/Module/Settings/Tokens.php:37
-msgid "Name and Password are required."
-msgstr "Naam en wachtwoord zijn vereist"
+#: ../../Zotlabs/Module/Import.php:157 ../../include/import.php:100
+msgid "Cloned channel not found. Import failed."
+msgstr "Gekloond kanaal niet gevonden. Importeren mislukt."
-#: ../../Zotlabs/Module/Settings/Tokens.php:77
-msgid "Token saved."
-msgstr "Token opgeslagen."
+#: ../../Zotlabs/Module/Import.php:167
+msgid "No channel. Import failed."
+msgstr "Geen kanaal. Importeren mislukt."
-#: ../../Zotlabs/Module/Settings/Tokens.php:113
+#: ../../Zotlabs/Module/Import.php:503
+#: ../../include/Import/import_diaspora.php:142
+msgid "Import completed."
+msgstr "Import voltooid."
+
+#: ../../Zotlabs/Module/Import.php:525
+msgid "You must be logged in to use this feature."
+msgstr "Je moet ingelogd zijn om dit onderdeel te kunnen gebruiken."
+
+#: ../../Zotlabs/Module/Import.php:530
+msgid "Import Channel"
+msgstr "Kanaal importeren"
+
+#: ../../Zotlabs/Module/Import.php:531
msgid ""
-"Use this form to create temporary access identifiers to share things with "
-"non-members. These identities may be used in Access Control Lists and "
-"visitors may login using these credentials to access private content."
-msgstr "Gebruik dit formulier om tijdelijke identiteiten aan te maken, waarmee je bepaalde informatie met niet-leden kan delen. Deze identiteiten kunnen onder Permissies (handmatige selectie) worden gebruikt. Gasten kunnen inloggen met onderstaande gegevens om zo toegang te krijgen tot privéinhoud."
+"Use this form to import an existing channel from a different server/hub. You"
+" may retrieve the channel identity from the old server/hub via the network "
+"or provide an export file."
+msgstr "Gebruik dit formulier om een bestaand kanaal te importeren van een andere hub. Je kan de kanaal-identiteit van de oude hub via het netwerk ontvangen of een exportbestand verstrekken."
-#: ../../Zotlabs/Module/Settings/Tokens.php:115
+#: ../../Zotlabs/Module/Import.php:533
+msgid "Or provide the old server/hub details"
+msgstr "Of vul de gegevens van de oude hub in"
+
+#: ../../Zotlabs/Module/Import.php:534
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Jouw oude kanaaladres (xyz@example.com)"
+
+#: ../../Zotlabs/Module/Import.php:535
+msgid "Your old login email address"
+msgstr "Het e-mailadres van je oude account"
+
+#: ../../Zotlabs/Module/Import.php:536
+msgid "Your old login password"
+msgstr "Wachtwoord van jouw oude account"
+
+#: ../../Zotlabs/Module/Import.php:537
msgid ""
-"You may also provide <em>dropbox</em> style access links to friends and "
-"associates by adding the Login Password to any specific site URL as shown. "
-"Examples:"
-msgstr "Je kan ook <em>dropbox</em>-achtige links aan mensen geven door bovenstaand wachtwoord op onderstaande manier aan een hub-URL toe te voegen. Voorbeelden:"
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be"
+" able to post from either location, but only one can be marked as the "
+"primary location for files, photos, and media."
+msgstr "Voor elke optie geldt dat je moet kiezen of je jouw primaire kanaaladres op deze hub wil instellen of dat jouw oude hub deze rol blijft vervullen."
-#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:647
-msgid "Guest Access Tokens"
-msgstr "Gasttoegang"
+#: ../../Zotlabs/Module/Import.php:538
+msgid "Make this hub my primary location"
+msgstr "Stel deze hub als mijn primaire locatie in"
-#: ../../Zotlabs/Module/Settings/Tokens.php:157
-msgid "Login Name"
-msgstr "Inlognaam"
+#: ../../Zotlabs/Module/Import.php:539
+msgid ""
+"Import existing posts if possible (experimental - limited by available "
+"memory"
+msgstr "Importeer bestaande berichten wanneer mogelijk (experimenteel - afhankelijk van beschikbaar servergeheugen)"
-#: ../../Zotlabs/Module/Settings/Tokens.php:158
-msgid "Login Password"
-msgstr "Wachtwoord:"
+#: ../../Zotlabs/Module/Import.php:540
+msgid ""
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
+msgstr "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid."
-#: ../../Zotlabs/Module/Settings/Tokens.php:159
-msgid "Expires (yyyy-mm-dd)"
-msgstr "Geldig t/m (yyyy-mm-dd)"
+#: ../../Zotlabs/Module/Viewconnections.php:65
+msgid "No connections."
+msgstr "Geen connecties."
-#: ../../Zotlabs/Lib/Chatroom.php:27
-msgid "Missing room name"
-msgstr "Naam chatkanaal ontbreekt"
+#: ../../Zotlabs/Module/Viewconnections.php:78
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Bezoek het profiel van %s [%s]"
-#: ../../Zotlabs/Lib/Chatroom.php:36
-msgid "Duplicate room name"
-msgstr "Naam chatkanaal bestaat al"
+#: ../../Zotlabs/Module/Viewconnections.php:107
+msgid "View Connections"
+msgstr "Connecties weergeven"
-#: ../../Zotlabs/Lib/Chatroom.php:86 ../../Zotlabs/Lib/Chatroom.php:94
-msgid "Invalid room specifier."
-msgstr "Ongeldige omschrijving chatkanaal"
+#: ../../Zotlabs/Module/Viewsrc.php:44
+msgid "Source of Item"
+msgstr "Bron van item"
-#: ../../Zotlabs/Lib/Chatroom.php:126
-msgid "Room not found."
+#: ../../Zotlabs/Module/Chat.php:181
+msgid "Room not found"
msgstr "Chatkanaal niet gevonden"
-#: ../../Zotlabs/Lib/Chatroom.php:147
-msgid "Room is full"
-msgstr "Chatkanaal is vol"
+#: ../../Zotlabs/Module/Chat.php:197
+msgid "Leave Room"
+msgstr "Chatkanaal verlaten"
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1889
-msgid "$Projectname Notification"
-msgstr "$Projectname-notificatie"
+#: ../../Zotlabs/Module/Chat.php:198
+msgid "Delete Room"
+msgstr "Chatkanaal verwijderen"
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../include/network.php:1890
-msgid "$projectname"
-msgstr "$projectname"
+#: ../../Zotlabs/Module/Chat.php:199
+msgid "I am away right now"
+msgstr "Ik ben momenteel afwezig"
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1892
-msgid "Thank You,"
-msgstr "Bedankt,"
+#: ../../Zotlabs/Module/Chat.php:200
+msgid "I am online"
+msgstr "Ik ben online"
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1894
-#, php-format
-msgid "%s Administrator"
-msgstr "Beheerder %s"
+#: ../../Zotlabs/Module/Chat.php:202
+msgid "Bookmark this room"
+msgstr "Chatkanaal aan bladwijzers toevoegen"
-#: ../../Zotlabs/Lib/Enotify.php:103
-#, php-format
-msgid "%s <!item_type!>"
-msgstr "%s <!item_type!>"
+#: ../../Zotlabs/Module/Chat.php:231
+msgid "New Chatroom"
+msgstr "Nieuw chatkanaal"
-#: ../../Zotlabs/Lib/Enotify.php:107
-#, php-format
-msgid "[$Projectname:Notify] New mail received at %s"
-msgstr "[$Projectname:Notificatie] Nieuw privébericht ontvangen op %s"
+#: ../../Zotlabs/Module/Chat.php:232
+msgid "Chatroom name"
+msgstr "Naam chatkanaal"
-#: ../../Zotlabs/Lib/Enotify.php:109
-#, php-format
-msgid "%1$s, %2$s sent you a new private message at %3$s."
-msgstr "%1$s, %2$s zond jou een nieuw privébericht om %3$s."
+#: ../../Zotlabs/Module/Chat.php:233
+msgid "Expiration of chats (minutes)"
+msgstr "Aantal minuten voordat chatberichten worden verwijderd"
-#: ../../Zotlabs/Lib/Enotify.php:110
+#: ../../Zotlabs/Module/Chat.php:249
#, php-format
-msgid "%1$s sent you %2$s."
-msgstr "%1$s zond jou %2$s."
+msgid "%1$s's Chatrooms"
+msgstr "Chatkanalen van %1$s"
-#: ../../Zotlabs/Lib/Enotify.php:110
-msgid "a private message"
-msgstr "een privébericht"
+#: ../../Zotlabs/Module/Chat.php:254
+msgid "No chatrooms available"
+msgstr "Geen chatkanalen beschikbaar"
-#: ../../Zotlabs/Lib/Enotify.php:111
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr "Bezoek %s om je privéberichten te bekijken en/of er op te reageren."
+#: ../../Zotlabs/Module/Chat.php:258
+msgid "Expiration"
+msgstr "Verloopt na"
-#: ../../Zotlabs/Lib/Enotify.php:170
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
-msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]een %4$s[/zrl]"
+#: ../../Zotlabs/Module/Chat.php:259
+msgid "min"
+msgstr "min"
-#: ../../Zotlabs/Lib/Enotify.php:178
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
-msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]een %5$s van %4$s[/zrl]"
+#: ../../Zotlabs/Module/Xchan.php:10
+msgid "Xchan Lookup"
+msgstr "Xchan opzoeken"
-#: ../../Zotlabs/Lib/Enotify.php:187
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
-msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]jouw %4$s[/zrl]"
+#: ../../Zotlabs/Module/Xchan.php:13
+msgid "Lookup xchan beginning with (or webbie): "
+msgstr "Zoek een xchan (of webbie) die begint met:"
-#: ../../Zotlabs/Lib/Enotify.php:198
-#, php-format
-msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
-msgstr "[$Projectname:Notificatie] Reactie op conversatie #%1$d door %2$s"
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
+msgstr "Agenda-items geïmporteerd."
-#: ../../Zotlabs/Lib/Enotify.php:199
-#, php-format
-msgid "%1$s, %2$s commented on an item/conversation you have been following."
-msgstr "%1$s, %2$s gaf een reactie op een bericht/conversatie die jij volgt."
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
+msgstr "Geen agenda-items gevonden."
-#: ../../Zotlabs/Lib/Enotify.php:202 ../../Zotlabs/Lib/Enotify.php:217
-#: ../../Zotlabs/Lib/Enotify.php:243 ../../Zotlabs/Lib/Enotify.php:261
-#: ../../Zotlabs/Lib/Enotify.php:275
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr "Bezoek %s om de conversatie te bekijken en/of er op te reageren."
+#: ../../Zotlabs/Module/Events.php:106
+msgid "Event can not end before it has started."
+msgstr "Gebeurtenis kan niet eindigen voordat het is begonnen"
-#: ../../Zotlabs/Lib/Enotify.php:208
-#, php-format
-msgid "[$Projectname:Notify] %s posted to your profile wall"
-msgstr "[$Projectname:Notificatie] %s heeft een bericht op jouw kanaal geplaatst"
+#: ../../Zotlabs/Module/Events.php:108 ../../Zotlabs/Module/Events.php:117
+#: ../../Zotlabs/Module/Events.php:139
+msgid "Unable to generate preview."
+msgstr "Niet in staat om voorvertoning te genereren"
-#: ../../Zotlabs/Lib/Enotify.php:210
-#, php-format
-msgid "%1$s, %2$s posted to your profile wall at %3$s"
-msgstr "%1$s, %2$s heeft om %3$s een bericht op jouw kanaal geplaatst"
+#: ../../Zotlabs/Module/Events.php:115
+msgid "Event title and start time are required."
+msgstr "Titel en begintijd van gebeurtenis zijn vereist."
-#: ../../Zotlabs/Lib/Enotify.php:212
-#, php-format
-msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
-msgstr "%1$s, %2$s heeft een bericht op [zrl=%3$s]jouw kanaal[/zrl] geplaatst"
+#: ../../Zotlabs/Module/Events.php:137 ../../Zotlabs/Module/Events.php:261
+msgid "Event not found."
+msgstr "Gebeurtenis niet gevonden"
-#: ../../Zotlabs/Lib/Enotify.php:236
-#, php-format
-msgid "[$Projectname:Notify] %s tagged you"
-msgstr "[$Projectname:Notificatie] %s heeft jou genoemd"
+#: ../../Zotlabs/Module/Events.php:453
+msgid "Edit event title"
+msgstr "Titel bewerken"
-#: ../../Zotlabs/Lib/Enotify.php:237
-#, php-format
-msgid "%1$s, %2$s tagged you at %3$s"
-msgstr "%1$s, %2$s noemde jou op %3$s"
+#: ../../Zotlabs/Module/Events.php:453
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835
+msgid "Event title"
+msgstr "Titel"
-#: ../../Zotlabs/Lib/Enotify.php:238
-#, php-format
-msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
-msgstr "%1$s, %2$s [zrl=%3$s]noemde jou[/zrl]."
+#: ../../Zotlabs/Module/Events.php:455
+msgid "Categories (comma-separated list)"
+msgstr "Categorieën (door komma's gescheiden lijst)"
-#: ../../Zotlabs/Lib/Enotify.php:250
-#, php-format
-msgid "[$Projectname:Notify] %1$s poked you"
-msgstr "[$Projectname:Notificatie] %1$s heeft jou aangestoten"
+#: ../../Zotlabs/Module/Events.php:456
+msgid "Edit Category"
+msgstr "Categorie"
-#: ../../Zotlabs/Lib/Enotify.php:251
-#, php-format
-msgid "%1$s, %2$s poked you at %3$s"
-msgstr "%1$s, %2$s heeft je aangestoten op %3$s"
+#: ../../Zotlabs/Module/Events.php:456
+msgid "Category"
+msgstr "Categorie"
-#: ../../Zotlabs/Lib/Enotify.php:252
-#, php-format
-msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
-msgstr "%1$s, %2$s [zrl=%2$s]heeft je aangestoten[/zrl]."
+#: ../../Zotlabs/Module/Events.php:459
+msgid "Edit start date and time"
+msgstr "Begindatum en -tijd bewerken"
-#: ../../Zotlabs/Lib/Enotify.php:268
-#, php-format
-msgid "[$Projectname:Notify] %s tagged your post"
-msgstr "[$Projectname:Notificatie] %s heeft jouw bericht getagd"
+#: ../../Zotlabs/Module/Events.php:459
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
+msgid "Start date and time"
+msgstr "Begindatum en -tijd"
-#: ../../Zotlabs/Lib/Enotify.php:269
-#, php-format
-msgid "%1$s, %2$s tagged your post at %3$s"
-msgstr "%1$s, %2$s heeft jouw bericht om %3$s getagd"
+#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:463
+msgid "Finish date and time are not known or not relevant"
+msgstr "Einddatum en -tijd zijn niet bekend of niet van toepassing"
-#: ../../Zotlabs/Lib/Enotify.php:270
-#, php-format
-msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
-msgstr "%1$s, %2$s heeft [zrl=%3$s]jouw bericht[/zrl] getagd"
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Edit finish date and time"
+msgstr "Einddatum en -tijd bewerken"
-#: ../../Zotlabs/Lib/Enotify.php:282
-msgid "[$Projectname:Notify] Introduction received"
-msgstr "[$Projectname:Notificatie] Connectieverzoek ontvangen"
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Finish date and time"
+msgstr "Einddatum en -tijd"
-#: ../../Zotlabs/Lib/Enotify.php:283
-#, php-format
-msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
-msgstr "%1$s, je hebt een nieuw connectieverzoek ontvangen van '%2$s' op %3$s"
+#: ../../Zotlabs/Module/Events.php:464 ../../Zotlabs/Module/Events.php:465
+msgid "Adjust for viewer timezone"
+msgstr "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt"
-#: ../../Zotlabs/Lib/Enotify.php:284
-#, php-format
+#: ../../Zotlabs/Module/Events.php:464
msgid ""
-"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
-msgstr "%1$s, je hebt een [zrl=%2$s]nieuw connectieverzoek[/zrl] ontvangen van %3$s."
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
+msgstr "Belangrijk voor gebeurtenissen die op een bepaalde locatie plaatsvinden. Niet praktisch voor wereldwijde feestdagen."
-#: ../../Zotlabs/Lib/Enotify.php:288 ../../Zotlabs/Lib/Enotify.php:307
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Je kan het profiel bekijken op %s"
+#: ../../Zotlabs/Module/Events.php:466
+msgid "Edit Description"
+msgstr "Omschrijving bewerken"
-#: ../../Zotlabs/Lib/Enotify.php:290
-#, php-format
-msgid "Please visit %s to approve or reject the connection request."
-msgstr "Bezoek %s om het connectieverzoek te accepteren of af te wijzen."
+#: ../../Zotlabs/Module/Events.php:468
+msgid "Edit Location"
+msgstr "Locatie bewerken"
-#: ../../Zotlabs/Lib/Enotify.php:297
-msgid "[$Projectname:Notify] Friend suggestion received"
-msgstr "[$Projectname:Notificatie] Kanaalvoorstel ontvangen"
+#: ../../Zotlabs/Module/Events.php:472 ../../include/conversation.php:1262
+msgid "Permission settings"
+msgstr "Permissies"
-#: ../../Zotlabs/Lib/Enotify.php:298
-#, php-format
-msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
-msgstr "%1$s, je hebt een kanaalvoorstel ontvangen van '%2$s' om %3$s"
+#: ../../Zotlabs/Module/Events.php:485
+msgid "Advanced Options"
+msgstr "Geavanceerde opties"
-#: ../../Zotlabs/Lib/Enotify.php:299
-#, php-format
-msgid ""
-"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
-"%4$s."
-msgstr "%1$s, je hebt [zrl=%2$s]een kanaalvoorstel[/zrl] ontvangen voor %3$s van %4$s."
+#: ../../Zotlabs/Module/Events.php:624
+msgid "Edit event"
+msgstr "Gebeurtenis bewerken"
-#: ../../Zotlabs/Lib/Enotify.php:305
-msgid "Name:"
-msgstr "Naam:"
+#: ../../Zotlabs/Module/Events.php:626
+msgid "Delete event"
+msgstr "Gebeurtenis verwijderen"
-#: ../../Zotlabs/Lib/Enotify.php:306
-msgid "Photo:"
-msgstr "Foto:"
+#: ../../Zotlabs/Module/Events.php:660
+msgid "calendar"
+msgstr "agenda"
-#: ../../Zotlabs/Lib/Enotify.php:309
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Bezoek %s om het voorstel te accepteren of af te wijzen."
+#: ../../Zotlabs/Module/Events.php:686
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849
+msgid "Month"
+msgstr "Maand"
-#: ../../Zotlabs/Lib/Enotify.php:527
-msgid "[$Projectname:Notify]"
-msgstr "[$Projectname:Notificatie]"
+#: ../../Zotlabs/Module/Events.php:687
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850
+msgid "Week"
+msgstr "Week"
-#: ../../Zotlabs/Lib/Enotify.php:687
-msgid "created a new post"
-msgstr "maakte een nieuw bericht aan"
+#: ../../Zotlabs/Module/Events.php:688
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851
+msgid "Day"
+msgstr "Dag"
-#: ../../Zotlabs/Lib/Enotify.php:688
+#: ../../Zotlabs/Module/Events.php:722
+msgid "Event removed"
+msgstr "Gebeurtenis verwijderd"
+
+#: ../../Zotlabs/Module/Events.php:725
+msgid "Failed to remove event"
+msgstr "Verwijderen gebeurtenis mislukt"
+
+#: ../../Zotlabs/Lib/Chatroom.php:27
+msgid "Missing room name"
+msgstr "Naam chatkanaal ontbreekt"
+
+#: ../../Zotlabs/Lib/Chatroom.php:36
+msgid "Duplicate room name"
+msgstr "Naam chatkanaal bestaat al"
+
+#: ../../Zotlabs/Lib/Chatroom.php:86 ../../Zotlabs/Lib/Chatroom.php:94
+msgid "Invalid room specifier."
+msgstr "Ongeldige omschrijving chatkanaal"
+
+#: ../../Zotlabs/Lib/Chatroom.php:126
+msgid "Room not found."
+msgstr "Chatkanaal niet gevonden"
+
+#: ../../Zotlabs/Lib/Chatroom.php:147
+msgid "Room is full"
+msgstr "Chatkanaal is vol"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:34
+#: ../../include/acl_selectors.php:128
+msgid "Visible to your default audience"
+msgstr "Voor iedereen zichtbaar, mits niet anders ingesteld"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:107
+#: ../../include/acl_selectors.php:191
+msgid "Only me"
+msgstr "Alleen ik"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:108
+msgid "Public"
+msgstr "Openbaar"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:109
+msgid "Anybody in the $Projectname network"
+msgstr "Iedereen in het $Projectname-netwerk"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:110
#, php-format
-msgid "commented on %s's post"
-msgstr "gaf een reactie op een bericht van %s"
+msgid "Any account on %s"
+msgstr "Iedereen op %s"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:111
+msgid "Any of my connections"
+msgstr "Al mijn geaccepteerde connecties"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:112
+msgid "Only connections I specifically allow"
+msgstr "Alleen connecties die uitdrukkelijk door jou zijn toegestaan"
-#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:667
+#: ../../Zotlabs/Lib/PermissionDescription.php:113
+msgid "Anybody authenticated (could include visitors from other networks)"
+msgstr "Geauthenticeerde leden (kan bezoekers van andere netwerken bevatten)"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:114
+msgid "Any connections including those who haven't yet been approved"
+msgstr "Al mijn geaccepteerde en nog niet geaccepteerde connecties"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:150
+msgid ""
+"This is your default setting for the audience of your normal stream, and "
+"posts."
+msgstr "Dit is de standaard privacy-instelling voor wie jouw berichten kan bekijken"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:151
+msgid ""
+"This is your default setting for who can view your default channel profile"
+msgstr "Dit is de standaard privacy-instelling voor wie jouw standaardprofiel kan bekijken"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:152
+msgid "This is your default setting for who can view your connections"
+msgstr "Dit is de standaard privacy-instelling voor wie een lijst met jouw connecties kan bekijken"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:153
+msgid ""
+"This is your default setting for who can view your file storage and photos"
+msgstr "Dit is de standaard privacy-instelling voor wie jouw bestanden en foto's kan bekijken"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:154
+msgid "This is your default setting for the audience of your webpages"
+msgstr "Dit is de standaard privacy-instelling voor wie jouw webpagina's kan bekijken"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:663
msgid "Private Message"
msgstr "Niet voor iedereen zichtbaar"
-#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:659
+#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:655
msgid "Select"
msgstr "Kies"
@@ -6888,11 +7115,11 @@ msgstr "Ster toevoegen of verwijderen"
msgid "starred"
msgstr "met ster"
-#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:674
+#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:670
msgid "Message signature validated"
msgstr "Berichtkenmerk gevalideerd"
-#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:675
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:671
msgid "Message signature incorrect"
msgstr "Berichtkenmerk onjuist"
@@ -6948,1006 +7175,3376 @@ msgstr "Kanaal-naar-kanaal"
msgid "via Wall-To-Wall:"
msgstr "via kanaal-naar-kanaal"
-#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:720
+#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:716
#, php-format
msgid "from %s"
msgstr "van %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:723
+#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:719
#, php-format
msgid "last edited: %s"
msgstr "laatst bewerkt: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:724
+#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:720
#, php-format
msgid "Expires: %s"
msgstr "Verloopt: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:377
+#: ../../Zotlabs/Lib/ThreadItem.php:358
+msgid "Attend"
+msgstr "Aanwezig"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:359
+msgid "Attendance Options"
+msgstr "Aanwezigheidsopties"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:360
+msgid "Vote"
+msgstr "Stem"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:361
+msgid "Voting Options"
+msgstr "Stemopties"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:381
+#: ../../extend/addon/addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr "Bladwijzers opslaan"
-#: ../../Zotlabs/Lib/ThreadItem.php:378
+#: ../../Zotlabs/Lib/ThreadItem.php:382
msgid "Add to Calendar"
msgstr "Aan agenda toevoegen"
-#: ../../Zotlabs/Lib/ThreadItem.php:387
+#: ../../Zotlabs/Lib/ThreadItem.php:391
msgid "Mark all seen"
msgstr "Markeer alles als bekeken"
-#: ../../Zotlabs/Lib/ThreadItem.php:436 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:440 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr "%s alle"
-#: ../../Zotlabs/Lib/ThreadItem.php:726 ../../include/conversation.php:1239
+#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/conversation.php:1237
msgid "Bold"
msgstr "Vet"
-#: ../../Zotlabs/Lib/ThreadItem.php:727 ../../include/conversation.php:1240
+#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/conversation.php:1238
msgid "Italic"
msgstr "Cursief"
-#: ../../Zotlabs/Lib/ThreadItem.php:728 ../../include/conversation.php:1241
+#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1239
msgid "Underline"
msgstr "Onderstrepen"
-#: ../../Zotlabs/Lib/ThreadItem.php:729 ../../include/conversation.php:1242
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1240
msgid "Quote"
msgstr "Citeren"
-#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/conversation.php:1243
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1241
msgid "Code"
msgstr "Broncode"
-#: ../../Zotlabs/Lib/ThreadItem.php:731
+#: ../../Zotlabs/Lib/ThreadItem.php:735
msgid "Image"
msgstr "Afbeelding"
-#: ../../Zotlabs/Lib/ThreadItem.php:732
+#: ../../Zotlabs/Lib/ThreadItem.php:736
msgid "Insert Link"
msgstr "Link invoegen"
-#: ../../Zotlabs/Lib/ThreadItem.php:733
+#: ../../Zotlabs/Lib/ThreadItem.php:737
msgid "Video"
msgstr "Video"
-#: ../../Zotlabs/Lib/PermissionDescription.php:31
-#: ../../include/acl_selectors.php:124
-msgid "Visible to your default audience"
-msgstr "Voor iedereen zichtbaar, mits niet anders ingesteld"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:106
-#: ../../include/acl_selectors.php:165
-msgid "Only me"
-msgstr "Alleen ik"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:107
-msgid "Public"
-msgstr "Openbaar"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:108
-msgid "Anybody in the $Projectname network"
-msgstr "Iedereen in het $Projectname-netwerk"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:109
-#, php-format
-msgid "Any account on %s"
-msgstr "Iedereen op %s"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:110
-msgid "Any of my connections"
-msgstr "Al mijn geaccepteerde connecties"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:111
-msgid "Only connections I specifically allow"
-msgstr "Alleen connecties die uitdrukkelijk door jou zijn toegestaan"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:112
-msgid "Anybody authenticated (could include visitors from other networks)"
-msgstr "Geauthenticeerde leden (kan bezoekers van andere netwerken bevatten)"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:113
-msgid "Any connections including those who haven't yet been approved"
-msgstr "Al mijn geaccepteerde en nog niet geaccepteerde connecties"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:152
-msgid ""
-"This is your default setting for the audience of your normal stream, and "
-"posts."
-msgstr "Dit is de standaard privacy-instelling voor wie jouw berichten kan bekijken"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:153
-msgid ""
-"This is your default setting for who can view your default channel profile"
-msgstr "Dit is de standaard privacy-instelling voor wie jouw standaardprofiel kan bekijken"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:154
-msgid "This is your default setting for who can view your connections"
-msgstr "Dit is de standaard privacy-instelling voor wie een lijst met jouw connecties kan bekijken"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:155
-msgid ""
-"This is your default setting for who can view your file storage and photos"
-msgstr "Dit is de standaard privacy-instelling voor wie jouw bestanden en foto's kan bekijken"
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:156
-msgid "This is your default setting for the audience of your webpages"
-msgstr "Dit is de standaard privacy-instelling voor wie jouw webpagina's kan bekijken"
-
-#: ../../Zotlabs/Lib/Apps.php:205
+#: ../../Zotlabs/Lib/Apps.php:207
msgid "Site Admin"
msgstr "Hubbeheerder"
-#: ../../Zotlabs/Lib/Apps.php:206
-msgid "Bug Report"
-msgstr "Bugrapport"
+#: ../../Zotlabs/Lib/Apps.php:208
+#: ../../extend/addon/addon/buglink/buglink.php:16
+msgid "Report Bug"
+msgstr "Bugrapport indienen"
-#: ../../Zotlabs/Lib/Apps.php:207
+#: ../../Zotlabs/Lib/Apps.php:209
msgid "View Bookmarks"
msgstr "Bladwijzers bekijken"
-#: ../../Zotlabs/Lib/Apps.php:208
+#: ../../Zotlabs/Lib/Apps.php:210
msgid "My Chatrooms"
msgstr "Mijn chatkanalen"
-#: ../../Zotlabs/Lib/Apps.php:210
+#: ../../Zotlabs/Lib/Apps.php:212
msgid "Firefox Share"
msgstr "Firefox Share"
-#: ../../Zotlabs/Lib/Apps.php:211
+#: ../../Zotlabs/Lib/Apps.php:213
msgid "Remote Diagnostics"
msgstr "Diagnose op afstand"
-#: ../../Zotlabs/Lib/Apps.php:212 ../../include/features.php:319
+#: ../../Zotlabs/Lib/Apps.php:214 ../../include/features.php:319
msgid "Suggest Channels"
msgstr "Kanalen voorstellen"
-#: ../../Zotlabs/Lib/Apps.php:213 ../../include/nav.php:115
-#: ../../boot.php:1739
+#: ../../Zotlabs/Lib/Apps.php:215 ../../include/nav.php:115
+#: ../../boot.php:1720
msgid "Login"
msgstr "Inloggen"
-#: ../../Zotlabs/Lib/Apps.php:215 ../../include/nav.php:184
+#: ../../Zotlabs/Lib/Apps.php:217 ../../include/nav.php:182
msgid "Grid"
msgstr "Grid"
-#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:187
+#: ../../Zotlabs/Lib/Apps.php:221 ../../include/features.php:99
+#: ../../include/conversation.php:1740
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:185
msgid "Channel Home"
msgstr "Jouw kanaal"
-#: ../../Zotlabs/Lib/Apps.php:223 ../../include/nav.php:206
-#: ../../include/conversation.php:1689 ../../include/conversation.php:1692
+#: ../../Zotlabs/Lib/Apps.php:225 ../../include/nav.php:204
+#: ../../include/conversation.php:1691 ../../include/conversation.php:1694
msgid "Events"
msgstr "Agenda"
-#: ../../Zotlabs/Lib/Apps.php:224 ../../include/nav.php:172
+#: ../../Zotlabs/Lib/Apps.php:226 ../../include/nav.php:170
msgid "Directory"
msgstr "Kanalengids"
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/nav.php:198
+#: ../../Zotlabs/Lib/Apps.php:228 ../../include/nav.php:196
msgid "Mail"
msgstr "Privéberichten"
-#: ../../Zotlabs/Lib/Apps.php:229 ../../include/nav.php:99
+#: ../../Zotlabs/Lib/Apps.php:231 ../../include/nav.php:99
msgid "Chat"
msgstr "Chatten"
-#: ../../Zotlabs/Lib/Apps.php:231
+#: ../../Zotlabs/Lib/Apps.php:233
msgid "Probe"
msgstr "Onderzoeken"
-#: ../../Zotlabs/Lib/Apps.php:232
+#: ../../Zotlabs/Lib/Apps.php:234
msgid "Suggest"
msgstr "Voorstellen"
-#: ../../Zotlabs/Lib/Apps.php:233
+#: ../../Zotlabs/Lib/Apps.php:235
msgid "Random Channel"
msgstr "Willekeurig kanaal"
-#: ../../Zotlabs/Lib/Apps.php:234
+#: ../../Zotlabs/Lib/Apps.php:236
msgid "Invite"
msgstr "Uitnodigen "
-#: ../../Zotlabs/Lib/Apps.php:235 ../../include/widgets.php:1564
+#: ../../Zotlabs/Lib/Apps.php:237 ../../include/widgets.php:1565
msgid "Features"
msgstr "Extra functies"
-#: ../../Zotlabs/Lib/Apps.php:236
+#: ../../Zotlabs/Lib/Apps.php:238
+#: ../../extend/addon/addon/openid/MysqlProvider.php:69
msgid "Language"
msgstr "Taal"
-#: ../../Zotlabs/Lib/Apps.php:237
+#: ../../Zotlabs/Lib/Apps.php:239
msgid "Post"
msgstr "Bericht"
-#: ../../Zotlabs/Lib/Apps.php:238
+#: ../../Zotlabs/Lib/Apps.php:240
+#: ../../extend/addon/addon/openid/MysqlProvider.php:58
+#: ../../extend/addon/addon/openid/MysqlProvider.php:59
+#: ../../extend/addon/addon/openid/MysqlProvider.php:60
msgid "Profile Photo"
msgstr "Profielfoto"
-#: ../../Zotlabs/Lib/Apps.php:339
+#: ../../Zotlabs/Lib/Apps.php:344
msgid "Purchase"
msgstr "Aanschaffen"
-#: ../../include/Import/import_diaspora.php:16
-msgid "No username found in import file."
-msgstr "Geen gebruikersnaam in het importbestand gevonden."
+#: ../../Zotlabs/Lib/Apps.php:348
+msgid "Undelete"
+msgstr "Verwijdering ongedaan maken"
-#: ../../include/Import/import_diaspora.php:41 ../../include/import.php:51
-msgid "Unable to create a unique channel address. Import failed."
-msgstr "Niet in staat om een uniek kanaaladres aan te maken. Importeren is mislukt."
+#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1914
+msgid "$Projectname Notification"
+msgstr "$Projectname-notificatie"
+
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../extend/addon/addon/diaspora/p.php:46
+#: ../../extend/addon/addon/diaspora/util.php:218
+#: ../../extend/addon/addon/diaspora/util.php:231
+#: ../../include/network.php:1915
+msgid "$projectname"
+msgstr "$projectname"
-#: ../../include/dba/dba_driver.php:173
+#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1917
+msgid "Thank You,"
+msgstr "Bedankt,"
+
+#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1919
#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "Kan DNS-informatie voor databaseserver '%s' niet vinden"
+msgid "%s Administrator"
+msgstr "Beheerder %s"
-#: ../../include/permissions.php:35
-msgid "Can view my normal stream and posts"
-msgstr "Kan mijn normale kanaalstream en berichten bekijken"
+#: ../../Zotlabs/Lib/Enotify.php:116
+#, php-format
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../include/permissions.php:39
-msgid "Can view my webpages"
-msgstr "Kan mijn pagina's bekijken"
+#: ../../Zotlabs/Lib/Enotify.php:120
+#, php-format
+msgid "[$Projectname:Notify] New mail received at %s"
+msgstr "[$Projectname:Notificatie] Nieuw privébericht ontvangen op %s"
-#: ../../include/permissions.php:43
-msgid "Can post on my channel page (\"wall\")"
-msgstr "Kan een bericht in mijn kanaal plaatsen"
+#: ../../Zotlabs/Lib/Enotify.php:122
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, %2$s zond jou een nieuw privébericht om %3$s."
-#: ../../include/permissions.php:46
-msgid "Can like/dislike stuff"
-msgstr "Kan dingen leuk of niet leuk vinden"
+#: ../../Zotlabs/Lib/Enotify.php:123
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s zond jou %2$s."
-#: ../../include/permissions.php:46
-msgid "Profiles and things other than posts/comments"
-msgstr "Profielen en dingen, buiten berichten en reacties"
+#: ../../Zotlabs/Lib/Enotify.php:123
+msgid "a private message"
+msgstr "een privébericht"
-#: ../../include/permissions.php:48
-msgid "Can forward to all my channel contacts via post @mentions"
-msgstr "Kan naar al mijn kanaalconnecties berichten doorsturen met behulp van @vermeldingen+"
+#: ../../Zotlabs/Lib/Enotify.php:124
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Bezoek %s om je privéberichten te bekijken en/of er op te reageren."
-#: ../../include/permissions.php:48
-msgid "Advanced - useful for creating group forum channels"
-msgstr "Geavanceerd - nuttig voor groepforums"
+#: ../../Zotlabs/Lib/Enotify.php:183
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]een %4$s[/zrl]"
-#: ../../include/permissions.php:49
-msgid "Can chat with me (when available)"
-msgstr "Kan met mij chatten (wanneer beschikbaar)"
+#: ../../Zotlabs/Lib/Enotify.php:191
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]een %5$s van %4$s[/zrl]"
-#: ../../include/permissions.php:50
-msgid "Can write to my file storage and photos"
-msgstr "Kan foto's en andere bestanden aan mijn bestandsopslag toevoegen"
+#: ../../Zotlabs/Lib/Enotify.php:200
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]jouw %4$s[/zrl]"
-#: ../../include/permissions.php:51
-msgid "Can edit my webpages"
-msgstr "Kan mijn pagina's bewerken"
+#: ../../Zotlabs/Lib/Enotify.php:211
+#, php-format
+msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[$Projectname:Notificatie] %2$s gaf een reactie in conversatie #%1$d"
-#: ../../include/permissions.php:53
-msgid "Somewhat advanced - very useful in open communities"
-msgstr "Enigszins geavanceerd (erg nuttig voor kanalen van forums/groepen)"
+#: ../../Zotlabs/Lib/Enotify.php:212
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s gaf een reactie in een conversatie die jij volgt."
-#: ../../include/permissions.php:55
-msgid "Can administer my channel resources"
-msgstr "Kan mijn kanaal beheren"
+#: ../../Zotlabs/Lib/Enotify.php:215 ../../Zotlabs/Lib/Enotify.php:292
+#: ../../Zotlabs/Lib/Enotify.php:309 ../../Zotlabs/Lib/Enotify.php:335
+#: ../../Zotlabs/Lib/Enotify.php:353 ../../Zotlabs/Lib/Enotify.php:367
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Bezoek %s om de conversatie te bekijken en/of er op te reageren."
-#: ../../include/permissions.php:55
+#: ../../Zotlabs/Lib/Enotify.php:273
+#, php-format
+msgid "%1$s, %2$s liked [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s vindt [zrl=%3$s]jouw %4$s[/zrl] leuk"
+
+#: ../../Zotlabs/Lib/Enotify.php:288
+#, php-format
+msgid "[$Projectname:Notify] Like received to conversation #%1$d by %2$s"
+msgstr "[$Projectname:Notificatie] %2$s vindt iets leuk in conversatie #%1$d"
+
+#: ../../Zotlabs/Lib/Enotify.php:289
+#, php-format
+msgid "%1$s, %2$s liked an item/conversation you created."
+msgstr "%1$s, %2$s vindt iets leuk in een conversatie die jij bent gestart."
+
+#: ../../Zotlabs/Lib/Enotify.php:300
+#, php-format
+msgid "[$Projectname:Notify] %s posted to your profile wall"
+msgstr "[$Projectname:Notificatie] %s heeft een bericht op jouw kanaal geplaatst"
+
+#: ../../Zotlabs/Lib/Enotify.php:302
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s heeft om %3$s een bericht op jouw kanaal geplaatst"
+
+#: ../../Zotlabs/Lib/Enotify.php:304
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s heeft een bericht op [zrl=%3$s]jouw kanaal[/zrl] geplaatst"
+
+#: ../../Zotlabs/Lib/Enotify.php:328
+#, php-format
+msgid "[$Projectname:Notify] %s tagged you"
+msgstr "[$Projectname:Notificatie] %s heeft jou genoemd"
+
+#: ../../Zotlabs/Lib/Enotify.php:329
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, %2$s noemde jou op %3$s"
+
+#: ../../Zotlabs/Lib/Enotify.php:330
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]noemde jou[/zrl]."
+
+#: ../../Zotlabs/Lib/Enotify.php:342
+#, php-format
+msgid "[$Projectname:Notify] %1$s poked you"
+msgstr "[$Projectname:Notificatie] %1$s heeft jou aangestoten"
+
+#: ../../Zotlabs/Lib/Enotify.php:343
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s heeft je aangestoten op %3$s"
+
+#: ../../Zotlabs/Lib/Enotify.php:344
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]heeft je aangestoten[/zrl]."
+
+#: ../../Zotlabs/Lib/Enotify.php:360
+#, php-format
+msgid "[$Projectname:Notify] %s tagged your post"
+msgstr "[$Projectname:Notificatie] %s heeft jouw bericht getagd"
+
+#: ../../Zotlabs/Lib/Enotify.php:361
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s heeft jouw bericht om %3$s getagd"
+
+#: ../../Zotlabs/Lib/Enotify.php:362
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s heeft [zrl=%3$s]jouw bericht[/zrl] getagd"
+
+#: ../../Zotlabs/Lib/Enotify.php:374
+msgid "[$Projectname:Notify] Introduction received"
+msgstr "[$Projectname:Notificatie] Connectieverzoek ontvangen"
+
+#: ../../Zotlabs/Lib/Enotify.php:375
+#, php-format
+msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
+msgstr "%1$s, je hebt een nieuw connectieverzoek ontvangen van '%2$s' op %3$s"
+
+#: ../../Zotlabs/Lib/Enotify.php:376
+#, php-format
msgid ""
-"Extremely advanced. Leave this alone unless you know what you are doing"
-msgstr "Zeer geavanceerd. Laat dit met rust, behalve als je weet wat je doet."
+"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
+msgstr "%1$s, je hebt een [zrl=%2$s]nieuw connectieverzoek[/zrl] ontvangen van %3$s."
-#: ../../include/photos.php:114
+#: ../../Zotlabs/Lib/Enotify.php:380 ../../Zotlabs/Lib/Enotify.php:399
#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
-msgstr "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes"
+msgid "You may visit their profile at %s"
+msgstr "Je kan het profiel bekijken op %s"
-#: ../../include/photos.php:121
-msgid "Image file is empty."
-msgstr "Afbeeldingsbestand is leeg"
+#: ../../Zotlabs/Lib/Enotify.php:382
+#, php-format
+msgid "Please visit %s to approve or reject the connection request."
+msgstr "Bezoek %s om het connectieverzoek te accepteren of af te wijzen."
-#: ../../include/photos.php:259
-msgid "Photo storage failed."
-msgstr "Foto kan niet worden opgeslagen"
+#: ../../Zotlabs/Lib/Enotify.php:389
+msgid "[$Projectname:Notify] Friend suggestion received"
+msgstr "[$Projectname:Notificatie] Kanaalvoorstel ontvangen"
-#: ../../include/photos.php:299
-msgid "a new photo"
-msgstr "een nieuwe foto"
+#: ../../Zotlabs/Lib/Enotify.php:390
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, je hebt een kanaalvoorstel ontvangen van '%2$s' om %3$s"
-#: ../../include/photos.php:303
+#: ../../Zotlabs/Lib/Enotify.php:391
#, php-format
-msgctxt "photo_upload"
-msgid "%1$s posted %2$s to %3$s"
-msgstr "%1$s plaatste %2$s op %3$s"
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, je hebt [zrl=%2$s]een kanaalvoorstel[/zrl] ontvangen voor %3$s van %4$s."
-#: ../../include/photos.php:506 ../../include/conversation.php:1675
-msgid "Photo Albums"
-msgstr "Fotoalbums"
+#: ../../Zotlabs/Lib/Enotify.php:397
+msgid "Name:"
+msgstr "Naam:"
-#: ../../include/photos.php:510
-msgid "Upload New Photos"
-msgstr "Nieuwe foto's uploaden"
+#: ../../Zotlabs/Lib/Enotify.php:398
+msgid "Photo:"
+msgstr "Foto:"
-#: ../../include/features.php:58
-msgid "General Features"
-msgstr "Algemene functies"
+#: ../../Zotlabs/Lib/Enotify.php:401
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Bezoek %s om het voorstel te accepteren of af te wijzen."
-#: ../../include/features.php:63
-msgid "Multiple Profiles"
-msgstr "Meerdere profielen"
+#: ../../Zotlabs/Lib/Enotify.php:619
+msgid "[$Projectname:Notify]"
+msgstr "[$Projectname:Notificatie]"
-#: ../../include/features.php:64
-msgid "Ability to create multiple profiles"
-msgstr "Mogelijkheid om meerdere profielen aan te maken"
+#: ../../Zotlabs/Lib/Enotify.php:779
+msgid "created a new post"
+msgstr "maakte een nieuw bericht aan"
-#: ../../include/features.php:72
-msgid "Advanced Profiles"
-msgstr "Geavanceerde profielen"
+#: ../../Zotlabs/Lib/Enotify.php:780
+#, php-format
+msgid "commented on %s's post"
+msgstr "gaf een reactie op een bericht van %s"
-#: ../../include/features.php:73
-msgid "Additional profile sections and selections"
-msgstr "Extra onderdelen en keuzes voor je profiel"
+#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:24
+msgid "Flag Adult Photos"
+msgstr "Markeer foto's als voor volwassenen"
-#: ../../include/features.php:81
-msgid "Profile Import/Export"
-msgstr "Profiel importen/exporteren"
+#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:25
+msgid ""
+"Provide photo edit option to hide inappropriate photos from default album "
+"view"
+msgstr "Zorgt voor een optie om foto's met inhoud voor volwassenen in de standaard albumweergave te verbergen"
-#: ../../include/features.php:82
-msgid "Save and load profile details across sites/channels"
-msgstr "Profielgegevens opslaan en in andere hubs/kanalen gebruiken."
+#: ../../extend/addon/addon/chords/Mod_Chords.php:44
+msgid ""
+"This is a fairly comprehensive and complete guitar chord dictionary which "
+"will list most of the available ways to play a certain chord, starting from "
+"the base of the fingerboard up to a few frets beyond the twelfth fret "
+"(beyond which everything repeats). A couple of non-standard tunings are "
+"provided for the benefit of slide players, etc."
+msgstr "This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc."
-#: ../../include/features.php:90
-msgid "Web Pages"
-msgstr "Webpagina's"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:46
+msgid ""
+"Chord names start with a root note (A-G) and may include sharps (#) and "
+"flats (b). This software will parse most of the standard naming conventions "
+"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
+msgstr "Chord names start with a root note (A-G) and may include sharps (#) and flats (b). This software will parse most of the standard naming conventions such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
-#: ../../include/features.php:91
-msgid "Provide managed web pages on your channel"
-msgstr "Sta beheerde webpagina's op jouw kanaal toe"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:48
+msgid ""
+"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
+"E7b13b11 ..."
+msgstr "Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."
-#: ../../include/features.php:100
-msgid "Provide a wiki for your channel"
-msgstr "Voeg een wiki aan jouw kanaal toe"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:51
+msgid "Guitar Chords"
+msgstr "Gitaarakkoorden"
-#: ../../include/features.php:117
-msgid "Private Notes"
-msgstr "Privé-aantekeningen"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:52
+msgid "The complete online chord dictionary"
+msgstr "Het complete online akkoordenboek"
-#: ../../include/features.php:118
-msgid "Enables a tool to store notes and reminders (note: not encrypted)"
-msgstr "Een eenvoudige toepassing om aantekeningen en herinneringen in te bewaren (let op: niet versleuteld)"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:57
+msgid "Tuning"
+msgstr "Stemmen"
-#: ../../include/features.php:126
-msgid "Navigation Channel Select"
-msgstr "Kanaal kiezen in navigatiemenu"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:58
+msgid "Chord name: example: Em7"
+msgstr "Akkoordnaam: bijvoorbeeld: Em7"
-#: ../../include/features.php:127
-msgid "Change channels directly from within the navigation dropdown menu"
-msgstr "Kies een ander kanaal direct vanuit het dropdown-menu op de navigatiebalk"
+#: ../../extend/addon/addon/chords/Mod_Chords.php:59
+msgid "Show for left handed stringing"
+msgstr "Toon voor linkshandige gitaar"
-#: ../../include/features.php:135
-msgid "Photo Location"
-msgstr "Fotolocatie"
+#: ../../extend/addon/addon/chords/chords.php:33
+msgid "Quick Reference"
+msgstr "Beknopt overzicht"
-#: ../../include/features.php:136
-msgid "If location data is available on uploaded photos, link this to a map."
-msgstr "Wanneer in de geüploade foto's locatiegegevens aanwezig zijn, link dit dan aan een kaart."
+#: ../../extend/addon/addon/diaspora/diaspora.php:671
+msgid "Diaspora Protocol Settings updated."
+msgstr "Diaspora-protocol-instellingen bijgewerkt."
-#: ../../include/features.php:144
-msgid "Access Controlled Chatrooms"
-msgstr "Chatkanalen met toegangscontrole "
+#: ../../extend/addon/addon/diaspora/diaspora.php:692
+msgid "Enable the Diaspora protocol for this channel"
+msgstr "Het Diaspora-protocol voor dit kanaal inschakelen"
-#: ../../include/features.php:145
-msgid "Provide chatrooms and chat services with access control."
-msgstr "Chatkanalen en chatdiensten met toegangscontrole aanbieden."
+#: ../../extend/addon/addon/diaspora/diaspora.php:696
+msgid "Allow any Diaspora member to comment on your public posts"
+msgstr "Geef elk Diaspora-lid toestemming om op jouw openbare berichten te reageren"
-#: ../../include/features.php:153
-msgid "Smart Birthdays"
-msgstr "Slimme verjaardagen"
+#: ../../extend/addon/addon/diaspora/diaspora.php:700
+msgid "Prevent your hashtags from being redirected to other sites"
+msgstr "Voorkom dat jouw hashtags naar andere websites worden doorverwezen"
-#: ../../include/features.php:154
+#: ../../extend/addon/addon/diaspora/diaspora.php:705
+msgid "Followed hashtags (comma separated, do not include the #)"
+msgstr "Gevolgde hashtags (door komma's gescheiden lijst, zonder de #)"
+
+#: ../../extend/addon/addon/diaspora/diaspora.php:710
+msgid "Diaspora Protocol Settings"
+msgstr "Diaspora-protocol (incl. Friendica)"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:94
+msgid "Hubzilla Directory Stats"
+msgstr "Kanalengidsstatistieken Hubzilla"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:95
+msgid "Total Hubs"
+msgstr "Totaal aantal hubs"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:97
+msgid "Hubzilla Hubs"
+msgstr "Hubzilla-hubs"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:99
+msgid "Friendica Hubs"
+msgstr "Friendica-hubs"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:101
+msgid "Diaspora Pods"
+msgstr "Diaspora-pods"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:103
+msgid "Hubzilla Channels"
+msgstr "Hubzilla-kanalen"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:105
+msgid "Friendica Channels"
+msgstr "Friendica-kanalen"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:107
+msgid "Diaspora Channels"
+msgstr "Diaspora-kanalen"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:109
+msgid "Aged 35 and above"
+msgstr "Leeftijd is ouder dan 35 jaar"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:111
+msgid "Aged 34 and under"
+msgstr "Leeftijd is jonger dan 34"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:113
+msgid "Average Age"
+msgstr "Gemiddelde leeftijd"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:115
+msgid "Known Chatrooms"
+msgstr "Bekend aantal chatkanalen"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:117
+msgid "Known Tags"
+msgstr "Bekend aantal tags"
+
+#: ../../extend/addon/addon/dirstats/dirstats.php:119
msgid ""
-"Make birthday events timezone aware in case your friends are scattered "
-"across the planet."
-msgstr "Maak verjaardagen bewust van tijdzones. Voor het geval dat jouw vrienden over de hele wereld verspreid zijn."
+"Please note Diaspora and Friendica statistics are merely those **this "
+"directory** is aware of, and not all those known in the network. This also "
+"applies to chatrooms,"
+msgstr "Please note Diaspora and Friendica statistics are merely those **this directory** is aware of, and not all those known in the network. This also applies to chatrooms,"
-#: ../../include/features.php:162
-msgid "Advanced Directory Search"
-msgstr "Geavanceerd in de kanalengids zoeken"
+#: ../../extend/addon/addon/donate/donate.php:21
+msgid "Project Servers and Resources"
+msgstr "Projectservers en -middelen"
-#: ../../include/features.php:163
-msgid "Allows creation of complex directory search queries"
-msgstr "Gebruik complexe zoekopdrachten in de kanalengids"
+#: ../../extend/addon/addon/donate/donate.php:22
+msgid "Project Creator and Tech Lead"
+msgstr "Projectgrondlegger en hoofdontwikkelaar"
-#: ../../include/features.php:171
-msgid "Advanced Theme and Layout Settings"
-msgstr "Geavanceerde thema- en lay-out-instellingen"
+#: ../../extend/addon/addon/donate/donate.php:23
+msgid "Admin, developer, directorymin, support bloke"
+msgstr "Beheerder, ontwikkelaar, kanalengidsbeheerder en supportgozer"
-#: ../../include/features.php:172
-msgid "Allows fine tuning of themes and page layouts"
-msgstr "Maakt het mogelijk dat thema's en pagina-lay-outs preciezer ingesteld kunnen worden "
+#: ../../extend/addon/addon/donate/donate.php:50
+msgid ""
+"And the hundreds of other people and organisations who helped make the "
+"Hubzilla possible."
+msgstr "En de honderden andere mensen en organisaties die Hubzilla mogelijk hebben gemaakt. "
-#: ../../include/features.php:182
-msgid "Post Composition Features"
-msgstr "Functies voor het opstellen van berichten"
+#: ../../extend/addon/addon/donate/donate.php:53
+msgid ""
+"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
+"their time and expertise - and often paying out of pocket for services they "
+"share with others."
+msgstr "De Hubzillaprojecten worden hoofdzakelijk aangeboden door vrijwilligers die er hun tijd en expertise insteken - en meestal zelf de diensten betalen die ze met anderen delen."
-#: ../../include/features.php:186
-msgid "Large Photos"
-msgstr "Grote foto's"
+#: ../../extend/addon/addon/donate/donate.php:54
+msgid ""
+"There is no corporate funding and no ads, and we do not collect and sell "
+"your personal information. (We don't control your personal information - "
+"<strong>you do</strong>.)"
+msgstr "Wij worden niet gefinancierd door bedrijven en reclame, en wij verzamelen en verkopen niet jouw persoonlijke gegevens. We hebben geen controle over jouw persoonlijke gegevens - <strong>dat heb jezelf</strong>."
-#: ../../include/features.php:187
+#: ../../extend/addon/addon/donate/donate.php:55
msgid ""
-"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
-"(640px) photo thumbnails"
-msgstr "Gebruik grotere foto's (1024px) in berichten. Wanneer dit is uitgeschakeld worden er kleinere foto's (640px) gebruikt."
+"Help support our ground-breaking work in decentralisation, web identity, and"
+" privacy."
+msgstr "Steun ons baanbrekende werk in decentralisatie, webidentiteit en privacy. "
-#: ../../include/features.php:196
-msgid "Automatically import channel content from other channels or feeds"
-msgstr "Automatisch inhoud uit andere kanalen of feeds importeren."
+#: ../../extend/addon/addon/donate/donate.php:57
+msgid ""
+"Your donations keep servers and services running and also helps us to "
+"provide innovative new features and continued development."
+msgstr "Jouw donaties laten onze servers en diensten draaien, en helpt ons om nieuwe innovatieve mogelijkheden te blijven ontwikkelen."
-#: ../../include/features.php:204
-msgid "Even More Encryption"
-msgstr "Extra encryptie"
+#: ../../extend/addon/addon/donate/donate.php:60
+msgid "Donate"
+msgstr "Doneer"
-#: ../../include/features.php:205
+#: ../../extend/addon/addon/donate/donate.php:62
msgid ""
-"Allow optional encryption of content end-to-end with a shared secret key"
-msgstr "Sta toe dat inhoud extra end-to-end wordt versleuteld met een gedeelde geheime sleutel."
+"Choose a project, developer, or public hub to support with a one-time "
+"donation"
+msgstr "Kies een project, ontwikkelaar of openbaar toegankelijke hub, die je met een eenmalige donatie wil steunen"
-#: ../../include/features.php:213
-msgid "Enable Voting Tools"
-msgstr "Peilingen inschakelen"
+#: ../../extend/addon/addon/donate/donate.php:63
+msgid "Donate Now"
+msgstr "Doneer nu"
-#: ../../include/features.php:214
-msgid "Provide a class of post which others can vote on"
-msgstr "Maakt het mogelijk om een bericht op te stellen, waar mensen op kunnen stemmen."
+#: ../../extend/addon/addon/donate/donate.php:64
+msgid ""
+"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project "
+"only)"
+msgstr "<strong><em>Of</em></strong> wordt een projectsponsor (alleen het Hubzilla-project)"
-#: ../../include/features.php:222
-msgid "Disable Comments"
-msgstr "Reacties uitschakelen"
+#: ../../extend/addon/addon/donate/donate.php:65
+msgid ""
+"Please indicate if you would like your first name or full name (or nothing) "
+"to appear in our sponsor listing"
+msgstr "Geef aan of jouw voornaam of volledige naam (of niets) op onze sponsorlijst moet verschijnen"
-#: ../../include/features.php:223
-msgid "Provide the option to disable comments for a post"
-msgstr "Maak het mogelijk dat reacties op een bericht kunnen worden uitgeschakeld"
+#: ../../extend/addon/addon/donate/donate.php:66
+msgid "Sponsor"
+msgstr "Sponsor"
-#: ../../include/features.php:231
-msgid "Delayed Posting"
-msgstr "Berichten uitstellen"
+#: ../../extend/addon/addon/donate/donate.php:69
+msgid "Special thanks to: "
+msgstr "Speciale dank gaat naar: "
-#: ../../include/features.php:232
-msgid "Allow posts to be published at a later date"
-msgstr "Maakt het mogelijk dat berichten op een toekomstig moment gepubliceerd kunnen worden."
+#: ../../extend/addon/addon/dwpost/dwpost.php:42
+msgid "Post to Dreamwidth"
+msgstr "Doorplaatsen naar Dreamwidth"
-#: ../../include/features.php:240
-msgid "Content Expiration"
-msgstr "Inhoud laten verlopen"
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+msgid "Enable Dreamwidth Post Plugin"
+msgstr "Doorplaatsen naar Dreamwidth inschakelen"
-#: ../../include/features.php:241
-msgid "Remove posts/comments and/or private messages at a future time"
-msgstr "Berichten, reacties en/of privéberichten na een bepaalde tijd verwijderen"
+#: ../../extend/addon/addon/dwpost/dwpost.php:77
+msgid "Dreamwidth username"
+msgstr "Gebruikersnaam Dreamwidth"
-#: ../../include/features.php:249
-msgid "Suppress Duplicate Posts/Comments"
-msgstr "Dubbele berichten/reacties tegenhouden"
+#: ../../extend/addon/addon/dwpost/dwpost.php:81
+msgid "Dreamwidth password"
+msgstr "Wachtwoord Dreamwidth"
-#: ../../include/features.php:250
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+msgid "Post to Dreamwidth by default"
+msgstr "Standaard doorplaatsen naar Dreamwidth"
+
+#: ../../extend/addon/addon/dwpost/dwpost.php:89
+msgid "Dreamwidth Post Settings"
+msgstr "Doorplaatsen naar Dreamwidth"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:45
+msgid "Flattr this!"
+msgstr "Flattr this!"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:83
+msgid "Flattr widget settings updated."
+msgstr "Instellingen Flattrwidget bijgewerkt."
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:100
+msgid "Flattr user"
+msgstr "Gebruikersnaam Flattr"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
+msgid "URL of the Thing to flattr"
+msgstr "URL van het Flattr-item"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
+msgid "If empty channel URL is used"
+msgstr "Wanneer een lege kanaal-URL wordt gebruikt"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
+msgid "Title of the Thing to flattr"
+msgstr "Naam van het Flattr-item"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
+msgid "If empty \"channel name on The Hubzilla\" will be used"
+msgstr "Wanneer een lege \"kanaalnaam op Hubzilla\" wordt gebruikt"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
+msgid "Static or dynamic flattr button"
+msgstr "Statische of dynamische Flattr-knop"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
+msgid "static"
+msgstr "statisch"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
+msgid "dynamic"
+msgstr "dynamisch"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
+msgid "Alignment of the widget"
+msgstr "Uitlijning van de widget"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
+msgid "left"
+msgstr "links"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
+msgid "right"
+msgstr "rechts"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+msgid "Enable Flattr widget"
+msgstr "Flattrwidget inschakelen"
+
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
+msgid "Flattr Widget Settings"
+msgstr "Flattrwidget"
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:118
+msgid "Contact not found."
+msgstr "Contact niet gevonden"
+
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:119
msgid ""
-"Prevent posts with identical content to be published with less than two "
-"minutes in between submissions."
-msgstr "Voorkomt dat berichten en reacties met identieke inhoud en die binnen twee minuten zijn verstuurd, worden gepubliceerd. "
+"This may occasionally happen if contact was requested by both persons and it"
+" has already been approved."
+msgstr "This may occasionally happen if contact was requested by both persons and it has already been approved."
-#: ../../include/features.php:261
-msgid "Network and Stream Filtering"
-msgstr "Netwerk- en streamfilter"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:238
+msgid "Response from remote site was not understood."
+msgstr "Response from remote site was not understood."
-#: ../../include/features.php:265
-msgid "Search by Date"
-msgstr "Zoek op datum"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:247
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:252
+msgid "Unexpected response from remote site: "
+msgstr "Unexpected response from remote site: "
-#: ../../include/features.php:266
-msgid "Ability to select posts by date ranges"
-msgstr "Mogelijkheid om berichten op datum te filteren "
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:261
+msgid "Confirmation completed successfully."
+msgstr "Confirmation completed successfully."
-#: ../../include/features.php:274 ../../include/group.php:311
-msgid "Privacy Groups"
-msgstr "Privacygroepen"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:263
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:277
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:284
+msgid "Remote site reported: "
+msgstr "Remote site reported: "
-#: ../../include/features.php:275
-msgid "Enable management and selection of privacy groups"
-msgstr "Beheer en selectie van privacygroepen inschakelen"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:275
+msgid "Temporary failure. Please wait and try again."
+msgstr "Temporary failure. Please wait and try again."
-#: ../../include/features.php:283 ../../include/widgets.php:283
-msgid "Saved Searches"
-msgstr "Opgeslagen zoekopdrachten"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:282
+msgid "Introduction failed or was revoked."
+msgstr "Introduction failed or was revoked."
-#: ../../include/features.php:284
-msgid "Save search terms for re-use"
-msgstr "Sla zoekopdrachten op voor hergebruik"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:428
+msgid "Unable to set contact photo."
+msgstr "Unable to set contact photo."
-#: ../../include/features.php:292
-msgid "Network Personal Tab"
-msgstr "Persoonlijke netwerktab"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:485
+#, php-format
+msgid "%1$s is now friends with %2$s"
+msgstr "%1$s is now friends with %2$s"
-#: ../../include/features.php:293
-msgid "Enable tab to display only Network posts that you've interacted on"
-msgstr "Sta het toe dat de tab netwerkberichten toont waarmee je interactie had"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:570
+#, php-format
+msgid "No user record found for '%s' "
+msgstr "No user record found for '%s' "
-#: ../../include/features.php:301
-msgid "Network New Tab"
-msgstr "Nieuwe netwerktab"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:580
+msgid "Our site encryption key is apparently messed up."
+msgstr "Our site encryption key is apparently messed up."
-#: ../../include/features.php:302
-msgid "Enable tab to display all new Network activity"
-msgstr "Laat de tab alle nieuwe netwerkactiviteit tonen"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:591
+msgid "Empty site URL was provided or URL could not be decrypted by us."
+msgstr "Empty site URL was provided or URL could not be decrypted by us."
-#: ../../include/features.php:310
-msgid "Affinity Tool"
-msgstr "Verwantschapsfilter"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:612
+msgid "Contact record was not found for you on our site."
+msgstr "Contact record was not found for you on our site."
-#: ../../include/features.php:311
-msgid "Filter stream activity by depth of relationships"
-msgstr "Filter wat je in jouw grid ziet op hoe goed je iemand kent of mag"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:626
+#, php-format
+msgid "Site public key not available in contact record for URL %s."
+msgstr "Site public key not available in contact record for URL %s."
-#: ../../include/features.php:320
-msgid "Show friend and connection suggestions"
-msgstr "Toon kanaalvoorstellen"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:646
+msgid ""
+"The ID provided by your system is a duplicate on our system. It should work "
+"if you try again."
+msgstr "The ID provided by your system is a duplicate on our system. It should work if you try again."
-#: ../../include/features.php:328
-msgid "Connection Filtering"
-msgstr "Berichtenfilters"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:657
+msgid "Unable to set your contact credentials on our system."
+msgstr "Unable to set your contact credentials on our system."
-#: ../../include/features.php:329
-msgid "Filter incoming posts from connections based on keywords/content"
-msgstr "Filter binnenkomende berichten van connecties aan de hand van trefwoorden en taal"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:724
+msgid "Unable to update your contact profile details on our system"
+msgstr "Unable to update your contact profile details on our system"
-#: ../../include/features.php:341
-msgid "Post/Comment Tools"
-msgstr "Bericht- en reactiehulpmiddelen"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:751
+#: ../../extend/addon/addon/friendica/dfrn_request.php:749
+msgid "[Name Withheld]"
+msgstr "[Name Withheld]"
-#: ../../include/features.php:345
-msgid "Community Tagging"
-msgstr "Taggen door anderen"
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:796
+#, php-format
+msgid "%1$s has joined %2$s"
+msgstr "%1$s has joined %2$s"
-#: ../../include/features.php:346
-msgid "Ability to tag existing posts"
-msgstr "Geeft andere mensen de mogelijkheid om jouw (bestaande) berichten te taggen"
+#: ../../extend/addon/addon/friendica/dfrn_poll.php:103
+#: ../../extend/addon/addon/friendica/dfrn_poll.php:536
+#, php-format
+msgid "%1$s welcomes %2$s"
+msgstr "%1$s welcomes %2$s"
-#: ../../include/features.php:354
-msgid "Post Categories"
-msgstr "Categorieën berichten"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:102
+msgid "This introduction has already been accepted."
+msgstr "This introduction has already been accepted."
-#: ../../include/features.php:355
-msgid "Add categories to your posts"
-msgstr "Voeg categorieën toe aan je berichten"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:123
+#: ../../extend/addon/addon/friendica/dfrn_request.php:528
+msgid "Profile location is not valid or does not contain profile information."
+msgstr "Profile location is not valid or does not contain profile information."
-#: ../../include/features.php:363
-msgid "Emoji Reactions"
-msgstr "Emoji-reacties"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:128
+#: ../../extend/addon/addon/friendica/dfrn_request.php:533
+msgid "Warning: profile location has no identifiable owner name."
+msgstr "Warning: profile location has no identifiable owner name."
-#: ../../include/features.php:364
-msgid "Add emoji reaction ability to posts"
-msgstr "Emoji-reacties in berichten toestaan"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:130
+#: ../../extend/addon/addon/friendica/dfrn_request.php:535
+msgid "Warning: profile location has no profile photo."
+msgstr "Warning: profile location has no profile photo."
-#: ../../include/features.php:372 ../../include/contact_widgets.php:53
-#: ../../include/widgets.php:346
-msgid "Saved Folders"
-msgstr "Bewaarde mappen"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:133
+#: ../../extend/addon/addon/friendica/dfrn_request.php:538
+#, 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 required parameter was not found at the given location"
+msgstr[1] "%d required parameters were not found at the given location"
-#: ../../include/features.php:373
-msgid "Ability to file posts under folders"
-msgstr "Mogelijkheid om berichten in mappen op te slaan"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:180
+msgid "Introduction complete."
+msgstr "Introduction complete."
-#: ../../include/features.php:381
-msgid "Dislike Posts"
-msgstr "Vind berichten niet leuk"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:224
+msgid "Unrecoverable protocol error."
+msgstr "Unrecoverable protocol error."
-#: ../../include/features.php:382
-msgid "Ability to dislike posts/comments"
-msgstr "Mogelijkheid om berichten en reacties niet leuk te vinden"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:252
+msgid "Profile unavailable."
+msgstr "Profile unavailable."
-#: ../../include/features.php:390
-msgid "Star Posts"
-msgstr "Geef berichten een ster"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:277
+#, php-format
+msgid "%s has received too many connection requests today."
+msgstr "%s has received too many connection requests today."
-#: ../../include/features.php:391
-msgid "Ability to mark special posts with a star indicator"
-msgstr "Mogelijkheid om speciale berichten met een ster te markeren"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:278
+msgid "Spam protection measures have been invoked."
+msgstr "Spam protection measures have been invoked."
-#: ../../include/features.php:399
-msgid "Tag Cloud"
-msgstr "Tagwolk"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:279
+msgid "Friends are advised to please try again in 24 hours."
+msgstr "Friends are advised to please try again in 24 hours."
-#: ../../include/features.php:400
-msgid "Provide a personal tag cloud on your channel page"
-msgstr "Zorgt voor een persoonlijke wolk met tags op jouw kanaalpagina"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:341
+msgid "Invalid locator"
+msgstr "Invalid locator"
-#: ../../include/features.php:412
-msgid "Premium Channel"
-msgstr "Premiumkanaal"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:350
+msgid "Invalid email address."
+msgstr "Invalid email address."
-#: ../../include/features.php:413
+#: ../../extend/addon/addon/friendica/dfrn_request.php:377
+msgid "This account has not been configured for email. Request failed."
+msgstr "This account has not been configured for email. Request failed."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:473
+msgid "Unable to resolve your name at the provided location."
+msgstr "Unable to resolve your name at the provided location."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:486
+msgid "You have already introduced yourself here."
+msgstr "You have already introduced yourself here."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:490
+#, php-format
+msgid "Apparently you are already friends with %s."
+msgstr "Apparently you are already friends with %s."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:511
+msgid "Invalid profile URL."
+msgstr "Invalid profile URL."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:517
+msgid "Disallowed profile URL."
+msgstr "Disallowed profile URL."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:587
+msgid "Failed to update contact record."
+msgstr "Failed to update contact record."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:608
+msgid "Your introduction has been sent."
+msgstr "Your introduction has been sent."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:662
+msgid "Please login to confirm introduction."
+msgstr "Please login to confirm introduction."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:676
msgid ""
-"Allows you to set restrictions and terms on those that connect with your "
-"channel"
-msgstr "Stelt je in staat om beperkingen en voorwaarden in te stellen voor jouw kanaal"
+"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."
-#: ../../include/help.php:25
-msgid "Help:"
-msgstr "Hulp:"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:690
+#: ../../extend/addon/addon/friendica/dfrn_request.php:707
+msgid "Confirm"
+msgstr "Confirm"
-#: ../../include/security.php:109
-msgid "guest:"
-msgstr "gast:"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:702
+msgid "Hide this contact"
+msgstr "Hide this contact"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:705
+#, php-format
+msgid "Welcome home %s."
+msgstr "Welcome home %s."
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:706
+#, php-format
+msgid "Please confirm your introduction/connection request to %s."
+msgstr "Please confirm your introduction/connection request to %s."
-#: ../../include/security.php:527
+#: ../../extend/addon/addon/friendica/dfrn_request.php:836
msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
-msgstr "De beveiligings-token van het tekstvak was ongeldig. Dit is mogelijk het gevolg van dat er te lang (meer dan 3 uur) gewacht is om de tekst op te slaan. "
+"Please enter your 'Identity Address' from one of the following supported "
+"communications networks:"
+msgstr "Please enter your 'Identity Address' from one of the following supported communications networks:"
-#: ../../include/text.php:450
-msgid "prev"
-msgstr "vorige"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:857
+#, php-format
+msgid ""
+"If you are not yet a member of the free social web, <a "
+"href=\"%s/siteinfo\">follow this link to find a public Friendica site and "
+"join us today</a>."
+msgstr "If you are not yet a member of the free social web, <a href=\"%s/siteinfo\">follow this link to find a public Friendica site and join us today</a>."
-#: ../../include/text.php:452
-msgid "first"
-msgstr "eerste"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:862
+msgid "Friend/Connection Request"
+msgstr "Friend/Connection Request"
-#: ../../include/text.php:481
-msgid "last"
-msgstr "laatste"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:863
+msgid ""
+"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
+"testuser@identi.ca"
+msgstr "Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"
-#: ../../include/text.php:484
-msgid "next"
-msgstr "volgende"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:864
+msgid "Please answer the following:"
+msgstr "Please answer the following:"
-#: ../../include/text.php:494
-msgid "older"
-msgstr "ouder"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#, php-format
+msgid "Does %s know you?"
+msgstr "Does %s know you?"
-#: ../../include/text.php:496
-msgid "newer"
-msgstr "nieuwer"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:869
+msgid "Add a personal note:"
+msgstr "Add a personal note:"
-#: ../../include/text.php:889
-msgid "No connections"
-msgstr "Geen connecties"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:871
+#: ../../include/network.php:2232 ../../include/network.php:2233
+msgid "Friendica"
+msgstr "Friendica"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:872
+msgid "StatusNet/Federated Social Web"
+msgstr "StatusNet/Federated Social Web"
-#: ../../include/text.php:914
+#: ../../extend/addon/addon/friendica/dfrn_request.php:873
+#: ../../include/network.php:2238
+msgid "Diaspora"
+msgstr "Diaspora"
+
+#: ../../extend/addon/addon/friendica/dfrn_request.php:874
#, php-format
-msgid "%1$s is now connected with %2$s"
-msgstr "%1$s is nu met %2$s verbonden"
+msgid ""
+" - please do not use this form. Instead, enter %s into your Diaspora search"
+" bar."
+msgstr " - please do not use this form. Instead, enter %s into your Diaspora search bar."
-#: ../../include/text.php:1059 ../../include/text.php:1064
-msgid "poke"
-msgstr "aanstoten"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:875
+msgid "Your Identity Address:"
+msgstr "Your Identity Address:"
-#: ../../include/text.php:1059 ../../include/text.php:1064
-#: ../../include/conversation.php:243
-msgid "poked"
-msgstr "aangestoten"
+#: ../../extend/addon/addon/friendica/dfrn_request.php:878
+msgid "Submit Request"
+msgstr "Submit Request"
-#: ../../include/text.php:1065
-msgid "ping"
-msgstr "ping"
+#: ../../extend/addon/addon/friendica/friendica.php:113
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:114
+msgid "GNU-Social Protocol Settings updated."
+msgstr "GNU social-protocol-instellingen bijgewerkt."
-#: ../../include/text.php:1065
-msgid "pinged"
-msgstr "gepingd"
+#: ../../extend/addon/addon/friendica/friendica.php:124
+msgid "Enable the (experimental) GNU-Social protocol for this channel"
+msgstr "GNU social-protocol voor dit kanaal inschakelen (experimenteel)"
-#: ../../include/text.php:1066
-msgid "prod"
-msgstr "por"
+#: ../../extend/addon/addon/friendica/friendica.php:128
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
+msgid "GNU-Social Protocol Settings"
+msgstr "GNU social-protocol"
-#: ../../include/text.php:1066
-msgid "prodded"
-msgstr "gepord"
+#: ../../extend/addon/addon/friendica/friendica.php:185
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:319
+msgid "Follow"
+msgstr "Volgen"
-#: ../../include/text.php:1067
-msgid "slap"
-msgstr "slaan"
+#: ../../extend/addon/addon/friendica/friendica.php:188
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:322
+#, php-format
+msgid "%1$s is now following %2$s"
+msgstr "%1$s volgt nu %2$s"
-#: ../../include/text.php:1067
-msgid "slapped"
-msgstr "sloeg"
+#: ../../extend/addon/addon/frphotos/frphotos.php:91
+msgid "Friendica Photo Album Import"
+msgstr "Fotoalbums importeren vanuit Friendica"
-#: ../../include/text.php:1068
-msgid "finger"
-msgstr "finger"
+#: ../../extend/addon/addon/frphotos/frphotos.php:92
+msgid "This will import all your Friendica photo albums to this Red channel."
+msgstr "Hiermee importeer je al jouw Friendica-fotoalbums in dit Hubzilla-kanaal."
-#: ../../include/text.php:1068
-msgid "fingered"
-msgstr "gefingerd"
+#: ../../extend/addon/addon/frphotos/frphotos.php:93
+msgid "Friendica Server base URL"
+msgstr "Basis-URL van Friendica-server"
-#: ../../include/text.php:1069
-msgid "rebuff"
-msgstr "afpoeieren"
+#: ../../extend/addon/addon/frphotos/frphotos.php:94
+msgid "Friendica Login Username"
+msgstr "Gebruikersnaam Friendica"
-#: ../../include/text.php:1069
-msgid "rebuffed"
-msgstr "afgepoeierd"
+#: ../../extend/addon/addon/frphotos/frphotos.php:95
+msgid "Friendica Login Password"
+msgstr "Wachtwoord Friendica"
-#: ../../include/text.php:1081
-msgid "happy"
-msgstr "gelukkig"
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:125
+msgid "Enable the GNU-Social protocol for this channel"
+msgstr "GNU social-protocol voor dit kanaal inschakelen"
-#: ../../include/text.php:1082
-msgid "sad"
-msgstr "bedroefd"
+#: ../../extend/addon/addon/hubwall/hubwall.php:19
+msgid "Send email to all members"
+msgstr "Naar alle leden e-mail versturen"
-#: ../../include/text.php:1083
-msgid "mellow"
-msgstr "mellow"
+#: ../../extend/addon/addon/hubwall/hubwall.php:33
+#, php-format
+msgid "$1%s Administrator"
+msgstr "Beheerder $1%s"
-#: ../../include/text.php:1084
-msgid "tired"
-msgstr "moe"
+#: ../../extend/addon/addon/hubwall/hubwall.php:50
+#: ../../extend/addon/addon/mailtest/mailtest.php:50
+msgid "No recipients found."
+msgstr "Geen ontvangers gevonden"
-#: ../../include/text.php:1085
-msgid "perky"
-msgstr "parmantig"
+#: ../../extend/addon/addon/hubwall/hubwall.php:73
+#, php-format
+msgid "%1$d of %2$d messages sent."
+msgstr "%1$d van %2$d berichten verzonden."
-#: ../../include/text.php:1086
-msgid "angry"
-msgstr "boos"
+#: ../../extend/addon/addon/hubwall/hubwall.php:81
+msgid "Send email to all hub members."
+msgstr "Naar alle leden van deze hub e-mail versturen."
-#: ../../include/text.php:1087
-msgid "stupefied"
-msgstr "verbijsterd"
+#: ../../extend/addon/addon/hubwall/hubwall.php:92
+#: ../../extend/addon/addon/mailtest/mailtest.php:96
+msgid "Message subject"
+msgstr "Onderwerp e-mailbericht"
-#: ../../include/text.php:1088
-msgid "puzzled"
-msgstr "verward"
+#: ../../extend/addon/addon/hubwall/hubwall.php:93
+msgid "Sender Email address"
+msgstr "E-mailadres afzender"
-#: ../../include/text.php:1089
-msgid "interested"
-msgstr "geïnteresseerd"
+#: ../../extend/addon/addon/hubwall/hubwall.php:94
+msgid "Test mode (only send to hub administrator)"
+msgstr "Testmodus (alleen naar hubbeheerder sturen)"
-#: ../../include/text.php:1090
-msgid "bitter"
-msgstr "verbitterd"
+#: ../../extend/addon/addon/ijpost/ijpost.php:42
+msgid "Post to Insanejournal"
+msgstr "Doorplaatsen naar InsaneJournal"
-#: ../../include/text.php:1091
-msgid "cheerful"
-msgstr "vrolijk"
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+msgid "Enable InsaneJournal Post Plugin"
+msgstr "Doorplaatsen naar InsaneJournal inschakelen"
-#: ../../include/text.php:1092
-msgid "alive"
-msgstr "levendig"
+#: ../../extend/addon/addon/ijpost/ijpost.php:77
+msgid "InsaneJournal username"
+msgstr "Gebruikersnaam InsaneJournal"
-#: ../../include/text.php:1093
-msgid "annoyed"
-msgstr "geërgerd"
+#: ../../extend/addon/addon/ijpost/ijpost.php:81
+msgid "InsaneJournal password"
+msgstr "Wachtwoord InsaneJournal"
-#: ../../include/text.php:1094
-msgid "anxious"
-msgstr "bezorgd"
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+msgid "Post to InsaneJournal by default"
+msgstr "Standaard doorplaatsen naar InsaneJournal"
-#: ../../include/text.php:1095
-msgid "cranky"
-msgstr "humeurig"
+#: ../../extend/addon/addon/ijpost/ijpost.php:89
+msgid "InsaneJournal Post Settings"
+msgstr "Doorplaatsen naar InsaneJournal"
-#: ../../include/text.php:1096
-msgid "disturbed"
-msgstr "verontrust"
+#: ../../extend/addon/addon/ijpost/ijpost.php:104
+msgid "Insane Journal Settings saved."
+msgstr "InsaneJournal-instellingen opgeslagen."
-#: ../../include/text.php:1097
-msgid "frustrated"
-msgstr "gefrustreerd "
+#: ../../extend/addon/addon/irc/irc.php:45
+msgid "Channels to auto connect"
+msgstr "Kanalen om automatisch mee te verbinden"
-#: ../../include/text.php:1098
-msgid "depressed"
-msgstr "gedeprimeerd"
+#: ../../extend/addon/addon/irc/irc.php:45
+#: ../../extend/addon/addon/irc/irc.php:49
+msgid "Comma separated list"
+msgstr "Door komma's gescheiden lijst"
-#: ../../include/text.php:1099
-msgid "motivated"
-msgstr "gemotiveerd"
+#: ../../extend/addon/addon/irc/irc.php:49
+#: ../../extend/addon/addon/irc/irc.php:96
+msgid "Popular Channels"
+msgstr "Populaire chatkanalen"
-#: ../../include/text.php:1100
-msgid "relaxed"
-msgstr "ontspannen"
+#: ../../extend/addon/addon/irc/irc.php:53
+msgid "IRC Settings"
+msgstr "IRC"
-#: ../../include/text.php:1101
-msgid "surprised"
-msgstr "verrast"
+#: ../../extend/addon/addon/irc/irc.php:69
+msgid "IRC settings saved."
+msgstr "IRC-instellingen opgeslagen."
-#: ../../include/text.php:1285 ../../include/js_strings.php:70
-msgid "Monday"
-msgstr "maandag"
+#: ../../extend/addon/addon/irc/irc.php:74
+msgid "IRC Chatroom"
+msgstr "IRC-chatkanaal"
-#: ../../include/text.php:1285 ../../include/js_strings.php:71
-msgid "Tuesday"
-msgstr "dinsdag"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:305
+#: ../../include/channel.php:1056 ../../include/channel.php:1218
+msgid "Status:"
+msgstr "Status:"
-#: ../../include/text.php:1285 ../../include/js_strings.php:72
-msgid "Wednesday"
-msgstr "woensdag"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+msgid "Activate addon"
+msgstr "Plugin inschakelen"
-#: ../../include/text.php:1285 ../../include/js_strings.php:73
-msgid "Thursday"
-msgstr "donderdag"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+msgid "Hide Jappixmini Chat-Widget from the webinterface"
+msgstr "Hide Jappixmini Chat-Widget from the webinterface"
-#: ../../include/text.php:1285 ../../include/js_strings.php:74
-msgid "Friday"
-msgstr "vrijdag"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:318
+msgid "Jabber username"
+msgstr "Gebruikersnaam Jabber"
-#: ../../include/text.php:1285 ../../include/js_strings.php:75
-msgid "Saturday"
-msgstr "zaterdag"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:324
+msgid "Jabber server"
+msgstr "Jabberserver"
-#: ../../include/text.php:1285 ../../include/js_strings.php:69
-msgid "Sunday"
-msgstr "zondag"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:330
+msgid "Jabber BOSH host URL"
+msgstr "Jabber BOSH host URL"
-#: ../../include/text.php:1289 ../../include/js_strings.php:45
-msgid "January"
-msgstr "januari"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:337
+msgid "Jabber password"
+msgstr "Wachtwoord Jabber"
-#: ../../include/text.php:1289 ../../include/js_strings.php:46
-msgid "February"
-msgstr "februari"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+msgid "Encrypt Jabber password with Hubzilla password"
+msgstr "Versleutel Jabber-wachtwoord met Hubzilla-wachtwoord"
-#: ../../include/text.php:1289 ../../include/js_strings.php:47
-msgid "March"
-msgstr "maart"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:347
+#: ../../extend/addon/addon/redred/redred.php:115
+msgid "Hubzilla password"
+msgstr "Wachtwoord Hubzilla"
-#: ../../include/text.php:1289 ../../include/js_strings.php:48
-msgid "April"
-msgstr "april"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+msgid "Approve subscription requests from Hubzilla contacts automatically"
+msgstr "Approve subscription requests from Hubzilla contacts automatically"
-#: ../../include/text.php:1289
-msgid "May"
-msgstr "mei"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+msgid "Purge internal list of jabber addresses of contacts"
+msgstr "Purge internal list of jabber addresses of contacts"
-#: ../../include/text.php:1289 ../../include/js_strings.php:50
-msgid "June"
-msgstr "juni"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:364
+msgid "Configuration Help"
+msgstr "Configuratiehulp"
-#: ../../include/text.php:1289 ../../include/js_strings.php:51
-msgid "July"
-msgstr "juli"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:368
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149
+msgid "Add Contact"
+msgstr "Contact toevoegen"
-#: ../../include/text.php:1289 ../../include/js_strings.php:52
-msgid "August"
-msgstr "augustus"
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
+msgid "Jappix Mini Settings"
+msgstr "Jappix Mini"
-#: ../../include/text.php:1289 ../../include/js_strings.php:53
-msgid "September"
-msgstr "september"
+#: ../../extend/addon/addon/js_upload/js_upload.php:44
+msgid "Upload a file"
+msgstr "Bestand uploaden"
-#: ../../include/text.php:1289 ../../include/js_strings.php:54
-msgid "October"
-msgstr "oktober"
+#: ../../extend/addon/addon/js_upload/js_upload.php:45
+msgid "Drop files here to upload"
+msgstr "Sleep bestanden hierheen om ze te uploaden"
-#: ../../include/text.php:1289 ../../include/js_strings.php:55
-msgid "November"
-msgstr "november"
+#: ../../extend/addon/addon/js_upload/js_upload.php:47
+msgid "Failed"
+msgstr "Mislukt"
-#: ../../include/text.php:1289 ../../include/js_strings.php:56
-msgid "December"
-msgstr "december"
+#: ../../extend/addon/addon/js_upload/js_upload.php:315
+msgid "No files were uploaded."
+msgstr "Er zijn geen bestanden geüpload."
-#: ../../include/text.php:1366 ../../include/text.php:1370
-msgid "Unknown Attachment"
-msgstr "Onbekende bijlage"
+#: ../../extend/addon/addon/js_upload/js_upload.php:322
+msgid "Uploaded file is empty"
+msgstr "Geüpload bestand is leeg"
-#: ../../include/text.php:1372
-msgid "unknown"
-msgstr "onbekend"
+#: ../../extend/addon/addon/js_upload/js_upload.php:335
+msgid "Image exceeds size limit of "
+msgstr "Afbeeldingsgrootte overschrijdt het limiet van "
-#: ../../include/text.php:1408
-msgid "remove category"
-msgstr "categorie verwijderen"
+#: ../../extend/addon/addon/js_upload/js_upload.php:347
+msgid "File has an invalid extension, it should be one of "
+msgstr "Bestand heeft een ongeldige extensie. Geldige extensies zijn "
-#: ../../include/text.php:1485
-msgid "remove from file"
-msgstr "uit map verwijderen"
+#: ../../extend/addon/addon/js_upload/js_upload.php:359
+msgid "Upload was cancelled, or server error encountered"
+msgstr "Upload werd geannuleerd of er was een serverfout"
-#: ../../include/text.php:1784 ../../include/text.php:1855
-msgid "default"
-msgstr "standaard"
+#: ../../extend/addon/addon/ldapauth/ldapauth.php:61
+msgid "An account has been created for you."
+msgstr "Er is voor jou een account aangemaakt."
-#: ../../include/text.php:1792
-msgid "Page layout"
-msgstr "Pagina-lay-out"
+#: ../../extend/addon/addon/ldapauth/ldapauth.php:68
+msgid "Authentication successful but rejected: account creation is disabled."
+msgstr "Authenticatie geslaagd, maar afgekeurd: aanmaken accounts uitgeschakeld."
-#: ../../include/text.php:1792
-msgid "You can create your own with the layouts tool"
-msgstr "Je kan jouw eigen lay-out ontwerpen onder lay-outs"
+#: ../../extend/addon/addon/libertree/libertree.php:38
+msgid "Post to Libertree"
+msgstr "Doorplaatsen naar Libertree"
-#: ../../include/text.php:1834
-msgid "Page content type"
-msgstr "Opmaaktype pagina"
+#: ../../extend/addon/addon/libertree/libertree.php:69
+msgid "Enable Libertree Post Plugin"
+msgstr "Doorplaatsen naar Libertree inschakelen"
-#: ../../include/text.php:1867
-msgid "Select an alternate language"
-msgstr "Kies een andere taal"
+#: ../../extend/addon/addon/libertree/libertree.php:73
+msgid "Libertree API token"
+msgstr "API-token Libertree"
-#: ../../include/text.php:2004
-msgid "activity"
-msgstr "activiteit"
+#: ../../extend/addon/addon/libertree/libertree.php:77
+msgid "Libertree site URL"
+msgstr "Website-URL Libertree"
-#: ../../include/text.php:2305
-msgid "Design Tools"
-msgstr "Ontwerp-hulpmiddelen"
+#: ../../extend/addon/addon/libertree/libertree.php:81
+msgid "Post to Libertree by default"
+msgstr "Standaard doorplaatsen naar Libertree"
-#: ../../include/text.php:2311
-msgid "Pages"
-msgstr "Pagina's"
+#: ../../extend/addon/addon/libertree/libertree.php:85
+msgid "Libertree Post Settings"
+msgstr "Doorplaatsen naar Libertree"
-#: ../../include/text.php:2333
-msgid "Import website..."
-msgstr "Website importeren..."
+#: ../../extend/addon/addon/libertree/libertree.php:99
+msgid "Libertree Settings saved."
+msgstr "Libertree-instellingen opgeslagen."
-#: ../../include/text.php:2334
-msgid "Select folder to import"
-msgstr "Kies een map om te importeren"
+#: ../../extend/addon/addon/ljpost/ljpost.php:42
+msgid "Post to LiveJournal"
+msgstr "Doorplaatsen naar LiveJournal"
-#: ../../include/text.php:2335
-msgid "Import from a zipped folder:"
-msgstr "Vanuit een zipbestand importeren:"
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+msgid "Enable LiveJournal Post Plugin"
+msgstr "Doorplaatsen naar LiveJournal inschakelen"
-#: ../../include/text.php:2336
-msgid "Import from cloud files:"
-msgstr "Vanuit de cloud importeren:"
+#: ../../extend/addon/addon/ljpost/ljpost.php:74
+msgid "LiveJournal username"
+msgstr "Gebruikersnaam LiveJournal"
-#: ../../include/text.php:2337
-msgid "/cloud/channel/path/to/folder"
-msgstr "/cloud/channel/maplocatie"
+#: ../../extend/addon/addon/ljpost/ljpost.php:78
+msgid "LiveJournal password"
+msgstr "Wachtwoord LiveJournal"
-#: ../../include/text.php:2338
-msgid "Enter path to website files"
-msgstr "Voer de locatie in van de websitebestanden"
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+msgid "Post to LiveJournal by default"
+msgstr "Standaard doorplaatsen naar "
-#: ../../include/text.php:2339
-msgid "Select folder"
-msgstr "Kies een map"
+#: ../../extend/addon/addon/ljpost/ljpost.php:86
+msgid "LiveJournal Post Settings"
+msgstr "Doorplaatsen naar LiveJournal"
-#: ../../include/text.php:2340
-msgid "Export website..."
-msgstr "Website exporteren..."
+#: ../../extend/addon/addon/ljpost/ljpost.php:101
+msgid "LiveJournal Settings saved."
+msgstr "LiveJournal-instellingen opgeslagen."
-#: ../../include/text.php:2341
-msgid "Export to a zip file"
-msgstr "Naar een zipbestand exporteren"
+#: ../../extend/addon/addon/logrot/logrot.php:36
+msgid "Logfile archive directory"
+msgstr "Logbestand archiefmap"
-#: ../../include/text.php:2342
-msgid "website.zip"
-msgstr "website.zip"
+#: ../../extend/addon/addon/logrot/logrot.php:36
+msgid "Directory to store rotated logs"
+msgstr "Map om geroteerde logbestanden in op te slaan"
-#: ../../include/text.php:2343
-msgid "Enter a name for the zip file."
-msgstr "Vul een naam in voor het zipbestand."
+#: ../../extend/addon/addon/logrot/logrot.php:37
+msgid "Logfile size in bytes before rotating"
+msgstr "Grootte van logbestand in bytes, voordat het wordt geroteerd"
-#: ../../include/text.php:2344
-msgid "Export to cloud files"
-msgstr "Naar de cloud exporteren"
+#: ../../extend/addon/addon/logrot/logrot.php:38
+msgid "Number of logfiles to retain"
+msgstr "Aantal te behouden logbestanden"
-#: ../../include/text.php:2345
-msgid "/path/to/export/folder"
-msgstr "/locatie/van/export/map"
+#: ../../extend/addon/addon/mailhost/mailhost.php:36
+msgid "Email notification hub"
+msgstr "Hub voor e-mailnotificaties"
-#: ../../include/text.php:2346
-msgid "Enter a path to a cloud files destination."
-msgstr "Voer de locatie in van de cloudbestemming"
+#: ../../extend/addon/addon/mailhost/mailhost.php:36
+msgid "Hostname"
+msgstr "Hostnaam"
-#: ../../include/text.php:2347
-msgid "Specify folder"
-msgstr "Selecteer een map"
+#: ../../extend/addon/addon/mailhost/mailhost.php:40
+msgid "Mailhost Settings"
+msgstr "Mailhost"
-#: ../../include/zot.php:700
-msgid "Invalid data packet"
-msgstr "Datapakket ongeldig"
+#: ../../extend/addon/addon/mailhost/mailhost.php:54
+msgid "MAILHOST Settings saved."
+msgstr "Mailhost-instellingen opgeslagen."
-#: ../../include/zot.php:716
-msgid "Unable to verify channel signature"
-msgstr "Kanaalkenmerk kon niet worden geverifieerd. "
+#: ../../extend/addon/addon/moremoods/moremoods.php:19
+msgid "lonely"
+msgstr "Eenzaam"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:20
+msgid "drunk"
+msgstr "dronken"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:21
+msgid "horny"
+msgstr "geil"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:22
+msgid "stoned"
+msgstr "stoned"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:23
+msgid "fucked up"
+msgstr "opgefokt"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:24
+msgid "clusterfucked"
+msgstr "clusterfucked"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:25
+msgid "crazy"
+msgstr "gek"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:26
+msgid "hurt"
+msgstr "gekwetst"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:27
+msgid "sleepy"
+msgstr "slaperig"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:28
+msgid "grumpy"
+msgstr "chagrijnig"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:29
+msgid "high"
+msgstr "high"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:30
+msgid "semi-conscious"
+msgstr "half bij kennis"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:31
+msgid "in love"
+msgstr "verliefd"
-#: ../../include/zot.php:2329
+#: ../../extend/addon/addon/moremoods/moremoods.php:32
+msgid "in lust"
+msgstr "wellustig"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:33
+msgid "naked"
+msgstr "naakt"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:34
+msgid "stinky"
+msgstr "stinkend"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:35
+msgid "sweaty"
+msgstr "zweterig"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:36
+msgid "bleeding out"
+msgstr "aan het doodbloeden"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:37
+msgid "victorious"
+msgstr "zegevierend"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:38
+msgid "defeated"
+msgstr "verslagen"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:39
+msgid "envious"
+msgstr "jaloers"
+
+#: ../../extend/addon/addon/moremoods/moremoods.php:40
+msgid "jealous"
+msgstr "jaloers"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:19
+msgid "bitchslap"
+msgstr "bitchslappen"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:19
+msgid "bitchslapped"
+msgstr "bitchslapped"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:20
+msgid "shag"
+msgstr "wippen"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:20
+msgid "shagged"
+msgstr "wipte met"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:21
+msgid "patent"
+msgstr "patent"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:21
+msgid "patented"
+msgstr "patented"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:22
+msgid "hug"
+msgstr "knuffelen"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:22
+msgid "hugged"
+msgstr "knuffelde"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:23
+msgid "murder"
+msgstr "vermoorden"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:23
+msgid "murdered"
+msgstr "vermoorde"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:24
+msgid "worship"
+msgstr "aanbidden"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:24
+msgid "worshipped"
+msgstr "aanbad"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:25
+msgid "kiss"
+msgstr "kussen"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:25
+msgid "kissed"
+msgstr "kuste"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:26
+msgid "tempt"
+msgstr "verleiden"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:26
+msgid "tempted"
+msgstr "verleidde"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:27
+msgid "raise eyebrows at"
+msgstr "wenkbrauwen optrekken"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:27
+msgid "raised their eyebrows at"
+msgstr "trok zijn/haar wenkbrauwen op naar"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:28
+msgid "insult"
+msgstr "beledigen"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:28
+msgid "insulted"
+msgstr "beledigde"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:29
+msgid "praise"
+msgstr "prijzen"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:29
+msgid "praised"
+msgstr "prees"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:30
+msgid "be dubious of"
+msgstr "twijfels hebben"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:30
+msgid "was dubious of"
+msgstr "had twijfels over"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:31
+msgid "eat"
+msgstr "opeten"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:31
+msgid "ate"
+msgstr "at"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:32
+msgid "giggle and fawn at"
+msgstr "giechelen en vleien"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:32
+msgid "giggled and fawned at"
+msgstr "giechelde naar en vleide met"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:33
+msgid "doubt"
+msgstr "betwijfelen"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:33
+msgid "doubted"
+msgstr "betwijfelde"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:34
+msgid "glare"
+msgstr "boos kijken"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:34
+msgid "glared at"
+msgstr "keek boos naar"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:35
+msgid "fuck"
+msgstr "neuken"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:35
+msgid "fucked"
+msgstr "neukte"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:36
+msgid "bonk"
+msgstr "naaien"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:36
+msgid "bonked"
+msgstr "naaide"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:37
+msgid "declare undying love for"
+msgstr "eeuwige liefde verklaren"
+
+#: ../../extend/addon/addon/morepokes/morepokes.php:37
+msgid "declared undying love for"
+msgstr "verklaarde de eeuwige liefde aan"
+
+#: ../../extend/addon/addon/msgfooter/msgfooter.php:46
+#: ../../extend/addon/addon/xmpp/xmpp.php:91
+msgid "Save Settings"
+msgstr "Instellingen opslaan"
+
+#: ../../extend/addon/addon/msgfooter/msgfooter.php:47
+msgid "text to include in all outgoing posts from this site"
+msgstr "tekst om onderaan elk uitgaand bericht van deze hub te plaatsen"
+
+#: ../../extend/addon/addon/nofed/nofed.php:42
+msgid "Federate"
+msgstr "Federeren"
+
+#: ../../extend/addon/addon/nofed/nofed.php:56
+msgid "nofed Settings saved."
+msgstr "Geen federatie-instellingen opgeslagen."
+
+#: ../../extend/addon/addon/nofed/nofed.php:72
+msgid "Allow Federation Toggle"
+msgstr "Federatie toestaan?"
+
+#: ../../extend/addon/addon/nofed/nofed.php:76
+msgid "Federate posts by default"
+msgstr "Standaard berichten federeren"
+
+#: ../../extend/addon/addon/nofed/nofed.php:80
+msgid "NoFed Settings"
+msgstr "Geen federatie"
+
+#: ../../extend/addon/addon/nsabait/nsabait.php:125
+msgid "Nsabait Settings updated."
+msgstr "NSAbait-instellingen bijgewerkt."
+
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+msgid "Enable NSAbait Plugin"
+msgstr "NSAbait inschakelen"
+
+#: ../../extend/addon/addon/nsabait/nsabait.php:161
+msgid "NSAbait Settings"
+msgstr "NSAbait"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:80
+msgid ""
+"This plugin looks in posts for the words/text you specify below, and "
+"collapses any content containing those keywords so it is not displayed at "
+"inappropriate times, such as sexual innuendo that may be improper in a work "
+"setting. It is polite and recommended to tag any content containing nudity "
+"with #NSFW. This filter can also match any other word/text you specify, and"
+" can thereby be used as a general purpose content filter."
+msgstr "Deze plug-in controleert berichten op woorden die je hieronder kunt opgeven en klapt berichten in die deze woorden bevatten, zodat die berichten niet worden weergegeven op ongeschikte momenten. Denk hierbij aan berichten met erotische afbeeldingen, die waarschijnlijk niet geschikt zijn binnen (bijvoorbeeld) een werkomgeving. Het is beleefd en het wordt aangeraden om zulke berichten met #NSFW te taggen. Dit filter kan ook gebruikt worden met andere woorden en is dus voor alles inzetbaar."
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+msgid "Enable Content filter"
+msgstr "Inhoudsfilter inschakelen"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:88
+msgid "Comma separated list of keywords to hide"
+msgstr "Door komma's gescheiden lijst met woorden die gefilterd moeten worden."
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:88
+msgid "Use /expression/ to provide regular expressions"
+msgstr "Gebruik /expressie/ voor reguliere expressies"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:92
+msgid "Not Safe For Work Settings"
+msgstr "Not Safe For Work (inhoudsfilter)"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:92
+msgid "General Purpose Content Filter"
+msgstr "Voor alles te gebruiken inhoudsfilter"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:110
+msgid "NSFW Settings saved."
+msgstr "NSFW-instellingen opgeslagen."
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:207
+msgid "Possible adult content"
+msgstr "Mogelijk inhoud voor volwassenen"
+
+#: ../../extend/addon/addon/nsfw/nsfw.php:211
#, php-format
-msgid "Unable to verify site signature for %s"
-msgstr "Hubkenmerk voor %s kon niet worden geverifieerd"
+msgid "%s - click to open/close"
+msgstr "%s - Klik om te openen of te sluiten"
-#: ../../include/zot.php:3713
-msgid "invalid target signature"
-msgstr "ongeldig doelkenmerk"
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:49
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:127
+msgid "System defaults:"
+msgstr "Systeemstandaarden:"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
+msgid "Preferred Clipart IDs"
+msgstr "Voorkeursclipart"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
+msgid "List of preferred clipart ids. These will be shown first."
+msgstr "Lijst met clipartnummers die als eerste moeten worden getoond."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
+msgid "Default Search Term"
+msgstr "Standaard zoekterm"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
+msgid "The default search term. These will be shown second."
+msgstr "Standaard zoekterm. Deze worden als tweede getoond."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
+msgid "Return After"
+msgstr "Ga na afloop naar"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
+msgid "Page to load after image selection."
+msgstr "Pagina die na het kiezen van een afbeelding moet laden."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:57
+#: ../../include/channel.php:965 ../../include/nav.php:93
+msgid "Edit Profile"
+msgstr "Profiel bewerken"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:58
+msgid "Profile List"
+msgstr "Profiellijst"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:60
+msgid "Order of Preferred"
+msgstr "Voorkeursclipart sorteren op"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:60
+msgid "Sort order of preferred clipart ids."
+msgstr "Als eerste getoonde clipart hierop sorteren."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
+msgid "Newest first"
+msgstr "Nieuwste eerst"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:64
+msgid "As entered"
+msgstr "Zoals ingevoerd"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:66
+msgid "Order of other"
+msgstr "Overige clipart sorteren op"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:66
+msgid "Sort order of other clipart ids."
+msgstr "Overige clipart hierop sorteren."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:68
+msgid "Most downloaded first"
+msgstr "Meest gedownload eerst"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:69
+msgid "Most liked first"
+msgstr "Meest geliked eerst"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:71
+msgid "Preferred IDs Message"
+msgstr "Tekst voorkeursclipart"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:71
+msgid "Message to display above preferred results."
+msgstr "Tekst die bovenaan de resultaten met voorkeursclipart moet worden getoond."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:77
+msgid "Uploaded by: "
+msgstr "Geüpload door: "
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:77
+msgid "Drawn by: "
+msgstr "Getekend door: "
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:191
+msgid "Or select from a free OpenClipart.org image:"
+msgstr "Of kies uit een vrije OpenClipart.org-afbeelding:"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:194
+msgid "Search Term"
+msgstr "Zoekterm"
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:216
+msgid "Unknown error. Please try again later."
+msgstr "Onbekende fout. Probeer later nog eens."
+
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:303
+msgid "Profile photo updated successfully."
+msgstr "Bijwerken profielfoto geslaagd."
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:146
+msgid "View Larger"
+msgstr "Groter tonen"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+msgid "Tile Server URL"
+msgstr "URL tile-server"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
+msgid ""
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" "
+"target=\"_blank\">public tile servers</a>"
+msgstr "Een lijst met <a href=\\\"http://wiki.openstreetmap.org/wiki/TMS\\\" target=\\\"_blank\\\">openbare tile-servers</a>"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+msgid "Nominatim (reverse geocoding) Server URL"
+msgstr "Server-URL Nominatim (reverse geocoding)"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+msgid ""
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" "
+"target=\"_blank\">Nominatim servers</a>"
+msgstr "Een lijst met <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">Nominatim-servers</a>"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+msgid "Default zoom"
+msgstr "Standaard zoomniveau"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
+msgid ""
+"The default zoom level. (1:world, 18:highest, also depends on tile server)"
+msgstr "Standaard zoomniveau. Van 1 (wereld) t/m 18 (maximaal). Is ook afhankelijk van tile-server."
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+msgid "Include marker on map"
+msgstr "Markering op kaart plaatsen"
+
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
+msgid "Include a marker on the map."
+msgstr "Plaatst een markering op de kaart."
+
+#: ../../extend/addon/addon/pageheader/pageheader.php:43
+msgid "Message to display on every page on this server"
+msgstr "Bericht om op elke pagina van deze hub weer te geven"
+
+#: ../../extend/addon/addon/pageheader/pageheader.php:48
+msgid "Pageheader Settings"
+msgstr "Pageheader"
+
+#: ../../extend/addon/addon/pageheader/pageheader.php:64
+msgid "pageheader Settings saved."
+msgstr "Pageheader-instellingen opgeslagen."
+
+#: ../../extend/addon/addon/piwik/piwik.php:85
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
+msgstr "Het bezoek aan deze website wordt gemeten door <a href='http://www.piwik.org'>Piwik</a>."
+
+#: ../../extend/addon/addon/piwik/piwik.php:88
+#, 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 "Wanneer je niet wil dat jouw bezoek aan deze website wordt bijgehouden, <a href='%s'>kan je een cookie achterlaten om te verhinderen dat Piwik jou op deze website blijft volgen</a> (opt-out)."
+
+#: ../../extend/addon/addon/piwik/piwik.php:96
+msgid "Piwik Base URL"
+msgstr "Basis-URL Piwik"
+
+#: ../../extend/addon/addon/piwik/piwik.php:96
+msgid ""
+"Absolute path to your Piwik installation. (without protocol (http/s), with "
+"trailing slash)"
+msgstr "Absoluut pad naar jouw Piwik-installatie (zonder protocol (http/s), met een slash op het einde)"
+
+#: ../../extend/addon/addon/piwik/piwik.php:97
+msgid "Site ID"
+msgstr "Site ID"
+
+#: ../../extend/addon/addon/piwik/piwik.php:98
+msgid "Show opt-out cookie link?"
+msgstr "Toon opt-out cookie-link?"
+
+#: ../../extend/addon/addon/piwik/piwik.php:99
+msgid "Asynchronous tracking"
+msgstr "Asynchroon volgen"
+
+#: ../../extend/addon/addon/piwik/piwik.php:100
+msgid "Enable frontend JavaScript error tracking"
+msgstr "Volgen van front-end JavaScript-fouten inschakelen"
+
+#: ../../extend/addon/addon/piwik/piwik.php:100
+msgid "This feature requires Piwik >= 2.2.0"
+msgstr "Deze functie vereist Piwik >= 2.2.0"
+
+#: ../../extend/addon/addon/planets/planets.php:121
+msgid "Planets Settings updated."
+msgstr "Planets-instellingen opgeslagen."
+
+#: ../../extend/addon/addon/planets/planets.php:153
+msgid "Enable Planets Plugin"
+msgstr "Planets inschakelen"
+
+#: ../../extend/addon/addon/planets/planets.php:157
+msgid "Planets Settings"
+msgstr "Planets"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:148
+msgid "You are now authenticated to pumpio."
+msgstr "De verbinding met pump.io is geverifieerd"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:149
+msgid "return to the featured settings page"
+msgstr "Ga terug naar pagina met plugin-instellingen"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:163
+msgid "Post to Pump.io"
+msgstr "Doorplaatsen naar Pump.io"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:198
+msgid "Pump.io servername"
+msgstr "Pump.io-servernaam"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:198
+msgid "Without \"http://\" or \"https://\""
+msgstr "Zonder \"http://\" of \"https://\""
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:202
+msgid "Pump.io username"
+msgstr "Gebruikersnaam Pump.io"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:202
+msgid "Without the servername"
+msgstr "Zonder servernaam"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:213
+msgid "You are not authenticated to pumpio"
+msgstr "De verbinding met pump.io is niet geverifieerd"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:215
+msgid "(Re-)Authenticate your pump.io connection"
+msgstr "Verifieer (opnieuw) jouw pump.io-verbinding"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+msgid "Enable pump.io Post Plugin"
+msgstr "Doorplaatsen naar Pump.io inschakelen"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+msgid "Post to pump.io by default"
+msgstr "Standaard doorplaatsen naar Pump.io"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+msgid "Should posts be public"
+msgstr "Moeten berichten openbaar zijn"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+msgid "Mirror all public posts"
+msgstr "Alle openbare berichten doorplaatsen"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:237
+msgid "Pump.io Post Settings"
+msgstr "Doorplaatsen naar Pump.io"
+
+#: ../../extend/addon/addon/pumpio/pumpio.php:266
+msgid "PumpIO Settings saved."
+msgstr "Pump.io-instellingen opgeslagen."
+
+#: ../../extend/addon/addon/qrator/qrator.php:48
+msgid "QR code"
+msgstr "QR-code"
+
+#: ../../extend/addon/addon/qrator/qrator.php:63
+msgid "QR Generator"
+msgstr "QR-code-generator"
+
+#: ../../extend/addon/addon/qrator/qrator.php:64
+msgid "Enter some text"
+msgstr "Vul wat tekst in"
+
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+msgid "Enable Rainbowtag"
+msgstr "Rainbowtag inschakelen"
+
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
+msgid "Rainbowtag Settings"
+msgstr "Rainbowtag"
+
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:101
+msgid "Rainbowtag Settings saved."
+msgstr "Rainbowtag-instellingen opgeslagen."
+
+#: ../../extend/addon/addon/randpost/randpost.php:97
+msgid "You're welcome."
+msgstr "Je bent van harte welkom."
+
+#: ../../extend/addon/addon/randpost/randpost.php:98
+msgid "Ah shucks..."
+msgstr "Hé verdorie..."
+
+#: ../../extend/addon/addon/randpost/randpost.php:99
+msgid "Don't mention it."
+msgstr "Graag gedaan."
+
+#: ../../extend/addon/addon/randpost/randpost.php:100
+msgid "&lt;blush&gt;"
+msgstr "<bloos>"
+
+#: ../../extend/addon/addon/redfiles/redfiles.php:119
+msgid "Redmatrix File Storage Import"
+msgstr "Importeer bestanden vanuit Redmatrix"
+
+#: ../../extend/addon/addon/redfiles/redfiles.php:120
+msgid "This will import all your Redmatrix cloud files to this channel."
+msgstr "Hiermee importeer je al jouw Redmatrix-bestanden in dit kanaal."
+
+#: ../../extend/addon/addon/redfiles/redfiles.php:121
+#: ../../extend/addon/addon/redphotos/redphotos.php:131
+msgid "Redmatrix Server base URL"
+msgstr "Basis-URL van Redmatrix-hub"
+
+#: ../../extend/addon/addon/redfiles/redfiles.php:122
+#: ../../extend/addon/addon/redphotos/redphotos.php:132
+msgid "Redmatrix Login Username"
+msgstr "Gebruikersnaam Redmatrix"
+
+#: ../../extend/addon/addon/redfiles/redfiles.php:123
+#: ../../extend/addon/addon/redphotos/redphotos.php:133
+msgid "Redmatrix Login Password"
+msgstr "Wachtwoord Redmatrix"
+
+#: ../../extend/addon/addon/redfiles/redfilehelper.php:67
+msgid "file"
+msgstr "bestand"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:106
+msgid "Photos imported"
+msgstr "Foto's geïmporteerd"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:129
+msgid "Redmatrix Photo Album Import"
+msgstr "Fotoalbums importeren vanuit Redmatrix"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:130
+msgid "This will import all your Redmatrix photo albums to this channel."
+msgstr "Hiermee importeer je al jouw Redmatrix-fotoalbums in dit Hubzilla-kanaal."
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:134
+msgid "Import just this album"
+msgstr "Alleen dit album importeren"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:134
+msgid "Leave blank to import all albums"
+msgstr "Laat leeg om alle albums te importeren"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:135
+msgid "Maximum count to import"
+msgstr "Maximaal aantal om te importeren"
+
+#: ../../extend/addon/addon/redphotos/redphotos.php:135
+msgid "0 or blank to import all available"
+msgstr "0 of leeg om alles te importeren"
+
+#: ../../extend/addon/addon/redred/redred.php:45
+msgid "Post to Red"
+msgstr "Doorplaatsen naar Hubzilla"
+
+#: ../../extend/addon/addon/redred/redred.php:60
+msgid "Channel is required."
+msgstr "Een kanaal is vereist."
+
+#: ../../extend/addon/addon/redred/redred.php:65
+msgid "Invalid channel."
+msgstr "Onbekend kanaal."
+
+#: ../../extend/addon/addon/redred/redred.php:76
+msgid "redred Settings saved."
+msgstr "RedRed-instellingen opgeslagen."
+
+#: ../../extend/addon/addon/redred/redred.php:95
+msgid "Allow posting to another Hubzilla Channel"
+msgstr "Doorplaatsen naar een ander Hubzilla-kanaal toestaan"
+
+#: ../../extend/addon/addon/redred/redred.php:99
+msgid "Send public postings to Hubzilla channel by default"
+msgstr "Standaard doorplaatsen naar een ander Hubzilla-kanaal toestaan"
+
+#: ../../extend/addon/addon/redred/redred.php:103
+msgid "Hubzilla API Path"
+msgstr "API-pad Hubzilla"
+
+#: ../../extend/addon/addon/redred/redred.php:103
+#: ../../extend/addon/addon/rtof/rtof.php:89
+msgid "https://{sitename}/api"
+msgstr "https://{hubnaam}/api"
+
+#: ../../extend/addon/addon/redred/redred.php:107
+msgid "Hubzilla login name"
+msgstr "Gebruikersnaam Hubzilla"
+
+#: ../../extend/addon/addon/redred/redred.php:111
+msgid "Hubzilla channel name"
+msgstr "Kanaalnaam Hubzilla"
+
+#: ../../extend/addon/addon/redred/redred.php:111
+#: ../../extend/addon/addon/openid/MysqlProvider.php:54
+msgid "Nickname"
+msgstr "Bijnaam"
+
+#: ../../extend/addon/addon/redred/redred.php:119
+msgid "Hubzilla Crosspost Settings"
+msgstr "Doorplaatsen naar Hubzilla"
+
+#: ../../extend/addon/addon/rtof/rtof.php:45
+msgid "Post to Friendica"
+msgstr "Doorplaatsen naar Friendica"
+
+#: ../../extend/addon/addon/rtof/rtof.php:62
+msgid "rtof Settings saved."
+msgstr "RTOF-instellingen opgeslagen."
+
+#: ../../extend/addon/addon/rtof/rtof.php:81
+msgid "Allow posting to Friendica"
+msgstr "Doorplaatsen naar Friendica toestaan"
+
+#: ../../extend/addon/addon/rtof/rtof.php:85
+msgid "Send public postings to Friendica by default"
+msgstr "Standaard doorplaatsen naar Friendica"
+
+#: ../../extend/addon/addon/rtof/rtof.php:89
+msgid "Friendica API Path"
+msgstr "API-pad Friendica"
+
+#: ../../extend/addon/addon/rtof/rtof.php:93
+msgid "Friendica login name"
+msgstr "Gebruikersnaam Friendica"
+
+#: ../../extend/addon/addon/rtof/rtof.php:97
+msgid "Friendica password"
+msgstr "Wachtwoord Friendica"
+
+#: ../../extend/addon/addon/rtof/rtof.php:101
+msgid "Hubzilla to Friendica Post Settings"
+msgstr "Doorplaatsen naar Friendica"
+
+#: ../../extend/addon/addon/sendzid/sendzid.php:25
+msgid "Extended Identity Sharing"
+msgstr "Uitgebreid identiteit delen"
+
+#: ../../extend/addon/addon/sendzid/sendzid.php:26
+msgid ""
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Deel jouw Hubzilla-identiteit met alle websites op het internet. Wanneer dit is uitgeschakeld wordt je identiteit alleen binnen het Hubzilla-netwerk gedeeld. Schakel dit alleen in als je weet wat je doet."
+
+#: ../../extend/addon/addon/skeleton/skeleton.php:59
+msgid "Some setting"
+msgstr "Een of andere instelling"
+
+#: ../../extend/addon/addon/skeleton/skeleton.php:61
+msgid "A setting"
+msgstr "Een instelling"
+
+#: ../../extend/addon/addon/skeleton/skeleton.php:64
+msgid "Skeleton Settings"
+msgstr "Plugin-skeleton"
+
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+msgid "Deactivate the feature"
+msgstr "Deze functie uitschakelen"
+
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+msgid "Hide the button and show the smilies directly."
+msgstr "Verberg de knop en toon de smilies direct."
+
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
+msgid "Smileybutton Settings"
+msgstr "Smileyknop"
+
+#: ../../extend/addon/addon/startpage/startpage.php:109
+msgid "Page to load after login"
+msgstr "Pagina die na het inloggen getoond moet worden"
+
+#: ../../extend/addon/addon/startpage/startpage.php:109
+msgid ""
+"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
+"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
+"blank for default network page (grid)."
+msgstr "Voorbeelden: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacygroep), &quot;channel&quot; of &quot;notifications/system&quot; (laat leeg voor de standaard netwerkpagina (grid)."
+
+#: ../../extend/addon/addon/startpage/startpage.php:113
+msgid "Startpage Settings"
+msgstr "Startpagina"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:143
+msgid "Post to GNU social"
+msgstr "Doorplaatsen naar GNU social"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:195
+msgid ""
+"Please contact your site administrator.<br />The provided API URL is not "
+"valid."
+msgstr "De verstrekte API-URL is ongeldig.<br />Neem contact op met jouw hubbeheerder."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:232
+msgid "We could not contact the GNU social API with the Path you entered."
+msgstr "Wij konden de GNU social-API niet bereiken door middel van het ingevulde pad."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:266
+msgid "GNU social settings updated."
+msgstr "GNU social-instellingen bijgewerkt."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:310
+msgid "Globally Available GNU social OAuthKeys"
+msgstr "Op de gehele hub te gebruiken GNU social OAuthkeys."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:312
+msgid ""
+"There are preconfigured OAuth key pairs for some GNU social servers "
+"available. If you are using one of them, please use these credentials.<br "
+"/>If not feel free to connect to any other GNU social instance (see below)."
+msgstr "Er zijn op deze hub enkele voorgeconfigureerde OAuthkey-paren voor GNU social servers beschikbaar. Wanneer je een van deze servers gebruikt, gebruik dan deze voorgeconfigureerde gegevens.<br />Wanneer dit niet het geval is, maak dan gerust met een andere GNU social-server verbinding (zie hieronder)."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:327
+msgid "Provide your own OAuth Credentials"
+msgstr "Verstrek jouw eigen OAuth-gegevens"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:329
+msgid ""
+"No consumer key pair for GNU social found. Register your Hubzilla Account as"
+" an desktop client on your GNU social 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 "
+"Hubzilla installation at your favourite GNU social installation."
+msgstr "Geen consumerkey voor GNU social gevonden. Registreer jouw Hubzilla-account als een desktopclient in jouw GNU-social-account, kopieer en plak hier de consumerkey en de consumersecret, en vul de API-base-root in.<br />Voordat je jouw eigen OAuthkey-paar registreert, vraag dan eerst aan jouw hubbeheerder of er al een key-paar voor deze hub op jouw favoriete GNU social-server bestaat."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:333
+msgid "OAuth Consumer Key"
+msgstr "OAuth-consumerkey"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:337
+msgid "OAuth Consumer Secret"
+msgstr "Oauth-consumersecret"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:341
+msgid "Base API Path"
+msgstr "Basispad API"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:341
+msgid "Remember the trailing /"
+msgstr "Vergeet niet de afsluitende /"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:345
+msgid "GNU social application name"
+msgstr "Naam GNU social-applicatie"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:368
+msgid ""
+"To connect to your GNU social account click the button below to get a "
+"security code from GNU social which you have to copy into the input box "
+"below and submit the form. Only your <strong>public</strong> posts will be "
+"posted to GNU social."
+msgstr "Om jouw GNU social-account te koppelen klik je op de knop hieronder. Je krijgt dan een veiligheidscode van GNU social die je kan kopiëren en dan hieronder in het invulveld kan plakken. Vervolgens klik je op Opslaan. Alleen jouw <strong>openbare</strong> berichten kunnen worden doorgeplaatst naar GNU social."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:370
+msgid "Log in with GNU social"
+msgstr "Inloggen op "
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:373
+msgid "Copy the security code from GNU social here"
+msgstr "Plak de veiligheidscode van GNU social hier"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:383
+msgid "Cancel Connection Process"
+msgstr "Annuleer het verbindingsproces"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:385
+msgid "Current GNU social API is"
+msgstr "Huidige GNU social-API is"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+msgid "Cancel GNU social Connection"
+msgstr "Annuleer de GNU social-verbinding"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:401
+#: ../../extend/addon/addon/twitter/twitter.php:232
+msgid "Currently connected to: "
+msgstr "Momenteel gekoppeld aan: "
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:406
+msgid ""
+"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to GNU social will lead the visitor to a blank page "
+"informing the visitor that the access to your profile has been restricted."
+msgstr "<strong>Opmerking</strong>: In verband met jouw privacyinstellingen (<em>wanneer jouw kanaalprofiel voor onbekenden is verborgen</em>) leidt de profiellink die mogelijk in jouw naar GNU social doorgestuurde openbare berichten staat, naar een lege pagina met de melding dat toegang tot jouw kanaalprofiel is beperkt."
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+msgid "Allow posting to GNU social"
+msgstr "Doorplaatsen naar GNU social toestaan"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+msgid ""
+"If enabled your public postings can be posted to the associated GNU-social "
+"account"
+msgstr "Wanneer dit is ingeschakeld kunnen jouw openbare berichten naar het gekoppelde Twitter-account worden doorgeplaatst"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+msgid "Post to GNU social by default"
+msgstr "Standaard doorplaatsen naar GNU social"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+msgid ""
+"If enabled your public postings will be posted to the associated GNU-social "
+"account by default"
+msgstr "Wanneer dit is ingeschakeld worden al jouw openbare berichten standaard naar het gekoppelde GNU social-account doorgeplaatst"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:255
+msgid "Clear OAuth configuration"
+msgstr "OAuth-configuratie wissen"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:432
+msgid "GNU social Post Settings"
+msgstr "Doorplaatsen naar GNU social"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:891
+msgid "API URL"
+msgstr "API-URL"
+
+#: ../../extend/addon/addon/statusnet/statusnet.php:894
+msgid "Application name"
+msgstr "Naam applicatie"
+
+#: ../../extend/addon/addon/superblock/superblock.php:110
+msgid "Currently blocked"
+msgstr "Momenteel geblokkeerd"
+
+#: ../../extend/addon/addon/superblock/superblock.php:112
+msgid "No channels currently blocked"
+msgstr "Momenteel geen kanalen geblokkeerd"
+
+#: ../../extend/addon/addon/superblock/superblock.php:118
+msgid "\"Superblock\" Settings"
+msgstr "Superblock"
+
+#: ../../extend/addon/addon/superblock/superblock.php:316
+msgid "Block Completely"
+msgstr "Volledig blokkeren"
+
+#: ../../extend/addon/addon/superblock/superblock.php:361
+msgid "superblock settings updated"
+msgstr "Superblock-instellingen bijgewerkt"
+
+#: ../../extend/addon/addon/testdrive/testdrive.php:104
+#, php-format
+msgid "Your account on %s will expire in a few days."
+msgstr "Jouw account op %s verloopt over een paar dagen. "
+
+#: ../../extend/addon/addon/testdrive/testdrive.php:105
+msgid "Your $Productname test account is about to expire."
+msgstr "Jouw $Productname-testaccount staat op het punt om te verlopen."
+
+#: ../../extend/addon/addon/tictac/tictac.php:21
+msgid "Three Dimensional Tic-Tac-Toe"
+msgstr "Driedimensionaal Boter-kaas-en-eieren"
+
+#: ../../extend/addon/addon/tictac/tictac.php:54
+msgid "3D Tic-Tac-Toe"
+msgstr "Boter-kaas-en-eieren in 3D"
+
+#: ../../extend/addon/addon/tictac/tictac.php:59
+msgid "New game"
+msgstr "Nieuw spel"
+
+#: ../../extend/addon/addon/tictac/tictac.php:60
+msgid "New game with handicap"
+msgstr "Nieuw spel met handicap"
+
+#: ../../extend/addon/addon/tictac/tictac.php:61
+msgid ""
+"Three dimensional tic-tac-toe is just like the traditional game except that "
+"it is played on multiple levels simultaneously. "
+msgstr "Driedimensionaal Boter-kaas-en-eieren is hetzelfde als het klassieke spel, behalve dat het gelijktijdig op meerdere hoogtes wordt gespeeld."
+
+#: ../../extend/addon/addon/tictac/tictac.php:62
+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 dit geval zijn er drie hoogtes. Je wint wanneer je drie op een rij hebt op een van de drie hoogtes, van boven naar beneden of diagonaal."
+
+#: ../../extend/addon/addon/tictac/tictac.php:64
+msgid ""
+"The handicap game disables the center position on the middle level because "
+"the player claiming this square often has an unfair advantage."
+msgstr "Het spel met een handicap schakelt de middelste positie op de middelste hoogte uit, omdat de speler die deze positie krijgt vaak een oneerlijk voordeel geniet."
+
+#: ../../extend/addon/addon/tictac/tictac.php:183
+msgid "You go first..."
+msgstr "Jij bent eerst..."
+
+#: ../../extend/addon/addon/tictac/tictac.php:188
+msgid "I'm going first this time..."
+msgstr "Ik ga deze keer eerst..."
+
+#: ../../extend/addon/addon/tictac/tictac.php:194
+msgid "You won!"
+msgstr "Jij wint!"
+
+#: ../../extend/addon/addon/tictac/tictac.php:200
+#: ../../extend/addon/addon/tictac/tictac.php:225
+msgid "\"Cat\" game!"
+msgstr "Gelijkspel!"
+
+#: ../../extend/addon/addon/tictac/tictac.php:223
+msgid "I won!"
+msgstr "Ik win!"
+
+#: ../../extend/addon/addon/tour/tour.php:75
+msgid "Edit your profile and change settings."
+msgstr "Jouw profiel bewerken en instellingen veranderen."
+
+#: ../../extend/addon/addon/tour/tour.php:76
+msgid "Click here to see activity from your connections."
+msgstr "Klik hier voor een tijdlijn met berichten en overige activiteiten van jouw connecties."
+
+#: ../../extend/addon/addon/tour/tour.php:77
+msgid "Click here to see your channel home."
+msgstr "Klik hier voor de tijdlijn van jouw eigen kanaal."
+
+#: ../../extend/addon/addon/tour/tour.php:78
+msgid "You can access your private messages from here."
+msgstr "Hiermee krijg je toegang tot jouw privéberichten."
+
+#: ../../extend/addon/addon/tour/tour.php:79
+msgid "Create new events here."
+msgstr "Nieuwe gebeurtenissen kan je hier aanmaken."
+
+#: ../../extend/addon/addon/tour/tour.php:80
+msgid ""
+"You can accept new connections and change permissions for existing ones "
+"here. You can also e.g. create groups of contacts."
+msgstr "Hier kan je nieuwe connecties accepteren en instellingen van bestaande connecties wijzigen. Je kan hier bijv. ook privacygroepen aanmaken."
+
+#: ../../extend/addon/addon/tour/tour.php:81
+msgid "System notifications will arrive here"
+msgstr "Systeemnotificaties komen hier tevoorschijn"
+
+#: ../../extend/addon/addon/tour/tour.php:82
+msgid "Search for content and users"
+msgstr "Zoek hier naar tekst in berichten of naar andere kanalen."
+
+#: ../../extend/addon/addon/tour/tour.php:83
+msgid "Browse for new contacts"
+msgstr "Blader hier in een gids met kanalen, die je toe kan voegen als connectie."
+
+#: ../../extend/addon/addon/tour/tour.php:84
+msgid "Launch installed apps"
+msgstr "Open (op deze hub) geïnstalleerde apps."
+
+#: ../../extend/addon/addon/tour/tour.php:85
+msgid "Looking for help? Click here."
+msgstr "Zoek je hulp? Klik dan hier."
+
+#: ../../extend/addon/addon/tour/tour.php:86
+msgid ""
+"New events have occurred in your network. Click here to see what has "
+"happened!"
+msgstr "Er is iets nieuws gebeurd in jouw netwerk. Klik hier om te zien wat precies."
+
+#: ../../extend/addon/addon/tour/tour.php:87
+msgid "You have received a new private message. Click here to see from who!"
+msgstr "Je hebt een nieuw privébericht ontvangen. Klik hier om te zien van wie."
+
+#: ../../extend/addon/addon/tour/tour.php:88
+msgid "There are events this week. Click here too see which!"
+msgstr "Er vinden deze week gebeurtenissen plaats. Klik hier om te zien welke dit zijn."
+
+#: ../../extend/addon/addon/tour/tour.php:89
+msgid "You have received a new introduction. Click here to see who!"
+msgstr "Je hebt een nieuw connectieverzoek ontvangen. Klik hier om te kijken van wie."
+
+#: ../../extend/addon/addon/tour/tour.php:90
+msgid ""
+"There is a new system notification. Click here to see what has happened!"
+msgstr "Er is een nieuwe systeemnotificatie. Klik hier om te zien wat er aan de hand is."
+
+#: ../../extend/addon/addon/tour/tour.php:93
+msgid "Click here to share text, images, videos and sound."
+msgstr "Klik hier om tekst, afbeeldingen, video en audio te delen."
+
+#: ../../extend/addon/addon/tour/tour.php:94
+msgid "You can write an optional title for your update (good for long posts)."
+msgstr "Je kan optioneel een titel voor je nieuwe bericht verzinnen. Vooral goed voor langere berichten."
+
+#: ../../extend/addon/addon/tour/tour.php:95
+msgid "Entering some categories here makes it easier to find your post later."
+msgstr "Het invullen van enkele categorieën, maakt het later terugvinden van je berichten gemakkelijker. Dit is niet verplicht."
+
+#: ../../extend/addon/addon/tour/tour.php:96
+msgid "Share photos, links, location, etc."
+msgstr "Deel foto's, links, locaties, enz."
+
+#: ../../extend/addon/addon/tour/tour.php:97
+msgid ""
+"Only want to share content for a while? Make it expire at a certain date."
+msgstr "Wil je alleen iets tot een bepaald moment delen? Dan kan je het hiermee op een bepaalde datum en tijd laten verlopen."
+
+#: ../../extend/addon/addon/tour/tour.php:98
+msgid "You can password protect content."
+msgstr "Je kan met een wachtwoord gegevens beveiligen."
+
+#: ../../extend/addon/addon/tour/tour.php:99
+msgid "Choose who you share with."
+msgstr "Kies met wie je dit wil delen. "
+
+#: ../../extend/addon/addon/tour/tour.php:101
+msgid "Click here when you are done."
+msgstr "Klik hier wanneer je klaar bent."
+
+#: ../../extend/addon/addon/tour/tour.php:104
+msgid "Adjust from which channels posts should be displayed."
+msgstr "Aanpassen van welke kanalen berichten moeten worden getoond. "
+
+#: ../../extend/addon/addon/tour/tour.php:105
+msgid "Only show posts from channels in the specified privacy group."
+msgstr "Toon alleen berichten van kanalen in de hier gekozen privacygroep."
+
+#: ../../extend/addon/addon/tour/tour.php:109
+msgid "Easily find posts containing tags (keywords preceded by the \"#\" symbol)."
+msgstr "Vind gemakkelijk berichten met tags (trefwoorden die beginnen met een \"#\")."
+
+#: ../../extend/addon/addon/tour/tour.php:110
+msgid "Easily find posts in given category."
+msgstr "Vind gemakkelijk berichten in een bepaalde categorie."
+
+#: ../../extend/addon/addon/tour/tour.php:111
+msgid "Easily find posts by date."
+msgstr "Vind gemakkelijk berichten op datum."
+
+#: ../../extend/addon/addon/tour/tour.php:112
+msgid ""
+"Suggested users who have volounteered to be shown as suggestions, and who we"
+" think you might find interesting."
+msgstr "Voorstellen voor kanalen die wellicht interessant voor jou zijn en hier ook vrijwillig voor hebben gekozen."
+
+#: ../../extend/addon/addon/tour/tour.php:113
+msgid "Here you see channels you have connected to."
+msgstr "Hier kan je zien met welke kanalen je bent verbonden (connecties)."
+
+#: ../../extend/addon/addon/tour/tour.php:114
+msgid "Save your search so you can repeat it at a later date."
+msgstr "Sla jouw zoekopdracht op, zodat je het later opnieuw kan gebruiken."
+
+#: ../../extend/addon/addon/tour/tour.php:117
+msgid ""
+"If you see this icon you can be sure that the sender is who it say it is. It"
+" is normal that it is not always possible to verify the sender, so the icon "
+"will be missing sometimes. There is usually no need to worry about that."
+msgstr "Wanneer je dit pictogram ziet, kan je er van uitgaan dat de afzender is wie hij/zij beweert te zijn. Het is niet altijd mogelijk om de afzender te verifiëren, waardoor het pictogram soms ontbreekt. Dit is meestal geen reden voor ongerustheid."
+
+#: ../../extend/addon/addon/tour/tour.php:118
+msgid ""
+"Danger! It seems someone tried to forge a message! This message is not "
+"necessarily from who it says it is from!"
+msgstr "Gevaar! Het lijkt er op dat iemand een bericht heeft proberen te vervalsen! Dit bericht is mogelijk niet afkomstig van de vermelde afzender!"
+
+#: ../../extend/addon/addon/tour/tour.php:125
+msgid ""
+"Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can "
+"pause it at any time and continue where you left off by reloading the page, "
+"or navigting to another page.</p><p>You can also advance by pressing the "
+"return key"
+msgstr "Welkom op Hubzilla! Wil jij een rondleiding hebben langs de gebruikersinterface?</p> <p>Je kan dit op elk moment pauzeren en weer hervatten door de pagina te herladen of naar een andere pagina te gaan.</p><p>Je kan ook vooruitgaan met behulp van de entertoets."
+
+#: ../../extend/addon/addon/twitter/twitter.php:99
+msgid "Post to Twitter"
+msgstr "Doorplaatsen naar Twitter"
+
+#: ../../extend/addon/addon/twitter/twitter.php:154
+msgid "Twitter settings updated."
+msgstr "Twitter-instellingen bijgewerkt."
+
+#: ../../extend/addon/addon/twitter/twitter.php:183
+msgid ""
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
+msgstr "Geen consumerkeys voor Twitter gevonden. Neem contact op met jouw hubbeheerder."
+
+#: ../../extend/addon/addon/twitter/twitter.php:205
+msgid ""
+"At this Hubzilla 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 "De Twitter-plugin is op deze Hubzilla-hub ingeschakeld, maar je hebt nog niet jouw Hubzilla-kanaal met jouw Twitter-account gekoppeld. Om dit te doen klik je op de knop hieronder om een PIN-code van Twitter te krijgen. Deze dien je te kopiëren en in het invoegveld beneden te plakken. Vervolgens klik je op Opslaan. Alleen jouw <strong>openbare</strong> berichten kunnen op Twitter worden geplaatst."
+
+#: ../../extend/addon/addon/twitter/twitter.php:207
+msgid "Log in with Twitter"
+msgstr "Op Twitter inloggen"
+
+#: ../../extend/addon/addon/twitter/twitter.php:210
+msgid "Copy the PIN from Twitter here"
+msgstr "Plak of type de PIN-code hier"
+
+#: ../../extend/addon/addon/twitter/twitter.php:237
+msgid ""
+"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to Twitter will lead the visitor to a blank page informing "
+"the visitor that the access to your profile has been restricted."
+msgstr "<strong>Opmerking</strong>: In verband met jouw privacyinstellingen (<em>wanneer jouw kanaalprofiel voor onbekenden is verborgen</em>) leidt de profiellink die mogelijk in jouw naar Twitter doorgestuurde openbare berichten staat, naar een lege pagina met de melding dat toegang tot jouw kanaalprofiel is beperkt."
+
+#: ../../extend/addon/addon/twitter/twitter.php:242
+msgid "Allow posting to Twitter"
+msgstr "Doorplaatsen naar Twitter toestaan"
+
+#: ../../extend/addon/addon/twitter/twitter.php:242
+msgid ""
+"If enabled your public postings can be posted to the associated Twitter "
+"account"
+msgstr "Wanneer dit is ingeschakeld kunnen jouw <strong>openbare</strong> berichten naar het gekoppelde Twitter-account worden doorgeplaatst"
+
+#: ../../extend/addon/addon/twitter/twitter.php:246
+msgid "Send public postings to Twitter by default"
+msgstr "Standaard doorplaatsen naar Twitter"
+
+#: ../../extend/addon/addon/twitter/twitter.php:246
+msgid ""
+"If enabled your public postings will be posted to the associated Twitter "
+"account by default"
+msgstr "Wanneer dit is ingeschakeld worden al jouw <strong>openbare</strong> berichten standaard naar het gekoppelde Twitter-account doorgeplaatst"
+
+#: ../../extend/addon/addon/twitter/twitter.php:264
+msgid "Twitter Post Settings"
+msgstr "Doorplaatsen naar Twitter"
+
+#: ../../extend/addon/addon/twitter/twitter.php:773
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:95
+msgid "Submit Settings"
+msgstr "Instellingen toepassen"
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:25
+msgid "Show Upload Limits"
+msgstr "Uploadlimieten tonen"
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:27
+msgid "Hubzilla configured maximum size: "
+msgstr "Op Hubzilla configureerde maximale grootte: "
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:28
+msgid "PHP upload_max_filesize: "
+msgstr "PHP upload_max_filesize: "
+
+#: ../../extend/addon/addon/upload_limits/upload_limits.php:29
+msgid "PHP post_max_size (must be larger than upload_max_filesize): "
+msgstr "PHP post_max_size (moet hoger zijn dan upload_max_filesize): "
+
+#: ../../extend/addon/addon/visage/visage.php:93
+msgid "Recent Channel/Profile Viewers"
+msgstr "Recente bezoekers van jouw kanaal/profiel"
+
+#: ../../extend/addon/addon/visage/visage.php:98
+msgid "This plugin/addon has not been configured."
+msgstr "Deze plugin is niet geconfigureerd. "
+
+#: ../../extend/addon/addon/visage/visage.php:99
+#, php-format
+msgid "Please visit the Visage settings on %s"
+msgstr "Bezoek de Visage-instellingen op %s"
+
+#: ../../extend/addon/addon/visage/visage.php:99
+msgid "your feature settings page"
+msgstr "Jouw plugin-instellingen"
+
+#: ../../extend/addon/addon/visage/visage.php:112
+msgid "No entries."
+msgstr "Niets aanwezig."
+
+#: ../../extend/addon/addon/visage/visage.php:166
+msgid "Enable Visage Visitor Logging"
+msgstr "Visage inschakelen "
+
+#: ../../extend/addon/addon/visage/visage.php:170
+msgid "Visage Settings"
+msgstr "Visage"
+
+#: ../../extend/addon/addon/wholikesme/wholikesme.php:29
+msgid "Who likes me?"
+msgstr "Wie vindt mij leuk?"
+
+#: ../../extend/addon/addon/wppost/wppost.php:45
+msgid "Post to WordPress"
+msgstr "Doorplaatsen naar WordPress"
+
+#: ../../extend/addon/addon/wppost/wppost.php:82
+msgid "Enable WordPress Post Plugin"
+msgstr "Doorplaatsen naar WordPress inschakelen"
+
+#: ../../extend/addon/addon/wppost/wppost.php:86
+msgid "WordPress username"
+msgstr "Gebruikersnaam WordPress"
+
+#: ../../extend/addon/addon/wppost/wppost.php:90
+msgid "WordPress password"
+msgstr "Wachtwoord WordPress"
+
+#: ../../extend/addon/addon/wppost/wppost.php:94
+msgid "WordPress API URL"
+msgstr "API-URL WordPress"
+
+#: ../../extend/addon/addon/wppost/wppost.php:95
+msgid "Typically https://your-blog.tld/xmlrpc.php"
+msgstr "Meestal https://jouw-blog.tld/xmlrpc.php"
+
+#: ../../extend/addon/addon/wppost/wppost.php:98
+msgid "WordPress blogid"
+msgstr "Blog ID WordPress"
+
+#: ../../extend/addon/addon/wppost/wppost.php:99
+msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
+msgstr "Voor websites met meerdere gebruikers, zoals wordpress.com. Anders leeg laten."
+
+#: ../../extend/addon/addon/wppost/wppost.php:105
+msgid "Post to WordPress by default"
+msgstr "Standaard naar WordPress doorplaatsen"
+
+#: ../../extend/addon/addon/wppost/wppost.php:109
+msgid "Forward comments (requires hubzilla_wp plugin)"
+msgstr "Reacties doorplaatsen (Hubzilla_WP-plugin vereist)"
+
+#: ../../extend/addon/addon/wppost/wppost.php:113
+msgid "WordPress Post Settings"
+msgstr "Doorplaatsen naar WordPress"
+
+#: ../../extend/addon/addon/wppost/wppost.php:129
+msgid "Wordpress Settings saved."
+msgstr "WordPress-instellingen opgeslagen."
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:31
+msgid "XMPP settings updated."
+msgstr "XMPP-instellingen bijgewerkt."
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+msgid "Enable Chat"
+msgstr "Chatten inschakelen"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:58
+msgid "Individual credentials"
+msgstr "Individuele credentials"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:64
+msgid "Jabber BOSH server"
+msgstr "BOSH-server van Jabber"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:69
+msgid "XMPP Settings"
+msgstr "XMPP"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:92
+msgid "Jabber BOSH host"
+msgstr "BOSH-host van Jabber"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:93
+msgid "Use central userbase"
+msgstr "Gebruik een centrale gebruikersgroep"
+
+#: ../../extend/addon/addon/xmpp/xmpp.php:93
+msgid ""
+"If enabled, members will automatically login to an ejabberd server that has "
+"to be installed on this machine with synchronized credentials via the "
+"\"auth_ejabberd.php\" script."
+msgstr "Wanneer ingeschakeld worden leden automatisch op een Ejabberd-server ingelogd. Deze dient wel op deze machine te zijn geïnstalleerd met zgn. 'synchronized credentials' via het 'auth_ejabberd.php'-script."
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:37
+msgid "Select Channel"
+msgstr "Kies een kanaal"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:42
+msgid "Read-write"
+msgstr "Lees- en schrijfrechten"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:43
+msgid "Read-only"
+msgstr "Alleen leesrechten"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:116
+msgid "My Calendars"
+msgstr "Mijn agenda's"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:118
+msgid "Shared Calendars"
+msgstr "Gedeelde agenda's"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:122
+msgid "Share this calendar"
+msgstr "Agenda delen"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:124
+msgid "Calendar name and color"
+msgstr "Naam en kleur agenda"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:126
+msgid "Create new calendar"
+msgstr "Nieuwe agenda aanmaken"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:128
+msgid "Calendar Name"
+msgstr "Naam agenda"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:129
+msgid "Calendar Tools"
+msgstr "Agenda-hulpmiddelen"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:130
+msgid "Import calendar"
+msgstr "Importeren"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:131
+msgid "Select a calendar to import to"
+msgstr "Kies een agenda om te importeren"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:158
+msgid "Addressbooks"
+msgstr "Adresboeken"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:160
+msgid "Addressbook name"
+msgstr "Naam adresboek"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:162
+msgid "Create new addressbook"
+msgstr "Nieuw adresboek aanmaken"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:163
+msgid "Addressbook Name"
+msgstr "Naam adresboek"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:165
+msgid "Addressbook Tools"
+msgstr "Adresboek-hulpmiddelen"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:166
+msgid "Import addressbook"
+msgstr "Importeren"
+
+#: ../../extend/addon/addon/cdav/include/widgets.php:167
+msgid "Select an addressbook to import to"
+msgstr "Kies een adresboek om te importeren"
+
+#: ../../extend/addon/addon/cdav/cdav.php:36
+msgid "Errors encountered creating database table: "
+msgstr "Fouten opgetreden tijdens aanmaken databasetabel: "
+
+#: ../../extend/addon/addon/cdav/cdav.php:197
+msgid "Default Calendar"
+msgstr "Standaard agenda"
+
+#: ../../extend/addon/addon/cdav/cdav.php:206
+msgid "Default Addressbook"
+msgstr "Standaard adresboek"
+
+#: ../../extend/addon/addon/cdav/cdav.php:215
+msgid "CalDAV/CardDAV Settings saved."
+msgstr "CalDAV/CardDAV-instellingen opgeslagen."
+
+#: ../../extend/addon/addon/cdav/cdav.php:234
+msgid "Enable CalDAV/CardDAV Server for this channel"
+msgstr "CalDAV/CardDAV-server voor dit kanaal inschakelen"
+
+#: ../../extend/addon/addon/cdav/cdav.php:237
+#, php-format
+msgid "Your CalDAV resources are located at %s "
+msgstr "Jouw CalDAV-URL is %s "
+
+#: ../../extend/addon/addon/cdav/cdav.php:240
+#, php-format
+msgid "Your CardDAV resources are located at %s "
+msgstr "Jouw CardDAV-URL is %s "
+
+#: ../../extend/addon/addon/cdav/cdav.php:246
+msgid "CalDAV/CardDAV Settings"
+msgstr "CalDAV/CardDAV"
+
+#: ../../extend/addon/addon/cdav/cdav.php:270
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145
+msgid "Mobile"
+msgstr "Mobiel"
+
+#: ../../extend/addon/addon/cdav/cdav.php:271
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146 ../../include/nav.php:88
+msgid "Home"
+msgstr "Thuis"
+
+#: ../../extend/addon/addon/cdav/cdav.php:272
+msgid "Home, Voice"
+msgstr "Thuis, spraak"
+
+#: ../../extend/addon/addon/cdav/cdav.php:273
+msgid "Home, Fax"
+msgstr "Thuis, fax"
+
+#: ../../extend/addon/addon/cdav/cdav.php:274
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147
+msgid "Work"
+msgstr "Werk"
+
+#: ../../extend/addon/addon/cdav/cdav.php:275
+msgid "Work, Voice"
+msgstr "Werk, spraak"
+
+#: ../../extend/addon/addon/cdav/cdav.php:276
+msgid "Work, Fax"
+msgstr "Werk, fax"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:744
+msgid "INVALID EVENT DISMISSED!"
+msgstr "ONGELDIGE GEBEURTENIS VERWIJDERD!"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
+msgid "Summary: "
+msgstr "Samenvatting: "
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
+msgid "Date: "
+msgstr "Datum: "
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:747
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:754
+msgid "Reason: "
+msgstr "Reden: "
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:752
+msgid "INVALID CARD DISMISSED!"
+msgstr "ONGELDIGE CONTACTKAART VERWIJDERD!"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
+msgid "Name: "
+msgstr "Naam: "
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:770
+msgid ""
+"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
+"Settings before you can use it."
+msgstr "Voordat je dit kunt gebruiken dien je eerst deze plugin onder 'Plugin-instellingen > CalDAV/CardDAV' in te schakelen."
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
+msgid "Example: YYYY-MM-DD HH:mm"
+msgstr "Bijvoorbeeld: JJJJ-MM-DD UU:mm"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
+msgid "End date and time"
+msgstr "Einddatum en -tijd"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:852
+msgid "List month"
+msgstr "Maand tonen"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:853
+msgid "List week"
+msgstr "Week tonen"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:854
+msgid "List day"
+msgstr "Dag tonen"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:861
+msgid "More"
+msgstr "Meer"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:862
+msgid "Less"
+msgstr "Minder"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:863
+msgid "Select calendar"
+msgstr "Kies agenda"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:865
+msgid "Delete all"
+msgstr "Alles verwijderen"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:867
+msgid "Sorry! Editing of recurrent events is not yet implemented."
+msgstr "Excuses! Bewerken van herhalende gebeurtenissen is nog niet geïmplementeerd."
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137
+msgid "Organisation"
+msgstr "Organisatie"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138
+#: ../../include/page_widgets.php:46
+msgid "Title"
+msgstr "Titel"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139
+msgid "Phone"
+msgstr "Telefoon"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141
+msgid "Instant messenger"
+msgstr "Instant messenger"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142
+msgid "Website"
+msgstr "Website"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144
+msgid "Note"
+msgstr "Opmerking"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150
+msgid "Add Field"
+msgstr "Veld toevoegen"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155
+msgid "P.O. Box"
+msgstr "Postbus"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156
+msgid "Additional"
+msgstr "Extra"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157
+msgid "Street"
+msgstr "Straat en huisnummer"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158
+msgid "Locality"
+msgstr "Plaats"
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159
+msgid "Region"
+msgstr "Provincie/staat/regio/enz."
+
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160
+msgid "ZIP Code"
+msgstr "Postcode"
+
+#: ../../extend/addon/addon/chess/chess.php:276
+#: ../../extend/addon/addon/chess/chess.php:430
+msgid "Invalid game."
+msgstr "Ongeldig spel."
+
+#: ../../extend/addon/addon/chess/chess.php:282
+#: ../../extend/addon/addon/chess/chess.php:436
+msgid "You are not a player in this game."
+msgstr "Jij doet niet aan dit speel mee."
+
+#: ../../extend/addon/addon/chess/chess.php:315
+msgid "You must be a local channel to create a game."
+msgstr "Je moet een lokaal kanaal zijn om een spel aan te maken."
+
+#: ../../extend/addon/addon/chess/chess.php:333
+msgid "You must select one opponent that is not yourself."
+msgstr "Je moet één tegenstander uitkiezen, maar niet jezelf."
+
+#: ../../extend/addon/addon/chess/chess.php:336
+msgid "Creating new game..."
+msgstr "Nieuw spel wordt aangemaakt..."
+
+#: ../../extend/addon/addon/chess/chess.php:342
+msgid "You must select white or black."
+msgstr "Je moet wit of zwart kiezen."
+
+#: ../../extend/addon/addon/chess/chess.php:349
+msgid "Error creating new game."
+msgstr "Fout tijdens aanmaken nieuw spel."
+
+#: ../../extend/addon/addon/chess/chess.php:379 ../../include/channel.php:816
+msgid "Requested channel is not available."
+msgstr "Opgevraagd kanaal is niet beschikbaar."
+
+#: ../../extend/addon/addon/chess/chess.php:392
+msgid "You must select a local channel /chess/channelname"
+msgstr "Je moet een lokaal kanaal kiezen: .../chess/kanaalnaam"
+
+#: ../../extend/addon/addon/chess/chess.php:920
+msgid "Enable notifications"
+msgstr "Notificaties inschakelen"
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:51
+msgid "Your Webbie:"
+msgstr "Jouw kanaaladres:"
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:54
+msgid "Fontsize (px):"
+msgstr "Tekengrootte (px):"
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:68
+msgid "Link:"
+msgstr "Link:"
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:70
+msgid "Like us on Hubzilla"
+msgstr "Like ons op Hubzilla"
+
+#: ../../extend/addon/addon/likebanner/likebanner.php:72
+msgid "Embed:"
+msgstr "Insluiten (embed):"
+
+#: ../../extend/addon/addon/openid/Mod_Id.php:85
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+msgid "Male"
+msgstr "Man"
+
+#: ../../extend/addon/addon/openid/Mod_Id.php:87
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+msgid "Female"
+msgstr "Vrouw"
+
+#: ../../extend/addon/addon/openid/Mod_Openid.php:30
+msgid "OpenID protocol error. No ID returned."
+msgstr "OpenID-protocolfout. Geen ID terugontvangen."
+
+#: ../../extend/addon/addon/openid/Mod_Openid.php:193
+#: ../../include/auth.php:286
+msgid "Login failed."
+msgstr "Inloggen mislukt."
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:52
+msgid "First Name"
+msgstr "Voornaam"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:53
+msgid "Last Name"
+msgstr "Achternaam"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:55
+msgid "Full Name"
+msgstr "Volledige naam"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:61
+msgid "Profile Photo 16px"
+msgstr "Profielfoto 16px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:62
+msgid "Profile Photo 32px"
+msgstr "Profielfoto 32px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:63
+msgid "Profile Photo 48px"
+msgstr "Profielfoto 48px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:64
+msgid "Profile Photo 64px"
+msgstr "Profielfoto 64px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:65
+msgid "Profile Photo 80px"
+msgstr "Profielfoto 80px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:66
+msgid "Profile Photo 128px"
+msgstr "Profielfoto 128px"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:67
+msgid "Timezone"
+msgstr "Tijdzone"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:70
+msgid "Birth Year"
+msgstr "Geboortejaar"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:71
+msgid "Birth Month"
+msgstr "Geboortemaand"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:72
+msgid "Birth Day"
+msgstr "Geboortedag"
+
+#: ../../extend/addon/addon/openid/MysqlProvider.php:73
+msgid "Birthdate"
+msgstr "Geboortedatum"
+
+#: ../../extend/addon/addon/openid/openid.php:49
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "We hebben een probleem ontdekt tijdens het inloggen met de OpenID die je hebt verstrekt. Controleer de ID op typefouten."
+
+#: ../../extend/addon/addon/openid/openid.php:49
+msgid "The error message was:"
+msgstr "Foutmelding was:"
+
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:44
+#, php-format
+msgid "Reconnecting %d connections"
+msgstr "%d connecties opnieuw aan het verbinden"
+
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:63
+msgid "Diaspora Reconnect"
+msgstr "Diaspora opnieuw verbinden"
+
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:65
+msgid ""
+"Use this form to re-establish Diaspora connections which were initially made"
+" from a different hub."
+msgstr "Gebruik dit formulier om opnieuw met Diaspora-connecties te verbinden, die oorspronkelijk op een andere hub waren verbonden."
+
+#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:70
+msgid "Reconnect"
+msgstr "Opnieuw verbinden"
+
+#: ../../extend/addon/addon/mailtest/mailtest.php:19
+msgid "Send test email"
+msgstr "Test-e-mail versturen"
+
+#: ../../extend/addon/addon/mailtest/mailtest.php:66
+msgid "Mail sent."
+msgstr "E-mail verzonden."
+
+#: ../../extend/addon/addon/mailtest/mailtest.php:68
+msgid "Sending of mail failed."
+msgstr "Verzenden van e-mail mislukt."
+
+#: ../../extend/addon/addon/mailtest/mailtest.php:77
+msgid "Mail Test"
+msgstr "E-mailtest"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:57
+msgid "Errors encountered deleting database table "
+msgstr "Fouten opgetreden tijdens verwijderen databasetabel "
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
+msgid "Drop tables when uninstalling?"
+msgstr "Verwijder tabellen tijdens uitschakelen plugin?"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
+msgid ""
+"If checked, the Rendezvous database tables will be deleted when the plugin "
+"is uninstalled."
+msgstr "Wanneer dit is aangevinkt worden de tabellen in de Rendezvous-database verwijderd wanneer de plugin wordt uitgeschakeld."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
+msgid "Mapbox Access Token"
+msgstr "Toegangstoken "
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
+msgid ""
+"If you enter a Mapbox access token, it will be used to retrieve map tiles "
+"from Mapbox instead of the default OpenStreetMap tile server."
+msgstr "De Mapbox-toegangstoken wordt gebruikt om kaarttegels (tiles) van Mapbox op te halen in plaats van de standaard tile-server van OpenStreetMap."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:154
+msgid "Rendezvous"
+msgstr "Rendezvous"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:159
+msgid ""
+"This identity has been deleted by another member due to inactivity. Please "
+"press the \"New identity\" button or refresh the page to register a new "
+"identity. You may use the same name."
+msgstr "Deze identiteit is door een ander lid verwijderd als gevolg van inactiviteit. Klik op de knop \"Nieuwe identiteit\" of herlaad de pagina om een nieuwe identiteit aan te maken. Je kan eventueel dezelfde naam gebruiken."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:160
+msgid "Welcome to Rendezvous!"
+msgstr "Welkom bij Rendezvous!"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:161
+msgid ""
+"Enter your name to join this rendezvous. To begin sharing your location with"
+" the other members, tap the GPS control. When your location is discovered, a"
+" red dot will appear and others will be able to see you on the map."
+msgstr "Vul je naam in om deel te nemen aan deze rendezvous. Om met het delen van je locatie met de andere leden te beginnen, klik je op de locatieknop van je webbrowser. Nadat jouw locatie is gevonden verschijnt er een rode stip en kunnen andere leden jou zien op de kaart."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:163
+msgid "Let's meet here"
+msgstr "Laten we elkaar hier ontmoeten"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:166
+msgid "New marker"
+msgstr "Nieuwe markering"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:167
+msgid "Edit marker"
+msgstr "Markering bewerken"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:168
+msgid "New identity"
+msgstr "Nieuwe identiteit"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:169
+msgid "Delete marker"
+msgstr "Markering verwijderen"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:170
+msgid "Delete member"
+msgstr "Lid verwijderen"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:171
+msgid "Edit proximity alert"
+msgstr "Nabijheidswaarschuwing bewerken"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:172
+msgid ""
+"A proximity alert will be issued when this member is within a certain radius"
+" of you.<br><br>Enter a radius in meters (0 to disable):"
+msgstr "Een nabijheidswaarschuwing wordt actief wanneer dit lid zich binnen een bepaalde straal bevindt.<br><br>Voer het aantal meters van de straal in (0 om uit te schakelen):"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:172
+msgid "distance"
+msgstr "afstand"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:183
+msgid "Add new rendezvous"
+msgstr "Nieuwe rendezvous toevoegen"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:184
+msgid ""
+"Create a new rendezvous and share the access link with those you wish to "
+"invite to the group. Those who open the link become members of the "
+"rendezvous. They can view other member locations, add markers to the map, or"
+" share their own locations with the group."
+msgstr "Maak een nieuwe rendezvous aan en deel de toegangslink met wie je wil uitnodigen voor de groep. Wie op de link klikt wordt lid van rendezvous. Zij kunnen dan de locaties zien van andere leden, markeringen aan de kaart toevoegen of hun eigen locaties met de groep delen."
+
+#: ../../include/features.php:222
+msgid "Disable Comments"
+msgstr "Reacties uitschakelen"
+
+#: ../../include/features.php:223
+msgid "Provide the option to disable comments for a post"
+msgstr "Maak het mogelijk dat reacties op een bericht kunnen worden uitgeschakeld"
+
+#: ../../include/dba/dba_driver.php:187
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Kan DNS-informatie voor databaseserver '%s' niet vinden"
+
+#: ../../include/datetime.php:147
+msgid "Birthday"
+msgstr "Verjaardag of geboortedatum"
+
+#: ../../include/datetime.php:149
+msgid "Age: "
+msgstr "Leeftijd:"
+
+#: ../../include/datetime.php:151
+msgid "YYYY-MM-DD or MM-DD"
+msgstr "JJJJ-MM-DD of MM-DD"
+
+#: ../../include/datetime.php:286 ../../boot.php:2564
+msgid "never"
+msgstr "nooit"
+
+#: ../../include/datetime.php:292
+msgid "less than a second ago"
+msgstr "minder dan een seconde geleden"
+
+#: ../../include/datetime.php:310
+#, php-format
+msgctxt "e.g. 22 hours ago, 1 minute ago"
+msgid "%1$d %2$s ago"
+msgstr "%1$d %2$s geleden"
+
+#: ../../include/datetime.php:321
+msgctxt "relative_date"
+msgid "year"
+msgid_plural "years"
+msgstr[0] "jaar"
+msgstr[1] "jaren"
+
+#: ../../include/datetime.php:324
+msgctxt "relative_date"
+msgid "month"
+msgid_plural "months"
+msgstr[0] "maand"
+msgstr[1] "maanden"
+
+#: ../../include/datetime.php:327
+msgctxt "relative_date"
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "week"
+msgstr[1] "weken"
+
+#: ../../include/datetime.php:330
+msgctxt "relative_date"
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dag"
+msgstr[1] "dagen"
+
+#: ../../include/datetime.php:333
+msgctxt "relative_date"
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "uur"
+msgstr[1] "uren"
+
+#: ../../include/datetime.php:336
+msgctxt "relative_date"
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuut"
+msgstr[1] "minuten"
+
+#: ../../include/datetime.php:339
+msgctxt "relative_date"
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "seconde"
+msgstr[1] "seconden"
+
+#: ../../include/datetime.php:576
+#, php-format
+msgid "%1$s's birthday"
+msgstr "Verjaardag van %1$s"
+
+#: ../../include/datetime.php:577
+#, php-format
+msgid "Happy Birthday %1$s"
+msgstr "Gefeliciteerd met je verjaardag %1$s"
#: ../../include/account.php:35
msgid "Not a valid email address"
@@ -7977,67 +10574,46 @@ msgstr "Vul de vereiste informatie in."
msgid "Failed to store account information."
msgstr "Account-informatie kon niet opgeslagen worden."
-#: ../../include/account.php:258
+#: ../../include/account.php:263
#, php-format
msgid "Registration confirmation for %s"
msgstr "Registratiebevestiging voor %s"
-#: ../../include/account.php:324
+#: ../../include/account.php:330
#, php-format
msgid "Registration request at %s"
msgstr "Registratiebevestiging voor %s"
-#: ../../include/account.php:326 ../../include/account.php:353
-#: ../../include/account.php:413 ../../include/network.php:1937
-msgid "Administrator"
-msgstr "Beheerder"
-
-#: ../../include/account.php:348
+#: ../../include/account.php:352
msgid "your registration password"
msgstr "jouw registratiewachtwoord"
-#: ../../include/account.php:351 ../../include/account.php:411
+#: ../../include/account.php:358 ../../include/account.php:420
#, php-format
msgid "Registration details for %s"
msgstr "Registratiegegevens voor %s"
-#: ../../include/account.php:423
+#: ../../include/account.php:431
msgid "Account approved."
msgstr "Account goedgekeurd"
-#: ../../include/account.php:463
+#: ../../include/account.php:471
#, php-format
msgid "Registration revoked for %s"
msgstr "Registratie ingetrokken voor %s"
-#: ../../include/account.php:748 ../../include/account.php:750
+#: ../../include/account.php:756 ../../include/account.php:758
msgid "Click here to upgrade."
msgstr "Klik hier om te upgraden."
-#: ../../include/account.php:756
+#: ../../include/account.php:764
msgid "This action exceeds the limits set by your subscription plan."
msgstr "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden."
-#: ../../include/account.php:761
+#: ../../include/account.php:769
msgid "This action is not available under your subscription plan."
msgstr "Deze handeling is niet mogelijk met jouw abonnement."
-#: ../../include/message.php:20
-msgid "No recipient provided."
-msgstr "Geen ontvanger opgegeven."
-
-#: ../../include/message.php:25
-msgid "[no subject]"
-msgstr "[geen onderwerp]"
-
-#: ../../include/message.php:45
-msgid "Unable to determine sender."
-msgstr "Afzender kan niet bepaald worden."
-
-#: ../../include/message.php:222
-msgid "Stored post could not be verified."
-msgstr "Opgeslagen bericht kon niet worden geverifieerd."
-
#: ../../include/selectors.php:30
msgid "Frequently"
msgstr "Regelmatig"
@@ -8062,14 +10638,6 @@ msgstr "Wekelijks"
msgid "Monthly"
msgstr "Maandelijks"
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Male"
-msgstr "Man"
-
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Female"
-msgstr "Vrouw"
-
#: ../../include/selectors.php:49
msgid "Currently Male"
msgstr "Momenteel man"
@@ -8323,192 +10891,115 @@ msgstr "Niet in staat om aangemaakte identiteit te vinden"
msgid "Default Profile"
msgstr "Standaardprofiel"
-#: ../../include/channel.php:813
-msgid "Requested channel is not available."
-msgstr "Opgevraagd kanaal is niet beschikbaar."
-
-#: ../../include/channel.php:960
+#: ../../include/channel.php:962
msgid "Create New Profile"
msgstr "Nieuw profiel aanmaken"
-#: ../../include/channel.php:963 ../../include/nav.php:93
-msgid "Edit Profile"
-msgstr "Profiel bewerken"
-
-#: ../../include/channel.php:980
+#: ../../include/channel.php:982
msgid "Visible to everybody"
msgstr "Voor iedereen zichtbaar"
-#: ../../include/channel.php:1053 ../../include/channel.php:1166
+#: ../../include/channel.php:1055 ../../include/channel.php:1174
msgid "Gender:"
msgstr "Geslacht:"
-#: ../../include/channel.php:1054 ../../include/channel.php:1210
-msgid "Status:"
-msgstr "Status:"
-
-#: ../../include/channel.php:1055 ../../include/channel.php:1221
+#: ../../include/channel.php:1057 ../../include/channel.php:1229
msgid "Homepage:"
msgstr "Homepagina:"
-#: ../../include/channel.php:1056
+#: ../../include/channel.php:1058
msgid "Online Now"
msgstr "Nu online"
-#: ../../include/channel.php:1171
+#: ../../include/channel.php:1179
msgid "Like this channel"
msgstr "Vind dit kanaal leuk"
-#: ../../include/channel.php:1195
+#: ../../include/channel.php:1203
msgid "j F, Y"
msgstr "F j Y"
-#: ../../include/channel.php:1196
+#: ../../include/channel.php:1204
msgid "j F"
msgstr "F j"
-#: ../../include/channel.php:1203
+#: ../../include/channel.php:1211
msgid "Birthday:"
msgstr "Geboortedatum:"
-#: ../../include/channel.php:1216
+#: ../../include/channel.php:1224
#, php-format
msgid "for %1$d %2$s"
msgstr "voor %1$d %2$s"
-#: ../../include/channel.php:1219
+#: ../../include/channel.php:1227
msgid "Sexual Preference:"
msgstr "Seksuele voorkeur:"
-#: ../../include/channel.php:1225
+#: ../../include/channel.php:1233
msgid "Tags:"
msgstr "Tags:"
-#: ../../include/channel.php:1227
+#: ../../include/channel.php:1235
msgid "Political Views:"
msgstr "Politieke overtuigingen:"
-#: ../../include/channel.php:1229
+#: ../../include/channel.php:1237
msgid "Religion:"
msgstr "Religie:"
-#: ../../include/channel.php:1233
+#: ../../include/channel.php:1241
msgid "Hobbies/Interests:"
msgstr "Hobby's/interesses:"
-#: ../../include/channel.php:1235
+#: ../../include/channel.php:1243
msgid "Likes:"
msgstr "Houdt van:"
-#: ../../include/channel.php:1237
+#: ../../include/channel.php:1245
msgid "Dislikes:"
msgstr "Houdt niet van:"
-#: ../../include/channel.php:1239
+#: ../../include/channel.php:1247
msgid "Contact information and Social Networks:"
msgstr "Contactinformatie en sociale netwerken:"
-#: ../../include/channel.php:1241
+#: ../../include/channel.php:1249
msgid "My other channels:"
msgstr "Mijn andere kanalen"
-#: ../../include/channel.php:1243
+#: ../../include/channel.php:1251
msgid "Musical interests:"
msgstr "Muzikale interesses:"
-#: ../../include/channel.php:1245
+#: ../../include/channel.php:1253
msgid "Books, literature:"
msgstr "Boeken, literatuur:"
-#: ../../include/channel.php:1247
+#: ../../include/channel.php:1255
msgid "Television:"
msgstr "Televisie:"
-#: ../../include/channel.php:1249
+#: ../../include/channel.php:1257
msgid "Film/dance/culture/entertainment:"
msgstr "Films/dansen/cultuur/vermaak:"
-#: ../../include/channel.php:1251
+#: ../../include/channel.php:1259
msgid "Love/Romance:"
msgstr "Liefde/romantiek:"
-#: ../../include/channel.php:1253
+#: ../../include/channel.php:1261
msgid "Work/employment:"
msgstr "Werk/beroep:"
-#: ../../include/channel.php:1255
+#: ../../include/channel.php:1263
msgid "School/education:"
msgstr "School/opleiding:"
-#: ../../include/channel.php:1276
+#: ../../include/channel.php:1284
msgid "Like this thing"
msgstr "Vind dit ding leuk"
-#: ../../include/acl_selectors.php:169
-msgid "Who can see this?"
-msgstr "Wie kan dit zien?"
-
-#: ../../include/acl_selectors.php:170
-msgid "Custom selection"
-msgstr "Handmatige selectie"
-
-#: ../../include/acl_selectors.php:171
-msgid ""
-"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
-" the scope of \"Show\"."
-msgstr "Kies \"Tonen\" om weergave toe te staan. Met \"Niet tonen\" kan je uitzonderingen maken op \"Tonen\"."
-
-#: ../../include/acl_selectors.php:172
-msgid "Show"
-msgstr "Tonen"
-
-#: ../../include/acl_selectors.php:173
-msgid "Don't show"
-msgstr "Niet tonen"
-
-#: ../../include/acl_selectors.php:207
-#, php-format
-msgid ""
-"Post permissions %s cannot be changed %s after a post is shared.</br />These"
-" permissions set who is allowed to view the post."
-msgstr "Permissies van berichten %s zijn niet meer te veranderen %s nadat een bericht is gedeeld.</br />Met deze permissies bepaal je wie het bericht kan zien."
-
-#: ../../include/bookmarks.php:35
-#, php-format
-msgid "%1$s's bookmarks"
-msgstr "Bladwijzers van %1$s"
-
-#: ../../include/group.php:26
-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 "Een verwijderde collectie met deze naam is gereactiveerd. Bestaande itemrechten <strong>kunnen</strong> van toepassing zijn op deze collectie en toekomstige leden. Wanneer je dit niet zo bedoeld hebt, moet je een nieuwe collectie met een andere naam aanmaken."
-
-#: ../../include/group.php:248
-msgid "Add new connections to this privacy group"
-msgstr "Voeg nieuwe connecties aan deze privacygroep toe"
-
-#: ../../include/group.php:289
-msgid "edit"
-msgstr "bewerken"
-
-#: ../../include/group.php:312
-msgid "Edit group"
-msgstr "Privacygroep bewerken"
-
-#: ../../include/group.php:313
-msgid "Add privacy group"
-msgstr "Privacygroep toevoegen"
-
-#: ../../include/group.php:314
-msgid "Channels not in any privacy group"
-msgstr "Kanalen die zich in geen enkele privacygroep bevinden"
-
-#: ../../include/group.php:316 ../../include/widgets.php:284
-msgid "add"
-msgstr "toevoegen"
-
#: ../../include/connections.php:95
msgid "New window"
msgstr "Nieuw venster"
@@ -8522,19 +11013,23 @@ msgstr "Open de geselecteerde locatie in een ander venster of tab"
msgid "User '%s' deleted"
msgstr "Account '%s' verwijderd"
-#: ../../include/page_widgets.php:7
-msgid "New Page"
-msgstr "Nieuwe pagina"
+#: ../../include/dir_fns.php:141
+msgid "Directory Options"
+msgstr "Opties kanalengids"
-#: ../../include/page_widgets.php:46
-msgid "Title"
-msgstr "Titel"
+#: ../../include/dir_fns.php:143
+msgid "Safe Mode"
+msgstr "Veilig zoeken"
-#: ../../include/wiki.php:525 ../../include/bbcode.php:619
-msgid "Different viewers will see this text differently"
-msgstr "Deze tekst wordt per persoon anders weergeven."
+#: ../../include/dir_fns.php:144
+msgid "Public Forums Only"
+msgstr "Alleen openbare forums"
+
+#: ../../include/dir_fns.php:145
+msgid "This Website Only"
+msgstr "Alleen deze hub"
-#: ../../include/nav.php:85 ../../include/nav.php:118 ../../boot.php:1738
+#: ../../include/nav.php:85 ../../include/nav.php:118 ../../boot.php:1719
msgid "Logout"
msgstr "Uitloggen"
@@ -8542,10 +11037,6 @@ msgstr "Uitloggen"
msgid "End this session"
msgstr "Beëindig deze sessie"
-#: ../../include/nav.php:88 ../../include/nav.php:149
-msgid "Home"
-msgstr "Home"
-
#: ../../include/nav.php:88
msgid "Your posts and conversations"
msgstr "Jouw kanaal"
@@ -8574,7 +11065,7 @@ msgstr "Jouw bestanden"
msgid "Your chatrooms"
msgstr "Jouw chatkanalen"
-#: ../../include/nav.php:105 ../../include/conversation.php:1715
+#: ../../include/nav.php:105 ../../include/conversation.php:1717
msgid "Bookmarks"
msgstr "Bladwijzers"
@@ -8587,165 +11078,578 @@ msgid "Your webpages"
msgstr "Jouw webpagina's"
#: ../../include/nav.php:111
-msgid "Your wiki"
-msgstr "Jouw wiki"
+msgid "Your wikis"
+msgstr "Jouw wiki's"
#: ../../include/nav.php:115
msgid "Sign in"
msgstr "Inloggen"
-#: ../../include/nav.php:132
-#, php-format
-msgid "%s - click to logout"
-msgstr "%s - klik om uit te loggen"
-
-#: ../../include/nav.php:135
+#: ../../include/nav.php:131
msgid "Remote authentication"
msgstr "Authenticatie op afstand"
-#: ../../include/nav.php:135
+#: ../../include/nav.php:131
msgid "Click to authenticate to your home hub"
msgstr "Authenticeer jezelf via (bijvoorbeeld) jouw hub"
-#: ../../include/nav.php:149
-msgid "Home Page"
-msgstr "Homepage"
+#: ../../include/nav.php:143
+msgid "Get me home"
+msgstr "Terug naar mijn hub"
+
+#: ../../include/nav.php:145
+msgid "Log me out of this site"
+msgstr "Uitloggen op deze hub"
-#: ../../include/nav.php:152
+#: ../../include/nav.php:150
msgid "Create an account"
msgstr "Maak een account aan"
-#: ../../include/nav.php:164
+#: ../../include/nav.php:162
msgid "Help and documentation"
msgstr "Hulp en documentatie"
-#: ../../include/nav.php:168
+#: ../../include/nav.php:166
msgid "Applications, utilities, links, games"
msgstr "Apps"
-#: ../../include/nav.php:170
+#: ../../include/nav.php:168
msgid "Search site @name, #tag, ?docs, content"
msgstr "Zoek een @kanaal, doorzoek inhoud hub met tekst en #tags, of doorzoek ?documentatie "
-#: ../../include/nav.php:172
+#: ../../include/nav.php:170
msgid "Channel Directory"
msgstr "Kanalengids"
-#: ../../include/nav.php:184
+#: ../../include/nav.php:182
msgid "Your grid"
msgstr "Jouw grid"
-#: ../../include/nav.php:185
+#: ../../include/nav.php:183
msgid "Mark all grid notifications seen"
msgstr "Markeer alle gridnotificaties als bekeken"
-#: ../../include/nav.php:187
+#: ../../include/nav.php:185
msgid "Channel home"
msgstr "Jouw kanaal"
-#: ../../include/nav.php:188
+#: ../../include/nav.php:186
msgid "Mark all channel notifications seen"
msgstr "Alle kanaalnotificaties als gelezen markeren"
-#: ../../include/nav.php:194
+#: ../../include/nav.php:192
msgid "Notices"
msgstr "Notificaties"
-#: ../../include/nav.php:194
+#: ../../include/nav.php:192
msgid "Notifications"
msgstr "Notificaties"
-#: ../../include/nav.php:195
+#: ../../include/nav.php:193
msgid "See all notifications"
msgstr "Alle notificaties weergeven"
-#: ../../include/nav.php:198
+#: ../../include/nav.php:196
msgid "Private mail"
msgstr "Privéberichten"
-#: ../../include/nav.php:199
+#: ../../include/nav.php:197
msgid "See all private messages"
msgstr "Alle privéberichten weergeven"
-#: ../../include/nav.php:200
+#: ../../include/nav.php:198
msgid "Mark all private messages seen"
msgstr "Markeer alle privéberichten als bekeken"
-#: ../../include/nav.php:201 ../../include/widgets.php:700
+#: ../../include/nav.php:199 ../../include/widgets.php:700
msgid "Inbox"
msgstr "Postvak IN"
-#: ../../include/nav.php:202 ../../include/widgets.php:705
+#: ../../include/nav.php:200 ../../include/widgets.php:705
msgid "Outbox"
msgstr "Postvak UIT"
-#: ../../include/nav.php:203 ../../include/widgets.php:710
+#: ../../include/nav.php:201 ../../include/widgets.php:710
msgid "New Message"
msgstr "Nieuw bericht"
-#: ../../include/nav.php:206
+#: ../../include/nav.php:204
msgid "Event Calendar"
msgstr "Agenda"
-#: ../../include/nav.php:207
+#: ../../include/nav.php:205
msgid "See all events"
msgstr "Alle gebeurtenissen weergeven"
-#: ../../include/nav.php:208
+#: ../../include/nav.php:206
msgid "Mark all events seen"
msgstr "Markeer alle gebeurtenissen als bekeken"
-#: ../../include/nav.php:211
+#: ../../include/nav.php:209
msgid "Manage Your Channels"
msgstr "Beheer je kanalen"
-#: ../../include/nav.php:213
+#: ../../include/nav.php:211
msgid "Account/Channel Settings"
msgstr "Account-/kanaal-instellingen"
-#: ../../include/nav.php:221 ../../include/widgets.php:1594
+#: ../../include/nav.php:219 ../../include/widgets.php:1595
msgid "Admin"
msgstr "Beheer"
-#: ../../include/nav.php:221
+#: ../../include/nav.php:219
msgid "Site Setup and Configuration"
msgstr "Hub instellen en beheren"
-#: ../../include/nav.php:252 ../../include/conversation.php:853
+#: ../../include/nav.php:250 ../../include/conversation.php:835
msgid "Loading..."
msgstr "Aan het laden..."
-#: ../../include/nav.php:257
+#: ../../include/nav.php:255
msgid "@name, #tag, ?doc, content"
msgstr "@kanaal, #tag, inhoud, ?hulp"
-#: ../../include/nav.php:258
+#: ../../include/nav.php:256
msgid "Please wait..."
msgstr "Wachten aub..."
-#: ../../include/bb2diaspora.php:398
+#: ../../include/features.php:58
+msgid "General Features"
+msgstr "Algemene functies"
+
+#: ../../include/features.php:63
+msgid "Multiple Profiles"
+msgstr "Meerdere profielen"
+
+#: ../../include/features.php:64
+msgid "Ability to create multiple profiles"
+msgstr "Mogelijkheid om meerdere profielen aan te maken"
+
+#: ../../include/features.php:72
+msgid "Advanced Profiles"
+msgstr "Geavanceerde profielen"
+
+#: ../../include/features.php:73
+msgid "Additional profile sections and selections"
+msgstr "Extra onderdelen en keuzes voor je profiel"
+
+#: ../../include/features.php:81
+msgid "Profile Import/Export"
+msgstr "Profiel importen/exporteren"
+
+#: ../../include/features.php:82
+msgid "Save and load profile details across sites/channels"
+msgstr "Profielgegevens opslaan en in andere hubs/kanalen gebruiken."
+
+#: ../../include/features.php:90
+msgid "Web Pages"
+msgstr "Webpagina's"
+
+#: ../../include/features.php:91
+msgid "Provide managed web pages on your channel"
+msgstr "Sta beheerde webpagina's op jouw kanaal toe"
+
+#: ../../include/features.php:100
+msgid "Provide a wiki for your channel"
+msgstr "Voeg een wiki aan jouw kanaal toe"
+
+#: ../../include/features.php:117
+msgid "Private Notes"
+msgstr "Privé-aantekeningen"
+
+#: ../../include/features.php:118
+msgid "Enables a tool to store notes and reminders (note: not encrypted)"
+msgstr "Een eenvoudige toepassing om aantekeningen en herinneringen in te bewaren (let op: niet versleuteld)"
+
+#: ../../include/features.php:126
+msgid "Navigation Channel Select"
+msgstr "Kanaal kiezen in navigatiemenu"
+
+#: ../../include/features.php:127
+msgid "Change channels directly from within the navigation dropdown menu"
+msgstr "Kies een ander kanaal direct vanuit het dropdown-menu op de navigatiebalk"
+
+#: ../../include/features.php:135
+msgid "Photo Location"
+msgstr "Fotolocatie"
+
+#: ../../include/features.php:136
+msgid "If location data is available on uploaded photos, link this to a map."
+msgstr "Wanneer in de geüploade foto's locatiegegevens aanwezig zijn, link dit dan aan een kaart."
+
+#: ../../include/features.php:144
+msgid "Access Controlled Chatrooms"
+msgstr "Chatkanalen met toegangscontrole "
+
+#: ../../include/features.php:145
+msgid "Provide chatrooms and chat services with access control."
+msgstr "Chatkanalen en chatdiensten met toegangscontrole aanbieden."
+
+#: ../../include/features.php:153
+msgid "Smart Birthdays"
+msgstr "Slimme verjaardagen"
+
+#: ../../include/features.php:154
+msgid ""
+"Make birthday events timezone aware in case your friends are scattered "
+"across the planet."
+msgstr "Maak verjaardagen bewust van tijdzones. Voor het geval dat jouw vrienden over de hele wereld verspreid zijn."
+
+#: ../../include/features.php:162
+msgid "Advanced Directory Search"
+msgstr "Geavanceerd in de kanalengids zoeken"
+
+#: ../../include/features.php:163
+msgid "Allows creation of complex directory search queries"
+msgstr "Gebruik complexe zoekopdrachten in de kanalengids"
+
+#: ../../include/features.php:171
+msgid "Advanced Theme and Layout Settings"
+msgstr "Geavanceerde thema- en lay-out-instellingen"
+
+#: ../../include/features.php:172
+msgid "Allows fine tuning of themes and page layouts"
+msgstr "Maakt het mogelijk dat thema's en pagina-lay-outs preciezer ingesteld kunnen worden "
+
+#: ../../include/features.php:182
+msgid "Post Composition Features"
+msgstr "Functies voor het opstellen van berichten"
+
+#: ../../include/features.php:186
+msgid "Large Photos"
+msgstr "Grote foto's"
+
+#: ../../include/features.php:187
+msgid ""
+"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
+"(640px) photo thumbnails"
+msgstr "Gebruik grotere foto's (1024px) in berichten. Wanneer dit is uitgeschakeld worden er kleinere foto's (640px) gebruikt."
+
+#: ../../include/features.php:196
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Automatisch inhoud uit andere kanalen of feeds importeren."
+
+#: ../../include/features.php:204
+msgid "Even More Encryption"
+msgstr "Extra encryptie"
+
+#: ../../include/features.php:205
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Sta toe dat inhoud extra end-to-end wordt versleuteld met een gedeelde geheime sleutel."
+
+#: ../../include/features.php:213
+msgid "Enable Voting Tools"
+msgstr "Peilingen inschakelen"
+
+#: ../../include/features.php:214
+msgid "Provide a class of post which others can vote on"
+msgstr "Maakt het mogelijk om een bericht op te stellen, waar mensen op kunnen stemmen."
+
+#: ../../include/features.php:222
+msgid "Disable Comments"
+msgstr "Reacties uitschakelen"
+
+#: ../../include/features.php:223
+msgid "Provide the option to disable comments for a post"
+msgstr "Maak het mogelijk dat reacties op een bericht kunnen worden uitgeschakeld"
+
+#: ../../include/features.php:231
+msgid "Delayed Posting"
+msgstr "Berichten uitstellen"
+
+#: ../../include/features.php:232
+msgid "Allow posts to be published at a later date"
+msgstr "Maakt het mogelijk dat berichten op een toekomstig moment gepubliceerd kunnen worden."
+
+#: ../../include/features.php:240
+msgid "Content Expiration"
+msgstr "Inhoud laten verlopen"
+
+#: ../../include/features.php:241
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Berichten, reacties en/of privéberichten na een bepaalde tijd verwijderen"
+
+#: ../../include/features.php:249
+msgid "Suppress Duplicate Posts/Comments"
+msgstr "Dubbele berichten/reacties tegenhouden"
+
+#: ../../include/features.php:250
+msgid ""
+"Prevent posts with identical content to be published with less than two "
+"minutes in between submissions."
+msgstr "Voorkomt dat berichten en reacties met identieke inhoud en die binnen twee minuten zijn verstuurd, worden gepubliceerd. "
+
+#: ../../include/features.php:261
+msgid "Network and Stream Filtering"
+msgstr "Netwerk- en streamfilter"
+
+#: ../../include/features.php:265
+msgid "Search by Date"
+msgstr "Zoek op datum"
+
+#: ../../include/features.php:266
+msgid "Ability to select posts by date ranges"
+msgstr "Mogelijkheid om berichten op datum te filteren "
+
+#: ../../include/features.php:274 ../../include/group.php:311
+msgid "Privacy Groups"
+msgstr "Privacygroepen"
+
+#: ../../include/features.php:275
+msgid "Enable management and selection of privacy groups"
+msgstr "Beheer en selectie van privacygroepen inschakelen"
+
+#: ../../include/features.php:283 ../../include/widgets.php:283
+msgid "Saved Searches"
+msgstr "Opgeslagen zoekopdrachten"
+
+#: ../../include/features.php:284
+msgid "Save search terms for re-use"
+msgstr "Sla zoekopdrachten op voor hergebruik"
+
+#: ../../include/features.php:292
+msgid "Network Personal Tab"
+msgstr "Persoonlijke netwerktab"
+
+#: ../../include/features.php:293
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Sta het toe dat de tab netwerkberichten toont waarmee je interactie had"
+
+#: ../../include/features.php:301
+msgid "Network New Tab"
+msgstr "Nieuwe netwerktab"
+
+#: ../../include/features.php:302
+msgid "Enable tab to display all new Network activity"
+msgstr "Laat de tab alle nieuwe netwerkactiviteit tonen"
+
+#: ../../include/features.php:310
+msgid "Affinity Tool"
+msgstr "Verwantschapsfilter"
+
+#: ../../include/features.php:311
+msgid "Filter stream activity by depth of relationships"
+msgstr "Filter wat je in jouw grid ziet op hoe goed je iemand kent of mag"
+
+#: ../../include/features.php:320
+msgid "Show friend and connection suggestions"
+msgstr "Toon kanaalvoorstellen"
+
+#: ../../include/features.php:328
+msgid "Connection Filtering"
+msgstr "Berichtenfilters"
+
+#: ../../include/features.php:329
+msgid "Filter incoming posts from connections based on keywords/content"
+msgstr "Filter binnenkomende berichten van connecties aan de hand van trefwoorden en taal"
+
+#: ../../include/features.php:341
+msgid "Post/Comment Tools"
+msgstr "Bericht- en reactiehulpmiddelen"
+
+#: ../../include/features.php:345
+msgid "Community Tagging"
+msgstr "Taggen door anderen"
+
+#: ../../include/features.php:346
+msgid "Ability to tag existing posts"
+msgstr "Geeft andere mensen de mogelijkheid om jouw (bestaande) berichten te taggen"
+
+#: ../../include/features.php:354
+msgid "Post Categories"
+msgstr "Categorieën berichten"
+
+#: ../../include/features.php:355
+msgid "Add categories to your posts"
+msgstr "Voeg categorieën toe aan je berichten"
+
+#: ../../include/features.php:363
+msgid "Emoji Reactions"
+msgstr "Emoji-reacties"
+
+#: ../../include/features.php:364
+msgid "Add emoji reaction ability to posts"
+msgstr "Emoji-reacties in berichten toestaan"
+
+#: ../../include/features.php:372 ../../include/contact_widgets.php:53
+#: ../../include/widgets.php:346
+msgid "Saved Folders"
+msgstr "Bewaarde mappen"
+
+#: ../../include/features.php:373
+msgid "Ability to file posts under folders"
+msgstr "Mogelijkheid om berichten in mappen op te slaan"
+
+#: ../../include/features.php:381
+msgid "Dislike Posts"
+msgstr "Vind berichten niet leuk"
+
+#: ../../include/features.php:382
+msgid "Ability to dislike posts/comments"
+msgstr "Mogelijkheid om berichten en reacties niet leuk te vinden"
+
+#: ../../include/features.php:390
+msgid "Star Posts"
+msgstr "Geef berichten een ster"
+
+#: ../../include/features.php:391
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Mogelijkheid om speciale berichten met een ster te markeren"
+
+#: ../../include/features.php:399
+msgid "Tag Cloud"
+msgstr "Tagwolk"
+
+#: ../../include/features.php:400
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Zorgt voor een persoonlijke wolk met tags op jouw kanaalpagina"
+
+#: ../../include/features.php:412
+msgid "Premium Channel"
+msgstr "Premiumkanaal"
+
+#: ../../include/features.php:413
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Stelt je in staat om beperkingen en voorwaarden in te stellen voor jouw kanaal"
+
+#: ../../include/bb2diaspora.php:404
msgid "Attachments:"
msgstr "Bijlagen:"
-#: ../../include/bb2diaspora.php:485 ../../include/event.php:22
+#: ../../include/bb2diaspora.php:499 ../../include/event.php:22
#: ../../include/event.php:69
msgid "l F d, Y \\@ g:i A"
msgstr "l d F Y \\@ G:i"
-#: ../../include/bb2diaspora.php:487
+#: ../../include/bb2diaspora.php:501
msgid "$Projectname event notification:"
msgstr "Notificatie $Projectname-gebeurtenis:"
-#: ../../include/bb2diaspora.php:491 ../../include/event.php:30
+#: ../../include/bb2diaspora.php:505 ../../include/event.php:30
#: ../../include/event.php:73
msgid "Starts:"
msgstr "Start:"
-#: ../../include/bb2diaspora.php:499 ../../include/event.php:40
+#: ../../include/bb2diaspora.php:513 ../../include/event.php:40
#: ../../include/event.php:77
msgid "Finishes:"
msgstr "Einde:"
+#: ../../include/bookmarks.php:35
+#, php-format
+msgid "%1$s's bookmarks"
+msgstr "Bladwijzers van %1$s"
+
+#: ../../include/help.php:31
+msgid "Help:"
+msgstr "Hulp:"
+
+#: ../../include/help.php:63
+msgid "Not Found"
+msgstr "Niet gevonden"
+
+#: ../../include/wiki.php:546 ../../include/bbcode.php:552
+#: ../../include/bbcode.php:683
+msgid "Different viewers will see this text differently"
+msgstr "Deze tekst wordt per persoon anders weergeven."
+
+#: ../../include/zot.php:667
+msgid "Invalid data packet"
+msgstr "Datapakket ongeldig"
+
+#: ../../include/zot.php:683
+msgid "Unable to verify channel signature"
+msgstr "Kanaalkenmerk kon niet worden geverifieerd. "
+
+#: ../../include/zot.php:2325
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr "Hubkenmerk voor %s kon niet worden geverifieerd"
+
+#: ../../include/zot.php:3723
+msgid "invalid target signature"
+msgstr "ongeldig doelkenmerk"
+
+#: ../../include/page_widgets.php:7
+msgid "New Page"
+msgstr "Nieuwe pagina"
+
+#: ../../include/message.php:32
+msgid "Unable to determine sender."
+msgstr "Afzender kan niet bepaald worden."
+
+#: ../../include/message.php:69
+msgid "No recipient provided."
+msgstr "Geen ontvanger opgegeven."
+
+#: ../../include/message.php:74
+msgid "[no subject]"
+msgstr "[geen onderwerp]"
+
+#: ../../include/message.php:225
+msgid "Stored post could not be verified."
+msgstr "Opgeslagen bericht kon niet worden geverifieerd."
+
+#: ../../include/contact_widgets.php:11
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d uitnodiging beschikbaar"
+msgstr[1] "%d uitnodigingen beschikbaar"
+
+#: ../../include/contact_widgets.php:19
+msgid "Find Channels"
+msgstr "Kanalen vinden"
+
+#: ../../include/contact_widgets.php:20
+msgid "Enter name or interest"
+msgstr "Vul naam of interesse in"
+
+#: ../../include/contact_widgets.php:21
+msgid "Connect/Follow"
+msgstr "Verbinden/volgen"
+
+#: ../../include/contact_widgets.php:22
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Voorbeeld: Robert Morgenstein, vissen"
+
+#: ../../include/contact_widgets.php:26
+msgid "Random Profile"
+msgstr "Willekeurig profiel"
+
+#: ../../include/contact_widgets.php:27
+msgid "Invite Friends"
+msgstr "Vrienden uitnodigen"
+
+#: ../../include/contact_widgets.php:29
+msgid "Advanced example: name=fred and country=iceland"
+msgstr "Geavanceerd voorbeeld (Engels): name=jan en country=nederland"
+
+#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
+#: ../../include/widgets.php:349 ../../include/widgets.php:468
+msgid "Everything"
+msgstr "Alles"
+
+#: ../../include/contact_widgets.php:91 ../../include/taxonomy.php:188
+#: ../../include/taxonomy.php:270 ../../include/widgets.php:46
+#: ../../include/widgets.php:465
+msgid "Categories"
+msgstr "Categorieën"
+
+#: ../../include/contact_widgets.php:122
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d gemeenschappelijke connectie"
+msgstr[1] "%d gemeenschappelijke connecties"
+
+#: ../../include/contact_widgets.php:127
+msgid "show more"
+msgstr "meer connecties weergeven"
+
#: ../../include/js_strings.php:5
msgid "Delete this item?"
msgstr "Dit item verwijderen?"
@@ -8886,11 +11790,55 @@ msgstr " "
msgid "timeago.numbers"
msgstr "timeago.numbers"
+#: ../../include/js_strings.php:45 ../../include/text.php:1307
+msgid "January"
+msgstr "januari"
+
+#: ../../include/js_strings.php:46 ../../include/text.php:1307
+msgid "February"
+msgstr "februari"
+
+#: ../../include/js_strings.php:47 ../../include/text.php:1307
+msgid "March"
+msgstr "maart"
+
+#: ../../include/js_strings.php:48 ../../include/text.php:1307
+msgid "April"
+msgstr "april"
+
#: ../../include/js_strings.php:49
msgctxt "long"
msgid "May"
msgstr "mei"
+#: ../../include/js_strings.php:50 ../../include/text.php:1307
+msgid "June"
+msgstr "juni"
+
+#: ../../include/js_strings.php:51 ../../include/text.php:1307
+msgid "July"
+msgstr "juli"
+
+#: ../../include/js_strings.php:52 ../../include/text.php:1307
+msgid "August"
+msgstr "augustus"
+
+#: ../../include/js_strings.php:53 ../../include/text.php:1307
+msgid "September"
+msgstr "september"
+
+#: ../../include/js_strings.php:54 ../../include/text.php:1307
+msgid "October"
+msgstr "oktober"
+
+#: ../../include/js_strings.php:55 ../../include/text.php:1307
+msgid "November"
+msgstr "november"
+
+#: ../../include/js_strings.php:56 ../../include/text.php:1307
+msgid "December"
+msgstr "december"
+
#: ../../include/js_strings.php:57
msgid "Jan"
msgstr "jan"
@@ -8940,6 +11888,34 @@ msgstr "nov"
msgid "Dec"
msgstr "dec"
+#: ../../include/js_strings.php:69 ../../include/text.php:1303
+msgid "Sunday"
+msgstr "zondag"
+
+#: ../../include/js_strings.php:70 ../../include/text.php:1303
+msgid "Monday"
+msgstr "maandag"
+
+#: ../../include/js_strings.php:71 ../../include/text.php:1303
+msgid "Tuesday"
+msgstr "dinsdag"
+
+#: ../../include/js_strings.php:72 ../../include/text.php:1303
+msgid "Wednesday"
+msgstr "woensdag"
+
+#: ../../include/js_strings.php:73 ../../include/text.php:1303
+msgid "Thursday"
+msgstr "donderdag"
+
+#: ../../include/js_strings.php:74 ../../include/text.php:1303
+msgid "Friday"
+msgstr "vrijdag"
+
+#: ../../include/js_strings.php:75 ../../include/text.php:1303
+msgid "Saturday"
+msgstr "zaterdag"
+
#: ../../include/js_strings.php:76
msgid "Sun"
msgstr "zo"
@@ -8993,493 +11969,403 @@ msgctxt "calendar"
msgid "All day"
msgstr "hele dag"
-#: ../../include/follow.php:27
-msgid "Channel is blocked on this site."
-msgstr "Kanaal is op deze hub geblokkeerd."
-
-#: ../../include/follow.php:32
-msgid "Channel location missing."
-msgstr "Ontbrekende kanaallocatie."
-
-#: ../../include/follow.php:80
-msgid "Response from remote channel was incomplete."
-msgstr "Antwoord van het kanaal op afstand was niet volledig."
+#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+msgid "Tags"
+msgstr "Tags"
-#: ../../include/follow.php:97
-msgid "Channel was deleted and no longer exists."
-msgstr "Kanaal is verwijderd en bestaat niet meer."
+#: ../../include/taxonomy.php:293
+msgid "Keywords"
+msgstr "Trefwoorden"
-#: ../../include/follow.php:147 ../../include/follow.php:183
-msgid "Protocol disabled."
-msgstr "Protocol uitgeschakeld."
+#: ../../include/taxonomy.php:314
+msgid "have"
+msgstr "heb"
-#: ../../include/follow.php:171
-msgid "Channel discovery failed."
-msgstr "Kanaal ontdekken mislukt."
+#: ../../include/taxonomy.php:314
+msgid "has"
+msgstr "heeft"
-#: ../../include/follow.php:210
-msgid "Cannot connect to yourself."
-msgstr "Kan niet met jezelf verbinden"
+#: ../../include/taxonomy.php:315
+msgid "want"
+msgstr "wil"
-#: ../../include/bbcode.php:123 ../../include/bbcode.php:881
-#: ../../include/bbcode.php:884 ../../include/bbcode.php:889
-#: ../../include/bbcode.php:892 ../../include/bbcode.php:895
-#: ../../include/bbcode.php:898 ../../include/bbcode.php:903
-#: ../../include/bbcode.php:906 ../../include/bbcode.php:911
-#: ../../include/bbcode.php:914 ../../include/bbcode.php:917
-#: ../../include/bbcode.php:920
-msgid "Image/photo"
-msgstr "Afbeelding/foto"
+#: ../../include/taxonomy.php:315
+msgid "wants"
+msgstr "wil"
-#: ../../include/bbcode.php:162 ../../include/bbcode.php:931
-msgid "Encrypted content"
-msgstr "Versleutelde inhoud"
+#: ../../include/taxonomy.php:316
+msgid "likes"
+msgstr "vindt dit leuk"
-#: ../../include/bbcode.php:178
-#, php-format
-msgid "Install %s element: "
-msgstr "Installeer %s-element: "
+#: ../../include/taxonomy.php:317
+msgid "dislikes"
+msgstr "vindt dit niet leuk"
-#: ../../include/bbcode.php:182
-#, php-format
-msgid ""
-"This post contains an installable %s element, however you lack permissions "
-"to install it on this site."
-msgstr "Dit bericht heeft een te installeren %s-element, maar je hebt geen permissies om het op deze hub te installeren."
+#: ../../include/text.php:460
+msgid "prev"
+msgstr "vorige"
-#: ../../include/bbcode.php:261
-#, php-format
-msgid "%1$s wrote the following %2$s %3$s"
-msgstr "%1$s schreef het volgende %2$s %3$s"
+#: ../../include/text.php:462
+msgid "first"
+msgstr "eerste"
-#: ../../include/bbcode.php:338 ../../include/bbcode.php:346
-msgid "Click to open/close"
-msgstr "Klik om te openen of te sluiten"
+#: ../../include/text.php:491
+msgid "last"
+msgstr "laatste"
-#: ../../include/bbcode.php:346
-msgid "spoiler"
-msgstr "spoiler"
+#: ../../include/text.php:494
+msgid "next"
+msgstr "volgende"
-#: ../../include/bbcode.php:869
-msgid "$1 wrote:"
-msgstr "$1 schreef:"
+#: ../../include/text.php:505
+msgid "older"
+msgstr "ouder"
-#: ../../include/conversation.php:204
-#, php-format
-msgid "%1$s is now connected with %2$s"
-msgstr "%1$s is nu met %2$s verbonden"
+#: ../../include/text.php:507
+msgid "newer"
+msgstr "nieuwer"
-#: ../../include/conversation.php:239
-#, php-format
-msgid "%1$s poked %2$s"
-msgstr "%1$s heeft %2$s aangestoten"
+#: ../../include/text.php:904
+msgid "No connections"
+msgstr "Geen connecties"
-#: ../../include/conversation.php:694
+#: ../../include/text.php:929
#, php-format
-msgid "View %s's profile @ %s"
-msgstr "Bekijk het profiel van %s @ %s"
-
-#: ../../include/conversation.php:713
-msgid "Categories:"
-msgstr "Categorieën:"
+msgid "View all %s connections"
+msgstr "Toon alle %s connecties"
-#: ../../include/conversation.php:714
-msgid "Filed under:"
-msgstr "Bewaard onder:"
-
-#: ../../include/conversation.php:739
-msgid "View in context"
-msgstr "In context bekijken"
+#: ../../include/text.php:1074 ../../include/text.php:1079
+msgid "poke"
+msgstr "aanstoten"
-#: ../../include/conversation.php:849
-msgid "remove"
-msgstr "verwijderen"
+#: ../../include/text.php:1074 ../../include/text.php:1079
+#: ../../include/conversation.php:243
+msgid "poked"
+msgstr "aangestoten"
-#: ../../include/conversation.php:854
-msgid "Delete Selected Items"
-msgstr "Verwijder de geselecteerde items"
+#: ../../include/text.php:1080
+msgid "ping"
+msgstr "ping"
-#: ../../include/conversation.php:947
-msgid "View Source"
-msgstr "Bron weergeven"
+#: ../../include/text.php:1080
+msgid "pinged"
+msgstr "gepingd"
-#: ../../include/conversation.php:948
-msgid "Follow Thread"
-msgstr "Conversatie volgen"
+#: ../../include/text.php:1081
+msgid "prod"
+msgstr "por"
-#: ../../include/conversation.php:949
-msgid "Unfollow Thread"
-msgstr "Conversatie niet meer volgen"
+#: ../../include/text.php:1081
+msgid "prodded"
+msgstr "gepord"
-#: ../../include/conversation.php:954
-msgid "Activity/Posts"
-msgstr "Activiteit/berichten connectie"
+#: ../../include/text.php:1082
+msgid "slap"
+msgstr "slaan"
-#: ../../include/conversation.php:956
-msgid "Edit Connection"
-msgstr "Connectie bewerken"
+#: ../../include/text.php:1082
+msgid "slapped"
+msgstr "sloeg"
-#: ../../include/conversation.php:957
-msgid "Message"
-msgstr "Bericht"
+#: ../../include/text.php:1083
+msgid "finger"
+msgstr "finger"
-#: ../../include/conversation.php:1077
-#, php-format
-msgid "%s likes this."
-msgstr "%s vindt dit leuk."
+#: ../../include/text.php:1083
+msgid "fingered"
+msgstr "gefingerd"
-#: ../../include/conversation.php:1077
-#, php-format
-msgid "%s doesn't like this."
-msgstr "%s vindt dit niet leuk."
+#: ../../include/text.php:1084
+msgid "rebuff"
+msgstr "afpoeieren"
-#: ../../include/conversation.php:1081
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgid_plural "<span %1$s>%2$d people</span> like this."
-msgstr[0] "<span %1$s>%2$d persoon</span> vindt dit leuk."
-msgstr[1] "<span %1$s>%2$d personen</span> vinden dit leuk."
+#: ../../include/text.php:1084
+msgid "rebuffed"
+msgstr "afgepoeierd"
-#: ../../include/conversation.php:1083
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgid_plural "<span %1$s>%2$d people</span> don't like this."
-msgstr[0] "<span %1$s>%2$d persoon</span> vindt dit niet leuk."
-msgstr[1] "<span %1$s>%2$d personen</span> vinden dit niet leuk."
+#: ../../include/text.php:1096
+msgid "happy"
+msgstr "gelukkig"
-#: ../../include/conversation.php:1089
-msgid "and"
-msgstr "en"
+#: ../../include/text.php:1097
+msgid "sad"
+msgstr "bedroefd"
-#: ../../include/conversation.php:1092
-#, php-format
-msgid ", and %d other people"
-msgid_plural ", and %d other people"
-msgstr[0] ", en %d ander persoon"
-msgstr[1] ", en %d andere personen"
+#: ../../include/text.php:1098
+msgid "mellow"
+msgstr "mellow"
-#: ../../include/conversation.php:1093
-#, php-format
-msgid "%s like this."
-msgstr "%s vinden dit leuk."
+#: ../../include/text.php:1099
+msgid "tired"
+msgstr "moe"
-#: ../../include/conversation.php:1093
-#, php-format
-msgid "%s don't like this."
-msgstr "%s vinden dit niet leuk."
+#: ../../include/text.php:1100
+msgid "perky"
+msgstr "parmantig"
-#: ../../include/conversation.php:1136
-msgid "Set your location"
-msgstr "Locatie instellen"
+#: ../../include/text.php:1101
+msgid "angry"
+msgstr "boos"
-#: ../../include/conversation.php:1137
-msgid "Clear browser location"
-msgstr "Locatie van webbrowser wissen"
+#: ../../include/text.php:1102
+msgid "stupefied"
+msgstr "verbijsterd"
-#: ../../include/conversation.php:1185
-msgid "Tag term:"
-msgstr "Tag:"
+#: ../../include/text.php:1103
+msgid "puzzled"
+msgstr "verward"
-#: ../../include/conversation.php:1186
-msgid "Where are you right now?"
-msgstr "Waar bevind je je op dit moment?"
+#: ../../include/text.php:1104
+msgid "interested"
+msgstr "geïnteresseerd"
-#: ../../include/conversation.php:1195
-msgid "Comments enabled"
-msgstr "Reacties ingeschakeld"
+#: ../../include/text.php:1105
+msgid "bitter"
+msgstr "verbitterd"
-#: ../../include/conversation.php:1196
-msgid "Comments disabled"
-msgstr "Reacties uitgeschakeld"
+#: ../../include/text.php:1106
+msgid "cheerful"
+msgstr "vrolijk"
-#: ../../include/conversation.php:1234
-msgid "Page link name"
-msgstr "Linknaam pagina"
+#: ../../include/text.php:1107
+msgid "alive"
+msgstr "levendig"
-#: ../../include/conversation.php:1237
-msgid "Post as"
-msgstr "Bericht plaatsen als"
+#: ../../include/text.php:1108
+msgid "annoyed"
+msgstr "geërgerd"
-#: ../../include/conversation.php:1251
-msgid "Toggle voting"
-msgstr "Peiling in- of uitschakelen"
+#: ../../include/text.php:1109
+msgid "anxious"
+msgstr "bezorgd"
-#: ../../include/conversation.php:1254
-msgid "Disable comments"
-msgstr "Reacties uitschakelen"
+#: ../../include/text.php:1110
+msgid "cranky"
+msgstr "humeurig"
-#: ../../include/conversation.php:1255
-msgid "Toggle comments"
-msgstr "Reacties in- of uitschakelen"
+#: ../../include/text.php:1111
+msgid "disturbed"
+msgstr "verontrust"
-#: ../../include/conversation.php:1263
-msgid "Categories (optional, comma-separated list)"
-msgstr "Categorieën (optioneel, door komma's gescheiden lijst)"
+#: ../../include/text.php:1112
+msgid "frustrated"
+msgstr "gefrustreerd "
-#: ../../include/conversation.php:1286
-msgid "Other networks and post services"
-msgstr "Andere netwerken en diensten"
+#: ../../include/text.php:1113
+msgid "depressed"
+msgstr "gedeprimeerd"
-#: ../../include/conversation.php:1292
-msgid "Set publish date"
-msgstr "Publicatiedatum instellen"
+#: ../../include/text.php:1114
+msgid "motivated"
+msgstr "gemotiveerd"
-#: ../../include/conversation.php:1541
-msgid "Discover"
-msgstr "Ontdekken"
+#: ../../include/text.php:1115
+msgid "relaxed"
+msgstr "ontspannen"
-#: ../../include/conversation.php:1544
-msgid "Imported public streams"
-msgstr "Openbare streams importeren"
+#: ../../include/text.php:1116
+msgid "surprised"
+msgstr "verrast"
-#: ../../include/conversation.php:1549
-msgid "Commented Order"
-msgstr "Nieuwe reacties bovenaan"
+#: ../../include/text.php:1307
+msgid "May"
+msgstr "mei"
-#: ../../include/conversation.php:1552
-msgid "Sort by Comment Date"
-msgstr "Berichten met nieuwe reacties bovenaan"
+#: ../../include/text.php:1384 ../../include/text.php:1388
+msgid "Unknown Attachment"
+msgstr "Onbekende bijlage"
-#: ../../include/conversation.php:1556
-msgid "Posted Order"
-msgstr "Nieuwe berichten bovenaan"
+#: ../../include/text.php:1390
+msgid "unknown"
+msgstr "onbekend"
-#: ../../include/conversation.php:1559
-msgid "Sort by Post Date"
-msgstr "Nieuwe berichten bovenaan"
+#: ../../include/text.php:1426
+msgid "remove category"
+msgstr "categorie verwijderen"
-#: ../../include/conversation.php:1567
-msgid "Posts that mention or involve you"
-msgstr "Alleen berichten die jou vermelden of waar je op een andere manier bij betrokken bent"
+#: ../../include/text.php:1503
+msgid "remove from file"
+msgstr "uit map verwijderen"
-#: ../../include/conversation.php:1576
-msgid "Activity Stream - by date"
-msgstr "Activiteitenstroom - volgens datum"
+#: ../../include/text.php:1770 ../../include/language.php:367
+msgid "default"
+msgstr "standaard"
-#: ../../include/conversation.php:1582
-msgid "Starred"
-msgstr "Met ster"
+#: ../../include/text.php:1778
+msgid "Page layout"
+msgstr "Pagina-lay-out"
-#: ../../include/conversation.php:1585
-msgid "Favourite Posts"
-msgstr "Favoriete berichten"
+#: ../../include/text.php:1778
+msgid "You can create your own with the layouts tool"
+msgstr "Je kan jouw eigen lay-out ontwerpen onder lay-outs"
-#: ../../include/conversation.php:1592
-msgid "Spam"
-msgstr "Spam"
+#: ../../include/text.php:1820
+msgid "Page content type"
+msgstr "Opmaaktype"
-#: ../../include/conversation.php:1595
-msgid "Posts flagged as SPAM"
-msgstr "Berichten gemarkeerd als SPAM"
+#: ../../include/text.php:1953
+msgid "activity"
+msgstr "activiteit"
-#: ../../include/conversation.php:1654
-msgid "Status Messages and Posts"
-msgstr "Berichten in dit kanaal"
+#: ../../include/text.php:2267
+msgid "Design Tools"
+msgstr "Ontwerp-hulpmiddelen"
-#: ../../include/conversation.php:1663
-msgid "About"
-msgstr "Over"
+#: ../../include/text.php:2273
+msgid "Pages"
+msgstr "Pagina's"
-#: ../../include/conversation.php:1666
-msgid "Profile Details"
-msgstr "Profiel"
+#: ../../include/text.php:2295
+msgid "Import website..."
+msgstr "Website importeren..."
-#: ../../include/conversation.php:1682
-msgid "Files and Storage"
-msgstr "Bestanden en opslagruimte"
+#: ../../include/text.php:2296
+msgid "Select folder to import"
+msgstr "Kies een map om te importeren"
-#: ../../include/conversation.php:1702 ../../include/conversation.php:1705
-#: ../../include/widgets.php:883
-msgid "Chatrooms"
-msgstr "Chatkanalen"
+#: ../../include/text.php:2297
+msgid "Import from a zipped folder:"
+msgstr "Vanuit een zipbestand importeren:"
-#: ../../include/conversation.php:1718
-msgid "Saved Bookmarks"
-msgstr "Opgeslagen bladwijzers"
+#: ../../include/text.php:2298
+msgid "Import from cloud files:"
+msgstr "Vanuit de cloud importeren:"
-#: ../../include/conversation.php:1728
-msgid "Manage Webpages"
-msgstr "Webpagina's beheren"
+#: ../../include/text.php:2299
+msgid "/cloud/channel/path/to/folder"
+msgstr "/cloud/channel/maplocatie"
-#: ../../include/conversation.php:1793
-msgctxt "noun"
-msgid "Attending"
-msgid_plural "Attending"
-msgstr[0] "aanwezig"
-msgstr[1] "aanwezig"
+#: ../../include/text.php:2300
+msgid "Enter path to website files"
+msgstr "Voer de locatie in van de websitebestanden"
-#: ../../include/conversation.php:1796
-msgctxt "noun"
-msgid "Not Attending"
-msgid_plural "Not Attending"
-msgstr[0] "niet aanwezig"
-msgstr[1] "niet aanwezig"
+#: ../../include/text.php:2301
+msgid "Select folder"
+msgstr "Kies een map"
-#: ../../include/conversation.php:1799
-msgctxt "noun"
-msgid "Undecided"
-msgid_plural "Undecided"
-msgstr[0] "nog niet beslist"
-msgstr[1] "nog niet beslist"
+#: ../../include/text.php:2302
+msgid "Export website..."
+msgstr "Website exporteren..."
-#: ../../include/conversation.php:1802
-msgctxt "noun"
-msgid "Agree"
-msgid_plural "Agrees"
-msgstr[0] "eens"
-msgstr[1] "eens"
+#: ../../include/text.php:2303
+msgid "Export to a zip file"
+msgstr "Naar een zipbestand exporteren"
-#: ../../include/conversation.php:1805
-msgctxt "noun"
-msgid "Disagree"
-msgid_plural "Disagrees"
-msgstr[0] "oneens"
-msgstr[1] "oneens"
+#: ../../include/text.php:2304
+msgid "website.zip"
+msgstr "website.zip"
-#: ../../include/conversation.php:1808
-msgctxt "noun"
-msgid "Abstain"
-msgid_plural "Abstains"
-msgstr[0] "onthouding"
-msgstr[1] "onthoudingen"
+#: ../../include/text.php:2305
+msgid "Enter a name for the zip file."
+msgstr "Vul een naam in voor het zipbestand."
-#: ../../include/datetime.php:147
-msgid "Birthday"
-msgstr "Verjaardag of geboortedatum"
+#: ../../include/text.php:2306
+msgid "Export to cloud files"
+msgstr "Naar de cloud exporteren"
-#: ../../include/datetime.php:149
-msgid "Age: "
-msgstr "Leeftijd:"
+#: ../../include/text.php:2307
+msgid "/path/to/export/folder"
+msgstr "/locatie/van/export/map"
-#: ../../include/datetime.php:151
-msgid "YYYY-MM-DD or MM-DD"
-msgstr "JJJJ-MM-DD of MM-DD"
+#: ../../include/text.php:2308
+msgid "Enter a path to a cloud files destination."
+msgstr "Voer de locatie in van de cloudbestemming"
-#: ../../include/datetime.php:284 ../../boot.php:2578
-msgid "never"
-msgstr "nooit"
+#: ../../include/text.php:2309
+msgid "Specify folder"
+msgstr "Selecteer een map"
-#: ../../include/datetime.php:290
-msgid "less than a second ago"
-msgstr "minder dan een seconde geleden"
+#: ../../include/import.php:30
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "Kan geen dubbele kanaal-identificator op deze hub aanmaken. Importeren mislukt."
-#: ../../include/datetime.php:308
-#, php-format
-msgctxt "e.g. 22 hours ago, 1 minute ago"
-msgid "%1$d %2$s ago"
-msgstr "%1$d %2$s geleden"
+#: ../../include/import.php:90
+msgid "Channel clone failed. Import failed."
+msgstr "Het klonen van het kanaal is mislukt. Importeren mislukt."
-#: ../../include/datetime.php:319
-msgctxt "relative_date"
-msgid "year"
-msgid_plural "years"
-msgstr[0] "jaar"
-msgstr[1] "jaren"
+#: ../../include/import.php:1354
+msgid "Unable to import element \""
+msgstr "Niet in staat om dit element te importeren: \""
-#: ../../include/datetime.php:322
-msgctxt "relative_date"
-msgid "month"
-msgid_plural "months"
-msgstr[0] "maand"
-msgstr[1] "maanden"
+#: ../../include/security.php:117
+msgid "guest:"
+msgstr "gast:"
-#: ../../include/datetime.php:325
-msgctxt "relative_date"
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "week"
-msgstr[1] "weken"
+#: ../../include/security.php:535
+msgid ""
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
+msgstr "De beveiligings-token van het tekstvak was ongeldig. Dit is mogelijk het gevolg van dat er te lang (meer dan 3 uur) gewacht is om de tekst op te slaan. "
-#: ../../include/datetime.php:328
-msgctxt "relative_date"
-msgid "day"
-msgid_plural "days"
-msgstr[0] "dag"
-msgstr[1] "dagen"
+#: ../../include/items.php:837 ../../include/items.php:882
+msgid "(Unknown)"
+msgstr "(Onbekend)"
-#: ../../include/datetime.php:331
-msgctxt "relative_date"
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "uur"
-msgstr[1] "uren"
+#: ../../include/items.php:1080
+msgid "Visible to anybody on the internet."
+msgstr "Voor iedereen op het internet zichtbaar."
-#: ../../include/datetime.php:334
-msgctxt "relative_date"
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "minuut"
-msgstr[1] "minuten"
+#: ../../include/items.php:1082
+msgid "Visible to you only."
+msgstr "Alleen voor jou zichtbaar."
-#: ../../include/datetime.php:337
-msgctxt "relative_date"
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "seconde"
-msgstr[1] "seconden"
+#: ../../include/items.php:1084
+msgid "Visible to anybody in this network."
+msgstr "Voor iedereen in dit netwerk zichtbaar."
-#: ../../include/datetime.php:574
-#, php-format
-msgid "%1$s's birthday"
-msgstr "Verjaardag van %1$s"
+#: ../../include/items.php:1086
+msgid "Visible to anybody authenticated."
+msgstr "Voor iedereen die geauthenticeerd is zichtbaar."
-#: ../../include/datetime.php:575
+#: ../../include/items.php:1088
#, php-format
-msgid "Happy Birthday %1$s"
-msgstr "Gefeliciteerd met je verjaardag %1$s"
-
-#: ../../include/dir_fns.php:141
-msgid "Directory Options"
-msgstr "Opties kanalengids"
-
-#: ../../include/dir_fns.php:143
-msgid "Safe Mode"
-msgstr "Veilig zoeken"
-
-#: ../../include/dir_fns.php:144
-msgid "Public Forums Only"
-msgstr "Alleen openbare forums"
+msgid "Visible to anybody on %s."
+msgstr "Voor iedereen op %s zichtbaar."
-#: ../../include/dir_fns.php:145
-msgid "This Website Only"
-msgstr "Alleen deze hub"
+#: ../../include/items.php:1090
+msgid "Visible to all connections."
+msgstr "Voor alle connecties zichtbaar."
-#: ../../include/event.php:824
-msgid "This event has been added to your calendar."
-msgstr "Dit evenement is aan jouw agenda toegevoegd."
+#: ../../include/items.php:1092
+msgid "Visible to approved connections."
+msgstr "Voor alle geaccepteerde connecties zichtbaar."
-#: ../../include/event.php:1024
-msgid "Not specified"
-msgstr "Niet aangegeven"
+#: ../../include/items.php:1094
+msgid "Visible to specific connections."
+msgstr "Voor specifieke connecties zichtbaar."
-#: ../../include/event.php:1025
-msgid "Needs Action"
-msgstr "Actie vereist"
+#: ../../include/items.php:3892
+msgid "Privacy group is empty."
+msgstr "Privacygroep is leeg"
-#: ../../include/event.php:1026
-msgid "Completed"
-msgstr "Voltooid"
+#: ../../include/items.php:3899
+#, php-format
+msgid "Privacy group: %s"
+msgstr "Privacygroep: %s"
-#: ../../include/event.php:1027
-msgid "In Process"
-msgstr "In behandeling"
+#: ../../include/items.php:3911
+msgid "Connection not found."
+msgstr "Connectie niet gevonden."
-#: ../../include/event.php:1028
-msgid "Cancelled"
-msgstr "Geannuleerd"
+#: ../../include/items.php:4260
+msgid "profile photo"
+msgstr "profielfoto"
-#: ../../include/import.php:30
-msgid ""
-"Cannot create a duplicate channel identifier on this system. Import failed."
-msgstr "Kan geen dubbele kanaal-identificator op deze hub aanmaken. Importeren mislukt."
+#: ../../include/items.php:4456
+#, php-format
+msgid "[Edited %s]"
+msgstr "[%s bewerkt]"
-#: ../../include/import.php:97
-msgid "Channel clone failed. Import failed."
-msgstr "Het klonen van het kanaal is mislukt. Importeren mislukt."
+#: ../../include/items.php:4456
+msgctxt "edit_activity"
+msgid "Post"
+msgstr "Bericht"
-#: ../../include/import.php:1447
-msgid "Unable to import element \""
-msgstr "Niet in staat om dit element te importeren: \""
+#: ../../include/items.php:4456
+msgctxt "edit_activity"
+msgid "Comment"
+msgstr "Reactie"
#: ../../include/auth.php:148
msgid "Logged out."
@@ -9489,10 +12375,6 @@ msgstr "Uitgelogd."
msgid "Failed authentication"
msgstr "Mislukte authenticatie"
-#: ../../include/auth.php:286
-msgid "Login failed."
-msgstr "Inloggen mislukt."
-
#: ../../include/activities.php:41
msgid " and "
msgstr " en "
@@ -9516,142 +12398,230 @@ msgstr "Bezoek het %2$s van %1$s"
msgid "%1$s has an updated %2$s, changing %3$s."
msgstr "%1$s heeft een aangepaste %2$s, %3$s veranderd."
-#: ../../include/network.php:704
-msgid "view full size"
-msgstr "volledige grootte tonen"
+#: ../../include/attach.php:248 ../../include/attach.php:336
+msgid "Item was not found."
+msgstr "Item niet gevonden"
-#: ../../include/network.php:1953
-msgid "No Subject"
-msgstr "Geen onderwerp"
+#: ../../include/attach.php:497
+msgid "No source file."
+msgstr "Geen bronbestand."
-#: ../../include/network.php:2207 ../../include/network.php:2208
-msgid "Friendica"
-msgstr "Friendica"
+#: ../../include/attach.php:519
+msgid "Cannot locate file to replace"
+msgstr "Kan het te vervangen bestand niet vinden"
-#: ../../include/network.php:2209
-msgid "OStatus"
-msgstr "OStatus"
+#: ../../include/attach.php:537
+msgid "Cannot locate file to revise/update"
+msgstr "Kan het bestand wat aangepast moet worden niet vinden"
-#: ../../include/network.php:2210
-msgid "GNU-Social"
-msgstr "GNU social"
+#: ../../include/attach.php:668
+#, php-format
+msgid "File exceeds size limit of %d"
+msgstr "Bestand is groter dan de toegelaten %d"
-#: ../../include/network.php:2211
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
+#: ../../include/attach.php:682
+#, php-format
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+msgstr "Je hebt jouw limiet van %1$.0f MB opslagruimte voor bijlagen bereikt."
-#: ../../include/network.php:2213
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../include/attach.php:852
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Uploaden van bestand mislukt. Mogelijk systeemlimiet bereikt of actie afgebroken."
-#: ../../include/network.php:2214
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../include/attach.php:865
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Opgeslagen bestand kon niet worden geverifieerd. Uploaden mislukt."
-#: ../../include/network.php:2215
-msgid "Zot"
-msgstr "Zot"
+#: ../../include/attach.php:920 ../../include/attach.php:936
+msgid "Path not available."
+msgstr "Locatie niet beschikbaar."
-#: ../../include/network.php:2216
-msgid "LinkedIn"
-msgstr "LinkedIn"
+#: ../../include/attach.php:982 ../../include/attach.php:1140
+msgid "Empty pathname"
+msgstr "Ontbrekende locatienaam"
-#: ../../include/network.php:2217
-msgid "XMPP/IM"
-msgstr "XMPP/IM"
+#: ../../include/attach.php:1008
+msgid "duplicate filename or path"
+msgstr "dubbele bestandsnaam of locatie"
-#: ../../include/network.php:2218
-msgid "MySpace"
-msgstr "MySpace"
+#: ../../include/attach.php:1030
+msgid "Path not found."
+msgstr "Locatie niet gevonden"
-#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
-#: ../../include/contact_widgets.php:91 ../../include/widgets.php:46
-#: ../../include/widgets.php:465
-msgid "Categories"
-msgstr "Categorieën"
+#: ../../include/attach.php:1094
+msgid "mkdir failed."
+msgstr "directory aanmaken (mkdir) mislukt."
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
-msgid "Tags"
-msgstr "Tags"
+#: ../../include/attach.php:1098
+msgid "database storage failed."
+msgstr "opslag in database mislukt."
-#: ../../include/taxonomy.php:293
-msgid "Keywords"
-msgstr "Trefwoorden"
+#: ../../include/attach.php:1146
+msgid "Empty path"
+msgstr "Ontbrekende locatie"
-#: ../../include/taxonomy.php:314
-msgid "have"
-msgstr "heb"
+#: ../../include/event.php:824
+msgid "This event has been added to your calendar."
+msgstr "Dit evenement is aan jouw agenda toegevoegd."
-#: ../../include/taxonomy.php:314
-msgid "has"
-msgstr "heeft"
+#: ../../include/event.php:1024
+msgid "Not specified"
+msgstr "Niet aangegeven"
-#: ../../include/taxonomy.php:315
-msgid "want"
-msgstr "wil"
+#: ../../include/event.php:1025
+msgid "Needs Action"
+msgstr "Actie vereist"
-#: ../../include/taxonomy.php:315
-msgid "wants"
-msgstr "wil"
+#: ../../include/event.php:1026
+msgid "Completed"
+msgstr "Voltooid"
-#: ../../include/taxonomy.php:316
-msgid "likes"
-msgstr "vindt dit leuk"
+#: ../../include/event.php:1027
+msgid "In Process"
+msgstr "In behandeling"
-#: ../../include/taxonomy.php:317
-msgid "dislikes"
-msgstr "vindt dit niet leuk"
+#: ../../include/event.php:1028
+msgid "Cancelled"
+msgstr "Geannuleerd"
-#: ../../include/contact_widgets.php:11
+#: ../../include/follow.php:27
+msgid "Channel is blocked on this site."
+msgstr "Kanaal is op deze hub geblokkeerd."
+
+#: ../../include/follow.php:32
+msgid "Channel location missing."
+msgstr "Ontbrekende kanaallocatie."
+
+#: ../../include/follow.php:80
+msgid "Response from remote channel was incomplete."
+msgstr "Antwoord van het kanaal op afstand was niet volledig."
+
+#: ../../include/follow.php:97
+msgid "Channel was deleted and no longer exists."
+msgstr "Kanaal is verwijderd en bestaat niet meer."
+
+#: ../../include/follow.php:147 ../../include/follow.php:183
+msgid "Protocol disabled."
+msgstr "Protocol uitgeschakeld."
+
+#: ../../include/follow.php:171
+msgid "Channel discovery failed."
+msgstr "Kanaal ontdekken mislukt."
+
+#: ../../include/follow.php:210
+msgid "Cannot connect to yourself."
+msgstr "Kan niet met jezelf verbinden"
+
+#: ../../include/group.php:26
+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 "Een verwijderde collectie met deze naam is gereactiveerd. Bestaande itemrechten <strong>kunnen</strong> van toepassing zijn op deze collectie en toekomstige leden. Wanneer je dit niet zo bedoeld hebt, moet je een nieuwe collectie met een andere naam aanmaken."
+
+#: ../../include/group.php:248
+msgid "Add new connections to this privacy group"
+msgstr "Voeg nieuwe connecties aan deze privacygroep toe"
+
+#: ../../include/group.php:289
+msgid "edit"
+msgstr "bewerken"
+
+#: ../../include/group.php:312
+msgid "Edit group"
+msgstr "Privacygroep bewerken"
+
+#: ../../include/group.php:313
+msgid "Add privacy group"
+msgstr "Privacygroep toevoegen"
+
+#: ../../include/group.php:314
+msgid "Channels not in any privacy group"
+msgstr "Kanalen die zich in geen enkele privacygroep bevinden"
+
+#: ../../include/group.php:316 ../../include/widgets.php:284
+msgid "add"
+msgstr "toevoegen"
+
+#: ../../include/language.php:380
+msgid "Select an alternate language"
+msgstr "Kies een andere taal"
+
+#: ../../include/photos.php:115
#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d uitnodiging beschikbaar"
-msgstr[1] "%d uitnodigingen beschikbaar"
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes"
-#: ../../include/contact_widgets.php:19
-msgid "Find Channels"
-msgstr "Kanalen vinden"
+#: ../../include/photos.php:122
+msgid "Image file is empty."
+msgstr "Afbeeldingsbestand is leeg"
-#: ../../include/contact_widgets.php:20
-msgid "Enter name or interest"
-msgstr "Vul naam of interesse in"
+#: ../../include/photos.php:260
+msgid "Photo storage failed."
+msgstr "Foto kan niet worden opgeslagen"
-#: ../../include/contact_widgets.php:21
-msgid "Connect/Follow"
-msgstr "Verbinden/volgen"
+#: ../../include/photos.php:300
+msgid "a new photo"
+msgstr "een nieuwe foto"
-#: ../../include/contact_widgets.php:22
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Voorbeeld: Robert Morgenstein, vissen"
+#: ../../include/photos.php:304
+#, php-format
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
+msgstr "%1$s plaatste %2$s op %3$s"
-#: ../../include/contact_widgets.php:26
-msgid "Random Profile"
-msgstr "Willekeurig profiel"
+#: ../../include/photos.php:507 ../../include/conversation.php:1677
+msgid "Photo Albums"
+msgstr "Fotoalbums"
-#: ../../include/contact_widgets.php:27
-msgid "Invite Friends"
-msgstr "Vrienden uitnodigen"
+#: ../../include/photos.php:511
+msgid "Upload New Photos"
+msgstr "Nieuwe foto's uploaden"
-#: ../../include/contact_widgets.php:29
-msgid "Advanced example: name=fred and country=iceland"
-msgstr "Geavanceerd voorbeeld (Engels): name=jan en country=nederland"
+#: ../../include/acl_selectors.php:198
+msgid "Who can see this?"
+msgstr "Wie kan dit zien?"
-#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
-#: ../../include/widgets.php:349 ../../include/widgets.php:468
-msgid "Everything"
-msgstr "Alles"
+#: ../../include/acl_selectors.php:199
+msgid "Custom selection"
+msgstr "Handmatige selectie"
-#: ../../include/contact_widgets.php:122
+#: ../../include/acl_selectors.php:200
+msgid ""
+"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
+" the scope of \"Show\"."
+msgstr "Kies \"Tonen\" om weergave toe te staan. Met \"Niet tonen\" kan je uitzonderingen maken op \"Tonen\"."
+
+#: ../../include/acl_selectors.php:201
+msgid "Show"
+msgstr "Tonen"
+
+#: ../../include/acl_selectors.php:202
+msgid "Don't show"
+msgstr "Niet tonen"
+
+#: ../../include/acl_selectors.php:235
#, php-format
-msgid "%d connection in common"
-msgid_plural "%d connections in common"
-msgstr[0] "%d gemeenschappelijke connectie"
-msgstr[1] "%d gemeenschappelijke connecties"
+msgid ""
+"Post permissions %s cannot be changed %s after a post is shared.</br />These"
+" permissions set who is allowed to view the post."
+msgstr "Permissies van berichten %s zijn niet meer te veranderen %s nadat een bericht is gedeeld.</br />Met deze permissies bepaal je wie het bericht kan zien."
-#: ../../include/contact_widgets.php:127
-msgid "show more"
-msgstr "meer connecties weergeven"
+#: ../../include/oembed.php:312
+msgid " by "
+msgstr " door "
+
+#: ../../include/oembed.php:313
+msgid " on "
+msgstr " op "
+
+#: ../../include/oembed.php:342
+msgid "Embedded content"
+msgstr "Ingesloten (embedded) inhoud"
+
+#: ../../include/oembed.php:351
+msgid "Embedding disabled"
+msgstr "Insluiten (embedding) uitgeschakeld"
#: ../../include/widgets.php:103
msgid "System"
@@ -9778,6 +12748,11 @@ msgstr "Exporteren"
msgid "Import Calendar"
msgstr "Importeren"
+#: ../../include/widgets.php:883 ../../include/conversation.php:1704
+#: ../../include/conversation.php:1707
+msgid "Chatrooms"
+msgstr "Chatkanalen"
+
#: ../../include/widgets.php:887
msgid "Overview"
msgstr "Overzicht"
@@ -9786,205 +12761,487 @@ msgstr "Overzicht"
msgid "Chat Members"
msgstr "Chatleden"
-#: ../../include/widgets.php:916
+#: ../../include/widgets.php:906
msgid "Wiki List"
msgstr "Wiki's"
-#: ../../include/widgets.php:954
+#: ../../include/widgets.php:944
msgid "Wiki Pages"
msgstr "Wikipagina's"
-#: ../../include/widgets.php:989
+#: ../../include/widgets.php:949
+msgid "Add new page"
+msgstr "Nieuwe pagina toevoegen"
+
+#: ../../include/widgets.php:950
+msgid "Page name"
+msgstr "Paginanaam"
+
+#: ../../include/widgets.php:983
msgid "Bookmarked Chatrooms"
msgstr "Bladwijzers van chatkanalen"
-#: ../../include/widgets.php:1020
+#: ../../include/widgets.php:1014
msgid "Suggested Chatrooms"
msgstr "Voorgestelde chatkanalen"
-#: ../../include/widgets.php:1166 ../../include/widgets.php:1278
+#: ../../include/widgets.php:1159 ../../include/widgets.php:1271
msgid "photo/image"
msgstr "foto/afbeelding"
-#: ../../include/widgets.php:1221
+#: ../../include/widgets.php:1214
msgid "Click to show more"
msgstr "Klik voor meer"
-#: ../../include/widgets.php:1372
+#: ../../include/widgets.php:1365
msgid "Rating Tools"
msgstr "Beoordelingen"
-#: ../../include/widgets.php:1376 ../../include/widgets.php:1378
+#: ../../include/widgets.php:1369 ../../include/widgets.php:1371
msgid "Rate Me"
msgstr "Beoordeel mij"
-#: ../../include/widgets.php:1381
+#: ../../include/widgets.php:1374
msgid "View Ratings"
msgstr "Bekijk beoordelingen"
-#: ../../include/widgets.php:1465
+#: ../../include/widgets.php:1467
msgid "Forums"
msgstr "Forums"
-#: ../../include/widgets.php:1494
+#: ../../include/widgets.php:1496
msgid "Tasks"
msgstr "Taken"
-#: ../../include/widgets.php:1505
-msgid "Documentation"
-msgstr "Documentatie"
-
-#: ../../include/widgets.php:1561 ../../include/widgets.php:1599
+#: ../../include/widgets.php:1562 ../../include/widgets.php:1600
msgid "Member registrations waiting for confirmation"
msgstr "Accounts die op goedkeuring wachten"
-#: ../../include/widgets.php:1567
+#: ../../include/widgets.php:1568
msgid "Inspect queue"
msgstr "Inspecteer berichtenwachtrij"
-#: ../../include/widgets.php:1569
+#: ../../include/widgets.php:1570
msgid "DB updates"
msgstr "Database-updates"
-#: ../../include/widgets.php:1595
+#: ../../include/widgets.php:1596
msgid "Plugin Features"
msgstr "Plugin-opties"
-#: ../../include/api.php:1330
-msgid "Public Timeline"
-msgstr "Openbare tijdlijn"
+#: ../../include/network.php:729
+msgid "view full size"
+msgstr "volledige grootte tonen"
-#: ../../include/oembed.php:322
-msgid " by "
-msgstr " door "
+#: ../../include/network.php:1978
+msgid "No Subject"
+msgstr "Geen onderwerp"
-#: ../../include/oembed.php:323
-msgid " on "
-msgstr " op "
+#: ../../include/network.php:2234
+msgid "OStatus"
+msgstr "OStatus"
-#: ../../include/oembed.php:352
-msgid "Embedded content"
-msgstr "Ingesloten (embedded) inhoud"
+#: ../../include/network.php:2235
+msgid "GNU-Social"
+msgstr "GNU social"
-#: ../../include/oembed.php:361
-msgid "Embedding disabled"
-msgstr "Insluiten (embedding) uitgeschakeld"
+#: ../../include/network.php:2236
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
-#: ../../include/items.php:918 ../../include/items.php:963
-msgid "(Unknown)"
-msgstr "(Onbekend)"
+#: ../../include/network.php:2239
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../include/items.php:1162
-msgid "Visible to anybody on the internet."
-msgstr "Voor iedereen op het internet zichtbaar."
+#: ../../include/network.php:2240
+msgid "Zot"
+msgstr "Zot"
-#: ../../include/items.php:1164
-msgid "Visible to you only."
-msgstr "Alleen voor jou zichtbaar."
+#: ../../include/network.php:2241
+msgid "LinkedIn"
+msgstr "LinkedIn"
-#: ../../include/items.php:1166
-msgid "Visible to anybody in this network."
-msgstr "Voor iedereen in dit netwerk zichtbaar."
+#: ../../include/network.php:2242
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
-#: ../../include/items.php:1168
-msgid "Visible to anybody authenticated."
-msgstr "Voor iedereen die geauthenticeerd is zichtbaar."
+#: ../../include/network.php:2243
+msgid "MySpace"
+msgstr "MySpace"
-#: ../../include/items.php:1170
-#, php-format
-msgid "Visible to anybody on %s."
-msgstr "Voor iedereen op %s zichtbaar."
+#: ../../include/permissions.php:35
+msgid "Can view my normal stream and posts"
+msgstr "Kan mijn normale kanaalstream en berichten bekijken"
-#: ../../include/items.php:1172
-msgid "Visible to all connections."
-msgstr "Voor alle connecties zichtbaar."
+#: ../../include/permissions.php:39
+msgid "Can view my webpages"
+msgstr "Kan mijn pagina's bekijken"
-#: ../../include/items.php:1174
-msgid "Visible to approved connections."
-msgstr "Voor alle geaccepteerde connecties zichtbaar."
+#: ../../include/permissions.php:43
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Kan een bericht in mijn kanaal plaatsen"
-#: ../../include/items.php:1176
-msgid "Visible to specific connections."
-msgstr "Voor specifieke connecties zichtbaar."
+#: ../../include/permissions.php:46
+msgid "Can like/dislike stuff"
+msgstr "Kan dingen leuk of niet leuk vinden"
-#: ../../include/items.php:3976
-msgid "Privacy group is empty."
-msgstr "Privacygroep is leeg"
+#: ../../include/permissions.php:46
+msgid "Profiles and things other than posts/comments"
+msgstr "Profielen en dingen, buiten berichten en reacties"
+
+#: ../../include/permissions.php:48
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Kan naar al mijn kanaalconnecties berichten doorsturen met behulp van @vermeldingen+"
+
+#: ../../include/permissions.php:48
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Geavanceerd - nuttig voor groepforums"
+
+#: ../../include/permissions.php:49
+msgid "Can chat with me (when available)"
+msgstr "Kan met mij chatten (wanneer beschikbaar)"
-#: ../../include/items.php:3983
+#: ../../include/permissions.php:50
+msgid "Can write to my file storage and photos"
+msgstr "Kan foto's en andere bestanden aan mijn bestandsopslag toevoegen"
+
+#: ../../include/permissions.php:51
+msgid "Can edit my webpages"
+msgstr "Kan mijn pagina's bewerken"
+
+#: ../../include/permissions.php:53
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Enigszins geavanceerd (erg nuttig voor kanalen van forums/groepen)"
+
+#: ../../include/permissions.php:55
+msgid "Can administer my channel resources"
+msgstr "Kan mijn kanaal beheren"
+
+#: ../../include/permissions.php:55
+msgid ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Zeer geavanceerd. Laat dit met rust, behalve als je weet wat je doet."
+
+#: ../../include/conversation.php:204
#, php-format
-msgid "Privacy group: %s"
-msgstr "Privacygroep: %s"
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s is nu met %2$s verbonden"
-#: ../../include/items.php:3995
-msgid "Connection not found."
-msgstr "Connectie niet gevonden."
+#: ../../include/conversation.php:239
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s heeft %2$s aangestoten"
-#: ../../include/items.php:4348
-msgid "profile photo"
-msgstr "profielfoto"
+#: ../../include/conversation.php:690
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "Bekijk het profiel van %s @ %s"
-#: ../../include/attach.php:248 ../../include/attach.php:334
-msgid "Item was not found."
-msgstr "Item niet gevonden"
+#: ../../include/conversation.php:709
+msgid "Categories:"
+msgstr "Categorieën:"
-#: ../../include/attach.php:500
-msgid "No source file."
-msgstr "Geen bronbestand."
+#: ../../include/conversation.php:710
+msgid "Filed under:"
+msgstr "Bewaard onder:"
-#: ../../include/attach.php:522
-msgid "Cannot locate file to replace"
-msgstr "Kan het te vervangen bestand niet vinden"
+#: ../../include/conversation.php:735
+msgid "View in context"
+msgstr "In context bekijken"
-#: ../../include/attach.php:540
-msgid "Cannot locate file to revise/update"
-msgstr "Kan het bestand wat aangepast moet worden niet vinden"
+#: ../../include/conversation.php:831
+msgid "remove"
+msgstr "verwijderen"
+
+#: ../../include/conversation.php:836
+msgid "Delete Selected Items"
+msgstr "Verwijder de geselecteerde items"
+
+#: ../../include/conversation.php:929
+msgid "View Source"
+msgstr "Bron weergeven"
+
+#: ../../include/conversation.php:930
+msgid "Follow Thread"
+msgstr "Conversatie volgen"
+
+#: ../../include/conversation.php:931
+msgid "Unfollow Thread"
+msgstr "Conversatie niet meer volgen"
+
+#: ../../include/conversation.php:936
+msgid "Activity/Posts"
+msgstr "Activiteit/berichten connectie"
+
+#: ../../include/conversation.php:938
+msgid "Edit Connection"
+msgstr "Connectie bewerken"
-#: ../../include/attach.php:675
+#: ../../include/conversation.php:939
+msgid "Message"
+msgstr "Bericht"
+
+#: ../../include/conversation.php:1075
#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "Bestand is groter dan de toegelaten %d"
+msgid "%s likes this."
+msgstr "%s vindt dit leuk."
-#: ../../include/attach.php:689
+#: ../../include/conversation.php:1075
#, php-format
-msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
-msgstr "Je hebt jouw limiet van %1$.0f MB opslagruimte voor bijlagen bereikt."
+msgid "%s doesn't like this."
+msgstr "%s vindt dit niet leuk."
-#: ../../include/attach.php:854
-msgid "File upload failed. Possible system limit or action terminated."
-msgstr "Uploaden van bestand mislukt. Mogelijk systeemlimiet bereikt of actie afgebroken."
+#: ../../include/conversation.php:1079
+#, php-format
+msgid "<span %1$s>%2$d people</span> like this."
+msgid_plural "<span %1$s>%2$d people</span> like this."
+msgstr[0] "<span %1$s>%2$d persoon</span> vindt dit leuk."
+msgstr[1] "<span %1$s>%2$d personen</span> vinden dit leuk."
-#: ../../include/attach.php:867
-msgid "Stored file could not be verified. Upload failed."
-msgstr "Opgeslagen bestand kon niet worden geverifieerd. Uploaden mislukt."
+#: ../../include/conversation.php:1081
+#, php-format
+msgid "<span %1$s>%2$d people</span> don't like this."
+msgid_plural "<span %1$s>%2$d people</span> don't like this."
+msgstr[0] "<span %1$s>%2$d persoon</span> vindt dit niet leuk."
+msgstr[1] "<span %1$s>%2$d personen</span> vinden dit niet leuk."
-#: ../../include/attach.php:923 ../../include/attach.php:939
-msgid "Path not available."
-msgstr "Locatie niet beschikbaar."
+#: ../../include/conversation.php:1087
+msgid "and"
+msgstr "en"
-#: ../../include/attach.php:985 ../../include/attach.php:1137
-msgid "Empty pathname"
-msgstr "Ontbrekende locatienaam"
+#: ../../include/conversation.php:1090
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ", en %d ander persoon"
+msgstr[1] ", en %d andere personen"
-#: ../../include/attach.php:1011
-msgid "duplicate filename or path"
-msgstr "dubbele bestandsnaam of locatie"
+#: ../../include/conversation.php:1091
+#, php-format
+msgid "%s like this."
+msgstr "%s vinden dit leuk."
-#: ../../include/attach.php:1033
-msgid "Path not found."
-msgstr "Locatie niet gevonden"
+#: ../../include/conversation.php:1091
+#, php-format
+msgid "%s don't like this."
+msgstr "%s vinden dit niet leuk."
-#: ../../include/attach.php:1091
-msgid "mkdir failed."
-msgstr "directory aanmaken (mkdir) mislukt."
+#: ../../include/conversation.php:1134
+msgid "Set your location"
+msgstr "Locatie instellen"
-#: ../../include/attach.php:1095
-msgid "database storage failed."
-msgstr "opslag in database mislukt."
+#: ../../include/conversation.php:1135
+msgid "Clear browser location"
+msgstr "Locatie van webbrowser wissen"
-#: ../../include/attach.php:1143
-msgid "Empty path"
-msgstr "Ontbrekende locatie"
+#: ../../include/conversation.php:1183
+msgid "Tag term:"
+msgstr "Tag:"
+
+#: ../../include/conversation.php:1184
+msgid "Where are you right now?"
+msgstr "Waar bevind je je op dit moment?"
+
+#: ../../include/conversation.php:1189
+msgid "Choose a different album..."
+msgstr "Kies een ander album..."
+
+#: ../../include/conversation.php:1193
+msgid "Comments enabled"
+msgstr "Reacties ingeschakeld"
+
+#: ../../include/conversation.php:1194
+msgid "Comments disabled"
+msgstr "Reacties uitgeschakeld"
+
+#: ../../include/conversation.php:1232
+msgid "Page link name"
+msgstr "Linknaam pagina"
+
+#: ../../include/conversation.php:1235
+msgid "Post as"
+msgstr "Bericht plaatsen als"
+
+#: ../../include/conversation.php:1249
+msgid "Toggle voting"
+msgstr "Peiling in- of uitschakelen"
+
+#: ../../include/conversation.php:1252
+msgid "Disable comments"
+msgstr "Reacties uitschakelen"
+
+#: ../../include/conversation.php:1253
+msgid "Toggle comments"
+msgstr "Reacties in- of uitschakelen"
+
+#: ../../include/conversation.php:1261
+msgid "Categories (optional, comma-separated list)"
+msgstr "Categorieën (optioneel, door komma's gescheiden lijst)"
+
+#: ../../include/conversation.php:1284
+msgid "Other networks and post services"
+msgstr "Andere netwerken en diensten"
+
+#: ../../include/conversation.php:1290
+msgid "Set publish date"
+msgstr "Publicatiedatum instellen"
+
+#: ../../include/conversation.php:1544
+msgid "Discover"
+msgstr "Ontdekken"
+
+#: ../../include/conversation.php:1547
+msgid "Imported public streams"
+msgstr "Openbare streams importeren"
+
+#: ../../include/conversation.php:1552
+msgid "Commented Order"
+msgstr "Nieuwe reacties bovenaan"
+
+#: ../../include/conversation.php:1555
+msgid "Sort by Comment Date"
+msgstr "Berichten met nieuwe reacties bovenaan"
+
+#: ../../include/conversation.php:1559
+msgid "Posted Order"
+msgstr "Nieuwe berichten bovenaan"
+
+#: ../../include/conversation.php:1562
+msgid "Sort by Post Date"
+msgstr "Nieuwe berichten bovenaan"
+
+#: ../../include/conversation.php:1570
+msgid "Posts that mention or involve you"
+msgstr "Alleen berichten die jou vermelden of waar je op een andere manier bij betrokken bent"
+
+#: ../../include/conversation.php:1579
+msgid "Activity Stream - by date"
+msgstr "Activiteitenstroom - volgens datum"
+
+#: ../../include/conversation.php:1585
+msgid "Starred"
+msgstr "Met ster"
+
+#: ../../include/conversation.php:1588
+msgid "Favourite Posts"
+msgstr "Favoriete berichten"
+
+#: ../../include/conversation.php:1595
+msgid "Spam"
+msgstr "Spam"
+
+#: ../../include/conversation.php:1598
+msgid "Posts flagged as SPAM"
+msgstr "Berichten gemarkeerd als SPAM"
+
+#: ../../include/conversation.php:1656
+msgid "Status Messages and Posts"
+msgstr "Berichten in dit kanaal"
+
+#: ../../include/conversation.php:1668
+msgid "Profile Details"
+msgstr "Profiel"
+
+#: ../../include/conversation.php:1684
+msgid "Files and Storage"
+msgstr "Bestanden en opslagruimte"
+
+#: ../../include/conversation.php:1720
+msgid "Saved Bookmarks"
+msgstr "Opgeslagen bladwijzers"
+
+#: ../../include/conversation.php:1730
+msgid "Manage Webpages"
+msgstr "Webpagina's beheren"
+
+#: ../../include/conversation.php:1795
+msgctxt "noun"
+msgid "Attending"
+msgid_plural "Attending"
+msgstr[0] "aanwezig"
+msgstr[1] "aanwezig"
+
+#: ../../include/conversation.php:1798
+msgctxt "noun"
+msgid "Not Attending"
+msgid_plural "Not Attending"
+msgstr[0] "niet aanwezig"
+msgstr[1] "niet aanwezig"
+
+#: ../../include/conversation.php:1801
+msgctxt "noun"
+msgid "Undecided"
+msgid_plural "Undecided"
+msgstr[0] "nog niet beslist"
+msgstr[1] "nog niet beslist"
+
+#: ../../include/conversation.php:1804
+msgctxt "noun"
+msgid "Agree"
+msgid_plural "Agrees"
+msgstr[0] "eens"
+msgstr[1] "eens"
+
+#: ../../include/conversation.php:1807
+msgctxt "noun"
+msgid "Disagree"
+msgid_plural "Disagrees"
+msgstr[0] "oneens"
+msgstr[1] "oneens"
+
+#: ../../include/conversation.php:1810
+msgctxt "noun"
+msgid "Abstain"
+msgid_plural "Abstains"
+msgstr[0] "onthouding"
+msgstr[1] "onthoudingen"
+
+#: ../../include/bbcode.php:134 ../../include/bbcode.php:962
+#: ../../include/bbcode.php:965 ../../include/bbcode.php:970
+#: ../../include/bbcode.php:973 ../../include/bbcode.php:976
+#: ../../include/bbcode.php:979 ../../include/bbcode.php:984
+#: ../../include/bbcode.php:987 ../../include/bbcode.php:992
+#: ../../include/bbcode.php:995 ../../include/bbcode.php:998
+#: ../../include/bbcode.php:1001
+msgid "Image/photo"
+msgstr "Afbeelding/foto"
+
+#: ../../include/bbcode.php:173 ../../include/bbcode.php:1012
+msgid "Encrypted content"
+msgstr "Versleutelde inhoud"
+
+#: ../../include/bbcode.php:189
+#, php-format
+msgid "Install %s element: "
+msgstr "Installeer %s-element: "
+
+#: ../../include/bbcode.php:193
+#, php-format
+msgid ""
+"This post contains an installable %s element, however you lack permissions "
+"to install it on this site."
+msgstr "Dit bericht heeft een te installeren %s-element, maar je hebt geen permissies om het op deze hub te installeren."
+
+#: ../../include/bbcode.php:272
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s schreef het volgende %2$s %3$s"
+
+#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
+msgid "Click to open/close"
+msgstr "Klik om te openen of te sluiten"
+
+#: ../../include/bbcode.php:357
+msgid "spoiler"
+msgstr "spoiler"
+
+#: ../../include/bbcode.php:950
+msgid "$1 wrote:"
+msgstr "$1 schreef:"
+
+#: ../../util/nconfig.php:34
+msgid "Source channel not found."
+msgstr "Bron van kanaal niet gevonden"
#: ../../view/theme/redbasic/php/config.php:9
msgid "Focus (Hubzilla default)"
@@ -10118,66 +13375,66 @@ msgstr "Grootte profielfoto's van berichten instellen"
msgid "Set size of followup author photos"
msgstr "Grootte profielfoto's van reacties instellen"
-#: ../../boot.php:1195
+#: ../../boot.php:1176
#, php-format
msgctxt "opensearch"
msgid "Search %1$s (%2$s)"
msgstr "Zoek %1$s (%2$s)"
-#: ../../boot.php:1195
+#: ../../boot.php:1176
msgctxt "opensearch"
msgid "$Projectname"
msgstr "$Projectname"
-#: ../../boot.php:1513
+#: ../../boot.php:1494
#, php-format
msgid "Update %s failed. See error logs."
msgstr "Update %s mislukt. Zie foutenlogboek."
-#: ../../boot.php:1516
+#: ../../boot.php:1497
#, php-format
msgid "Update Error at %s"
msgstr "Update-fout op %s"
-#: ../../boot.php:1720
+#: ../../boot.php:1701
msgid ""
"Create an account to access services and applications within the Hubzilla"
msgstr "Maak een account aan om toegang te krijgen tot diensten en toepassingen van Hubzilla"
-#: ../../boot.php:1741
+#: ../../boot.php:1722
msgid "Login/Email"
msgstr "E-mailadres of inlognaam"
-#: ../../boot.php:1742
+#: ../../boot.php:1723
msgid "Password"
msgstr "Wachtwoord"
-#: ../../boot.php:1743
+#: ../../boot.php:1724
msgid "Remember me"
msgstr "Aangemeld blijven"
-#: ../../boot.php:1746
+#: ../../boot.php:1727
msgid "Forgot your password?"
msgstr "Wachtwoord vergeten?"
-#: ../../boot.php:2315
+#: ../../boot.php:2288
msgid "toggle mobile"
msgstr "mobiele weergave omschakelen"
-#: ../../boot.php:2470
+#: ../../boot.php:2443
msgid "Website SSL certificate is not valid. Please correct."
msgstr "Het SSL-certificaat van deze website is ongeldig. Corrigeer dit a.u.b."
-#: ../../boot.php:2473
+#: ../../boot.php:2446
#, php-format
msgid "[hubzilla] Website SSL error for %s"
msgstr "[hubzilla] Probleem met SSL-certificaat voor %s"
-#: ../../boot.php:2577
+#: ../../boot.php:2563
msgid "Cron/Scheduled tasks not running."
msgstr "Cron is niet actief"
-#: ../../boot.php:2581
+#: ../../boot.php:2567
#, php-format
msgid "[hubzilla] Cron tasks not running on %s"
msgstr "[hubzilla] Cron-taken zijn niet actief op %s"
diff --git a/view/nl/hstrings.php b/view/nl/hstrings.php
index 7d3ced9ff..c29146662 100644
--- a/view/nl/hstrings.php
+++ b/view/nl/hstrings.php
@@ -61,9 +61,8 @@ App::$strings["You are using %1\$s of %2\$s available file storage. (%3\$s&#37;)
App::$strings["WARNING:"] = "WAARSCHUWING:";
App::$strings["Create new folder"] = "Nieuwe map aanmaken";
App::$strings["Upload file"] = "Bestand uploaden";
-App::$strings["Drop files here to immediately upload"] = "Sleep bestanden hierheen om ze onmiddelijk te uploaden";
+App::$strings["Drop files here to immediately upload"] = "Sleep bestanden hierheen om ze onmiddellijk te uploaden";
App::$strings["Permission denied."] = "Toegang geweigerd.";
-App::$strings["Not Found"] = "Niet gevonden";
App::$strings["Page not found."] = "Pagina niet gevonden.";
App::$strings["Permission denied"] = "Toegang geweigerd";
App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Authenticatie op afstand geblokkeerd. Je bent lokaal op deze hub ingelogd. Uitloggen en opnieuw proberen.";
@@ -72,117 +71,233 @@ App::$strings["Requested profile is not available."] = "Opgevraagd profiel is ni
App::$strings["Some blurb about what to do when you're new here"] = "Welkom op \$Projectname. Klik op de tab ontdekken of klik rechtsboven op de <a href=\"directory\">kanalengids</a>, om kanalen te vinden. Rechtsboven vind je ook <a href=\"directory\">apps</a>, waar je vrijwel alle functies van \$Projectname kunt vinden. Voor <a href=\"directory\">hulp</a> met \$Projectname klik je op het vraagteken.";
App::$strings["Away"] = "Afwezig";
App::$strings["Online"] = "Online";
-App::$strings["No such group"] = "Collectie niet gevonden";
-App::$strings["No such channel"] = "Niet zo'n kanaal";
-App::$strings["forum"] = "forum";
-App::$strings["Search Results For:"] = "Zoekresultaten voor:";
-App::$strings["Privacy group is empty"] = "Privacygroep is leeg";
-App::$strings["Privacy group: "] = "Privacygroep: ";
-App::$strings["Invalid connection."] = "Ongeldige connectie.";
+App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Maximum toegestane dagelijkse registraties op deze \$Projectname-hub bereikt. Probeer het morgen (UTC) nogmaals.";
+App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Registratie mislukt. De gebruiksvoorwaarden dienen wel geaccepteerd te worden.";
+App::$strings["Passwords do not match."] = "Wachtwoorden komen niet met elkaar overeen.";
+App::$strings["Registration successful. Please check your email for validation instructions."] = "Registratie geslaagd. Controleer je e-mail voor instructies.";
+App::$strings["Your registration is pending approval by the site owner."] = "Jouw accountregistratie wacht op goedkeuring van de beheerder van deze \$Projectname-hub.";
+App::$strings["Your registration can not be processed."] = "Jouw registratie kan niet verwerkt worden.";
+App::$strings["Registration on this hub is disabled."] = "Registreren van nieuwe accounts is op deze hub uitgeschakeld.";
+App::$strings["Registration on this hub is by approval only."] = "Registraties op deze hub moeten eerst worden goedgekeurd.";
+App::$strings["<a href=\"pubsites\">Register at another affiliated hub.</a>"] = "<a href=\"pubsites\">Registreer op een andere hub</a>.";
+App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Deze \$Projectname-hub heeft het maximum aantal dagelijks toegestane registraties bereikt. Probeer het morgen (UTC) nogmaals.";
+App::$strings["Terms of Service"] = "Gebruiksvoorwaarden";
+App::$strings["I accept the %s for this website"] = "Ik accepteer de %s van deze \$Projectname-hub";
+App::$strings["I am over 13 years of age and accept the %s for this website"] = "Ik ben 13 jaar of ouder en accepteer de %s van deze \$Projectname-hub";
+App::$strings["Your email address"] = "Jouw e-mailadres";
+App::$strings["Choose a password"] = "Geef een wachtwoord op";
+App::$strings["Please re-enter your password"] = "Geef het wachtwoord opnieuw op";
+App::$strings["Please enter your invitation code"] = "Vul jouw uitnodigingscode in";
+App::$strings["Name or caption"] = "Naam";
+App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Voorbeelden: \"Jan Pietersen\", \"Willems weblog\", \"Computerforum\"";
+App::$strings["Choose a short nickname"] = "Korte bijnaam";
+App::$strings["Your nickname will be used to create an easy to remember channel address e.g. nickname%s"] = "Deze bijnaam wordt gebruikt om een makkelijk te onthouden kanaaladres van jouw kanaal aan te maken, die je dan met anderen kunt delen. Bijvoorbeeld: bijnaam%s";
+App::$strings["Channel role and privacy"] = "Kanaaltype en privacy";
+App::$strings["Select a channel role with your privacy requirements."] = "Kies een kanaaltype met het door jou gewenste privacyniveau.";
+App::$strings["Read more about roles"] = "Lees meer over kanaaltypes";
+App::$strings["no"] = "Nee";
+App::$strings["yes"] = "Ja";
+App::$strings["Registration"] = "Registratie";
+App::$strings["Membership on this site is by invitation only."] = "Registreren op deze \$Projectname-hub kan alleen op uitnodiging.";
+App::$strings["Register"] = "Registreren";
+App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Mogelijk moet op deze hub eerst jouw e-mail geverifieerd worden. Wanneer je na het indienen van dit formulier op de inlogpagina terecht komt, dan dien je jouw e-mail te controleren voor instructies. Controleer eventueel ook jouw spamfolder.";
App::$strings["Fetching URL returns error: %1\$s"] = "Ophalen URL gaf een foutmelding terug: %1\$s";
-App::$strings["network"] = "netwerk";
-App::$strings["RSS"] = "RSS";
-App::$strings["You must be logged in to see this page."] = "Je moet zijn ingelogd om deze pagina te kunnen bekijken.";
-App::$strings["Posts and comments"] = "Berichten en reacties";
-App::$strings["Only posts"] = "Alleen berichten";
-App::$strings["Insufficient permissions. Request redirected to profile page."] = "Onvoldoende permissies. Doorgestuurd naar profielpagina.";
-App::$strings["Your service plan only allows %d channels."] = "Jouw abonnement staat maar %d kanalen toe.";
-App::$strings["Nothing to import."] = "Niets gevonden om te importeren";
-App::$strings["Unable to download data from old server"] = "Niet in staat om gegevens van de oude hub te downloaden";
-App::$strings["Imported file is empty."] = "Geïmporteerde bestand is leeg";
-App::$strings["Warning: Database versions differ by %1\$d updates."] = "Waarschuwing: database-versies lopen %1\$d updates achter.";
-App::$strings["Cloned channel not found. Import failed."] = "Gekloond kanaal niet gevonden. Importeren mislukt.";
-App::$strings["No channel. Import failed."] = "Geen kanaal. Importeren mislukt.";
-App::$strings["Import completed."] = "Import voltooid.";
-App::$strings["You must be logged in to use this feature."] = "Je moet ingelogd zijn om dit onderdeel te kunnen gebruiken.";
-App::$strings["Import Channel"] = "Kanaal importeren";
-App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Gebruik dit formulier om een bestaand kanaal te importeren van een andere hub. Je kan de kanaal-identiteit van de oude hub via het netwerk ontvangen of een exportbestand verstrekken.";
-App::$strings["File to Upload"] = "Bestand om te uploaden";
-App::$strings["Or provide the old server/hub details"] = "Of vul de gegevens van de oude hub in";
-App::$strings["Your old identity address (xyz@example.com)"] = "Jouw oude kanaaladres (xyz@example.com)";
-App::$strings["Your old login email address"] = "Het e-mailadres van je oude account";
-App::$strings["Your old login password"] = "Wachtwoord van jouw oude account";
-App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Voor elke optie geldt dat je moet kiezen of je jouw primaire kanaaladres op deze hub wil instellen of dat jouw oude hub deze rol blijft vervullen.";
-App::$strings["Make this hub my primary location"] = "Stel deze hub als mijn primaire locatie in";
-App::$strings["Import existing posts if possible (experimental - limited by available memory"] = "Importeer bestaande berichten wanneer mogelijk (experimenteel - afhankelijk van beschikbaar servergeheugen)";
-App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid.";
+App::$strings["Profile Match"] = "Profielovereenkomst";
+App::$strings["No keywords to match. Please add keywords to your default profile."] = "Je hebt geen trefwoorden waarmee overeenkomsten gevonden kunnen worden. Voeg enkele trefwoorden aan je standaardprofiel toe.";
+App::$strings["is interested in:"] = "is geïnteresseerd in:";
+App::$strings["Connect"] = "Verbinden";
+App::$strings["No matches"] = "Geen overeenkomsten";
+App::$strings["Could not access contact record."] = "Kon geen toegang krijgen tot de connectie-gegevens.";
+App::$strings["Could not locate selected profile."] = "Kon het gekozen profiel niet vinden.";
+App::$strings["Connection updated."] = "Connectie bijgewerkt.";
+App::$strings["Failed to update connection record."] = "Bijwerken van connectie-gegevens mislukt.";
+App::$strings["is now connected to"] = "is nu verbonden met";
+App::$strings["No"] = "Nee";
+App::$strings["Yes"] = "Ja";
+App::$strings["Could not access address book record."] = "Kon geen toegang krijgen tot de record van de connectie.";
+App::$strings["Refresh failed - channel is currently unavailable."] = "Vernieuwen mislukt - kanaal is momenteel niet beschikbaar";
+App::$strings["Unable to set address book parameters."] = "Niet in staat om de parameters van connecties in te stellen.";
+App::$strings["Connection has been removed."] = "Connectie is verwijderd";
+App::$strings["View Profile"] = "Profiel weergeven";
+App::$strings["View %s's profile"] = "Profiel van %s weergeven";
+App::$strings["Refresh Permissions"] = "Permissies vernieuwen";
+App::$strings["Fetch updated permissions"] = "Aangepaste permissies ophalen";
+App::$strings["Recent Activity"] = "Recente activiteit/berichten";
+App::$strings["View recent posts and comments"] = "Recente berichten en reacties weergeven";
+App::$strings["Unblock"] = "Deblokkeren";
+App::$strings["Block"] = "Blokkeren";
+App::$strings["Block (or Unblock) all communications with this connection"] = "Blokkeer (of deblokkeer) alle communicatie met deze connectie";
+App::$strings["This connection is blocked!"] = "Deze connectie is geblokkeerd!";
+App::$strings["Unignore"] = "Niet meer negeren";
+App::$strings["Ignore"] = "Negeren";
+App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Negeer (of negeer niet meer) alle inkomende communicatie van deze connectie";
+App::$strings["This connection is ignored!"] = "Deze connectie wordt genegeerd!";
+App::$strings["Unarchive"] = "Niet meer archiveren";
+App::$strings["Archive"] = "Archiveren";
+App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Archiveer (of dearchiveer) deze connectie - markeer het kanaal als dood, maar bewaar de inhoud";
+App::$strings["This connection is archived!"] = "Deze connectie is gearchiveerd!";
+App::$strings["Unhide"] = "Niet meer verbergen";
+App::$strings["Hide"] = "Verbergen";
+App::$strings["Hide or Unhide this connection from your other connections"] = "Deze connectie verbergen (of niet meer verbergen) voor jouw andere connecties";
+App::$strings["This connection is hidden!"] = "Deze connectie is verborgen!";
+App::$strings["Delete this connection"] = "Deze connectie verwijderen";
+App::$strings["Me"] = "Ik";
+App::$strings["Family"] = "Familie";
+App::$strings["Friends"] = "Vrienden";
+App::$strings["Acquaintances"] = "Kennissen";
+App::$strings["All"] = "Alles";
+App::$strings["Approve this connection"] = "Deze connectie accepteren";
+App::$strings["Accept connection to allow communication"] = "Keur deze connectie goed om communicatie toe te staan";
+App::$strings["Set Affinity"] = "Verwantschapsfilter instellen";
+App::$strings["Set Profile"] = "Profiel instellen";
+App::$strings["Set Affinity & Profile"] = "Verwantschapsfilter en profiel instellen";
+App::$strings["none"] = "geen";
+App::$strings["Connection Default Permissions"] = "Standaard permissies voor connecties";
+App::$strings["Connection: %s"] = "Connectie: %s";
+App::$strings["Apply these permissions automatically"] = "Deze permissies automatisch toepassen";
+App::$strings["Connection requests will be approved without your interaction"] = "Connectieverzoeken zullen automatisch worden geaccepteerd";
+App::$strings["This connection's primary address is"] = "Het primaire kanaaladres van deze connectie is";
+App::$strings["Available locations:"] = "Beschikbare locaties:";
+App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Permissies die op deze pagina staan vermeld worden op alle nieuwe connecties toegepast.";
+App::$strings["Connection Tools"] = "Hulpmiddelen";
+App::$strings["Slide to adjust your degree of friendship"] = "Schuif om te bepalen hoe goed je iemand kent en/of mag";
+App::$strings["Rating"] = "Beoordeling";
+App::$strings["Slide to adjust your rating"] = "Gebruik de schuif om je beoordeling te geven";
+App::$strings["Optionally explain your rating"] = "Verklaar jouw beoordeling (niet verplicht)";
+App::$strings["Custom Filter"] = "Berichtenfilter";
+App::$strings["Only import posts with this text"] = "Importeer alleen berichten met deze tekst";
+App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "woorden (één per regel), #tags, /regex/ of talen (lang=iso639-1) - laat leeg om alle berichten te importeren";
+App::$strings["Do not import posts with this text"] = "Importeer geen berichten met deze tekst";
+App::$strings["This information is public!"] = "Deze informatie is openbaar!";
+App::$strings["Connection Pending Approval"] = "Connectie moet nog geaccepteerd worden";
+App::$strings["inherited"] = "geërfd";
App::$strings["Submit"] = "Opslaan";
+App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Kies het profiel dat je aan %s wil tonen wanneer hij/zij ingelogd jouw profiel wil bekijken.";
+App::$strings["Their Settings"] = "Hun instellingen";
+App::$strings["My Settings"] = "Mijn instellingen";
+App::$strings["Individual Permissions"] = "Individuele permissies";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele instellingen. Je kan je deze overgeërfde permissies hier <strong>niet</strong> veranderen.";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele permissies. Je kan de permissies hier veranderen, maar die hebben geen effect, tenzij de overgeërfde permissies worden veranderd. ";
+App::$strings["Last update:"] = "Laatste wijziging:";
+App::$strings["Invalid message"] = "Ongeldig bericht";
+App::$strings["no results"] = "geen resultaten";
+App::$strings["channel sync processed"] = "kanaalsync verwerkt";
+App::$strings["queued"] = "in wachtrij";
+App::$strings["posted"] = "verstuurd";
+App::$strings["accepted for delivery"] = "geaccepteerd om afgeleverd te worden";
+App::$strings["updated"] = "geüpdatet";
+App::$strings["update ignored"] = "update genegeerd";
+App::$strings["permission denied"] = "toegang geweigerd";
+App::$strings["recipient not found"] = "ontvanger niet gevonden";
+App::$strings["mail recalled"] = "Privébericht ingetrokken";
+App::$strings["duplicate mail received"] = "dubbel privébericht ontvangen";
+App::$strings["mail delivered"] = "privébericht afgeleverd";
+App::$strings["Delivery report for %1\$s"] = "Afleveringsrapport voor %1\$s";
+App::$strings["Options"] = "Opties";
+App::$strings["Redeliver"] = "Opnieuw afleveren";
App::$strings["Bookmark added"] = "Bladwijzer toegevoegd";
App::$strings["My Bookmarks"] = "Mijn bladwijzers";
App::$strings["My Connections Bookmarks"] = "Bladwijzers van mijn connecties";
-App::$strings["%s account blocked/unblocked"] = array(
- 0 => "%s account geblokkeerd/gedeblokkeerd",
- 1 => "%s accounts geblokkeerd/gedeblokkeerd",
-);
-App::$strings["%s account deleted"] = array(
- 0 => "%s account verwijderd",
- 1 => "%s accounts verwijderd",
-);
-App::$strings["Account not found"] = "Account niet gevonden";
-App::$strings["Account '%s' deleted"] = "Account '%s' verwijderd";
-App::$strings["Account '%s' blocked"] = "Account '%s' geblokkeerd";
-App::$strings["Account '%s' unblocked"] = "Account '%s' gedeblokkeerd";
-App::$strings["Administration"] = "Beheer";
-App::$strings["Accounts"] = "Accounts";
-App::$strings["select all"] = "alles selecteren";
-App::$strings["Registrations waiting for confirm"] = "Accounts die op goedkeuring wachten";
-App::$strings["Request date"] = "Tijd/datum verzoek";
-App::$strings["Email"] = "E-mail";
-App::$strings["No registrations."] = "Geen verzoeken.";
+App::$strings["network"] = "netwerk";
+App::$strings["RSS"] = "RSS";
+App::$strings["Location not found."] = "Locatie niet gevonden.";
+App::$strings["Location lookup failed."] = "Opzoeken locatie mislukt";
+App::$strings["Please select another location to become primary before removing the primary location."] = "Kies eerst een andere primaire locatie alvorens de huidige primaire locatie te verwijderen.";
+App::$strings["Syncing locations"] = "Locaties synchronizeren";
+App::$strings["No locations found."] = "Geen locaties gevonden.";
+App::$strings["Manage Channel Locations"] = "Kanaallocaties beheren";
+App::$strings["Location"] = "Locatie";
+App::$strings["Address"] = "Adres";
+App::$strings["Primary"] = "Primair";
+App::$strings["Drop"] = "Verwijderen";
+App::$strings["Sync Now"] = "Nu synchroniseren";
+App::$strings["Please wait several minutes between consecutive operations."] = "Wacht enkele minuten tussen opeenvolgende handelingen.";
+App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen door op de hub van de kloon in te loggen en het kanaal daar te verwijderen.";
+App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is.";
+App::$strings["Continue"] = "Ga verder";
+App::$strings["Premium Channel Setup"] = "Instellen premiumkanaal ";
+App::$strings["Enable premium channel connection restrictions"] = "Restricties voor connecties van premiumkanaal toestaan";
+App::$strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Vul je restricties of voorwaarden in, zoals een paypal-afschrift, voorschriften voor leden, enz.";
+App::$strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Dit kanaal kan extra stappen of het accepteren van de volgende voorwaarden vereisen, voordat de connectie wordt geaccepteerd:";
+App::$strings["Potential connections will then see the following text before proceeding:"] = "Mogelijke connecties zullen dan de volgende tekst zien voordat ze verder kunnen:";
+App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Door verder te gaan ga ik automatisch akkoord met alle voorwaarden en aanwijzingen op deze pagina.";
+App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(Er zijn geen speciale voorwaarden en aanwijzingen door de kanaal-eigenaar verstrekt) ";
+App::$strings["Restricted or Premium Channel"] = "Beperkt of premiumkanaal";
+App::$strings["Invalid item."] = "Ongeldig item.";
+App::$strings["Channel not found."] = "Kanaal niet gevonden.";
+App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
+App::$strings["Save to Folder:"] = "Bewaar in map: ";
+App::$strings["- select -"] = "- kies map -";
+App::$strings["Save"] = "Opslaan";
+App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Je hebt %1$.0f van totaal %2$.0f toegestane kanalen aangemaakt.";
+App::$strings["Create a new channel"] = "Nieuw kanaal aanmaken";
+App::$strings["Create New"] = "Nieuwe aanmaken";
+App::$strings["Channel Manager"] = "Kanaalbeheer";
+App::$strings["Current Channel"] = "Huidig kanaal";
+App::$strings["Switch to one of your channels by selecting it."] = "Activeer een van jouw andere kanalen door er op te klikken.";
+App::$strings["Default Channel"] = "Standaardkanaal";
+App::$strings["Make Default"] = "Als standaard instellen";
+App::$strings["%d new messages"] = "%d nieuwe berichten";
+App::$strings["%d new introductions"] = "%d nieuwe connectieverzoeken";
+App::$strings["Delegated Channel"] = "Uitbesteed kanaal";
+App::$strings["Blocked"] = "Geblokkeerd";
+App::$strings["Ignored"] = "Genegeerd";
+App::$strings["Hidden"] = "Verborgen";
+App::$strings["Archived"] = "Gearchiveerd";
+App::$strings["New"] = "Nieuw";
+App::$strings["New Connections"] = "Nieuwe connecties";
+App::$strings["Show pending (new) connections"] = "Nog te accepteren (nieuwe) connecties weergeven";
+App::$strings["All Connections"] = "Alle connecties";
+App::$strings["Show all connections"] = "Toon alle connecties";
+App::$strings["Only show blocked connections"] = "Toon alleen geblokkeerde connecties";
+App::$strings["Only show ignored connections"] = "Toon alleen genegeerde connecties";
+App::$strings["Only show archived connections"] = "Toon alleen gearchiveerde connecties";
+App::$strings["Only show hidden connections"] = "Toon alleen verborgen connecties";
+App::$strings["Pending approval"] = "Moet nog geaccepteerd worden";
+App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+App::$strings["Edit connection"] = "Connectie bewerken";
+App::$strings["Delete connection"] = "Connectie verwijderen";
+App::$strings["Channel address"] = "Kanaaladres";
+App::$strings["Network"] = "Netwerk";
+App::$strings["Status"] = "Status";
+App::$strings["Connected"] = "Verbonden";
+App::$strings["Approve connection"] = "Connectie accepteren";
App::$strings["Approve"] = "Goedkeuren";
-App::$strings["Deny"] = "Afkeuren";
-App::$strings["Block"] = "Blokkeren";
-App::$strings["Unblock"] = "Deblokkeren";
-App::$strings["ID"] = "ID";
-App::$strings["All Channels"] = "Alle kanalen";
-App::$strings["Register date"] = "Geregistreerd";
-App::$strings["Last login"] = "Laatste keer ingelogd";
-App::$strings["Expires"] = "Verloopt";
-App::$strings["Service Class"] = "Abonnementen";
-App::$strings["Selected accounts will be deleted!\\n\\nEverything these accounts had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Geselecteerde accounts (met bijbehorende kanalen) worden verwijderd!\\n\\nAlles wat deze accounts op deze hub hebben gepubliceerd wordt definitief verwijderd!\\n\\Weet je het zeker?";
-App::$strings["The account {0} will be deleted!\\n\\nEverything this account has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Account {0} (met bijbehorende kanalen) wordt verwijderd !\\n\\nAlles wat dit account op deze hub heeft gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?";
-App::$strings["%s channel censored/uncensored"] = array(
- 0 => "%s kanaal gecensureerd/ongecensureerd",
- 1 => "%s kanalen gecensureerd/ongecensureerd",
-);
-App::$strings["%s channel code allowed/disallowed"] = array(
- 0 => "Scripts toegestaan/niet toegestaan voor %s kanaal",
- 1 => "Scripts toegestaan/niet toegestaan voor %s kanalen",
-);
-App::$strings["%s channel deleted"] = array(
- 0 => "%s kanaal verwijderd",
- 1 => "%s kanalen verwijderd",
-);
-App::$strings["Channel not found"] = "Kanaal niet gevonden";
-App::$strings["Channel '%s' deleted"] = "Kanaal '%s' verwijderd";
-App::$strings["Channel '%s' censored"] = "Kanaal '%s' gecensureerd";
-App::$strings["Channel '%s' uncensored"] = "Kanaal '%s' ongecensureerd";
-App::$strings["Channel '%s' code allowed"] = "Scripts toegestaan voor kanaal '%s'";
-App::$strings["Channel '%s' code disallowed"] = "Scripts niet toegestaan voor kanaal '%s'";
-App::$strings["Channels"] = "Kanalen";
-App::$strings["Censor"] = "Censureren";
-App::$strings["Uncensor"] = "Niet censureren";
-App::$strings["Allow Code"] = "Scripts toestaan";
-App::$strings["Disallow Code"] = "Scripts niet toestaan";
-App::$strings["Channel"] = "Kanaal";
-App::$strings["UID"] = "UID";
-App::$strings["Address"] = "Kanaaladres";
-App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Geselecteerde kanalen worden verwijderd!\\n\\nAlles wat in deze kanalen op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?";
-App::$strings["The channel {0} will be deleted!\\n\\nEverything that was posted in this channel on this site will be permanently deleted!\\n\\nAre you sure?"] = "Kanaal {0} wordt verwijderd!\\n\\nAlles wat in dit kanaal op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?";
-App::$strings["Update has been marked successful"] = "Update is als succesvol gemarkeerd";
-App::$strings["Executing %s failed. Check system logs."] = "Uitvoeren van %s is mislukt. Controleer systeemlogboek.";
-App::$strings["Update %s was successfully applied."] = "Update %s was geslaagd.";
-App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "Update %s gaf geen melding. Het is daarom niet bekend of deze geslaagd is.";
-App::$strings["Update function %s could not be found."] = "Update-functie %s kon niet gevonden worden.";
-App::$strings["No failed updates."] = "Geen mislukte updates.";
-App::$strings["Failed Updates"] = "Mislukte updates";
-App::$strings["Mark success (if update was manually applied)"] = "Markeer als geslaagd (wanneer de update handmatig was uitgevoerd)";
-App::$strings["Attempt to execute this update step automatically"] = "Poging om deze stap van de update automatisch uit te voeren.";
+App::$strings["Ignore connection"] = "Connectie negeren";
+App::$strings["Recent activity"] = "Recente activiteit";
+App::$strings["Connections"] = "Connecties";
+App::$strings["Search"] = "Zoeken";
+App::$strings["Search your connections"] = "Doorzoek jouw connecties";
+App::$strings["Connections search"] = "Connecties zoeken";
+App::$strings["Find"] = "Vinden";
+App::$strings["Image uploaded but image cropping failed."] = "Afbeelding geüpload, maar afbeelding kon niet worden bijgesneden. ";
+App::$strings["Cover Photos"] = "Omslagfoto's";
+App::$strings["Image resize failed."] = "Afbeelding kon niet van grootte veranderd worden.";
+App::$strings["Unable to process image"] = "Afbeelding kan niet verwerkt worden";
+App::$strings["Image upload failed."] = "Uploaden afbeelding mislukt";
+App::$strings["Unable to process image."] = "Niet in staat om afbeelding te verwerken.";
+App::$strings["female"] = "vrouw";
+App::$strings["%1\$s updated her %2\$s"] = "%1\$s heeft haar %2\$s bijgewerkt";
+App::$strings["male"] = "man";
+App::$strings["%1\$s updated his %2\$s"] = "%1\$s heeft zijn %2\$s bijgewerkt";
+App::$strings["%1\$s updated their %2\$s"] = "De %2\$s van %1\$s is bijgewerkt";
+App::$strings["cover photo"] = "omslagfoto";
+App::$strings["Photo not available."] = "Foto niet beschikbaar.";
+App::$strings["Upload File:"] = "Bestand uploaden:";
+App::$strings["Select a profile:"] = "Kies een profiel:";
+App::$strings["Upload Cover Photo"] = "Omslagfoto uploaden";
+App::$strings["or"] = "of";
+App::$strings["skip this step"] = "sla deze stap over";
+App::$strings["select a photo from your photo albums"] = "Kies een foto uit jouw fotoalbums";
+App::$strings["Crop Image"] = "Afbeelding bijsnijden";
+App::$strings["Please adjust the image cropping for optimum viewing."] = "Snij de afbeelding zo uit dat deze optimaal wordt weergegeven.";
+App::$strings["Done Editing"] = "Klaar met bewerken";
App::$strings["Off"] = "Uit";
App::$strings["On"] = "Aan";
App::$strings["Lock feature %s"] = " Vergrendel de functie '%s'";
App::$strings["Manage Additional Features"] = "Beheer - Extra functies";
App::$strings["Log settings updated."] = "Logboek-instellingen bijgewerkt.";
+App::$strings["Administration"] = "Beheer";
App::$strings["Logs"] = "Logboeken";
App::$strings["Clear"] = "Leegmaken";
App::$strings["Debugging"] = "Debuggen";
@@ -227,7 +342,6 @@ App::$strings["Field Name"] = "Veldnaam";
App::$strings["Label on profile pages"] = "Tekstlabel voor op profielpagina's";
App::$strings["Help text"] = "Helptekst";
App::$strings["Additional info (optional)"] = "Extra informatie (optioneel)";
-App::$strings["Save"] = "Opslaan";
App::$strings["Field definition not found"] = "Velddefinitie niet gevonden";
App::$strings["Edit Profile Field"] = "Profielveld bewerken";
App::$strings["Profile Fields"] = "Profielvelden";
@@ -267,6 +381,84 @@ App::$strings["Only allow embeds from secure (SSL) websites and links."] = "Alle
App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "Alleen ongefilterde ingesloten (embedded) HTML van deze websites toestaan";
App::$strings["One site per line. By default embedded content is filtered."] = "Eén website per regel. Standaard wordt ingesloten (embedded) inhoud gefilterd.";
App::$strings["Block embedded HTML from these domains"] = "Ingesloten (embedded) HTML vanaf deze domeinen blokkeren";
+App::$strings["Theme settings updated."] = "Thema-instellingen bijgewerkt.";
+App::$strings["No themes found."] = "Geen thema's gevonden";
+App::$strings["Screenshot"] = "Schermafdruk";
+App::$strings["Themes"] = "Thema's";
+App::$strings["[Experimental]"] = "[Experimenteel]";
+App::$strings["[Unsupported]"] = "[Niet ondersteund]";
+App::$strings["Password changed for account %d."] = "Wachtwoord veranderd voor account %d.";
+App::$strings["Account settings updated."] = "Account-instellingen bijgewerkt.";
+App::$strings["Account not found."] = "Account niet gevonden.";
+App::$strings["Account Edit"] = "Account bewerken";
+App::$strings["New Password"] = "Nieuw wachtwoord";
+App::$strings["New Password again"] = "Nieuw wachtwoord bevestigen";
+App::$strings["Technical skill level"] = "Technisch niveau";
+App::$strings["Account language (for emails)"] = "Taal van account (voor e-mails)";
+App::$strings["Service class"] = "Abonnement";
+App::$strings["%s account blocked/unblocked"] = array(
+ 0 => "%s account geblokkeerd/gedeblokkeerd",
+ 1 => "%s accounts geblokkeerd/gedeblokkeerd",
+);
+App::$strings["%s account deleted"] = array(
+ 0 => "%s account verwijderd",
+ 1 => "%s accounts verwijderd",
+);
+App::$strings["Account not found"] = "Account niet gevonden";
+App::$strings["Account '%s' deleted"] = "Account '%s' verwijderd";
+App::$strings["Account '%s' blocked"] = "Account '%s' geblokkeerd";
+App::$strings["Account '%s' unblocked"] = "Account '%s' gedeblokkeerd";
+App::$strings["Accounts"] = "Accounts";
+App::$strings["select all"] = "alles selecteren";
+App::$strings["Registrations waiting for confirm"] = "Accounts die op goedkeuring wachten";
+App::$strings["Request date"] = "Tijd/datum verzoek";
+App::$strings["Email"] = "E-mail";
+App::$strings["No registrations."] = "Geen verzoeken.";
+App::$strings["Deny"] = "Afkeuren";
+App::$strings["ID"] = "ID";
+App::$strings["All Channels"] = "Alle kanalen";
+App::$strings["Register date"] = "Geregistreerd";
+App::$strings["Last login"] = "Laatste keer ingelogd";
+App::$strings["Expires"] = "Verloopt";
+App::$strings["Service Class"] = "Abonnement";
+App::$strings["Selected accounts will be deleted!\\n\\nEverything these accounts had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Geselecteerde accounts (met bijbehorende kanalen) worden verwijderd!\\n\\nAlles wat deze accounts op deze hub hebben gepubliceerd wordt definitief verwijderd!\\n\\Weet je het zeker?";
+App::$strings["The account {0} will be deleted!\\n\\nEverything this account has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Account {0} (met bijbehorende kanalen) wordt verwijderd !\\n\\nAlles wat dit account op deze hub heeft gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?";
+App::$strings["%s channel censored/uncensored"] = array(
+ 0 => "%s kanaal gecensureerd/ongecensureerd",
+ 1 => "%s kanalen gecensureerd/ongecensureerd",
+);
+App::$strings["%s channel code allowed/disallowed"] = array(
+ 0 => "Scripts toegestaan/niet toegestaan voor %s kanaal",
+ 1 => "Scripts toegestaan/niet toegestaan voor %s kanalen",
+);
+App::$strings["%s channel deleted"] = array(
+ 0 => "%s kanaal verwijderd",
+ 1 => "%s kanalen verwijderd",
+);
+App::$strings["Channel not found"] = "Kanaal niet gevonden";
+App::$strings["Channel '%s' deleted"] = "Kanaal '%s' verwijderd";
+App::$strings["Channel '%s' censored"] = "Kanaal '%s' gecensureerd";
+App::$strings["Channel '%s' uncensored"] = "Kanaal '%s' ongecensureerd";
+App::$strings["Channel '%s' code allowed"] = "Scripts toegestaan voor kanaal '%s'";
+App::$strings["Channel '%s' code disallowed"] = "Scripts niet toegestaan voor kanaal '%s'";
+App::$strings["Channels"] = "Kanalen";
+App::$strings["Censor"] = "Censureren";
+App::$strings["Uncensor"] = "Niet censureren";
+App::$strings["Allow Code"] = "Scripts toestaan";
+App::$strings["Disallow Code"] = "Scripts niet toestaan";
+App::$strings["Channel"] = "Kanaal";
+App::$strings["UID"] = "UID";
+App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Geselecteerde kanalen worden verwijderd!\\n\\nAlles wat in deze kanalen op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?";
+App::$strings["The channel {0} will be deleted!\\n\\nEverything that was posted in this channel on this site will be permanently deleted!\\n\\nAre you sure?"] = "Kanaal {0} wordt verwijderd!\\n\\nAlles wat in dit kanaal op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?";
+App::$strings["Update has been marked successful"] = "Update is als succesvol gemarkeerd";
+App::$strings["Executing %s failed. Check system logs."] = "Uitvoeren van %s is mislukt. Controleer systeemlogboek.";
+App::$strings["Update %s was successfully applied."] = "Update %s was geslaagd.";
+App::$strings["Update %s did not return a status. Unknown if it succeeded."] = "Update %s gaf geen melding. Het is daarom niet bekend of deze geslaagd is.";
+App::$strings["Update function %s could not be found."] = "Update-functie %s kon niet gevonden worden.";
+App::$strings["No failed updates."] = "Geen mislukte updates.";
+App::$strings["Failed Updates"] = "Mislukte updates";
+App::$strings["Mark success (if update was manually applied)"] = "Markeer als geslaagd (wanneer de update handmatig was uitgevoerd)";
+App::$strings["Attempt to execute this update step automatically"] = "Poging om deze stap van de update automatisch uit te voeren.";
App::$strings["Site settings updated."] = "Hub-instellingen bijgewerkt.";
App::$strings["Default"] = "Standaard";
App::$strings["mobile"] = "mobiel";
@@ -293,7 +485,7 @@ App::$strings["Registration"] = "Registratie";
App::$strings["File upload"] = "Bestand uploaden";
App::$strings["Policies"] = "Beleid";
App::$strings["Advanced"] = "Geavanceerd";
-App::$strings["Site name"] = "Naam van deze \$Projectname-hub";
+App::$strings["Site name"] = "Hubnaam";
App::$strings["Server Configuration/Role"] = "Configuratietype hub";
App::$strings["Site default technical skill level"] = "Standaard technisch niveau voor deze hub";
App::$strings["Used to provide a member experience matched to technical comfort level"] = "Wordt gebruikt om leden een gebruikerservaring te bieden die met hun technisch niveau overeenkomt";
@@ -302,6 +494,8 @@ App::$strings["Members can set their own technical comfort level by default"] =
App::$strings["Banner/Logo"] = "Banner/logo";
App::$strings["Administrator Information"] = "Informatie over de beheerder";
App::$strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Contactinformatie voor hub-beheerders. Getoond op pagina met hub-informatie. Er kan hier bbcode gebruikt worden.";
+App::$strings["Site Information"] = "Hub-informatie";
+App::$strings["Publicly visible description of this site. Displayed on siteinfo page. BBCode can be used here"] = "Openbaar zichtbare beschrijving van deze hub. Getoond op pagina met hub-informatie. Er kan hier bbcode gebruikt worden.";
App::$strings["System language"] = "Standaardtaal";
App::$strings["System theme"] = "Standaardthema";
App::$strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Standaardthema voor \$Projectname-hub (kan door lid veranderd worden) - <a href='#' id='cnftheme'>verander thema-instellingen</a>";
@@ -351,173 +545,35 @@ App::$strings["Maximum Load Average"] = "Maximaal gemiddelde systeembelasting";
App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Maximale systeembelasting voordat de afleverings- en polllingsprocessen worden uitgesteld. Standaard is 50.";
App::$strings["Expiration period in days for imported (grid/network) content"] = "Aantal dagen waarna geïmporteerde inhoud uit iemands grid/netwerk-pagina wordt verwijderd.";
App::$strings["0 for no expiration of imported content"] = "Dit geldt alleen voor inhoud van andere kanalen, dus niet voor iemands eigen kanaal. 0 voor het niet verwijderen van geïmporteerde inhoud.";
-App::$strings["Theme settings updated."] = "Thema-instellingen bijgewerkt.";
-App::$strings["No themes found."] = "Geen thema's gevonden";
-App::$strings["Screenshot"] = "Schermafdruk";
-App::$strings["Themes"] = "Thema's";
-App::$strings["[Experimental]"] = "[Experimenteel]";
-App::$strings["[Unsupported]"] = "[Niet ondersteund]";
-App::$strings["Photos"] = "Foto's";
-App::$strings["Invalid item."] = "Ongeldig item.";
-App::$strings["Channel not found."] = "Kanaal niet gevonden.";
-App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
-App::$strings["Save to Folder:"] = "Bewaar in map: ";
-App::$strings["- select -"] = "- kies map -";
-App::$strings["Unable to lookup recipient."] = "Niet in staat om ontvanger op te zoeken.";
-App::$strings["Unable to communicate with requested channel."] = "Niet in staat om met het aangevraagde kanaal te communiceren.";
-App::$strings["Cannot verify requested channel."] = "Kan opgevraagd kanaal niet verifieren";
-App::$strings["Selected channel has private message restrictions. Send failed."] = "Gekozen kanaal heeft restricties voor privéberichten. Verzenden mislukt.";
-App::$strings["Messages"] = "Berichten";
-App::$strings["Message recalled."] = "Bericht ingetrokken.";
-App::$strings["Conversation removed."] = "Conversatie verwijderd";
-App::$strings["Please enter a link URL:"] = "Vul een URL in:";
-App::$strings["Expires YYYY-MM-DD HH:MM"] = "Verloopt op DD-MM-YYYY om HH:MM";
-App::$strings["Requested channel is not in this network"] = "Opgevraagd kanaal is niet in dit netwerk beschikbaar";
-App::$strings["Send Private Message"] = "Privébericht versturen";
-App::$strings["To:"] = "Aan:";
-App::$strings["Subject:"] = "Onderwerp:";
-App::$strings["Your message:"] = "Jouw bericht:";
-App::$strings["Attach file"] = "Bestand toevoegen";
-App::$strings["Insert web link"] = "Weblink invoegen";
-App::$strings["Send"] = "Verzenden";
-App::$strings["Set expiration date"] = "Verloopdatum instellen";
-App::$strings["Encrypt text"] = "Tekst versleutelen";
-App::$strings["Delete message"] = "Bericht verwijderen";
-App::$strings["Delivery report"] = "Afleveringsrapport";
-App::$strings["Recall message"] = "Bericht intrekken";
-App::$strings["Message has been recalled."] = "Bericht is ingetrokken.";
-App::$strings["Delete Conversation"] = "Verwijder conversatie";
-App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Geen veilige communicatie beschikbaar. <strong>Mogelijk</strong> kan je reageren op de kanaalpagina van de afzender.";
-App::$strings["Send Reply"] = "Antwoord versturen";
-App::$strings["Your message for %s (%s):"] = "Jouw privébericht aan %s (%s):";
-App::$strings["Blocked"] = "Geblokkeerd";
-App::$strings["Ignored"] = "Genegeerd";
-App::$strings["Hidden"] = "Verborgen";
-App::$strings["Archived"] = "Gearchiveerd";
-App::$strings["New"] = "Nieuw";
-App::$strings["All"] = "Alles";
-App::$strings["New Connections"] = "Nieuwe connecties";
-App::$strings["Show pending (new) connections"] = "Nog te accepteren (nieuwe) connecties weergeven";
-App::$strings["All Connections"] = "Alle connecties";
-App::$strings["Show all connections"] = "Toon alle connecties";
-App::$strings["Only show blocked connections"] = "Toon alleen geblokkeerde connecties";
-App::$strings["Only show ignored connections"] = "Toon alleen genegeerde connecties";
-App::$strings["Only show archived connections"] = "Toon alleen gearchiveerde connecties";
-App::$strings["Only show hidden connections"] = "Toon alleen verborgen connecties";
-App::$strings["Pending approval"] = "Moet nog geaccepteerd worden";
-App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
-App::$strings["Edit connection"] = "Connectie bewerken";
-App::$strings["Delete connection"] = "Connectie verwijderen";
-App::$strings["Channel address"] = "Kanaaladres";
-App::$strings["Network"] = "Netwerk";
-App::$strings["Status"] = "Status";
-App::$strings["Connected"] = "Verbonden";
-App::$strings["Approve connection"] = "Connectie accepteren";
-App::$strings["Ignore connection"] = "Connectie negeren";
-App::$strings["Ignore"] = "Negeren";
-App::$strings["Recent activity"] = "Recente activiteit";
-App::$strings["Connections"] = "Connecties";
-App::$strings["Search"] = "Zoeken";
-App::$strings["Search your connections"] = "Doorzoek jouw connecties";
-App::$strings["Connections search"] = "Connecties zoeken";
-App::$strings["Find"] = "Vinden";
-App::$strings["Image uploaded but image cropping failed."] = "Afbeelding geüpload, maar afbeelding kon niet worden bijgesneden. ";
-App::$strings["Cover Photos"] = "Omslagfoto's";
-App::$strings["Image resize failed."] = "Afbeelding kon niet van grootte veranderd worden.";
-App::$strings["Unable to process image"] = "Afbeelding kan niet verwerkt worden";
-App::$strings["Image upload failed."] = "Uploaden afbeelding mislukt";
-App::$strings["Unable to process image."] = "Niet in staat om afbeelding te verwerken.";
-App::$strings["female"] = "vrouw";
-App::$strings["%1\$s updated her %2\$s"] = "%1\$s heeft haar %2\$s bijgewerkt";
-App::$strings["male"] = "man";
-App::$strings["%1\$s updated his %2\$s"] = "%1\$s heeft zijn %2\$s bijgewerkt";
-App::$strings["%1\$s updated their %2\$s"] = "De %2\$s van %1\$s is bijgewerkt";
-App::$strings["cover photo"] = "omslagfoto";
-App::$strings["Photo not available."] = "Foto niet beschikbaar.";
-App::$strings["Upload File:"] = "Bestand uploaden:";
-App::$strings["Select a profile:"] = "Kies een profiel:";
-App::$strings["Upload Cover Photo"] = "Omslagfoto uploaden";
-App::$strings["or"] = "of";
-App::$strings["skip this step"] = "sla deze stap over";
-App::$strings["select a photo from your photo albums"] = "Kies een foto uit jouw fotoalbums";
-App::$strings["Crop Image"] = "Afbeelding bijsnijden";
-App::$strings["Please adjust the image cropping for optimum viewing."] = "Snij de afbeelding zo uit dat deze optimaal wordt weergegeven.";
-App::$strings["Done Editing"] = "Klaar met bewerken";
-App::$strings["Edit post"] = "Bericht bewerken";
-App::$strings["Could not access contact record."] = "Kon geen toegang krijgen tot de connectie-gegevens.";
-App::$strings["Could not locate selected profile."] = "Kon het gekozen profiel niet vinden.";
-App::$strings["Connection updated."] = "Connectie bijgewerkt.";
-App::$strings["Failed to update connection record."] = "Bijwerken van connectie-gegevens mislukt.";
-App::$strings["is now connected to"] = "is nu verbonden met";
-App::$strings["Could not access address book record."] = "Kon geen toegang krijgen tot de record van de connectie.";
-App::$strings["Refresh failed - channel is currently unavailable."] = "Vernieuwen mislukt - kanaal is momenteel niet beschikbaar";
-App::$strings["Unable to set address book parameters."] = "Niet in staat om de parameters van connecties in te stellen.";
-App::$strings["Connection has been removed."] = "Connectie is verwijderd";
-App::$strings["View Profile"] = "Profiel weergeven";
-App::$strings["View %s's profile"] = "Profiel van %s weergeven";
-App::$strings["Refresh Permissions"] = "Permissies vernieuwen";
-App::$strings["Fetch updated permissions"] = "Aangepaste permissies ophalen";
-App::$strings["Recent Activity"] = "Recente activiteit/berichten";
-App::$strings["View recent posts and comments"] = "Recente berichten en reacties weergeven";
-App::$strings["Block (or Unblock) all communications with this connection"] = "Blokkeer (of deblokkeer) alle communicatie met deze connectie";
-App::$strings["This connection is blocked!"] = "Deze connectie is geblokkeerd!";
-App::$strings["Unignore"] = "Niet meer negeren";
-App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Negeer (of negeer niet meer) alle inkomende communicatie van deze connectie";
-App::$strings["This connection is ignored!"] = "Deze connectie wordt genegeerd!";
-App::$strings["Unarchive"] = "Niet meer archiveren";
-App::$strings["Archive"] = "Archiveren";
-App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Archiveer (of dearchiveer) deze connectie - markeer het kanaal als dood, maar bewaar de inhoud";
-App::$strings["This connection is archived!"] = "Deze connectie is gearchiveerd!";
-App::$strings["Unhide"] = "Niet meer verbergen";
-App::$strings["Hide"] = "Verbergen";
-App::$strings["Hide or Unhide this connection from your other connections"] = "Deze connectie verbergen (of niet meer verbergen) voor jouw andere connecties";
-App::$strings["This connection is hidden!"] = "Deze connectie is verborgen!";
-App::$strings["Delete this connection"] = "Deze connectie verwijderen";
-App::$strings["Me"] = "Ik";
-App::$strings["Family"] = "Familie";
-App::$strings["Friends"] = "Vrienden";
-App::$strings["Acquaintances"] = "Kennissen";
-App::$strings["Approve this connection"] = "Deze connectie accepteren";
-App::$strings["Accept connection to allow communication"] = "Keur deze connectie goed om communicatie toe te staan";
-App::$strings["Set Affinity"] = "Verwantschapsfilter instellen";
-App::$strings["Set Profile"] = "Profiel instellen";
-App::$strings["Set Affinity & Profile"] = "Verwantschapsfilter en profiel instellen";
-App::$strings["none"] = "geen";
-App::$strings["Connection Default Permissions"] = "Standaard permissies voor connecties";
-App::$strings["Connection: %s"] = "Connectie: %s";
-App::$strings["Apply these permissions automatically"] = "Deze permissies automatisch toepassen";
-App::$strings["Connection requests will be approved without your interaction"] = "Connectieverzoeken zullen automatisch worden geaccepteerd";
-App::$strings["This connection's primary address is"] = "Het primaire kanaaladres van deze connectie is";
-App::$strings["Available locations:"] = "Beschikbare locaties:";
-App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Permissies die op deze pagina staan vermeld worden op alle nieuwe connecties toegepast.";
-App::$strings["Connection Tools"] = "Hulpmiddelen";
-App::$strings["Slide to adjust your degree of friendship"] = "Schuif om te bepalen hoe goed je iemand kent en/of mag";
-App::$strings["Rating"] = "Beoordeling";
-App::$strings["Slide to adjust your rating"] = "Gebruik de schuif om je beoordeling te geven";
-App::$strings["Optionally explain your rating"] = "Verklaar jouw beoordeling (niet verplicht)";
-App::$strings["Custom Filter"] = "Berichtenfilter";
-App::$strings["Only import posts with this text"] = "Importeer alleen berichten met deze tekst";
-App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "woorden (één per regel), #tags, /regex/ of talen (lang=iso639-1) - laat leeg om alle berichten te importeren";
-App::$strings["Do not import posts with this text"] = "Importeer geen berichten met deze tekst";
-App::$strings["This information is public!"] = "Deze informatie is openbaar!";
-App::$strings["Connection Pending Approval"] = "Connectie moet nog geaccepteerd worden";
-App::$strings["inherited"] = "geërfd";
-App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Kies het profiel dat je aan %s wil tonen wanneer hij/zij ingelogd jouw profiel wil bekijken.";
-App::$strings["Their Settings"] = "Hun instellingen";
-App::$strings["My Settings"] = "Mijn instellingen";
-App::$strings["Individual Permissions"] = "Individuele permissies";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele instellingen. Je kan je deze overgeërfde permissies hier <strong>niet</strong> veranderen.";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele permissies. Je kan de permissies hier veranderen, maar die hebben geen effect, tenzij de overgeërfde permissies worden veranderd. ";
-App::$strings["Last update:"] = "Laatste wijziging:";
+App::$strings["Public Hubs"] = "Openbare hubs";
+App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Op de hier weergegeven hubs kan iedereen zich voor het \$Projectname-netwerk aanmelden. Alle hubs in het netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen een financiële tegemoetkoming voor bepaalde uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven.";
+App::$strings["Hub URL"] = "Hub-URL";
+App::$strings["Access Type"] = "Toegangs-<br/>&nbsp;type";
+App::$strings["Registration Policy"] = "Registratie-<br/>&nbsp;beleid";
+App::$strings["Stats"] = "Stats";
+App::$strings["Software"] = "Software";
+App::$strings["Ratings"] = "Beoordelingen";
+App::$strings["Rate"] = "Beoordeel";
+App::$strings["View"] = "Weergeven";
App::$strings["Item not found"] = "Item niet gevonden";
-App::$strings["Block Name"] = "Bloknaam";
-App::$strings["Title (optional)"] = "Titel (optioneel)";
-App::$strings["Edit Block"] = "Blok bewerken";
App::$strings["Layout Name"] = "Naam lay-out";
App::$strings["Layout Description (Optional)"] = "Lay-out-omschrijving (optioneel)";
App::$strings["Edit Layout"] = "Lay-out bewerken";
App::$strings["Page link"] = "Paginalink";
+App::$strings["Insert web link"] = "Weblink invoegen";
App::$strings["Edit Webpage"] = "Webpagina bewerken";
+App::$strings["Photos"] = "Foto's";
+App::$strings["You must be logged in to see this page."] = "Je moet zijn ingelogd om deze pagina te kunnen bekijken.";
+App::$strings["Posts and comments"] = "Berichten en reacties";
+App::$strings["Only posts"] = "Alleen berichten";
+App::$strings["Insufficient permissions. Request redirected to profile page."] = "Onvoldoende permissies. Doorgestuurd naar profielpagina.";
+App::$strings["No such group"] = "Collectie niet gevonden";
+App::$strings["No such channel"] = "Niet zo'n kanaal";
+App::$strings["forum"] = "forum";
+App::$strings["Search Results For:"] = "Zoekresultaten voor:";
+App::$strings["Privacy group is empty"] = "Privacygroep is leeg";
+App::$strings["Privacy group: "] = "Privacygroep: ";
+App::$strings["Invalid connection."] = "Ongeldige connectie.";
App::$strings["Unable to update menu."] = "Niet in staat om menu aan te passen";
App::$strings["Unable to create menu."] = "Niet in staat om menu aan te maken.";
App::$strings["Menu Name"] = "Menunaam";
@@ -528,7 +584,6 @@ App::$strings["Allow Bookmarks"] = "Bladwijzers toestaan";
App::$strings["Menu may be used to store saved bookmarks"] = "Menu kan gebruikt worden om bladwijzers in op te slaan";
App::$strings["Submit and proceed"] = "Opslaan en doorgaan";
App::$strings["Menus"] = "Menu's";
-App::$strings["Drop"] = "Verwijderen";
App::$strings["Created"] = "Aangemaakt";
App::$strings["Edited"] = "Bewerkt";
App::$strings["Bookmarks allowed"] = "Bladwijzers toegestaan";
@@ -560,34 +615,20 @@ App::$strings["Categories (optional, comma separated list)"] = "Categorieën (op
App::$strings["Version ID"] = "Versie-ID";
App::$strings["Price of app"] = "Prijs van de app";
App::$strings["Location (URL) to purchase app"] = "Locatie (URL) om de app aan te schaffen";
-App::$strings["Public Hubs"] = "Openbare hubs";
-App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Op de hier weergegeven hubs kan iedereen zich voor het \$Projectname-netwerk aanmelden. Alle hubs in het netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen een financiële tegemoetkoming voor bepaalde uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven.";
-App::$strings["Hub URL"] = "Hub-URL";
-App::$strings["Access Type"] = "Toegangs-<br/>&nbsp;type";
-App::$strings["Registration Policy"] = "Registratie-<br/>&nbsp;beleid";
-App::$strings["Stats"] = "Stats";
-App::$strings["Software"] = "Software";
-App::$strings["Ratings"] = "Beoordelingen";
-App::$strings["Rate"] = "Beoordeel";
-App::$strings["Location"] = "Locatie";
-App::$strings["View"] = "Weergeven";
-App::$strings["Item not available."] = "Item is niet aanwezig.";
-App::$strings["Authorize application connection"] = "Geef toestemming voor applicatiekoppeling";
-App::$strings["Return to your app and insert this Security Code:"] = "Ga terug naar je app en voeg deze beveiligingscode in:";
-App::$strings["Please login to continue."] = "Inloggen om verder te kunnen gaan.";
-App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Wil je deze applicatie toestemming geven om jouw berichten en connecties te zien, en/of nieuwe berichten voor jou te plaatsen?";
+App::$strings["Edit post"] = "Bericht bewerken";
+App::$strings["Documentation Search"] = "Zoek documentatie";
+App::$strings["About"] = "Over";
+App::$strings["Members"] = "Kanalen";
+App::$strings["Administrators"] = "Beheerders";
+App::$strings["Developers"] = "Ontwikkelaars";
+App::$strings["Tutorials"] = "Zelfstudie";
+App::$strings["\$Projectname Documentation"] = "\$Projectname-documentatie";
+App::$strings["Contents"] = "Inhoud";
App::$strings["Share content from Firefox to \$Projectname"] = "Deel webpagina's vanuit Firefox met ";
App::$strings["Activate the Firefox \$Projectname provider"] = "Activeer de \$Projectname-service in Firefox";
-App::$strings["Layout updated."] = "Lay-out bijgewerkt.";
-App::$strings["Feature disabled."] = "Functie uitgeschakeld.";
-App::$strings["Edit System Page Description"] = "Systeempagina's bewerken";
-App::$strings["Layout not found."] = "Lay-out niet gevonden.";
-App::$strings["Module Name:"] = "Modulenaam:";
-App::$strings["Layout Help"] = "Lay-out-hulp";
+App::$strings["Apps"] = "Apps";
App::$strings["\$Projectname"] = "\$Projectname";
App::$strings["Welcome to %s"] = "Welkom op %s";
-App::$strings["Remote privacy information not available."] = "Privacy-informatie op afstand niet beschikbaar.";
-App::$strings["Visible to:"] = "Zichtbaar voor:";
App::$strings["Permission Denied."] = "Toegang geweigerd";
App::$strings["File not found."] = "Bestand niet gevonden.";
App::$strings["Edit file permissions"] = "Bestandsrechten bewerken";
@@ -600,64 +641,85 @@ App::$strings["Copy/paste this URL to link file from a web page"] = "Kopieer/pla
App::$strings["Share this file"] = "Dit bestand delen";
App::$strings["Show URL to this file"] = "Toon URL van dit bestand";
App::$strings["Notify your contacts about this file"] = "Jouw connecties over dit bestand berichten";
-App::$strings["Continue"] = "Ga verder";
-App::$strings["Premium Channel Setup"] = "Instellen premiumkanaal ";
-App::$strings["Enable premium channel connection restrictions"] = "Restricties voor connecties van premiumkanaal toestaan";
-App::$strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Vul je restricties of voorwaarden in, zoals een paypal-afschrift, voorschriften voor leden, enz.";
-App::$strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Dit kanaal kan extra stappen of het accepteren van de volgende voorwaarden vereisen, voordat de connectie wordt geaccepteerd:";
-App::$strings["Potential connections will then see the following text before proceeding:"] = "Mogelijke connecties zullen dan de volgende tekst zien voordat ze verder kunnen:";
-App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Door verder te gaan ga ik automatisch akkoord met alle voorwaarden en aanwijzingen op deze pagina.";
-App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(Er zijn geen speciale voorwaarden en aanwijzingen door de kanaal-eigenaar verstrekt) ";
-App::$strings["Restricted or Premium Channel"] = "Beperkt of premiumkanaal";
-App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Je hebt %1$.0f van totaal %2$.0f toegestane kanalen aangemaakt.";
-App::$strings["Create a new channel"] = "Nieuw kanaal aanmaken";
-App::$strings["Create New"] = "Nieuwe aanmaken";
-App::$strings["Channel Manager"] = "Kanaalbeheer";
-App::$strings["Current Channel"] = "Huidig kanaal";
-App::$strings["Switch to one of your channels by selecting it."] = "Activeer een van jouw andere kanalen door er op te klikken.";
-App::$strings["Default Channel"] = "Standaardkanaal";
-App::$strings["Make Default"] = "Als standaard instellen";
-App::$strings["%d new messages"] = "%d nieuwe berichten";
-App::$strings["%d new introductions"] = "%d nieuwe connectieverzoeken";
-App::$strings["Delegated Channel"] = "Uitbesteed kanaal";
-App::$strings["Privacy group created."] = "Privacygroep aangemaakt";
-App::$strings["Could not create privacy group."] = "Kon privacygroep niet aanmaken";
-App::$strings["Privacy group not found."] = "Privacygroep niet gevonden";
-App::$strings["Privacy group updated."] = "Privacygroep bijgewerkt";
-App::$strings["Create a group of channels."] = "Privacygroep met kanalen aanmaken";
-App::$strings["Privacy group name: "] = "Naam privacygroep: ";
-App::$strings["Members are visible to other channels"] = "Kanalen in deze privacygroep zijn zichtbaar voor andere kanalen";
-App::$strings["Privacy group removed."] = "Privacygroep verwijderd.";
-App::$strings["Unable to remove privacy group."] = "Verwijderen privacygroep mislukt";
-App::$strings["Privacy group editor"] = "Privacygroep bewerken";
-App::$strings["Members"] = "Kanalen";
-App::$strings["All Connected Channels"] = "Alle kanaalconnecties";
-App::$strings["Click on a channel to add or remove."] = "Klik op een kanaal om deze toe te voegen of te verwijderen.";
-App::$strings["Invalid message"] = "Ongeldig bericht";
-App::$strings["no results"] = "geen resultaten";
-App::$strings["channel sync processed"] = "kanaalsync verwerkt";
-App::$strings["queued"] = "in wachtrij";
-App::$strings["posted"] = "verstuurd";
-App::$strings["accepted for delivery"] = "geaccepteerd om afgeleverd te worden";
-App::$strings["updated"] = "geüpdatet";
-App::$strings["update ignored"] = "update genegeerd";
-App::$strings["permission denied"] = "toegang geweigerd";
-App::$strings["recipient not found"] = "ontvanger niet gevonden";
-App::$strings["mail recalled"] = "Privébericht ingetrokken";
-App::$strings["duplicate mail received"] = "dubbel privébericht ontvangen";
-App::$strings["mail delivered"] = "privébericht afgeleverd";
-App::$strings["Delivery report for %1\$s"] = "Afleveringsrapport voor %1\$s";
-App::$strings["Options"] = "Opties";
-App::$strings["Redeliver"] = "Opnieuw afleveren";
+App::$strings["Public access denied."] = "Openbare toegang geweigerd.";
+App::$strings["%d rating"] = array(
+ 0 => "%d beoordeling",
+ 1 => "%d beoordelingen",
+);
+App::$strings["Gender: "] = "Geslacht:";
+App::$strings["Status: "] = "Status: ";
+App::$strings["Homepage: "] = "Homepage: ";
+App::$strings["Age:"] = "Leeftijd:";
+App::$strings["Location:"] = "Plaats:";
+App::$strings["Description:"] = "Omschrijving:";
+App::$strings["Hometown:"] = "Oorspronkelijk uit:";
+App::$strings["About:"] = "Over:";
+App::$strings["Public Forum:"] = "Openbaar forum:";
+App::$strings["Keywords: "] = "Trefwoorden: ";
+App::$strings["Don't suggest"] = "Niet voorstellen";
+App::$strings["Common connections:"] = "Gemeenschappelijke connecties:";
+App::$strings["Global Directory"] = "Volledige kanalengids";
+App::$strings["Local Directory"] = "Lokale kanalengids";
+App::$strings["Finding:"] = "Gezocht naar:";
+App::$strings["Channel Suggestions"] = "Voorgestelde kanalen";
+App::$strings["next page"] = "volgende pagina";
+App::$strings["previous page"] = "vorige pagina";
+App::$strings["Sort options"] = "Sorteeropties";
+App::$strings["Alphabetic"] = "Alfabetisch";
+App::$strings["Reverse Alphabetic"] = "Omgekeerd alfabetisch";
+App::$strings["Newest to Oldest"] = "Nieuw naar oud";
+App::$strings["Oldest to Newest"] = "Oud naar nieuw";
+App::$strings["No entries (some entries may be hidden)."] = "Niets gevonden (sommige kanalen kunnen verborgen zijn).";
+App::$strings["Unable to locate original post."] = "Niet in staat om de originele locatie van het bericht te vinden. ";
+App::$strings["Empty post discarded."] = "Leeg bericht geannuleerd";
+App::$strings["Executable content type not permitted to this channel."] = "Uitvoerbare bestanden zijn niet toegestaan op dit kanaal.";
+App::$strings["Duplicate post suppressed."] = "Dubbel bericht tegengehouden.";
+App::$strings["System error. Post not saved."] = "Systeemfout. Bericht niet opgeslagen.";
+App::$strings["Unable to obtain post information from database."] = "Niet in staat om informatie over dit bericht uit de database te verkrijgen.";
+App::$strings["You have reached your limit of %1$.0f top level posts."] = "Je hebt jouw limiet van %1$.0f berichten bereikt.";
+App::$strings["You have reached your limit of %1$.0f webpages."] = "Je hebt jouw limiet van %1$.0f webpagina's bereikt.";
+App::$strings["toggle full screen mode"] = "Volledig scherm";
+App::$strings["Channel added."] = "Kanaal toegevoegd.";
+App::$strings["Unable to lookup recipient."] = "Niet in staat om ontvanger op te zoeken.";
+App::$strings["Unable to communicate with requested channel."] = "Niet in staat om met het aangevraagde kanaal te communiceren.";
+App::$strings["Cannot verify requested channel."] = "Kan opgevraagd kanaal niet verifieren";
+App::$strings["Selected channel has private message restrictions. Send failed."] = "Gekozen kanaal heeft restricties voor privéberichten. Verzenden mislukt.";
+App::$strings["Messages"] = "Berichten";
+App::$strings["Message recalled."] = "Bericht ingetrokken.";
+App::$strings["Conversation removed."] = "Conversatie verwijderd";
+App::$strings["Please enter a link URL:"] = "Vul een URL in:";
+App::$strings["Expires YYYY-MM-DD HH:MM"] = "Verloopt op DD-MM-YYYY om HH:MM";
+App::$strings["Requested channel is not in this network"] = "Opgevraagd kanaal is niet in dit netwerk beschikbaar";
+App::$strings["Send Private Message"] = "Privébericht versturen";
+App::$strings["To:"] = "Aan:";
+App::$strings["Subject:"] = "Onderwerp:";
+App::$strings["Your message:"] = "Jouw bericht:";
+App::$strings["Attach file"] = "Bestand toevoegen";
+App::$strings["Send"] = "Verzenden";
+App::$strings["Set expiration date"] = "Verloopdatum instellen";
+App::$strings["Encrypt text"] = "Tekst versleutelen";
+App::$strings["Delete message"] = "Bericht verwijderen";
+App::$strings["Delivery report"] = "Afleveringsrapport";
+App::$strings["Recall message"] = "Bericht intrekken";
+App::$strings["Message has been recalled."] = "Bericht is ingetrokken.";
+App::$strings["Delete Conversation"] = "Verwijder conversatie";
+App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Geen veilige communicatie beschikbaar. <strong>Mogelijk</strong> kan je reageren op de kanaalpagina van de afzender.";
+App::$strings["Send Reply"] = "Antwoord versturen";
+App::$strings["Your message for %s (%s):"] = "Jouw privébericht aan %s (%s):";
App::$strings["webpage"] = "Webpagina";
App::$strings["block"] = "blok";
App::$strings["layout"] = "lay-out";
App::$strings["menu"] = "menu";
App::$strings["%s element installed"] = "%s onderdeel geïnstalleerd";
App::$strings["%s element installation failed"] = "Installatie %s-element mislukt";
+App::$strings["Nothing to import."] = "Niets gevonden om te importeren";
+App::$strings["Unable to download data from old server"] = "Niet in staat om gegevens van de oude hub te downloaden";
+App::$strings["Imported file is empty."] = "Geïmporteerde bestand is leeg";
+App::$strings["Warning: Database versions differ by %1\$d updates."] = "Waarschuwing: database-versies lopen %1\$d updates achter.";
App::$strings["Import completed"] = "Importeren voltooid";
App::$strings["Import Items"] = "Importeer items";
App::$strings["Use this form to import existing posts and content from an export file."] = "Gebruik dit formulier om bestaande berichten en andere inhoud vanuit een exportbestand te importeren.";
+App::$strings["File to Upload"] = "Bestand om te uploaden";
App::$strings["Total invitation limit exceeded."] = "Limiet voor aantal uitnodigingen overschreden.";
App::$strings["%s : Not a valid email address."] = "%s : Geen geldig e-mailadres.";
App::$strings["Please join us on \$Projectname"] = "Uitnodiging voor \$Projectname";
@@ -676,112 +738,27 @@ App::$strings["1. Register at any \$Projectname location (they are all inter-con
App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn \$Projectname-kanaaladres in het zoekveld invullen:";
App::$strings["or visit"] = "of bezoek";
App::$strings["3. Click [Connect]"] = "3. Klik op [+ Verbinden]";
-App::$strings["Location not found."] = "Locatie niet gevonden.";
-App::$strings["Location lookup failed."] = "Opzoeken locatie mislukt";
-App::$strings["Please select another location to become primary before removing the primary location."] = "Kies eerst een andere primaire locatie alvorens de huidige primaire locatie te verwijderen.";
-App::$strings["Syncing locations"] = "Locaties synchronizeren";
-App::$strings["No locations found."] = "Geen locaties gevonden.";
-App::$strings["Manage Channel Locations"] = "Kanaallocaties beheren";
-App::$strings["Primary"] = "Primair";
-App::$strings["Sync Now"] = "Nu synchroniseren";
-App::$strings["Please wait several minutes between consecutive operations."] = "Wacht enkele minuten tussen opeenvolgende handelingen.";
-App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen door op de hub van de kloon in te loggen en het kanaal daar te verwijderen.";
-App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is.";
-App::$strings["Website:"] = "Website:";
-App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Kanaal op afstand [%s] (nog niet op deze hub bekend)";
-App::$strings["Rating (this information is public)"] = "Beoordeling (deze informatie is openbaar)";
-App::$strings["Optionally explain your rating (this information is public)"] = "Verklaar jouw beoordeling (niet verplicht, deze informatie is openbaar)";
-App::$strings["Like/Dislike"] = "Leuk/niet leuk";
-App::$strings["This action is restricted to members."] = "Deze actie kan alleen door \$Projectname-leden worden uitgevoerd.";
-App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Je dient <a href=\"rmagic\">in te loggen met je \$Projectname-account</a> of <a href=\"register\">een nieuw \$Projectname-account aan te maken</a> om verder te kunnen gaan.";
-App::$strings["Invalid request."] = "Ongeldig verzoek";
-App::$strings["channel"] = "kanaal";
-App::$strings["thing"] = "ding";
-App::$strings["Channel unavailable."] = "Kanaal niet beschikbaar.";
-App::$strings["Previous action reversed."] = "Vorige actie omgedraaid";
-App::$strings["photo"] = "foto";
-App::$strings["status"] = "bericht";
-App::$strings["event"] = "gebeurtenis";
-App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s vindt %3\$s van %2\$s leuk";
-App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s vindt %3\$s van %2\$s niet leuk";
-App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s is het eens met %2\$s's %3\$s";
-App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s is het niet eens met %2\$s's %3\$s";
-App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s onthoudt zich van een besluit over %2\$s's %3\$s";
-App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s is aanwezig op %2\$s's %3\$s";
-App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s is niet aanwezig op %2\$s's %3\$s";
-App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s is mogelijk aanwezig op %2\$s's %3\$s";
-App::$strings["Action completed."] = "Actie voltooid";
-App::$strings["Thank you."] = "Bedankt";
-App::$strings["Profile not found."] = "Profiel niet gevonden.";
-App::$strings["Profile deleted."] = "Profiel verwijderd.";
-App::$strings["Profile-"] = "Profiel-";
-App::$strings["New profile created."] = "Nieuw profiel aangemaakt.";
-App::$strings["Profile unavailable to clone."] = "Profiel niet beschikbaar om te klonen";
-App::$strings["Profile unavailable to export."] = "Geen profiel beschikbaar om te exporteren";
-App::$strings["Profile Name is required."] = "Profielnaam is vereist";
-App::$strings["Marital Status"] = "Huwelijke status";
-App::$strings["Romantic Partner"] = "Romantische partner";
-App::$strings["Likes"] = "Houdt van";
-App::$strings["Dislikes"] = "Houdt niet van";
-App::$strings["Work/Employment"] = "Werk/arbeid";
-App::$strings["Religion"] = "Religie";
-App::$strings["Political Views"] = "Politieke overtuigingen";
-App::$strings["Gender"] = "Geslacht";
-App::$strings["Sexual Preference"] = "Seksuele voorkeur";
-App::$strings["Homepage"] = "Homepage";
-App::$strings["Interests"] = "Interesses";
-App::$strings["Address"] = "Kanaaladres";
-App::$strings["Location"] = "Locatie";
-App::$strings["Profile updated."] = "Profiel bijgewerkt";
-App::$strings["Hide your connections list from viewers of this profile"] = "Laat de lijst met connecties niet aan bezoekers van dit profiel zien.";
-App::$strings["Edit Profile Details"] = "Profiel bewerken";
-App::$strings["View this profile"] = "Profiel weergeven";
-App::$strings["Edit visibility"] = "Zichtbaarheid bewerken";
-App::$strings["Profile Tools"] = "Hulpmiddelen";
-App::$strings["Change cover photo"] = "Omslagfoto wijzigen";
-App::$strings["Change profile photo"] = "Profielfoto veranderen";
-App::$strings["Create a new profile using these settings"] = "Een nieuw profiel aanmaken met dit profiel als basis";
-App::$strings["Clone this profile"] = "Dit profiel klonen";
-App::$strings["Delete this profile"] = "Dit profiel verwijderen";
-App::$strings["Add profile things"] = "Dingen aan je profiel toevoegen";
-App::$strings["Personal"] = "Persoonlijk";
-App::$strings["Relation"] = "Relatie";
-App::$strings["Miscellaneous"] = "Diversen";
-App::$strings["Import profile from file"] = "Profiel vanuit bestand importeren";
-App::$strings["Export profile to file"] = "Profiel naar bestand exporteren";
-App::$strings["Your gender"] = "Jouw geslacht";
-App::$strings["Marital status"] = "Burgerlijke staat";
-App::$strings["Sexual preference"] = "Seksuele voorkeur";
-App::$strings["Profile name"] = "Profielnaam";
-App::$strings["This is your default profile."] = "Dit is jouw standaardprofiel";
-App::$strings["Your full name"] = "Jouw volledige naam";
-App::$strings["Title/Description"] = "Titel/omschrijving";
-App::$strings["Street address"] = "Straat en huisnummer";
-App::$strings["Locality/City"] = "Woonplaats";
-App::$strings["Region/State"] = "Provincie/gewest/deelstaat";
-App::$strings["Postal/Zip code"] = "Postcode";
-App::$strings["Country"] = "Land";
-App::$strings["Who (if applicable)"] = "Wie (wanneer van toepassing)";
-App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Voorbeelden: petra123, Petra Jansen, petra@voorbeeld.nl";
-App::$strings["Since (date)"] = "Sinds (datum)";
-App::$strings["Tell us about yourself"] = "Vertel ons iets over jezelf";
-App::$strings["Homepage URL"] = "URL homepagina";
-App::$strings["Hometown"] = "Oorspronkelijk uit";
-App::$strings["Political views"] = "Politieke overtuigingen";
-App::$strings["Religious views"] = "Religieuze overtuigingen";
-App::$strings["Keywords used in directory listings"] = "Trefwoorden voor in de kanalengids";
-App::$strings["Example: fishing photography software"] = "Voorbeeld: muziek, fotografie, software";
-App::$strings["Musical interests"] = "Muzikale interesses";
-App::$strings["Books, literature"] = "Boeken/literatuur";
-App::$strings["Television"] = "Televisie";
-App::$strings["Film/Dance/Culture/Entertainment"] = "Film/dans/cultuur/entertainment";
-App::$strings["Hobbies/Interests"] = "Hobby's/interesses";
-App::$strings["Love/Romance"] = "Liefde/romantiek";
-App::$strings["School/Education"] = "School/opleiding";
-App::$strings["Contact information and social networks"] = "Contactinformatie en sociale netwerken";
-App::$strings["My other channels"] = "Mijn andere kanalen";
-App::$strings["Profile Image"] = "Profielfoto";
-App::$strings["Edit Profiles"] = "Bewerk profielen";
+App::$strings["Block Name"] = "Bloknaam";
+App::$strings["Title (optional)"] = "Titel (optioneel)";
+App::$strings["Edit Block"] = "Blok bewerken";
+App::$strings["Privacy group created."] = "Privacygroep aangemaakt";
+App::$strings["Could not create privacy group."] = "Kon privacygroep niet aanmaken";
+App::$strings["Privacy group not found."] = "Privacygroep niet gevonden";
+App::$strings["Privacy group updated."] = "Privacygroep bijgewerkt";
+App::$strings["Create a group of channels."] = "Privacygroep met kanalen aanmaken";
+App::$strings["Privacy group name: "] = "Naam privacygroep: ";
+App::$strings["Members are visible to other channels"] = "Kanalen in deze privacygroep zijn zichtbaar voor andere kanalen";
+App::$strings["Privacy group removed."] = "Privacygroep verwijderd.";
+App::$strings["Unable to remove privacy group."] = "Verwijderen privacygroep mislukt";
+App::$strings["Privacy group editor"] = "Privacygroep bewerken";
+App::$strings["All Connected Channels"] = "Alle kanaalconnecties";
+App::$strings["Click on a channel to add or remove."] = "Klik op een kanaal om deze toe te voegen of te verwijderen.";
+App::$strings["Invalid profile identifier."] = "Ongeldige profiel-identificator";
+App::$strings["Profile Visibility Editor"] = "Zichtbaarheid profiel ";
+App::$strings["Profile"] = "Profiel";
+App::$strings["Click on a contact to add or remove."] = "Klik op een connectie om deze toe te voegen of te verwijderen";
+App::$strings["Visible To"] = "Zichtbaar voor";
+App::$strings["Hub not found."] = "Hub niet gevonden.";
App::$strings["Unable to create element."] = "Niet in staat om onderdeel aan te maken.";
App::$strings["Unable to update menu element."] = "Menu-onderdeel kan niet worden geüpdatet.";
App::$strings["Unable to add menu element."] = "Menu-onderdeel kan niet worden toegevoegd.";
@@ -811,6 +788,88 @@ App::$strings["Menu item deleted."] = "Menu-item verwijderd.";
App::$strings["Menu item could not be deleted."] = "Menu-item kon niet worden verwijderd.";
App::$strings["Edit Menu Element"] = "Menu-element bewerken";
App::$strings["Link text"] = "Linktekst";
+App::$strings["No ratings"] = "Geen beoordelingen";
+App::$strings["Rating: "] = "Beoordeling: ";
+App::$strings["Website: "] = "Website: ";
+App::$strings["Description: "] = "Omschrijving: ";
+App::$strings["Item not available."] = "Item is niet aanwezig.";
+App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s is %2\$s";
+App::$strings["Mood"] = "Stemming";
+App::$strings["Set your current mood and tell your friends"] = "Noteer je huidige stemming en toon het aan je connecties";
+App::$strings["No more system notifications."] = "Geen systeemnotificaties meer.";
+App::$strings["System Notifications"] = "Systeemnotificaties";
+App::$strings["Page owner information could not be retrieved."] = "Informatie over de pagina-eigenaar werd niet ontvangen.";
+App::$strings["Profile Photos"] = "Profielfoto's";
+App::$strings["Album not found."] = "Album niet gevonden.";
+App::$strings["Delete Album"] = "Verwijder album";
+App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Er bestaan meerdere submappen met deze albumnaam, maar verspreidt over verschillende mappen. Verwijder de gewenste map(pen) met de bestandsbeheerder.";
+App::$strings["Delete Photo"] = "Verwijder foto";
+App::$strings["No photos selected"] = "Geen foto's geselecteerd";
+App::$strings["Access to this item is restricted."] = "Toegang tot dit item is beperkt.";
+App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt.";
+App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB aan foto-opslag gebruikt.";
+App::$strings["Upload Photos"] = "Foto's uploaden";
+App::$strings["Enter an album name"] = "Vul een albumnaam in";
+App::$strings["or select an existing album (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
+App::$strings["Create a status post for this upload"] = "Plaats een bericht voor deze upload.";
+App::$strings["Caption (optional):"] = "Bijschrift (optioneel):";
+App::$strings["Description (optional):"] = "Omschrijving (optioneel):";
+App::$strings["Album name could not be decoded"] = "Albumnaam kon niet gedecodeerd worden";
+App::$strings["Contact Photos"] = "Connectiefoto's";
+App::$strings["Show Newest First"] = "Nieuwste eerst weergeven";
+App::$strings["Show Oldest First"] = "Oudste eerst weergeven";
+App::$strings["View Photo"] = "Foto weergeven";
+App::$strings["Edit Album"] = "Album bewerken";
+App::$strings["Permission denied. Access to this item may be restricted."] = "Toegang geweigerd. Toegang tot dit item kan zijn beperkt.";
+App::$strings["Photo not available"] = "Foto niet aanwezig";
+App::$strings["Use as profile photo"] = "Als profielfoto gebruiken";
+App::$strings["Use as cover photo"] = "Als omslagfoto gebruiken";
+App::$strings["Private Photo"] = "Privéfoto";
+App::$strings["Previous"] = "Vorige";
+App::$strings["View Full Size"] = "Volledige grootte weergeven";
+App::$strings["Next"] = "Volgende";
+App::$strings["Edit photo"] = "Foto bewerken";
+App::$strings["Rotate CW (right)"] = "Draai met de klok mee (naar rechts)";
+App::$strings["Rotate CCW (left)"] = "Draai tegen de klok in (naar links)";
+App::$strings["Move photo to album"] = "Verplaatst foto naar album";
+App::$strings["Enter a new album name"] = "Vul een nieuwe albumnaam in";
+App::$strings["or select an existing one (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
+App::$strings["Caption"] = "Bijschrift";
+App::$strings["Add a Tag"] = "Tag toevoegen";
+App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl";
+App::$strings["Flag as adult in album view"] = "Markeer als voor volwassenen in albumweergave";
+App::$strings["I like this (toggle)"] = "Vind ik leuk";
+App::$strings["I don't like this (toggle)"] = "Vind ik niet leuk";
+App::$strings["Share"] = "Delen";
+App::$strings["Please wait"] = "Even wachten";
+App::$strings["This is you"] = "Dit ben jij";
+App::$strings["Comment"] = "Reactie";
+App::$strings["Preview"] = "Voorvertoning";
+App::$strings["__ctx:title__ Likes"] = "vinden dit leuk";
+App::$strings["__ctx:title__ Dislikes"] = "vinden dit niet leuk";
+App::$strings["__ctx:title__ Agree"] = "eens";
+App::$strings["__ctx:title__ Disagree"] = "oneens";
+App::$strings["__ctx:title__ Abstain"] = "onthoudingen";
+App::$strings["__ctx:title__ Attending"] = "aanwezig";
+App::$strings["__ctx:title__ Not attending"] = "niet aanwezig";
+App::$strings["__ctx:title__ Might attend"] = "mogelijk aanwezig";
+App::$strings["View all"] = "Toon alles";
+App::$strings["__ctx:noun__ Like"] = array(
+ 0 => "vindt dit leuk",
+ 1 => "vinden dit leuk",
+);
+App::$strings["__ctx:noun__ Dislike"] = array(
+ 0 => "vindt dit niet leuk",
+ 1 => "vinden dit niet leuk",
+);
+App::$strings["Photo Tools"] = "Hulpmiddelen";
+App::$strings["In This Photo:"] = "Op deze foto:";
+App::$strings["Map"] = "Kaart";
+App::$strings["__ctx:noun__ Likes"] = "vinden dit leuk";
+App::$strings["__ctx:noun__ Dislikes"] = "vinden dit niet leuk";
+App::$strings["Close"] = "Sluiten";
+App::$strings["View Album"] = "Album weergeven";
+App::$strings["Recent Photos"] = "Recente foto's";
App::$strings["\$Projectname Server - Setup"] = "\$Projectname Hub - Setup";
App::$strings["Could not connect to database."] = "Could not connect to database.";
App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Could not connect to specified hub URL. Possible SSL certificate or DNS issue.";
@@ -819,7 +878,6 @@ App::$strings["Your site database has been installed."] = "Your hub database has
App::$strings["You may need to import the file \"install/schema_xxx.sql\" manually using a database client."] = "You may need to import the file \"install/schema_xxx.sql\" manually using a database client.";
App::$strings["Please see the file \"install/INSTALL.txt\"."] = "Please see the file \"install/INSTALL.txt\".";
App::$strings["System check"] = "System check";
-App::$strings["Next"] = "Volgende";
App::$strings["Check again"] = "Check again";
App::$strings["Database connection"] = "Database connection";
App::$strings["In order to install \$Projectname we need to know how to connect to your database."] = "In order to install \$Projectname we need to know how to connect to your database.";
@@ -846,11 +904,12 @@ App::$strings["If you don't have a command line version of PHP installed on serv
App::$strings["PHP executable path"] = "PHP executable path";
App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Enter full path to php executable. You can leave this blank to continue the installation.";
App::$strings["Command line PHP"] = "Command line PHP";
+App::$strings["Unable to check command line PHP, as shell_exec() is disabled. This is required."] = "Unable to check command line PHP, as shell_exec() is disabled. This is required.";
App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "The command line version of PHP on your system does not have \"register_argc_argv\" enabled.";
App::$strings["This is required for message delivery to work."] = "This is required for message delivery to work.";
App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv";
App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once.";
-App::$strings["You can adjust these settings in the servers php.ini."] = "You can adjust these settings in the servers php.ini.";
+App::$strings["You can adjust these settings in the server php.ini file."] = "You can adjust these settings in the server php.ini file.";
App::$strings["PHP upload limits"] = "PHP upload limits";
App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys";
App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\".";
@@ -858,17 +917,19 @@ App::$strings["Generate encryption keys"] = "Generate encryption keys";
App::$strings["libCurl PHP module"] = "libCurl PHP module";
App::$strings["GD graphics PHP module"] = "GD graphics PHP module";
App::$strings["OpenSSL PHP module"] = "OpenSSL PHP module";
-App::$strings["mysqli or postgres PHP module"] = "mysqli or postgres PHP module";
+App::$strings["PDO database PHP module"] = "PDO database PHP module";
App::$strings["mb_string PHP module"] = "mb_string PHP module";
App::$strings["xml PHP module"] = "xml PHP module";
App::$strings["Apache mod_rewrite module"] = "Apache mod_rewrite module";
App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Error: Apache webserver mod-rewrite module is required but not installed.";
-App::$strings["proc_open"] = "proc_open";
-App::$strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "Error: proc_open is required but is either not installed or has been disabled in php.ini";
+App::$strings["exec"] = "exec";
+App::$strings["Error: exec is required but is either not installed or has been disabled in php.ini"] = "Error: exec is required but is either not installed or has been disabled in php.ini";
+App::$strings["shell_exec"] = "shell_exec";
+App::$strings["Error: shell_exec is required but is either not installed or has been disabled in php.ini"] = "Error: shell_exec is required but is either not installed or has been disabled in php.ini";
App::$strings["Error: libCURL PHP module required but not installed."] = "Error: libCURL PHP module required but not installed.";
App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Error: GD graphics PHP module with JPEG support required but not installed.";
App::$strings["Error: openssl PHP module required but not installed."] = "Error: openssl PHP module required but not installed.";
-App::$strings["Error: mysqli or postgres PHP module required but neither are installed."] = "Error: mysqli or postgres PHP module required but neither are installed.";
+App::$strings["Error: PDO database PHP module required but not installed."] = "Error: PDO database PHP module required but not installed.";
App::$strings["Error: mb_string PHP module required but not installed."] = "Error: mb_string PHP module required but not installed.";
App::$strings["Error: xml PHP module required for DAV but not installed."] = "Error: xml PHP module required for DAV but not installed.";
App::$strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "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.";
@@ -876,12 +937,12 @@ App::$strings["This is most often a permission setting, as the web server may no
App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder.";
App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions.";
App::$strings[".htconfig.php is writable"] = ".htconfig.php is writable";
-App::$strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.";
+App::$strings["This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.";
App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder.";
App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.";
App::$strings["Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."] = "Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains.";
App::$strings["%s is writable"] = "%s is writable";
-App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder";
+App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"] = "This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder";
App::$strings["store is writable"] = "store is writable";
App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "SSL certificate cannot be validated. Fix certificate or disable https access to this hub.";
App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "If you have https access to your hub or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!";
@@ -897,133 +958,11 @@ App::$strings["The database configuration file \".htconfig.php\" could not be wr
App::$strings["Errors encountered creating database tables."] = "Errors encountered creating database tables.";
App::$strings["<h1>What next</h1>"] = "<h1>What next</h1>";
App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANT: You will need to [manually] setup a scheduled task for the poller.";
-App::$strings["No valid account found."] = "Geen geldige account gevonden.";
-App::$strings["Password reset request issued. Check your email."] = "Het verzoek om je wachtwoord opnieuw in te stellen is behandeld. Controleer je e-mail.";
-App::$strings["Site Member (%s)"] = "Lid van hub (%s)";
-App::$strings["Password reset requested at %s"] = "Verzoek tot het opnieuw instellen van een wachtwoord op %s is ingediend";
-App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Het verzoek kon niet worden geverifieerd. (Mogelijk heb je al eerder een verzoek ingediend.) Opnieuw instellen van wachtwoord is mislukt.";
-App::$strings["Password Reset"] = "Wachtwoord vergeten?";
-App::$strings["Your password has been reset as requested."] = "Jouw wachtwoord is opnieuw ingesteld zoals je had verzocht.";
-App::$strings["Your new password is"] = "Jouw nieuwe wachtwoord is";
-App::$strings["Save or copy your new password - and then"] = "Kopieer of sla je nieuwe wachtwoord op - en";
-App::$strings["click here to login"] = "klik dan hier om in te loggen";
-App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Jouw wachtwoord kan worden veranderd onder <em>instellingen</em>, nadat je succesvol bent ingelogd.";
-App::$strings["Your password has changed at %s"] = "Jouw wachtwoord op %s is veranderd";
-App::$strings["Forgot your Password?"] = "Wachtwoord vergeten?";
-App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Voer je e-mailadres in en verstuur deze om je wachtwoord opnieuw in te stellen. Controleer hierna hier je e-mail voor verdere instructies.";
-App::$strings["Email Address"] = "E-mailadres";
-App::$strings["Reset"] = "Opnieuw instellen";
-App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s is %2\$s";
-App::$strings["Mood"] = "Stemming";
-App::$strings["Set your current mood and tell your friends"] = "Noteer je huidige stemming en toon het aan je connecties";
-App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Het verwijderen van een kanaal is niet toegestaan binnen 48 uur nadat het wachtwoord van het account is veranderd.";
-App::$strings["Remove This Channel"] = "Verwijder dit kanaal";
-App::$strings["WARNING: "] = "WAARSCHUWING: ";
-App::$strings["This channel will be completely removed from the network. "] = "Dit kanaal wordt volledig uit het \$Projectname-netwerk verwijderd.";
-App::$strings["This action is permanent and can not be undone!"] = "Deze handeling is van permanente aard en kan niet meer worden teruggedraaid!";
-App::$strings["Please enter your password for verification:"] = "Vul je wachtwoord in ter verificatie:";
-App::$strings["Remove this channel and all its clones from the network"] = "Dit kanaal en alle klonen hiervan uit het \$Projectname-netwerk verwijderen";
-App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Standaard wordt alleen het kanaal dat zich op deze hub bevindt uit het \$Projectname-netwerk verwijderd";
-App::$strings["Remove Channel"] = "Kanaal verwijderen";
-App::$strings["No more system notifications."] = "Geen systeemnotificaties meer.";
-App::$strings["System Notifications"] = "Systeemnotificaties";
-App::$strings["Profile Match"] = "Profielovereenkomst";
-App::$strings["No keywords to match. Please add keywords to your default profile."] = "Je hebt geen trefwoorden waarmee overeenkomsten gevonden kunnen worden. Voeg enkele trefwoorden aan je standaardprofiel toe.";
-App::$strings["is interested in:"] = "is geïnteresseerd in:";
-App::$strings["Connect"] = "Verbinden";
-App::$strings["No matches"] = "Geen overeenkomsten";
+App::$strings["Item is not editable"] = "Item is niet te bewerken";
App::$strings["This site is not a directory server"] = "Deze hub is geen kanalengidshub (directoryserver)";
-App::$strings["This directory server requires an access token"] = "Deze kanalengidshub (directoryserver) heeft een toegangs-token nodig";
-App::$strings["Hub not found."] = "Hub niet gevonden.";
-App::$strings["Page owner information could not be retrieved."] = "Informatie over de pagina-eigenaar werd niet ontvangen.";
-App::$strings["Profile Photos"] = "Profielfoto's";
-App::$strings["Album not found."] = "Album niet gevonden.";
-App::$strings["Delete Album"] = "Verwijder album";
-App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Er bestaan meerdere submappen met deze albumnaam, maar verspreidt over verschillende mappen. Verwijder de gewenste map(pen) met de bestandsbeheerder.";
-App::$strings["Delete Photo"] = "Verwijder foto";
-App::$strings["Public access denied."] = "Openbare toegang geweigerd.";
-App::$strings["No photos selected"] = "Geen foto's geselecteerd";
-App::$strings["Access to this item is restricted."] = "Toegang tot dit item is beperkt.";
-App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt.";
-App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB aan foto-opslag gebruikt.";
-App::$strings["Upload Photos"] = "Foto's uploaden";
-App::$strings["Enter an album name"] = "Vul een albumnaam in";
-App::$strings["or select an existing album (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
-App::$strings["Create a status post for this upload"] = "Plaats een bericht voor deze upload.";
-App::$strings["Caption (optional):"] = "Bijschrift (optioneel):";
-App::$strings["Description (optional):"] = "Omschrijving (optioneel):";
-App::$strings["Album name could not be decoded"] = "Albumnaam kon niet gedecodeerd worden";
-App::$strings["Contact Photos"] = "Connectiefoto's";
-App::$strings["Show Newest First"] = "Nieuwste eerst weergeven";
-App::$strings["Show Oldest First"] = "Oudste eerst weergeven";
-App::$strings["View Photo"] = "Foto weergeven";
-App::$strings["Edit Album"] = "Album bewerken";
-App::$strings["Permission denied. Access to this item may be restricted."] = "Toegang geweigerd. Toegang tot dit item kan zijn beperkt.";
-App::$strings["Photo not available"] = "Foto niet aanwezig";
-App::$strings["Use as profile photo"] = "Als profielfoto gebruiken";
-App::$strings["Use as cover photo"] = "Als omslagfoto gebruiken";
-App::$strings["Private Photo"] = "Privéfoto";
-App::$strings["Previous"] = "Vorige";
-App::$strings["View Full Size"] = "Volledige grootte weergeven";
-App::$strings["Edit photo"] = "Foto bewerken";
-App::$strings["Rotate CW (right)"] = "Draai met de klok mee (naar rechts)";
-App::$strings["Rotate CCW (left)"] = "Draai tegen de klok in (naar links)";
-App::$strings["Move photo to album"] = "Verplaatst foto naar album";
-App::$strings["Enter a new album name"] = "Vul een nieuwe albumnaam in";
-App::$strings["or select an existing one (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
-App::$strings["Caption"] = "Bijschrift";
-App::$strings["Add a Tag"] = "Tag toevoegen";
-App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl";
-App::$strings["Flag as adult in album view"] = "Markeer als voor volwassenen in albumweergave";
-App::$strings["I like this (toggle)"] = "Vind ik leuk";
-App::$strings["I don't like this (toggle)"] = "Vind ik niet leuk";
-App::$strings["Share"] = "Delen";
-App::$strings["Please wait"] = "Even wachten";
-App::$strings["This is you"] = "Dit ben jij";
-App::$strings["Comment"] = "Reactie";
-App::$strings["Preview"] = "Voorvertoning";
-App::$strings["__ctx:title__ Likes"] = "vinden dit leuk";
-App::$strings["__ctx:title__ Dislikes"] = "vinden dit niet leuk";
-App::$strings["__ctx:title__ Agree"] = "eens";
-App::$strings["__ctx:title__ Disagree"] = "oneens";
-App::$strings["__ctx:title__ Abstain"] = "onthoudingen";
-App::$strings["__ctx:title__ Attending"] = "aanwezig";
-App::$strings["__ctx:title__ Not attending"] = "niet aanwezig";
-App::$strings["__ctx:title__ Might attend"] = "mogelijk aanwezig";
-App::$strings["View all"] = "Toon alles";
-App::$strings["__ctx:noun__ Like"] = array(
- 0 => "vindt dit leuk",
- 1 => "vinden dit leuk",
-);
-App::$strings["__ctx:noun__ Dislike"] = array(
- 0 => "vindt dit niet leuk",
- 1 => "vinden dit niet leuk",
-);
-App::$strings["Photo Tools"] = "Hulpmiddelen";
-App::$strings["In This Photo:"] = "Op deze foto:";
-App::$strings["Map"] = "Kaart";
-App::$strings["__ctx:noun__ Likes"] = "vinden dit leuk";
-App::$strings["__ctx:noun__ Dislikes"] = "vinden dit niet leuk";
-App::$strings["Close"] = "Sluiten";
-App::$strings["View Album"] = "Album weergeven";
-App::$strings["Recent Photos"] = "Recente foto's";
-App::$strings["Name or caption"] = "Naam";
-App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Voorbeelden: \"Jan Pietersen\", \"Willems weblog\", \"Computerforum\"";
-App::$strings["Choose a short nickname"] = "Korte bijnaam";
-App::$strings["Your nickname will be used to create an easy to remember channel address e.g. nickname%s"] = "Deze bijnaam wordt gebruikt om een makkelijk te onthouden kanaaladres van jouw kanaal aan te maken, die je dan met anderen kunt delen. Bijvoorbeeld: bijnaam%s";
-App::$strings["Channel role and privacy"] = "Kanaaltype en privacy";
-App::$strings["Select a channel role with your privacy requirements."] = "Kies een kanaaltype met het door jou gewenste privacyniveau.";
-App::$strings["Read more about roles"] = "Lees meer over kanaaltypes";
App::$strings["Create Channel"] = "Kanaal aanmaken";
App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Een kanaal is jouw identiteit in dit netwerk. Het kan bijvoorbeeld een persoon, een blog of een forum vertegenwoordigen. Door met elkaar te verbinden kunnen kanalen, met behulp van uitgebreide permissies, informatie uitwisselen.";
App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "Of <a href=\"import\">importeer een bestaand kanaal</a> vanaf een andere locatie";
-App::$strings["sent you a private message"] = "stuurde jou een privébericht";
-App::$strings["added your channel"] = "voegde jouw kanaal toe";
-App::$strings["g A l F d"] = "G:i, l d F";
-App::$strings["[today]"] = "[vandaag]";
-App::$strings["posted an event"] = "plaatste een gebeurtenis";
-App::$strings["Invalid request identifier."] = "Ongeldige verzoek identificator (request identifier)";
-App::$strings["Discard"] = "Annuleren";
App::$strings["Mark all system notifications seen"] = "Markeer alle systeemnotificaties als bekeken";
App::$strings["Poke"] = "Aanstoten";
App::$strings["Poke somebody"] = "Iemand aanstoten";
@@ -1032,30 +971,81 @@ App::$strings["Poke, prod or do other things to somebody"] = "Iemand bijvoorbeel
App::$strings["Recipient"] = "Ontvanger";
App::$strings["Choose what you wish to do to recipient"] = "Kies wat je met de ontvanger wil doen";
App::$strings["Make this post private"] = "Maak dit bericht privé";
-App::$strings["Apps"] = "Apps";
+App::$strings["Profile not found."] = "Profiel niet gevonden.";
+App::$strings["Profile deleted."] = "Profiel verwijderd.";
+App::$strings["Profile-"] = "Profiel-";
+App::$strings["New profile created."] = "Nieuw profiel aangemaakt.";
+App::$strings["Profile unavailable to clone."] = "Profiel niet beschikbaar om te klonen";
+App::$strings["Profile unavailable to export."] = "Geen profiel beschikbaar om te exporteren";
+App::$strings["Profile Name is required."] = "Profielnaam is vereist";
+App::$strings["Marital Status"] = "Huwelijke status";
+App::$strings["Romantic Partner"] = "Romantische partner";
+App::$strings["Likes"] = "Houdt van";
+App::$strings["Dislikes"] = "Houdt niet van";
+App::$strings["Work/Employment"] = "Werk/arbeid";
+App::$strings["Religion"] = "Religie";
+App::$strings["Political Views"] = "Politieke overtuigingen";
+App::$strings["Gender"] = "Geslacht";
+App::$strings["Sexual Preference"] = "Seksuele voorkeur";
+App::$strings["Homepage"] = "Homepage";
+App::$strings["Interests"] = "Interesses";
+App::$strings["Address"] = "Kanaaladres";
+App::$strings["Location"] = "Locatie";
+App::$strings["Profile updated."] = "Profiel bijgewerkt";
+App::$strings["Hide your connections list from viewers of this profile"] = "Laat de lijst met connecties niet aan bezoekers van dit profiel zien.";
+App::$strings["Edit Profile Details"] = "Profiel bewerken";
+App::$strings["View this profile"] = "Profiel weergeven";
+App::$strings["Edit visibility"] = "Zichtbaarheid bewerken";
+App::$strings["Profile Tools"] = "Hulpmiddelen";
+App::$strings["Change cover photo"] = "Omslagfoto wijzigen";
+App::$strings["Change profile photo"] = "Profielfoto veranderen";
+App::$strings["Create a new profile using these settings"] = "Een nieuw profiel aanmaken met dit profiel als basis";
+App::$strings["Clone this profile"] = "Dit profiel klonen";
+App::$strings["Delete this profile"] = "Dit profiel verwijderen";
+App::$strings["Add profile things"] = "Dingen aan je profiel toevoegen";
+App::$strings["Personal"] = "Persoonlijk";
+App::$strings["Relation"] = "Relatie";
+App::$strings["Miscellaneous"] = "Diversen";
+App::$strings["Import profile from file"] = "Profiel vanuit bestand importeren";
+App::$strings["Export profile to file"] = "Profiel naar bestand exporteren";
+App::$strings["Your gender"] = "Jouw geslacht";
+App::$strings["Marital status"] = "Burgerlijke staat";
+App::$strings["Sexual preference"] = "Seksuele voorkeur";
+App::$strings["Profile name"] = "Profielnaam";
+App::$strings["This is your default profile."] = "Dit is jouw standaardprofiel";
+App::$strings["Your full name"] = "Jouw volledige naam";
+App::$strings["Title/Description"] = "Titel/omschrijving";
+App::$strings["Street address"] = "Straat en huisnummer";
+App::$strings["Locality/City"] = "Woonplaats";
+App::$strings["Region/State"] = "Provincie/gewest/deelstaat";
+App::$strings["Postal/Zip code"] = "Postcode";
+App::$strings["Country"] = "Land";
+App::$strings["Who (if applicable)"] = "Wie (wanneer van toepassing)";
+App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Voorbeelden: petra123, Petra Jansen, petra@voorbeeld.nl";
+App::$strings["Since (date)"] = "Sinds (datum)";
+App::$strings["Tell us about yourself"] = "Vertel ons iets over jezelf";
+App::$strings["Homepage URL"] = "URL homepagina";
+App::$strings["Hometown"] = "Oorspronkelijk uit";
+App::$strings["Political views"] = "Politieke overtuigingen";
+App::$strings["Religious views"] = "Religieuze overtuigingen";
+App::$strings["Keywords used in directory listings"] = "Trefwoorden voor in de kanalengids";
+App::$strings["Example: fishing photography software"] = "Voorbeeld: muziek, fotografie, software";
+App::$strings["Musical interests"] = "Muzikale interesses";
+App::$strings["Books, literature"] = "Boeken/literatuur";
+App::$strings["Television"] = "Televisie";
+App::$strings["Film/Dance/Culture/Entertainment"] = "Film/dans/cultuur/entertainment";
+App::$strings["Hobbies/Interests"] = "Hobby's/interesses";
+App::$strings["Love/Romance"] = "Liefde/romantiek";
+App::$strings["School/Education"] = "School/opleiding";
+App::$strings["Contact information and social networks"] = "Contactinformatie en sociale netwerken";
+App::$strings["My other channels"] = "Mijn andere kanalen";
+App::$strings["Profile Image"] = "Profielfoto";
+App::$strings["Edit Profiles"] = "Bewerk profielen";
App::$strings["Unable to find your hub."] = "Niet in staat om je hub te vinden";
App::$strings["Post successful."] = "Verzenden bericht geslaagd.";
-App::$strings["Invalid profile identifier."] = "Ongeldige profiel-identificator";
-App::$strings["Profile Visibility Editor"] = "Zichtbaarheid profiel ";
-App::$strings["Profile"] = "Profiel";
-App::$strings["Click on a contact to add or remove."] = "Klik op een connectie om deze toe te voegen of te verwijderen";
-App::$strings["Visible To"] = "Zichtbaar voor";
App::$strings["This setting requires special processing and editing has been blocked."] = "Deze instelling vereist een speciaal proces en bewerken is geblokkeerd.";
App::$strings["Configuration Editor"] = "Configuratiebewerker";
App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Waarschuwing: het veranderen van sommige instellingen kunnen jouw kanaal onklaar maken. Verlaat deze pagina, tenzij je weet waar je mee bezig bent en voldoende kennis bezit over hoe je deze functies moet gebruiken. ";
-App::$strings["Version %s"] = "Versie %s";
-App::$strings["Installed plugins/addons/apps:"] = "Ingeschakelde plugins en apps:";
-App::$strings["No installed plugins/addons/apps"] = "Geen ingeschakelde plugins en apps";
-App::$strings["This is a hub of \$Projectname - a global cooperative network of decentralized privacy enhanced websites."] = "Dit is een \$Projectname-hub - \$Projectname is een wereldwijd coöperatief netwerk van gedecentraliseerde websites (hubs) met verbeterde privacy.";
-App::$strings["Tag: "] = "Tag: ";
-App::$strings["Last background fetch: "] = "Meest recente achtergrond-fetch:";
-App::$strings["Current load average: "] = "Gemiddelde systeembelasting is nu:";
-App::$strings["Running at web location"] = "Draaiend op weblocatie";
-App::$strings["Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more about \$Projectname."] = "Bezoek <a href=\"http://hubzilla.org\">hubzilla.org</a> ";
-App::$strings["Bug reports and issues: please visit"] = "Bugrapporten en andere kwesties: bezoek";
-App::$strings["\$projectname issues"] = "\$projectname-issues";
-App::$strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "Voorstellen, lofbetuigingen, enz. - e-mail \"redmatrix\" at librelist - dot com";
-App::$strings["Site Administrators"] = "Hubbeheerders: ";
App::$strings["Blocks"] = "Blokken";
App::$strings["Block Title"] = "Bloktitel";
App::$strings["Layouts"] = "Lay-outs";
@@ -1063,68 +1053,79 @@ App::$strings["Help"] = "Hulp";
App::$strings["Comanche page description language help"] = "Hulp met de paginabeschrijvingstaal Comanche";
App::$strings["Layout Description"] = "Lay-out-omschrijving";
App::$strings["Download PDL file"] = "Download PDL-bestand";
-App::$strings["# Accounts"] = "# accounts";
-App::$strings["# blocked accounts"] = "# geblokkeerde accounts";
-App::$strings["# expired accounts"] = "# verlopen accounts";
-App::$strings["# expiring accounts"] = "# accounts die nog moeten verlopen";
-App::$strings["# Channels"] = "# Kanalen";
-App::$strings["# primary"] = "# primair";
-App::$strings["# clones"] = "# klonen";
-App::$strings["Message queues"] = "Berichtenwachtrij";
-App::$strings["Your software should be updated"] = "Jouw software moet worden bijgewerkt ";
-App::$strings["Summary"] = "Samenvatting";
-App::$strings["Registered accounts"] = "Geregistreerde accounts";
-App::$strings["Pending registrations"] = "Accounts die op goedkeuring wachten";
-App::$strings["Registered channels"] = "Geregistreerde kanalen";
-App::$strings["Active plugins"] = "Ingeschakelde plugins";
-App::$strings["Version"] = "Versie";
-App::$strings["Repository version (master)"] = "Versie repository (master)";
-App::$strings["Repository version (dev)"] = "Versie repository (dev)";
+App::$strings["Website:"] = "Website:";
+App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Kanaal op afstand [%s] (nog niet op deze hub bekend)";
+App::$strings["Rating (this information is public)"] = "Beoordeling (deze informatie is openbaar)";
+App::$strings["Optionally explain your rating (this information is public)"] = "Verklaar jouw beoordeling (niet verplicht, deze informatie is openbaar)";
+App::$strings["Like/Dislike"] = "Leuk/niet leuk";
+App::$strings["This action is restricted to members."] = "Deze actie kan alleen door \$Projectname-leden worden uitgevoerd.";
+App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Je dient <a href=\"rmagic\">in te loggen met je \$Projectname-account</a> of <a href=\"register\">een nieuw \$Projectname-account aan te maken</a> om verder te kunnen gaan.";
+App::$strings["Invalid request."] = "Ongeldig verzoek";
+App::$strings["channel"] = "kanaal";
+App::$strings["thing"] = "ding";
+App::$strings["Channel unavailable."] = "Kanaal niet beschikbaar.";
+App::$strings["Previous action reversed."] = "Vorige actie omgedraaid";
+App::$strings["photo"] = "foto";
+App::$strings["status"] = "bericht";
+App::$strings["event"] = "gebeurtenis";
+App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s vindt %3\$s van %2\$s leuk";
+App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s vindt %3\$s van %2\$s niet leuk";
+App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s is het eens met %2\$s's %3\$s";
+App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s is het niet eens met %2\$s's %3\$s";
+App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s onthoudt zich van een besluit over %2\$s's %3\$s";
+App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s is aanwezig op %2\$s's %3\$s";
+App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s is niet aanwezig op %2\$s's %3\$s";
+App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s is mogelijk aanwezig op %2\$s's %3\$s";
+App::$strings["Action completed."] = "Actie voltooid";
+App::$strings["Thank you."] = "Bedankt";
App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Vernieuw de pagina met shift+R of shift+F5, of leeg je browserbuffer, wanneer de nieuwe foto niet meteen wordt weergegeven.";
+App::$strings["Use Photo for Profile"] = "Als profielfoto gebruiken";
App::$strings["Upload Profile Photo"] = "Profielfoto uploaden";
-App::$strings["Permissions denied."] = "Permissies niet toegestaan";
-App::$strings["l, F j"] = "l j F";
-App::$strings["Link to Source"] = "Originele locatie";
-App::$strings["Edit Event"] = "Gebeurtenis bewerken";
-App::$strings["Create Event"] = "Gebeurtenis aanmaken";
-App::$strings["Export"] = "Exporteren";
-App::$strings["Import"] = "Importeren";
-App::$strings["Today"] = "Vandaag";
+App::$strings["Use"] = "Gebruiken";
+App::$strings["Items tagged with: %s"] = "Items getagd met %s";
+App::$strings["Search results for: %s"] = "Zoekresultaten voor %s";
App::$strings["No channel."] = "Geen kanaal.";
App::$strings["Common connections"] = "Veel voorkomende connecties";
App::$strings["No connections in common."] = "Geen gemeenschappelijke connecties.";
-App::$strings["No ratings"] = "Geen beoordelingen";
-App::$strings["Rating: "] = "Beoordeling: ";
-App::$strings["Website: "] = "Website: ";
-App::$strings["Description: "] = "Omschrijving: ";
-App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Maximum toegestane dagelijkse registraties op deze \$Projectname-hub bereikt. Probeer het morgen (UTC) nogmaals.";
-App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Registratie mislukt. De gebruiksvoorwaarden dienen wel geaccepteerd te worden.";
-App::$strings["Passwords do not match."] = "Wachtwoorden komen niet met elkaar overeen.";
-App::$strings["Registration successful. Please check your email for validation instructions."] = "Registratie geslaagd. Controleer je e-mail voor instructies.";
-App::$strings["Your registration is pending approval by the site owner."] = "Jouw accountregistratie wacht op goedkeuring van de beheerder van deze \$Projectname-hub.";
-App::$strings["Your registration can not be processed."] = "Jouw registratie kan niet verwerkt worden.";
-App::$strings["Registration on this hub is disabled."] = "Registreren van nieuwe accounts is op deze hub uitgeschakeld.";
-App::$strings["Registration on this hub is by approval only."] = "Registraties op deze hub moeten eerst worden goedgekeurd.";
-App::$strings["<a href=\"pubsites\">Register at another affiliated hub.</a>"] = "<a href=\"pubsites\">Registreer op een andere hub</a>.";
-App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Deze \$Projectname-hub heeft het maximum aantal dagelijks toegestane registraties bereikt. Probeer het morgen (UTC) nogmaals.";
-App::$strings["Terms of Service"] = "Gebruiksvoorwaarden";
-App::$strings["I accept the %s for this website"] = "Ik accepteer de %s van deze \$Projectname-hub";
-App::$strings["I am over 13 years of age and accept the %s for this website"] = "Ik ben 13 jaar of ouder en accepteer de %s van deze \$Projectname-hub";
-App::$strings["Your email address"] = "Jouw e-mailadres";
-App::$strings["Choose a password"] = "Geef een wachtwoord op";
-App::$strings["Please re-enter your password"] = "Geef het wachtwoord opnieuw op";
-App::$strings["Please enter your invitation code"] = "Vul jouw uitnodigingscode in";
-App::$strings["no"] = "Nee";
-App::$strings["yes"] = "Ja";
-App::$strings["Membership on this site is by invitation only."] = "Registreren op deze \$Projectname-hub kan alleen op uitnodiging.";
-App::$strings["Register"] = "Registreren";
-App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Mogelijk moet op deze hub eerst jouw e-mail geverifieerd worden. Wanneer je na het indienen van dit formulier op de inlogpagina terecht komt, dan dien je jouw e-mail te controleren voor instructies. Controleer eventueel ook jouw spamfolder.";
-App::$strings["Documentation Search"] = "Zoek documentatie";
-App::$strings["\$Projectname Documentation"] = "\$Projectname-documentatie";
+App::$strings["Authorize application connection"] = "Geef toestemming voor applicatiekoppeling";
+App::$strings["Return to your app and insert this Security Code:"] = "Ga terug naar je app en voeg deze beveiligingscode in:";
+App::$strings["Please login to continue."] = "Inloggen om verder te kunnen gaan.";
+App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Wil je deze applicatie toestemming geven om jouw berichten en connecties te zien, en/of nieuwe berichten voor jou te plaatsen?";
+App::$strings["sent you a private message"] = "stuurde jou een privébericht";
+App::$strings["added your channel"] = "voegde jouw kanaal toe";
+App::$strings["g A l F d"] = "G:i, l d F";
+App::$strings["[today]"] = "[vandaag]";
+App::$strings["posted an event"] = "plaatste een gebeurtenis";
+App::$strings["About this site"] = "Over deze hub";
+App::$strings["Site Name"] = "Hubnaam";
+App::$strings["Administrator"] = "Beheerder";
+App::$strings["Software and Project information"] = "Software- en projectinformatie";
+App::$strings["This site is powered by \$Projectname"] = "Dit is een \$Projectname-hub";
+App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Federatieve en gedecentraliseerde netwerk- en identiteitsdiensten, mogelijk gemaakt door Zot";
+App::$strings["Version %s"] = "Versie %s";
+App::$strings["Project homepage"] = "Projectwebsite";
+App::$strings["Developer homepage"] = "Ontwikkelaarswebsite";
+App::$strings["No valid account found."] = "Geen geldige account gevonden.";
+App::$strings["Password reset request issued. Check your email."] = "Het verzoek om je wachtwoord opnieuw in te stellen is behandeld. Controleer je e-mail.";
+App::$strings["Site Member (%s)"] = "Lid van hub (%s)";
+App::$strings["Password reset requested at %s"] = "Verzoek tot het opnieuw instellen van een wachtwoord op %s is ingediend";
+App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Het verzoek kon niet worden geverifieerd. (Mogelijk heb je al eerder een verzoek ingediend.) Opnieuw instellen van wachtwoord is mislukt.";
+App::$strings["Password Reset"] = "Wachtwoord vergeten?";
+App::$strings["Your password has been reset as requested."] = "Jouw wachtwoord is opnieuw ingesteld zoals je had verzocht.";
+App::$strings["Your new password is"] = "Jouw nieuwe wachtwoord is";
+App::$strings["Save or copy your new password - and then"] = "Kopieer of sla je nieuwe wachtwoord op - en";
+App::$strings["click here to login"] = "klik dan hier om in te loggen";
+App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Jouw wachtwoord kan worden veranderd onder <em>instellingen</em>, nadat je succesvol bent ingelogd.";
+App::$strings["Your password has changed at %s"] = "Jouw wachtwoord op %s is veranderd";
+App::$strings["Forgot your Password?"] = "Wachtwoord vergeten?";
+App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Voer je e-mailadres in en verstuur deze om je wachtwoord opnieuw in te stellen. Controleer hierna hier je e-mail voor verdere instructies.";
+App::$strings["Email Address"] = "E-mailadres";
+App::$strings["Reset"] = "Opnieuw instellen";
App::$strings["Select a bookmark folder"] = "Kies een bladwijzermap";
App::$strings["Save Bookmark"] = "Bladwijzer opslaan";
App::$strings["URL of bookmark"] = "URL van bladwijzer";
App::$strings["Or enter new bookmark folder name"] = "Of geef de naam op van een nieuwe bladwijzermap";
+App::$strings["This directory server requires an access token"] = "Deze kanalengidshub (directoryserver) heeft een toegangs-token nodig";
App::$strings["Authentication failed."] = "Authenticatie mislukt.";
App::$strings["Remote Authentication"] = "Authenticatie op afstand";
App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Vul jouw kanaaladres in (bijv. channel@example.com)";
@@ -1136,6 +1137,49 @@ App::$strings["This account and all its channels will be completely removed from
App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Dit account, al zijn kanalen en alle klonen van zijn kanalen uit het \$Projectname-netwerk verwijderen";
App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "Standaard worden alleen de kanalen die zich op deze hub bevinden uit het \$Projectname-netwerk verwijderd";
App::$strings["Remove Account"] = "Account verwijderen";
+App::$strings["Layout updated."] = "Lay-out bijgewerkt.";
+App::$strings["Feature disabled."] = "Functie uitgeschakeld.";
+App::$strings["Edit System Page Description"] = "Systeempagina's bewerken";
+App::$strings["Layout not found."] = "Lay-out niet gevonden.";
+App::$strings["Module Name:"] = "Modulenaam:";
+App::$strings["Layout Help"] = "Lay-out-hulp";
+App::$strings["Export Channel"] = "Kanaal exporteren";
+App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exporteer de basisinformatie van jouw kanaal naar een bestand. Dit fungeert als een back-up van jouw connecties, permissies, profiel en basisgegevens, die gebruikt kan worden om op een nieuwe hub jouw gegevens te importeren. Deze back-up bevat echter niet de inhoud van jouw kanaal.";
+App::$strings["Export Content"] = "Inhoud exporteren";
+App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exporteer informatie en recente inhoud van jouw kanaal naar een JSON-back-up, wat kan worden gebruikt om jouw kanaal te herstellen of te importeren op een andere hub. Dit slaat al jouw connecties, permissies, profielgegevens en enkele maanden aan inhoud van jouw kanaal op. Dit bestand kan ZEER groot worden. Wees geduldig - het kan enkele minuten duren voordat de download begint.";
+App::$strings["Export your posts from a given year."] = "Exporteer jouw berichten uit een bepaald jaar.";
+App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "Je kan ook berichten en conversaties uit een bepaald jaar of van een bepaalde maand exporteren. Verander de datum in de adresbalk van jouw webbrowser om andere jaren en maanden te selecteren. Wanneer het exporteren mislukt (waarschijnlijk door een gebrek aan beschikbaar servergeheugen), probeer het dan nogmaals met een beperkter tijdvak.";
+App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Bezoek <a href=\"%1\$s\">%2\$s</a> om alle berichten van bijvoorbeeld dit jaar te selecteren. ";
+App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Bezoek <a href=\"%1\$s\">%2\$s</a> om alle berichten van bijvoorbeeld januari dit jaar te selecteren.";
+App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Deze back-up-bestanden kunnen geïmporteerd of hersteld worden door op jouw hub en met jouw kanaal <a href=\"%1\$s\">%2\$s</a> te bezoeken. Voor het beste resultaat kan je de bestanden in chronologische volgorde importeren of herstellen.";
+App::$strings["Permissions denied."] = "Permissies niet toegestaan";
+App::$strings["l, F j"] = "l j F";
+App::$strings["Link to Source"] = "Originele locatie";
+App::$strings["Edit Event"] = "Gebeurtenis bewerken";
+App::$strings["Create Event"] = "Gebeurtenis aanmaken";
+App::$strings["Export"] = "Exporteren";
+App::$strings["Import"] = "Importeren";
+App::$strings["Today"] = "Vandaag";
+App::$strings["# Accounts"] = "# accounts";
+App::$strings["# blocked accounts"] = "# geblokkeerde accounts";
+App::$strings["# expired accounts"] = "# verlopen accounts";
+App::$strings["# expiring accounts"] = "# accounts die nog moeten verlopen";
+App::$strings["# Channels"] = "# Kanalen";
+App::$strings["# primary"] = "# primair";
+App::$strings["# clones"] = "# klonen";
+App::$strings["Message queues"] = "Berichtenwachtrij";
+App::$strings["Your software should be updated"] = "Jouw software moet worden bijgewerkt ";
+App::$strings["Summary"] = "Samenvatting";
+App::$strings["Registered accounts"] = "Geregistreerde accounts";
+App::$strings["Pending registrations"] = "Accounts die op goedkeuring wachten";
+App::$strings["Registered channels"] = "Geregistreerde kanalen";
+App::$strings["Active plugins"] = "Ingeschakelde plugins";
+App::$strings["Version"] = "Versie";
+App::$strings["Repository version (master)"] = "Versie repository (master)";
+App::$strings["Repository version (dev)"] = "Versie repository (dev)";
+App::$strings["Remote privacy information not available."] = "Privacy-informatie op afstand niet beschikbaar.";
+App::$strings["Visible to:"] = "Zichtbaar voor:";
+App::$strings["No service class restrictions found."] = "Geen abonnementsbeperkingen gevonden.";
App::$strings["Import Webpage Elements"] = "Webpagina-elementen importeren";
App::$strings["Import selected"] = "Importbestand geselecteerd";
App::$strings["Export Webpage Elements"] = "Webpagina-elementen exporteren";
@@ -1145,98 +1189,50 @@ App::$strings["Actions"] = "Acties";
App::$strings["Page Link"] = "Paginalink";
App::$strings["Page Title"] = "Paginatitel";
App::$strings["Invalid file type."] = "Ongeldig bestandsformaat";
-App::$strings["Error opening zip file"] = "Fout met openen zipbestand";
+App::$strings["Error opening zip file"] = "Fout tijdens openen zipbestand";
App::$strings["Invalid folder path."] = "Ongeldige maplocatie";
App::$strings["No webpage elements detected."] = "Geen webpagina-elementen gedecteerd";
App::$strings["Import complete."] = "Importeren voltooid.";
-App::$strings["Export Channel"] = "Kanaal exporteren";
-App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exporteer de basisinformatie van jouw kanaal naar een bestand. Dit fungeert als een back-up van jouw connecties, permissies, profiel en basisgegevens, die gebruikt kan worden om op een nieuwe hub jouw gegevens te importeren. Deze back-up bevat echter niet de inhoud van jouw kanaal.";
-App::$strings["Export Content"] = "Inhoud exporteren";
-App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exporteer informatie en recente inhoud van jouw kanaal naar een JSON-back-up, wat kan worden gebruikt om jouw kanaal te herstellen of te importeren op een andere hub. Dit slaat al jouw connecties, permissies, profielgegevens en enkele maanden aan inhoud van jouw kanaal op. Dit bestand kan ZEER groot worden. Wees geduldig - het kan enkele minuten duren voordat de download begint.";
-App::$strings["Export your posts from a given year."] = "Exporteer jouw berichten uit een bepaald jaar.";
-App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "Je kan ook berichten en conversaties uit een bepaald jaar of van een bepaalde maand exporteren. Verander de datum in de adresbalk van jouw webbrowser om andere jaren en maanden te selecteren. Wanneer het exporteren mislukt (waarschijnlijk door een gebrek aan beschikbaar servergeheugen), probeer het dan nogmaals met een beperkter tijdvak.";
-App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Bezoek <a href=\"%1\$s\">%2\$s</a> om alle berichten van bijvoorbeeld dit jaar te selecteren. ";
-App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Bezoek <a href=\"%1\$s\">%2\$s</a> om alle berichten van bijvoorbeeld januari dit jaar te selecteren.";
-App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Deze back-up-bestanden kunnen geïmporteerd of hersteld worden door op jouw hub en met jouw kanaal <a href=\"%1\$s\">%2\$s</a> te bezoeken. Voor het beste resultaat kan je de bestanden in chronologische volgorde importeren of herstellen.";
-App::$strings["Item is not editable"] = "Item is niet te bewerken";
-App::$strings["Items tagged with: %s"] = "Items getagd met %s";
-App::$strings["Search results for: %s"] = "Zoekresultaten voor %s";
-App::$strings["Calendar entries imported."] = "Agenda-items geïmporteerd.";
-App::$strings["No calendar entries found."] = "Geen agenda-items gevonden.";
-App::$strings["Event can not end before it has started."] = "Gebeurtenis kan niet eindigen voordat het is begonnen";
-App::$strings["Unable to generate preview."] = "Niet in staat om voorvertoning te genereren";
-App::$strings["Event title and start time are required."] = "Titel en begintijd van gebeurtenis zijn vereist.";
-App::$strings["Event not found."] = "Gebeurtenis niet gevonden";
-App::$strings["Edit event title"] = "Titel bewerken";
-App::$strings["Event title"] = "Titel";
-App::$strings["Categories (comma-separated list)"] = "Categorieën (door komma's gescheiden lijst)";
-App::$strings["Edit Category"] = "Categorie";
-App::$strings["Category"] = "Categorie";
-App::$strings["Edit start date and time"] = "Begindatum en -tijd bewerken";
-App::$strings["Start date and time"] = "Begindatum en -tijd";
-App::$strings["Finish date and time are not known or not relevant"] = "Einddatum en -tijd zijn niet bekend of niet van toepassing";
-App::$strings["Edit finish date and time"] = "Einddatum en -tijd bewerken";
-App::$strings["Finish date and time"] = "Einddatum en -tijd";
-App::$strings["Adjust for viewer timezone"] = "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt";
-App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Belangrijk voor gebeurtenissen die op een bepaalde locatie plaatsvinden. Niet praktisch voor wereldwijde feestdagen.";
-App::$strings["Edit Description"] = "Omschrijving bewerken";
-App::$strings["Edit Location"] = "Locatie bewerken";
-App::$strings["Share this event"] = "Deel deze gebeurtenis";
-App::$strings["Permission settings"] = "Permissies";
-App::$strings["Advanced Options"] = "Geavanceerde opties";
-App::$strings["Edit event"] = "Gebeurtenis bewerken";
-App::$strings["Delete event"] = "Gebeurtenis verwijderen";
-App::$strings["calendar"] = "agenda";
-App::$strings["Month"] = "Maand";
-App::$strings["Week"] = "Week";
-App::$strings["Day"] = "Dag";
-App::$strings["Event removed"] = "Gebeurtenis verwijderd";
-App::$strings["Failed to remove event"] = "Verwijderen gebeurtenis mislukt";
-App::$strings["No service class restrictions found."] = "Geen abonnementsbeperkingen gevonden.";
-App::$strings["Thing updated"] = "Ding bijgewerkt";
-App::$strings["Object store: failed"] = "Opslaan van ding mislukt";
-App::$strings["Thing added"] = "Ding toegevoegd";
-App::$strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
-App::$strings["Show Thing"] = "Ding weergeven";
-App::$strings["item not found."] = "Item niet gevonden";
-App::$strings["Edit Thing"] = "Ding bewerken";
-App::$strings["Select a profile"] = "Kies een profiel";
-App::$strings["Post an activity"] = "Plaats een bericht";
-App::$strings["Only sends to viewers of the applicable profile"] = "Toont dit alleen aan diegene die het gekozen profiel mogen zien.";
-App::$strings["Name of thing e.g. something"] = "Naam van ding";
-App::$strings["URL of thing (optional)"] = "URL van ding (optioneel)";
-App::$strings["URL for photo of thing (optional)"] = "URL voor foto van ding (optioneel)";
-App::$strings["Add Thing to your Profile"] = "Ding aan je profiel toevoegen";
-App::$strings["Unable to locate original post."] = "Niet in staat om de originele locatie van het bericht te vinden. ";
-App::$strings["Empty post discarded."] = "Leeg bericht geannuleerd";
-App::$strings["Executable content type not permitted to this channel."] = "Uitvoerbare bestanden zijn niet toegestaan op dit kanaal.";
-App::$strings["Duplicate post suppressed."] = "Dubbel bericht tegengehouden.";
-App::$strings["System error. Post not saved."] = "Systeemfout. Bericht niet opgeslagen.";
-App::$strings["Unable to obtain post information from database."] = "Niet in staat om informatie over dit bericht uit de database te verkrijgen.";
-App::$strings["You have reached your limit of %1$.0f top level posts."] = "Je hebt jouw limiet van %1$.0f berichten bereikt.";
-App::$strings["You have reached your limit of %1$.0f webpages."] = "Je hebt jouw limiet van %1$.0f webpagina's bereikt.";
+App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Het verwijderen van een kanaal is niet toegestaan binnen 48 uur nadat het wachtwoord van het account is veranderd.";
+App::$strings["Remove This Channel"] = "Verwijder dit kanaal";
+App::$strings["This channel will be completely removed from the network. "] = "Dit kanaal wordt volledig uit het \$Projectname-netwerk verwijderd.";
+App::$strings["Remove this channel and all its clones from the network"] = "Dit kanaal en alle klonen hiervan uit het \$Projectname-netwerk verwijderen";
+App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Standaard wordt alleen het kanaal dat zich op deze hub bevindt uit het \$Projectname-netwerk verwijderd";
+App::$strings["Remove Channel"] = "Kanaal verwijderen";
App::$strings["Files: shared with me"] = "Bestanden: met mij gedeeld";
App::$strings["NEW"] = "NIEUW";
App::$strings["Remove all files"] = "Verwijder alle bestanden";
App::$strings["Remove this file"] = "Verwijder dit bestand";
App::$strings["Not found"] = "Niet gevonden";
-App::$strings["Wiki"] = "Wiki";
-App::$strings["Sandbox"] = "Zandbak";
-App::$strings["\"# Wiki Sandbox\\n\\nContent you **edit** and **preview** here *will not be saved*.\""] = "\"# Wiki Sandbox\\n\\nWat er hier onder **edit** en **preview** staat *wordt niet opgeslagen*.\"";
+App::$strings["Invalid channel"] = "Onbekend kanaal";
+App::$strings["Error retrieving wiki"] = "Fout tijdens ophalen wiki";
+App::$strings["Error creating zip file export folder"] = "Fout tijdens aanmaken exportmap zipbestand";
+App::$strings["Error downloading wiki: "] = "Fout tijdens downloaden wiki: ";
+App::$strings["Wikis"] = "Wiki's";
+App::$strings["Download"] = "Download";
+App::$strings["Wiki name"] = "Naam wiki";
+App::$strings["Content type"] = "Opmaaktype";
+App::$strings["Create a status post for this wiki"] = "Plaats een bericht over deze wiki";
+App::$strings["Wiki not found"] = "Wiki is niet gevonden";
+App::$strings["Rename page"] = "Pagina hernoemen";
+App::$strings["Error retrieving page content"] = "Fout tijdens ophalen inhoud pagina";
App::$strings["Revision Comparison"] = "Revisies vergelijken";
App::$strings["Revert"] = "Ongedaan maken";
-App::$strings["Enter the name of your new wiki:"] = "Vul de naam in van jouw nieuwe wiki:";
-App::$strings["Enter the name of the new page:"] = "Vul de naam in van de nieuwe pagina:";
-App::$strings["Enter the new name:"] = "Vul de nieuwe naam in:";
+App::$strings["Source"] = "Bron";
+App::$strings["New page name"] = "Nieuwe paginanaam";
App::$strings["Embed image from photo albums"] = "Afbeelding uit een fotoalbum invoegen";
App::$strings["Embed an image from your albums"] = "Afbeelding uit jouw albums invoegen";
App::$strings["OK"] = "OK";
App::$strings["Choose images to embed"] = "Kies afbeeldingen om in te voegen";
App::$strings["Choose an album"] = "Kies een album";
-App::$strings["Choose a different album..."] = "Kies een ander album...";
-App::$strings["Error getting album list"] = "Fout met ophalen albumlijst";
-App::$strings["Error getting photo link"] = "Fout met ophalen fotolink";
-App::$strings["Error getting album"] = "Fout met ophalen album";
+App::$strings["Choose a different album"] = "Kies een ander album";
+App::$strings["Error getting album list"] = "Fout tijdens ophalen albumlijst";
+App::$strings["Error getting photo link"] = "Fout tijdens ophalen fotolink";
+App::$strings["Error getting album"] = "Fout tijdens ophalen album";
+App::$strings["Error creating wiki. Invalid name."] = "Fout tijdens aanmaken wiki. Ongeldige naam.";
+App::$strings["Wiki created, but error creating Home page."] = "Wiki aangemaakt, maar fout tijdens aanmaken homepagina.";
+App::$strings["Error creating wiki"] = "Fout tijdens aanmaken wiki.";
+App::$strings["New page created"] = "Nieuwe pagina aangemaakt";
App::$strings["Failed to create source. No channel selected."] = "Aanmaken bron mislukt. Geen kanaal geselecteerd.";
App::$strings["Source created."] = "Bron aangemaakt.";
App::$strings["Source updated."] = "Bron aangemaakt.";
@@ -1259,60 +1255,34 @@ App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s volgt het %3\$s van %
App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s volgt het %3\$s van %2\$s niet meer";
App::$strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Geen voorgestelde kanalen gevonden. Wanneer dit een nieuwe hub is, probeer het dan over 24 uur weer.";
App::$strings["Ignore/Hide"] = "Negeren/Verbergen";
-App::$strings["Channel Suggestions"] = "Voorgestelde kanalen";
App::$strings["post"] = "bericht";
App::$strings["comment"] = "reactie";
App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s heeft het %3\$s van %2\$s getagd met %4\$s";
-App::$strings["Tag removed"] = "Tag verwijderd";
-App::$strings["Remove Item Tag"] = "Verwijder item-tag";
-App::$strings["Select a tag to remove: "] = "Kies een tag om te verwijderen";
-App::$strings["Channel added."] = "Kanaal toegevoegd.";
-App::$strings["No connections."] = "Geen connecties.";
-App::$strings["Visit %s's profile [%s]"] = "Bezoek het profiel van %s [%s]";
-App::$strings["View Connections"] = "Connecties weergeven";
-App::$strings["Source of Item"] = "Bron van item";
-App::$strings["Room not found"] = "Chatkanaal niet gevonden";
-App::$strings["Leave Room"] = "Chatkanaal verlaten";
-App::$strings["Delete Room"] = "Chatkanaal verwijderen";
-App::$strings["I am away right now"] = "Ik ben momenteel afwezig";
-App::$strings["I am online"] = "Ik ben online";
-App::$strings["Bookmark this room"] = "Chatkanaal aan bladwijzers toevoegen";
-App::$strings["New Chatroom"] = "Nieuw chatkanaal";
-App::$strings["Chatroom name"] = "Naam chatkanaal";
-App::$strings["Expiration of chats (minutes)"] = "Aantal minuten voordat chatberichten worden verwijderd";
-App::$strings["%1\$s's Chatrooms"] = "Chatkanalen van %1\$s";
-App::$strings["No chatrooms available"] = "Geen chatkanalen beschikbaar";
-App::$strings["Expiration"] = "Verloopt na";
-App::$strings["min"] = "min";
-App::$strings["Xchan Lookup"] = "Xchan opzoeken";
-App::$strings["Lookup xchan beginning with (or webbie): "] = "Zoek een xchan (of webbie) die begint met:";
-App::$strings["%d rating"] = array(
- 0 => "%d beoordeling",
- 1 => "%d beoordelingen",
-);
-App::$strings["Gender: "] = "Geslacht:";
-App::$strings["Status: "] = "Status: ";
-App::$strings["Homepage: "] = "Homepage: ";
-App::$strings["Age:"] = "Leeftijd:";
-App::$strings["Location:"] = "Plaats:";
-App::$strings["Description:"] = "Omschrijving:";
-App::$strings["Hometown:"] = "Oorspronkelijk uit:";
-App::$strings["About:"] = "Over:";
-App::$strings["Public Forum:"] = "Openbaar forum:";
-App::$strings["Keywords: "] = "Trefwoorden: ";
-App::$strings["Don't suggest"] = "Niet voorstellen";
-App::$strings["Common connections:"] = "Gemeenschappelijke connecties:";
-App::$strings["Global Directory"] = "Volledige kanalengids";
-App::$strings["Local Directory"] = "Lokale kanalengids";
-App::$strings["Finding:"] = "Gezocht naar:";
-App::$strings["next page"] = "volgende pagina";
-App::$strings["previous page"] = "vorige pagina";
-App::$strings["Sort options"] = "Sorteeropties";
-App::$strings["Alphabetic"] = "Alfabetisch";
-App::$strings["Reverse Alphabetic"] = "Omgekeerd alfabetisch";
-App::$strings["Newest to Oldest"] = "Nieuw naar oud";
-App::$strings["Oldest to Newest"] = "Oud naar nieuw";
-App::$strings["No entries (some entries may be hidden)."] = "Niets gevonden (sommige kanalen kunnen verborgen zijn).";
+App::$strings["Additional Features"] = "Extra functies";
+App::$strings["Name is required"] = "Naam is vereist";
+App::$strings["Key and Secret are required"] = "Key en secret zijn vereist";
+App::$strings["Add application"] = "Applicatie toevoegen";
+App::$strings["Name of application"] = "Naam van applicatie";
+App::$strings["Consumer Key"] = "Consumer key";
+App::$strings["Automatically generated - change if desired. Max length 20"] = "Automatische gegenereerd - verander wanneer gewenst. Maximale lengte is 20";
+App::$strings["Consumer Secret"] = "Consumer secret";
+App::$strings["Redirect"] = "Redirect/doorverwijzing";
+App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI voor redirect - laat leeg, behalve wanneer de applicatie dit vereist";
+App::$strings["Icon url"] = "Pictogram-URL";
+App::$strings["Application not found."] = "Applicatie niet gevonden.";
+App::$strings["Connected Apps"] = "Verbonden applicaties";
+App::$strings["Client key starts with"] = "Client key begint met";
+App::$strings["No name"] = "Geen naam";
+App::$strings["Remove authorization"] = "Autorisatie verwijderen";
+App::$strings["This channel is limited to %d tokens"] = "Dit kanaal heeft een limiet van %d tokens";
+App::$strings["Name and Password are required."] = "Naam en wachtwoord zijn vereist";
+App::$strings["Token saved."] = "Token opgeslagen.";
+App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Gebruik dit formulier om tijdelijke identiteiten aan te maken, waarmee je bepaalde informatie met niet-leden kan delen. Deze identiteiten kunnen onder Permissies (handmatige selectie) worden gebruikt. Gasten kunnen inloggen met onderstaande gegevens om zo toegang te krijgen tot privéinhoud.";
+App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "Je kan ook <em>dropbox</em>-achtige links aan mensen geven door bovenstaand wachtwoord op onderstaande manier aan een hub-URL toe te voegen. Voorbeelden:";
+App::$strings["Guest Access Tokens"] = "Gasttoegang";
+App::$strings["Login Name"] = "Inlognaam";
+App::$strings["Login Password"] = "Wachtwoord:";
+App::$strings["Expires (yyyy-mm-dd)"] = "Geldig t/m (yyyy-mm-dd)";
App::$strings["Not valid email."] = "Geen geldig e-mailadres.";
App::$strings["Protected email address. Cannot change to that email."] = "Beschermd e-mailadres. Kan dat e-mailadres niet gebruiken.";
App::$strings["System failure storing new email. Please try again."] = "Systeemfout opslaan van nieuwe e-mail. Probeer het nog een keer.";
@@ -1343,6 +1313,7 @@ App::$strings["Anybody on the internet"] = "Iedereen op het internet";
App::$strings["Publish your default profile in the network directory"] = "Publiceer je standaardprofiel in de kanalengids";
App::$strings["Allow us to suggest you as a potential friend to new members?"] = "Sta ons toe om jouw kanaal als mogelijke connectie voor te stellen aan nieuwe kanalen";
App::$strings["Your channel address is"] = "Jouw kanaaladres is";
+App::$strings["Your files/photos are accessible via WebDAV at"] = "Jouw bestanden/foto's zijn beschikbaar via WebDAV op";
App::$strings["Channel Settings"] = "Kanaal-instellingen";
App::$strings["Basic Settings"] = "Basis-instellingen";
App::$strings["Full Name:"] = "Volledige naam:";
@@ -1390,6 +1361,7 @@ App::$strings["You receive a private message"] = "Je een privé-bericht ontvangt
App::$strings["You receive a friend suggestion"] = "Je een kanaalvoorstel ontvangt";
App::$strings["You are tagged in a post"] = "Je expliciet in een bericht bent genoemd";
App::$strings["You are poked/prodded/etc. in a post"] = "Je bent in een bericht aangestoten/gepord/etc.";
+App::$strings["Someone likes your post/comment"] = "Iemand jouw bericht/reactie leuk vindt";
App::$strings["Show visual notifications including:"] = "Toon de volgende zichtbare notificaties:";
App::$strings["Unseen grid activity"] = "Niet bekeken grid-activiteit";
App::$strings["Unseen channel activity"] = "Niet bekeken kanaal-activiteit";
@@ -1434,6 +1406,8 @@ App::$strings["Minimum of 10 seconds, no maximum"] = "Minimaal 10 seconde, geen
App::$strings["Maximum number of conversations to load at any time:"] = "Maximaal aantal conversaties die per keer geladen worden:";
App::$strings["Maximum of 100 items"] = "Maximaal 100 conversaties";
App::$strings["Show emoticons (smilies) as images"] = "Toon emoticons (smilies) als afbeeldingen";
+App::$strings["Manual conversation updates"] = "Handmatige conversatie-updates";
+App::$strings["Default is automatic, which may increase screen jumping"] = "Standaard is automatisch, maar soms kan het zorgen voor het verspringen van items";
App::$strings["Link post titles to source"] = "Berichtkoppen naar originele locatie linken";
App::$strings["System Page Layout Editor - (advanced)"] = "Lay-out bewerken van systeempagina's (geavanceerd)";
App::$strings["Use blog/list mode on channel page"] = "Gebruik blog/lijst-modus op kanaalpagina";
@@ -1444,78 +1418,106 @@ App::$strings["click to expand content exceeding this height"] = "klik om inhoud
App::$strings["Grid page max height of content (in pixels)"] = "Maximale hoogte berichtinhoud op gridpagina (in pixels)";
App::$strings["No feature settings configured"] = "Geen plugin-instellingen aanwezig";
App::$strings["Feature/Addon Settings"] = "Plugin-instellingen";
-App::$strings["Additional Features"] = "Extra functies";
-App::$strings["Name is required"] = "Naam is vereist";
-App::$strings["Key and Secret are required"] = "Key en secret zijn vereist";
-App::$strings["Add application"] = "Applicatie toevoegen";
-App::$strings["Name of application"] = "Naam van applicatie";
-App::$strings["Consumer Key"] = "Consumer key";
-App::$strings["Automatically generated - change if desired. Max length 20"] = "Automatische gegenereerd - verander wanneer gewenst. Maximale lengte is 20";
-App::$strings["Consumer Secret"] = "Consumer secret";
-App::$strings["Redirect"] = "Redirect/doorverwijzing";
-App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI voor redirect - laat leeg, behalve wanneer de applicatie dit vereist";
-App::$strings["Icon url"] = "Pictogram-URL";
-App::$strings["Application not found."] = "Applicatie niet gevonden.";
-App::$strings["Connected Apps"] = "Verbonden applicaties";
-App::$strings["Client key starts with"] = "Client key begint met";
-App::$strings["No name"] = "Geen naam";
-App::$strings["Remove authorization"] = "Autorisatie verwijderen";
-App::$strings["This channel is limited to %d tokens"] = "Dit kanaal heeft een limiet van %d tokens";
-App::$strings["Name and Password are required."] = "Naam en wachtwoord zijn vereist";
-App::$strings["Token saved."] = "Token opgeslagen.";
-App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Gebruik dit formulier om tijdelijke identiteiten aan te maken, waarmee je bepaalde informatie met niet-leden kan delen. Deze identiteiten kunnen onder Permissies (handmatige selectie) worden gebruikt. Gasten kunnen inloggen met onderstaande gegevens om zo toegang te krijgen tot privéinhoud.";
-App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "Je kan ook <em>dropbox</em>-achtige links aan mensen geven door bovenstaand wachtwoord op onderstaande manier aan een hub-URL toe te voegen. Voorbeelden:";
-App::$strings["Guest Access Tokens"] = "Gasttoegang";
-App::$strings["Login Name"] = "Inlognaam";
-App::$strings["Login Password"] = "Wachtwoord:";
-App::$strings["Expires (yyyy-mm-dd)"] = "Geldig t/m (yyyy-mm-dd)";
+App::$strings["Tag removed"] = "Tag verwijderd";
+App::$strings["Remove Item Tag"] = "Verwijder item-tag";
+App::$strings["Select a tag to remove: "] = "Kies een tag om te verwijderen";
+App::$strings["Thing updated"] = "Ding bijgewerkt";
+App::$strings["Object store: failed"] = "Opslaan van ding mislukt";
+App::$strings["Thing added"] = "Ding toegevoegd";
+App::$strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+App::$strings["Show Thing"] = "Ding weergeven";
+App::$strings["item not found."] = "Item niet gevonden";
+App::$strings["Edit Thing"] = "Ding bewerken";
+App::$strings["Select a profile"] = "Kies een profiel";
+App::$strings["Post an activity"] = "Plaats een bericht";
+App::$strings["Only sends to viewers of the applicable profile"] = "Toont dit alleen aan diegene die het gekozen profiel mogen zien.";
+App::$strings["Name of thing e.g. something"] = "Naam van ding";
+App::$strings["URL of thing (optional)"] = "URL van ding (optioneel)";
+App::$strings["URL for photo of thing (optional)"] = "URL voor foto van ding (optioneel)";
+App::$strings["Add Thing to your Profile"] = "Ding aan je profiel toevoegen";
+App::$strings["Your service plan only allows %d channels."] = "Jouw abonnement staat maar %d kanalen toe.";
+App::$strings["Cloned channel not found. Import failed."] = "Gekloond kanaal niet gevonden. Importeren mislukt.";
+App::$strings["No channel. Import failed."] = "Geen kanaal. Importeren mislukt.";
+App::$strings["Import completed."] = "Import voltooid.";
+App::$strings["You must be logged in to use this feature."] = "Je moet ingelogd zijn om dit onderdeel te kunnen gebruiken.";
+App::$strings["Import Channel"] = "Kanaal importeren";
+App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Gebruik dit formulier om een bestaand kanaal te importeren van een andere hub. Je kan de kanaal-identiteit van de oude hub via het netwerk ontvangen of een exportbestand verstrekken.";
+App::$strings["Or provide the old server/hub details"] = "Of vul de gegevens van de oude hub in";
+App::$strings["Your old identity address (xyz@example.com)"] = "Jouw oude kanaaladres (xyz@example.com)";
+App::$strings["Your old login email address"] = "Het e-mailadres van je oude account";
+App::$strings["Your old login password"] = "Wachtwoord van jouw oude account";
+App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Voor elke optie geldt dat je moet kiezen of je jouw primaire kanaaladres op deze hub wil instellen of dat jouw oude hub deze rol blijft vervullen.";
+App::$strings["Make this hub my primary location"] = "Stel deze hub als mijn primaire locatie in";
+App::$strings["Import existing posts if possible (experimental - limited by available memory"] = "Importeer bestaande berichten wanneer mogelijk (experimenteel - afhankelijk van beschikbaar servergeheugen)";
+App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid.";
+App::$strings["No connections."] = "Geen connecties.";
+App::$strings["Visit %s's profile [%s]"] = "Bezoek het profiel van %s [%s]";
+App::$strings["View Connections"] = "Connecties weergeven";
+App::$strings["Source of Item"] = "Bron van item";
+App::$strings["Room not found"] = "Chatkanaal niet gevonden";
+App::$strings["Leave Room"] = "Chatkanaal verlaten";
+App::$strings["Delete Room"] = "Chatkanaal verwijderen";
+App::$strings["I am away right now"] = "Ik ben momenteel afwezig";
+App::$strings["I am online"] = "Ik ben online";
+App::$strings["Bookmark this room"] = "Chatkanaal aan bladwijzers toevoegen";
+App::$strings["New Chatroom"] = "Nieuw chatkanaal";
+App::$strings["Chatroom name"] = "Naam chatkanaal";
+App::$strings["Expiration of chats (minutes)"] = "Aantal minuten voordat chatberichten worden verwijderd";
+App::$strings["%1\$s's Chatrooms"] = "Chatkanalen van %1\$s";
+App::$strings["No chatrooms available"] = "Geen chatkanalen beschikbaar";
+App::$strings["Expiration"] = "Verloopt na";
+App::$strings["min"] = "min";
+App::$strings["Xchan Lookup"] = "Xchan opzoeken";
+App::$strings["Lookup xchan beginning with (or webbie): "] = "Zoek een xchan (of webbie) die begint met:";
+App::$strings["Calendar entries imported."] = "Agenda-items geïmporteerd.";
+App::$strings["No calendar entries found."] = "Geen agenda-items gevonden.";
+App::$strings["Event can not end before it has started."] = "Gebeurtenis kan niet eindigen voordat het is begonnen";
+App::$strings["Unable to generate preview."] = "Niet in staat om voorvertoning te genereren";
+App::$strings["Event title and start time are required."] = "Titel en begintijd van gebeurtenis zijn vereist.";
+App::$strings["Event not found."] = "Gebeurtenis niet gevonden";
+App::$strings["Edit event title"] = "Titel bewerken";
+App::$strings["Event title"] = "Titel";
+App::$strings["Categories (comma-separated list)"] = "Categorieën (door komma's gescheiden lijst)";
+App::$strings["Edit Category"] = "Categorie";
+App::$strings["Category"] = "Categorie";
+App::$strings["Edit start date and time"] = "Begindatum en -tijd bewerken";
+App::$strings["Start date and time"] = "Begindatum en -tijd";
+App::$strings["Finish date and time are not known or not relevant"] = "Einddatum en -tijd zijn niet bekend of niet van toepassing";
+App::$strings["Edit finish date and time"] = "Einddatum en -tijd bewerken";
+App::$strings["Finish date and time"] = "Einddatum en -tijd";
+App::$strings["Adjust for viewer timezone"] = "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt";
+App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Belangrijk voor gebeurtenissen die op een bepaalde locatie plaatsvinden. Niet praktisch voor wereldwijde feestdagen.";
+App::$strings["Edit Description"] = "Omschrijving bewerken";
+App::$strings["Edit Location"] = "Locatie bewerken";
+App::$strings["Permission settings"] = "Permissies";
+App::$strings["Advanced Options"] = "Geavanceerde opties";
+App::$strings["Edit event"] = "Gebeurtenis bewerken";
+App::$strings["Delete event"] = "Gebeurtenis verwijderen";
+App::$strings["calendar"] = "agenda";
+App::$strings["Month"] = "Maand";
+App::$strings["Week"] = "Week";
+App::$strings["Day"] = "Dag";
+App::$strings["Event removed"] = "Gebeurtenis verwijderd";
+App::$strings["Failed to remove event"] = "Verwijderen gebeurtenis mislukt";
App::$strings["Missing room name"] = "Naam chatkanaal ontbreekt";
App::$strings["Duplicate room name"] = "Naam chatkanaal bestaat al";
App::$strings["Invalid room specifier."] = "Ongeldige omschrijving chatkanaal";
App::$strings["Room not found."] = "Chatkanaal niet gevonden";
App::$strings["Room is full"] = "Chatkanaal is vol";
-App::$strings["\$Projectname Notification"] = "\$Projectname-notificatie";
-App::$strings["\$projectname"] = "\$projectname";
-App::$strings["Thank You,"] = "Bedankt,";
-App::$strings["%s Administrator"] = "Beheerder %s";
-App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
-App::$strings["[\$Projectname:Notify] New mail received at %s"] = "[\$Projectname:Notificatie] Nieuw privébericht ontvangen op %s";
-App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s zond jou een nieuw privébericht om %3\$s.";
-App::$strings["%1\$s sent you %2\$s."] = "%1\$s zond jou %2\$s.";
-App::$strings["a private message"] = "een privébericht";
-App::$strings["Please visit %s to view and/or reply to your private messages."] = "Bezoek %s om je privéberichten te bekijken en/of er op te reageren.";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %4\$s[/zrl]";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %5\$s van %4\$s[/zrl]";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]jouw %4\$s[/zrl]";
-App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notificatie] Reactie op conversatie #%1\$d door %2\$s";
-App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s gaf een reactie op een bericht/conversatie die jij volgt.";
-App::$strings["Please visit %s to view and/or reply to the conversation."] = "Bezoek %s om de conversatie te bekijken en/of er op te reageren.";
-App::$strings["[\$Projectname:Notify] %s posted to your profile wall"] = "[\$Projectname:Notificatie] %s heeft een bericht op jouw kanaal geplaatst";
-App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s heeft om %3\$s een bericht op jouw kanaal geplaatst";
-App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s heeft een bericht op [zrl=%3\$s]jouw kanaal[/zrl] geplaatst";
-App::$strings["[\$Projectname:Notify] %s tagged you"] = "[\$Projectname:Notificatie] %s heeft jou genoemd";
-App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s noemde jou op %3\$s";
-App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]noemde jou[/zrl].";
-App::$strings["[\$Projectname:Notify] %1\$s poked you"] = "[\$Projectname:Notificatie] %1\$s heeft jou aangestoten";
-App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s heeft je aangestoten op %3\$s";
-App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]heeft je aangestoten[/zrl].";
-App::$strings["[\$Projectname:Notify] %s tagged your post"] = "[\$Projectname:Notificatie] %s heeft jouw bericht getagd";
-App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s heeft jouw bericht om %3\$s getagd";
-App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s heeft [zrl=%3\$s]jouw bericht[/zrl] getagd";
-App::$strings["[\$Projectname:Notify] Introduction received"] = "[\$Projectname:Notificatie] Connectieverzoek ontvangen";
-App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, je hebt een nieuw connectieverzoek ontvangen van '%2\$s' op %3\$s";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, je hebt een [zrl=%2\$s]nieuw connectieverzoek[/zrl] ontvangen van %3\$s.";
-App::$strings["You may visit their profile at %s"] = "Je kan het profiel bekijken op %s";
-App::$strings["Please visit %s to approve or reject the connection request."] = "Bezoek %s om het connectieverzoek te accepteren of af te wijzen.";
-App::$strings["[\$Projectname:Notify] Friend suggestion received"] = "[\$Projectname:Notificatie] Kanaalvoorstel ontvangen";
-App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, je hebt een kanaalvoorstel ontvangen van '%2\$s' om %3\$s";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, je hebt [zrl=%2\$s]een kanaalvoorstel[/zrl] ontvangen voor %3\$s van %4\$s.";
-App::$strings["Name:"] = "Naam:";
-App::$strings["Photo:"] = "Foto:";
-App::$strings["Please visit %s to approve or reject the suggestion."] = "Bezoek %s om het voorstel te accepteren of af te wijzen.";
-App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Notificatie]";
-App::$strings["created a new post"] = "maakte een nieuw bericht aan";
-App::$strings["commented on %s's post"] = "gaf een reactie op een bericht van %s";
+App::$strings["Visible to your default audience"] = "Voor iedereen zichtbaar, mits niet anders ingesteld";
+App::$strings["Only me"] = "Alleen ik";
+App::$strings["Public"] = "Openbaar";
+App::$strings["Anybody in the \$Projectname network"] = "Iedereen in het \$Projectname-netwerk";
+App::$strings["Any account on %s"] = "Iedereen op %s";
+App::$strings["Any of my connections"] = "Al mijn geaccepteerde connecties";
+App::$strings["Only connections I specifically allow"] = "Alleen connecties die uitdrukkelijk door jou zijn toegestaan";
+App::$strings["Anybody authenticated (could include visitors from other networks)"] = "Geauthenticeerde leden (kan bezoekers van andere netwerken bevatten)";
+App::$strings["Any connections including those who haven't yet been approved"] = "Al mijn geaccepteerde en nog niet geaccepteerde connecties";
+App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Dit is de standaard privacy-instelling voor wie jouw berichten kan bekijken";
+App::$strings["This is your default setting for who can view your default channel profile"] = "Dit is de standaard privacy-instelling voor wie jouw standaardprofiel kan bekijken";
+App::$strings["This is your default setting for who can view your connections"] = "Dit is de standaard privacy-instelling voor wie een lijst met jouw connecties kan bekijken";
+App::$strings["This is your default setting for who can view your file storage and photos"] = "Dit is de standaard privacy-instelling voor wie jouw bestanden en foto's kan bekijken";
+App::$strings["This is your default setting for the audience of your webpages"] = "Dit is de standaard privacy-instelling voor wie jouw webpagina's kan bekijken";
App::$strings["Private Message"] = "Niet voor iedereen zichtbaar";
App::$strings["Select"] = "Kies";
App::$strings["Save to Folder"] = "In map opslaan";
@@ -1549,6 +1551,10 @@ App::$strings["via Wall-To-Wall:"] = "via kanaal-naar-kanaal";
App::$strings["from %s"] = "van %s";
App::$strings["last edited: %s"] = "laatst bewerkt: %s";
App::$strings["Expires: %s"] = "Verloopt: %s";
+App::$strings["Attend"] = "Aanwezig";
+App::$strings["Attendance Options"] = "Aanwezigheidsopties";
+App::$strings["Vote"] = "Stem";
+App::$strings["Voting Options"] = "Stemopties";
App::$strings["Save Bookmarks"] = "Bladwijzers opslaan";
App::$strings["Add to Calendar"] = "Aan agenda toevoegen";
App::$strings["Mark all seen"] = "Markeer alles als bekeken";
@@ -1561,22 +1567,8 @@ App::$strings["Code"] = "Broncode";
App::$strings["Image"] = "Afbeelding";
App::$strings["Insert Link"] = "Link invoegen";
App::$strings["Video"] = "Video";
-App::$strings["Visible to your default audience"] = "Voor iedereen zichtbaar, mits niet anders ingesteld";
-App::$strings["Only me"] = "Alleen ik";
-App::$strings["Public"] = "Openbaar";
-App::$strings["Anybody in the \$Projectname network"] = "Iedereen in het \$Projectname-netwerk";
-App::$strings["Any account on %s"] = "Iedereen op %s";
-App::$strings["Any of my connections"] = "Al mijn geaccepteerde connecties";
-App::$strings["Only connections I specifically allow"] = "Alleen connecties die uitdrukkelijk door jou zijn toegestaan";
-App::$strings["Anybody authenticated (could include visitors from other networks)"] = "Geauthenticeerde leden (kan bezoekers van andere netwerken bevatten)";
-App::$strings["Any connections including those who haven't yet been approved"] = "Al mijn geaccepteerde en nog niet geaccepteerde connecties";
-App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Dit is de standaard privacy-instelling voor wie jouw berichten kan bekijken";
-App::$strings["This is your default setting for who can view your default channel profile"] = "Dit is de standaard privacy-instelling voor wie jouw standaardprofiel kan bekijken";
-App::$strings["This is your default setting for who can view your connections"] = "Dit is de standaard privacy-instelling voor wie een lijst met jouw connecties kan bekijken";
-App::$strings["This is your default setting for who can view your file storage and photos"] = "Dit is de standaard privacy-instelling voor wie jouw bestanden en foto's kan bekijken";
-App::$strings["This is your default setting for the audience of your webpages"] = "Dit is de standaard privacy-instelling voor wie jouw webpagina's kan bekijken";
App::$strings["Site Admin"] = "Hubbeheerder";
-App::$strings["Bug Report"] = "Bugrapport";
+App::$strings["Report Bug"] = "Bugrapport indienen";
App::$strings["View Bookmarks"] = "Bladwijzers bekijken";
App::$strings["My Chatrooms"] = "Mijn chatkanalen";
App::$strings["Firefox Share"] = "Firefox Share";
@@ -1584,6 +1576,7 @@ App::$strings["Remote Diagnostics"] = "Diagnose op afstand";
App::$strings["Suggest Channels"] = "Kanalen voorstellen";
App::$strings["Login"] = "Inloggen";
App::$strings["Grid"] = "Grid";
+App::$strings["Wiki"] = "Wiki";
App::$strings["Channel Home"] = "Jouw kanaal";
App::$strings["Events"] = "Agenda";
App::$strings["Directory"] = "Kanalengids";
@@ -1598,196 +1591,752 @@ App::$strings["Language"] = "Taal";
App::$strings["Post"] = "Bericht";
App::$strings["Profile Photo"] = "Profielfoto";
App::$strings["Purchase"] = "Aanschaffen";
+App::$strings["Undelete"] = "Verwijdering ongedaan maken";
+App::$strings["\$Projectname Notification"] = "\$Projectname-notificatie";
+App::$strings["\$projectname"] = "\$projectname";
+App::$strings["Thank You,"] = "Bedankt,";
+App::$strings["%s Administrator"] = "Beheerder %s";
+App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
+App::$strings["[\$Projectname:Notify] New mail received at %s"] = "[\$Projectname:Notificatie] Nieuw privébericht ontvangen op %s";
+App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s zond jou een nieuw privébericht om %3\$s.";
+App::$strings["%1\$s sent you %2\$s."] = "%1\$s zond jou %2\$s.";
+App::$strings["a private message"] = "een privébericht";
+App::$strings["Please visit %s to view and/or reply to your private messages."] = "Bezoek %s om je privéberichten te bekijken en/of er op te reageren.";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %4\$s[/zrl]";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %5\$s van %4\$s[/zrl]";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]jouw %4\$s[/zrl]";
+App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notificatie] %2\$s gaf een reactie in conversatie #%1\$d";
+App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s gaf een reactie in een conversatie die jij volgt.";
+App::$strings["Please visit %s to view and/or reply to the conversation."] = "Bezoek %s om de conversatie te bekijken en/of er op te reageren.";
+App::$strings["%1\$s, %2\$s liked [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s vindt [zrl=%3\$s]jouw %4\$s[/zrl] leuk";
+App::$strings["[\$Projectname:Notify] Like received to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notificatie] %2\$s vindt iets leuk in conversatie #%1\$d";
+App::$strings["%1\$s, %2\$s liked an item/conversation you created."] = "%1\$s, %2\$s vindt iets leuk in een conversatie die jij bent gestart.";
+App::$strings["[\$Projectname:Notify] %s posted to your profile wall"] = "[\$Projectname:Notificatie] %s heeft een bericht op jouw kanaal geplaatst";
+App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s heeft om %3\$s een bericht op jouw kanaal geplaatst";
+App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s heeft een bericht op [zrl=%3\$s]jouw kanaal[/zrl] geplaatst";
+App::$strings["[\$Projectname:Notify] %s tagged you"] = "[\$Projectname:Notificatie] %s heeft jou genoemd";
+App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s noemde jou op %3\$s";
+App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]noemde jou[/zrl].";
+App::$strings["[\$Projectname:Notify] %1\$s poked you"] = "[\$Projectname:Notificatie] %1\$s heeft jou aangestoten";
+App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s heeft je aangestoten op %3\$s";
+App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]heeft je aangestoten[/zrl].";
+App::$strings["[\$Projectname:Notify] %s tagged your post"] = "[\$Projectname:Notificatie] %s heeft jouw bericht getagd";
+App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s heeft jouw bericht om %3\$s getagd";
+App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s heeft [zrl=%3\$s]jouw bericht[/zrl] getagd";
+App::$strings["[\$Projectname:Notify] Introduction received"] = "[\$Projectname:Notificatie] Connectieverzoek ontvangen";
+App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, je hebt een nieuw connectieverzoek ontvangen van '%2\$s' op %3\$s";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, je hebt een [zrl=%2\$s]nieuw connectieverzoek[/zrl] ontvangen van %3\$s.";
+App::$strings["You may visit their profile at %s"] = "Je kan het profiel bekijken op %s";
+App::$strings["Please visit %s to approve or reject the connection request."] = "Bezoek %s om het connectieverzoek te accepteren of af te wijzen.";
+App::$strings["[\$Projectname:Notify] Friend suggestion received"] = "[\$Projectname:Notificatie] Kanaalvoorstel ontvangen";
+App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, je hebt een kanaalvoorstel ontvangen van '%2\$s' om %3\$s";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, je hebt [zrl=%2\$s]een kanaalvoorstel[/zrl] ontvangen voor %3\$s van %4\$s.";
+App::$strings["Name:"] = "Naam:";
+App::$strings["Photo:"] = "Foto:";
+App::$strings["Please visit %s to approve or reject the suggestion."] = "Bezoek %s om het voorstel te accepteren of af te wijzen.";
+App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Notificatie]";
+App::$strings["created a new post"] = "maakte een nieuw bericht aan";
+App::$strings["commented on %s's post"] = "gaf een reactie op een bericht van %s";
+App::$strings["Flag Adult Photos"] = "Markeer foto's als voor volwassenen";
+App::$strings["Provide photo edit option to hide inappropriate photos from default album view"] = "Zorgt voor een optie om foto's met inhoud voor volwassenen in de standaard albumweergave te verbergen";
+App::$strings["This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc."] = "This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc.";
+App::$strings["Chord names start with a root note (A-G) and may include sharps (#) and flats (b). This software will parse most of the standard naming conventions such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."] = "Chord names start with a root note (A-G) and may include sharps (#) and flats (b). This software will parse most of the standard naming conventions such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements.";
+App::$strings["Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."] = "Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ...";
+App::$strings["Guitar Chords"] = "Gitaarakkoorden";
+App::$strings["The complete online chord dictionary"] = "Het complete online akkoordenboek";
+App::$strings["Tuning"] = "Stemmen";
+App::$strings["Chord name: example: Em7"] = "Akkoordnaam: bijvoorbeeld: Em7";
+App::$strings["Show for left handed stringing"] = "Toon voor linkshandige gitaar";
+App::$strings["Quick Reference"] = "Beknopt overzicht";
+App::$strings["Diaspora Protocol Settings updated."] = "Diaspora-protocol-instellingen bijgewerkt.";
+App::$strings["Enable the Diaspora protocol for this channel"] = "Het Diaspora-protocol voor dit kanaal inschakelen";
+App::$strings["Allow any Diaspora member to comment on your public posts"] = "Geef elk Diaspora-lid toestemming om op jouw openbare berichten te reageren";
+App::$strings["Prevent your hashtags from being redirected to other sites"] = "Voorkom dat jouw hashtags naar andere websites worden doorverwezen";
+App::$strings["Followed hashtags (comma separated, do not include the #)"] = "Gevolgde hashtags (door komma's gescheiden lijst, zonder de #)";
+App::$strings["Diaspora Protocol Settings"] = "Diaspora-protocol (incl. Friendica)";
+App::$strings["Hubzilla Directory Stats"] = "Kanalengidsstatistieken Hubzilla";
+App::$strings["Total Hubs"] = "Totaal aantal hubs";
+App::$strings["Hubzilla Hubs"] = "Hubzilla-hubs";
+App::$strings["Friendica Hubs"] = "Friendica-hubs";
+App::$strings["Diaspora Pods"] = "Diaspora-pods";
+App::$strings["Hubzilla Channels"] = "Hubzilla-kanalen";
+App::$strings["Friendica Channels"] = "Friendica-kanalen";
+App::$strings["Diaspora Channels"] = "Diaspora-kanalen";
+App::$strings["Aged 35 and above"] = "Leeftijd is ouder dan 35 jaar";
+App::$strings["Aged 34 and under"] = "Leeftijd is jonger dan 34";
+App::$strings["Average Age"] = "Gemiddelde leeftijd";
+App::$strings["Known Chatrooms"] = "Bekend aantal chatkanalen";
+App::$strings["Known Tags"] = "Bekend aantal tags";
+App::$strings["Please note Diaspora and Friendica statistics are merely those **this directory** is aware of, and not all those known in the network. This also applies to chatrooms,"] = "Please note Diaspora and Friendica statistics are merely those **this directory** is aware of, and not all those known in the network. This also applies to chatrooms,";
+App::$strings["Project Servers and Resources"] = "Projectservers en -middelen";
+App::$strings["Project Creator and Tech Lead"] = "Projectgrondlegger en hoofdontwikkelaar";
+App::$strings["Admin, developer, directorymin, support bloke"] = "Beheerder, ontwikkelaar, kanalengidsbeheerder en supportgozer";
+App::$strings["And the hundreds of other people and organisations who helped make the Hubzilla possible."] = "En de honderden andere mensen en organisaties die Hubzilla mogelijk hebben gemaakt. ";
+App::$strings["The Redmatrix/Hubzilla projects are provided primarily by volunteers giving their time and expertise - and often paying out of pocket for services they share with others."] = "De Hubzillaprojecten worden hoofdzakelijk aangeboden door vrijwilligers die er hun tijd en expertise insteken - en meestal zelf de diensten betalen die ze met anderen delen.";
+App::$strings["There is no corporate funding and no ads, and we do not collect and sell your personal information. (We don't control your personal information - <strong>you do</strong>.)"] = "Wij worden niet gefinancierd door bedrijven en reclame, en wij verzamelen en verkopen niet jouw persoonlijke gegevens. We hebben geen controle over jouw persoonlijke gegevens - <strong>dat heb jezelf</strong>.";
+App::$strings["Help support our ground-breaking work in decentralisation, web identity, and privacy."] = "Steun ons baanbrekende werk in decentralisatie, webidentiteit en privacy. ";
+App::$strings["Your donations keep servers and services running and also helps us to provide innovative new features and continued development."] = "Jouw donaties laten onze servers en diensten draaien, en helpt ons om nieuwe innovatieve mogelijkheden te blijven ontwikkelen.";
+App::$strings["Donate"] = "Doneer";
+App::$strings["Choose a project, developer, or public hub to support with a one-time donation"] = "Kies een project, ontwikkelaar of openbaar toegankelijke hub, die je met een eenmalige donatie wil steunen";
+App::$strings["Donate Now"] = "Doneer nu";
+App::$strings["<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"] = "<strong><em>Of</em></strong> wordt een projectsponsor (alleen het Hubzilla-project)";
+App::$strings["Please indicate if you would like your first name or full name (or nothing) to appear in our sponsor listing"] = "Geef aan of jouw voornaam of volledige naam (of niets) op onze sponsorlijst moet verschijnen";
+App::$strings["Sponsor"] = "Sponsor";
+App::$strings["Special thanks to: "] = "Speciale dank gaat naar: ";
+App::$strings["Post to Dreamwidth"] = "Doorplaatsen naar Dreamwidth";
+App::$strings["Enable Dreamwidth Post Plugin"] = "Doorplaatsen naar Dreamwidth inschakelen";
+App::$strings["Dreamwidth username"] = "Gebruikersnaam Dreamwidth";
+App::$strings["Dreamwidth password"] = "Wachtwoord Dreamwidth";
+App::$strings["Post to Dreamwidth by default"] = "Standaard doorplaatsen naar Dreamwidth";
+App::$strings["Dreamwidth Post Settings"] = "Doorplaatsen naar Dreamwidth";
+App::$strings["Flattr this!"] = "Flattr this!";
+App::$strings["Flattr widget settings updated."] = "Instellingen Flattrwidget bijgewerkt.";
+App::$strings["Flattr user"] = "Gebruikersnaam Flattr";
+App::$strings["URL of the Thing to flattr"] = "URL van het Flattr-item";
+App::$strings["If empty channel URL is used"] = "Wanneer een lege kanaal-URL wordt gebruikt";
+App::$strings["Title of the Thing to flattr"] = "Naam van het Flattr-item";
+App::$strings["If empty \"channel name on The Hubzilla\" will be used"] = "Wanneer een lege \"kanaalnaam op Hubzilla\" wordt gebruikt";
+App::$strings["Static or dynamic flattr button"] = "Statische of dynamische Flattr-knop";
+App::$strings["static"] = "statisch";
+App::$strings["dynamic"] = "dynamisch";
+App::$strings["Alignment of the widget"] = "Uitlijning van de widget";
+App::$strings["left"] = "links";
+App::$strings["right"] = "rechts";
+App::$strings["Enable Flattr widget"] = "Flattrwidget inschakelen";
+App::$strings["Flattr Widget Settings"] = "Flattrwidget";
+App::$strings["Contact not found."] = "Contact niet gevonden";
+App::$strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "This may occasionally happen if contact was requested by both persons and it has already been approved.";
+App::$strings["Response from remote site was not understood."] = "Response from remote site was not understood.";
+App::$strings["Unexpected response from remote site: "] = "Unexpected response from remote site: ";
+App::$strings["Confirmation completed successfully."] = "Confirmation completed successfully.";
+App::$strings["Remote site reported: "] = "Remote site reported: ";
+App::$strings["Temporary failure. Please wait and try again."] = "Temporary failure. Please wait and try again.";
+App::$strings["Introduction failed or was revoked."] = "Introduction failed or was revoked.";
+App::$strings["Unable to set contact photo."] = "Unable to set contact photo.";
+App::$strings["%1\$s is now friends with %2\$s"] = "%1\$s is now friends with %2\$s";
+App::$strings["No user record found for '%s' "] = "No user record found for '%s' ";
+App::$strings["Our site encryption key is apparently messed up."] = "Our site encryption key is apparently messed up.";
+App::$strings["Empty site URL was provided or URL could not be decrypted by us."] = "Empty site URL was provided or URL could not be decrypted by us.";
+App::$strings["Contact record was not found for you on our site."] = "Contact record was not found for you on our site.";
+App::$strings["Site public key not available in contact record for URL %s."] = "Site public key not available in contact record for URL %s.";
+App::$strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "The ID provided by your system is a duplicate on our system. It should work if you try again.";
+App::$strings["Unable to set your contact credentials on our system."] = "Unable to set your contact credentials on our system.";
+App::$strings["Unable to update your contact profile details on our system"] = "Unable to update your contact profile details on our system";
+App::$strings["[Name Withheld]"] = "[Name Withheld]";
+App::$strings["%1\$s has joined %2\$s"] = "%1\$s has joined %2\$s";
+App::$strings["%1\$s welcomes %2\$s"] = "%1\$s welcomes %2\$s";
+App::$strings["This introduction has already been accepted."] = "This introduction has already been accepted.";
+App::$strings["Profile location is not valid or does not contain profile information."] = "Profile location is not valid or does not contain profile information.";
+App::$strings["Warning: profile location has no identifiable owner name."] = "Warning: profile location has no identifiable owner name.";
+App::$strings["Warning: profile location has no profile photo."] = "Warning: profile location has no profile photo.";
+App::$strings["%d required parameter was not found at the given location"] = array(
+ 0 => "%d required parameter was not found at the given location",
+ 1 => "%d required parameters were not found at the given location",
+);
+App::$strings["Introduction complete."] = "Introduction complete.";
+App::$strings["Unrecoverable protocol error."] = "Unrecoverable protocol error.";
+App::$strings["Profile unavailable."] = "Profile unavailable.";
+App::$strings["%s has received too many connection requests today."] = "%s has received too many connection requests today.";
+App::$strings["Spam protection measures have been invoked."] = "Spam protection measures have been invoked.";
+App::$strings["Friends are advised to please try again in 24 hours."] = "Friends are advised to please try again in 24 hours.";
+App::$strings["Invalid locator"] = "Invalid locator";
+App::$strings["Invalid email address."] = "Invalid email address.";
+App::$strings["This account has not been configured for email. Request failed."] = "This account has not been configured for email. Request failed.";
+App::$strings["Unable to resolve your name at the provided location."] = "Unable to resolve your name at the provided location.";
+App::$strings["You have already introduced yourself here."] = "You have already introduced yourself here.";
+App::$strings["Apparently you are already friends with %s."] = "Apparently you are already friends with %s.";
+App::$strings["Invalid profile URL."] = "Invalid profile URL.";
+App::$strings["Disallowed profile URL."] = "Disallowed profile URL.";
+App::$strings["Failed to update contact record."] = "Failed to update contact record.";
+App::$strings["Your introduction has been sent."] = "Your introduction has been sent.";
+App::$strings["Please login to confirm introduction."] = "Please login to confirm introduction.";
+App::$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.";
+App::$strings["Confirm"] = "Confirm";
+App::$strings["Hide this contact"] = "Hide this contact";
+App::$strings["Welcome home %s."] = "Welcome home %s.";
+App::$strings["Please confirm your introduction/connection request to %s."] = "Please confirm your introduction/connection request to %s.";
+App::$strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "Please enter your 'Identity Address' from one of the following supported communications networks:";
+App::$strings["If you are not yet a member of the free social web, <a href=\"%s/siteinfo\">follow this link to find a public Friendica site and join us today</a>."] = "If you are not yet a member of the free social web, <a href=\"%s/siteinfo\">follow this link to find a public Friendica site and join us today</a>.";
+App::$strings["Friend/Connection Request"] = "Friend/Connection Request";
+App::$strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca";
+App::$strings["Please answer the following:"] = "Please answer the following:";
+App::$strings["Does %s know you?"] = "Does %s know you?";
+App::$strings["Add a personal note:"] = "Add a personal note:";
+App::$strings["Friendica"] = "Friendica";
+App::$strings["StatusNet/Federated Social Web"] = "StatusNet/Federated Social Web";
+App::$strings["Diaspora"] = "Diaspora";
+App::$strings[" - please do not use this form. Instead, enter %s into your Diaspora search bar."] = " - please do not use this form. Instead, enter %s into your Diaspora search bar.";
+App::$strings["Your Identity Address:"] = "Your Identity Address:";
+App::$strings["Submit Request"] = "Submit Request";
+App::$strings["GNU-Social Protocol Settings updated."] = "GNU social-protocol-instellingen bijgewerkt.";
+App::$strings["Enable the (experimental) GNU-Social protocol for this channel"] = "GNU social-protocol voor dit kanaal inschakelen (experimenteel)";
+App::$strings["GNU-Social Protocol Settings"] = "GNU social-protocol";
+App::$strings["Follow"] = "Volgen";
+App::$strings["%1\$s is now following %2\$s"] = "%1\$s volgt nu %2\$s";
+App::$strings["Friendica Photo Album Import"] = "Fotoalbums importeren vanuit Friendica";
+App::$strings["This will import all your Friendica photo albums to this Red channel."] = "Hiermee importeer je al jouw Friendica-fotoalbums in dit Hubzilla-kanaal.";
+App::$strings["Friendica Server base URL"] = "Basis-URL van Friendica-server";
+App::$strings["Friendica Login Username"] = "Gebruikersnaam Friendica";
+App::$strings["Friendica Login Password"] = "Wachtwoord Friendica";
+App::$strings["Enable the GNU-Social protocol for this channel"] = "GNU social-protocol voor dit kanaal inschakelen";
+App::$strings["Send email to all members"] = "Naar alle leden e-mail versturen";
+App::$strings["$1%s Administrator"] = "Beheerder $1%s";
+App::$strings["No recipients found."] = "Geen ontvangers gevonden";
+App::$strings["%1\$d of %2\$d messages sent."] = "%1\$d van %2\$d berichten verzonden.";
+App::$strings["Send email to all hub members."] = "Naar alle leden van deze hub e-mail versturen.";
+App::$strings["Message subject"] = "Onderwerp e-mailbericht";
+App::$strings["Sender Email address"] = "E-mailadres afzender";
+App::$strings["Test mode (only send to hub administrator)"] = "Testmodus (alleen naar hubbeheerder sturen)";
+App::$strings["Post to Insanejournal"] = "Doorplaatsen naar InsaneJournal";
+App::$strings["Enable InsaneJournal Post Plugin"] = "Doorplaatsen naar InsaneJournal inschakelen";
+App::$strings["InsaneJournal username"] = "Gebruikersnaam InsaneJournal";
+App::$strings["InsaneJournal password"] = "Wachtwoord InsaneJournal";
+App::$strings["Post to InsaneJournal by default"] = "Standaard doorplaatsen naar InsaneJournal";
+App::$strings["InsaneJournal Post Settings"] = "Doorplaatsen naar InsaneJournal";
+App::$strings["Insane Journal Settings saved."] = "InsaneJournal-instellingen opgeslagen.";
+App::$strings["Channels to auto connect"] = "Kanalen om automatisch mee te verbinden";
+App::$strings["Comma separated list"] = "Door komma's gescheiden lijst";
+App::$strings["Popular Channels"] = "Populaire chatkanalen";
+App::$strings["IRC Settings"] = "IRC";
+App::$strings["IRC settings saved."] = "IRC-instellingen opgeslagen.";
+App::$strings["IRC Chatroom"] = "IRC-chatkanaal";
+App::$strings["Status:"] = "Status:";
+App::$strings["Activate addon"] = "Plugin inschakelen";
+App::$strings["Hide Jappixmini Chat-Widget from the webinterface"] = "Hide Jappixmini Chat-Widget from the webinterface";
+App::$strings["Jabber username"] = "Gebruikersnaam Jabber";
+App::$strings["Jabber server"] = "Jabberserver";
+App::$strings["Jabber BOSH host URL"] = "Jabber BOSH host URL";
+App::$strings["Jabber password"] = "Wachtwoord Jabber";
+App::$strings["Encrypt Jabber password with Hubzilla password"] = "Versleutel Jabber-wachtwoord met Hubzilla-wachtwoord";
+App::$strings["Hubzilla password"] = "Wachtwoord Hubzilla";
+App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "Approve subscription requests from Hubzilla contacts automatically";
+App::$strings["Purge internal list of jabber addresses of contacts"] = "Purge internal list of jabber addresses of contacts";
+App::$strings["Configuration Help"] = "Configuratiehulp";
+App::$strings["Add Contact"] = "Contact toevoegen";
+App::$strings["Jappix Mini Settings"] = "Jappix Mini";
+App::$strings["Upload a file"] = "Bestand uploaden";
+App::$strings["Drop files here to upload"] = "Sleep bestanden hierheen om ze te uploaden";
+App::$strings["Failed"] = "Mislukt";
+App::$strings["No files were uploaded."] = "Er zijn geen bestanden geüpload.";
+App::$strings["Uploaded file is empty"] = "Geüpload bestand is leeg";
+App::$strings["Image exceeds size limit of "] = "Afbeeldingsgrootte overschrijdt het limiet van ";
+App::$strings["File has an invalid extension, it should be one of "] = "Bestand heeft een ongeldige extensie. Geldige extensies zijn ";
+App::$strings["Upload was cancelled, or server error encountered"] = "Upload werd geannuleerd of er was een serverfout";
+App::$strings["An account has been created for you."] = "Er is voor jou een account aangemaakt.";
+App::$strings["Authentication successful but rejected: account creation is disabled."] = "Authenticatie geslaagd, maar afgekeurd: aanmaken accounts uitgeschakeld.";
+App::$strings["Post to Libertree"] = "Doorplaatsen naar Libertree";
+App::$strings["Enable Libertree Post Plugin"] = "Doorplaatsen naar Libertree inschakelen";
+App::$strings["Libertree API token"] = "API-token Libertree";
+App::$strings["Libertree site URL"] = "Website-URL Libertree";
+App::$strings["Post to Libertree by default"] = "Standaard doorplaatsen naar Libertree";
+App::$strings["Libertree Post Settings"] = "Doorplaatsen naar Libertree";
+App::$strings["Libertree Settings saved."] = "Libertree-instellingen opgeslagen.";
+App::$strings["Post to LiveJournal"] = "Doorplaatsen naar LiveJournal";
+App::$strings["Enable LiveJournal Post Plugin"] = "Doorplaatsen naar LiveJournal inschakelen";
+App::$strings["LiveJournal username"] = "Gebruikersnaam LiveJournal";
+App::$strings["LiveJournal password"] = "Wachtwoord LiveJournal";
+App::$strings["Post to LiveJournal by default"] = "Standaard doorplaatsen naar ";
+App::$strings["LiveJournal Post Settings"] = "Doorplaatsen naar LiveJournal";
+App::$strings["LiveJournal Settings saved."] = "LiveJournal-instellingen opgeslagen.";
+App::$strings["Logfile archive directory"] = "Logbestand archiefmap";
+App::$strings["Directory to store rotated logs"] = "Map om geroteerde logbestanden in op te slaan";
+App::$strings["Logfile size in bytes before rotating"] = "Grootte van logbestand in bytes, voordat het wordt geroteerd";
+App::$strings["Number of logfiles to retain"] = "Aantal te behouden logbestanden";
+App::$strings["Email notification hub"] = "Hub voor e-mailnotificaties";
+App::$strings["Hostname"] = "Hostnaam";
+App::$strings["Mailhost Settings"] = "Mailhost";
+App::$strings["MAILHOST Settings saved."] = "Mailhost-instellingen opgeslagen.";
+App::$strings["lonely"] = "Eenzaam";
+App::$strings["drunk"] = "dronken";
+App::$strings["horny"] = "geil";
+App::$strings["stoned"] = "stoned";
+App::$strings["fucked up"] = "opgefokt";
+App::$strings["clusterfucked"] = "clusterfucked";
+App::$strings["crazy"] = "gek";
+App::$strings["hurt"] = "gekwetst";
+App::$strings["sleepy"] = "slaperig";
+App::$strings["grumpy"] = "chagrijnig";
+App::$strings["high"] = "high";
+App::$strings["semi-conscious"] = "half bij kennis";
+App::$strings["in love"] = "verliefd";
+App::$strings["in lust"] = "wellustig";
+App::$strings["naked"] = "naakt";
+App::$strings["stinky"] = "stinkend";
+App::$strings["sweaty"] = "zweterig";
+App::$strings["bleeding out"] = "aan het doodbloeden";
+App::$strings["victorious"] = "zegevierend";
+App::$strings["defeated"] = "verslagen";
+App::$strings["envious"] = "jaloers";
+App::$strings["jealous"] = "jaloers";
+App::$strings["bitchslap"] = "bitchslappen";
+App::$strings["bitchslapped"] = "bitchslapped";
+App::$strings["shag"] = "wippen";
+App::$strings["shagged"] = "wipte met";
+App::$strings["patent"] = "patent";
+App::$strings["patented"] = "patented";
+App::$strings["hug"] = "knuffelen";
+App::$strings["hugged"] = "knuffelde";
+App::$strings["murder"] = "vermoorden";
+App::$strings["murdered"] = "vermoorde";
+App::$strings["worship"] = "aanbidden";
+App::$strings["worshipped"] = "aanbad";
+App::$strings["kiss"] = "kussen";
+App::$strings["kissed"] = "kuste";
+App::$strings["tempt"] = "verleiden";
+App::$strings["tempted"] = "verleidde";
+App::$strings["raise eyebrows at"] = "wenkbrauwen optrekken";
+App::$strings["raised their eyebrows at"] = "trok zijn/haar wenkbrauwen op naar";
+App::$strings["insult"] = "beledigen";
+App::$strings["insulted"] = "beledigde";
+App::$strings["praise"] = "prijzen";
+App::$strings["praised"] = "prees";
+App::$strings["be dubious of"] = "twijfels hebben";
+App::$strings["was dubious of"] = "had twijfels over";
+App::$strings["eat"] = "opeten";
+App::$strings["ate"] = "at";
+App::$strings["giggle and fawn at"] = "giechelen en vleien";
+App::$strings["giggled and fawned at"] = "giechelde naar en vleide met";
+App::$strings["doubt"] = "betwijfelen";
+App::$strings["doubted"] = "betwijfelde";
+App::$strings["glare"] = "boos kijken";
+App::$strings["glared at"] = "keek boos naar";
+App::$strings["fuck"] = "neuken";
+App::$strings["fucked"] = "neukte";
+App::$strings["bonk"] = "naaien";
+App::$strings["bonked"] = "naaide";
+App::$strings["declare undying love for"] = "eeuwige liefde verklaren";
+App::$strings["declared undying love for"] = "verklaarde de eeuwige liefde aan";
+App::$strings["Save Settings"] = "Instellingen opslaan";
+App::$strings["text to include in all outgoing posts from this site"] = "tekst om onderaan elk uitgaand bericht van deze hub te plaatsen";
+App::$strings["Federate"] = "Federeren";
+App::$strings["nofed Settings saved."] = "Geen federatie-instellingen opgeslagen.";
+App::$strings["Allow Federation Toggle"] = "Federatie toestaan?";
+App::$strings["Federate posts by default"] = "Standaard berichten federeren";
+App::$strings["NoFed Settings"] = "Geen federatie";
+App::$strings["Nsabait Settings updated."] = "NSAbait-instellingen bijgewerkt.";
+App::$strings["Enable NSAbait Plugin"] = "NSAbait inschakelen";
+App::$strings["NSAbait Settings"] = "NSAbait";
+App::$strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Deze plug-in controleert berichten op woorden die je hieronder kunt opgeven en klapt berichten in die deze woorden bevatten, zodat die berichten niet worden weergegeven op ongeschikte momenten. Denk hierbij aan berichten met erotische afbeeldingen, die waarschijnlijk niet geschikt zijn binnen (bijvoorbeeld) een werkomgeving. Het is beleefd en het wordt aangeraden om zulke berichten met #NSFW te taggen. Dit filter kan ook gebruikt worden met andere woorden en is dus voor alles inzetbaar.";
+App::$strings["Enable Content filter"] = "Inhoudsfilter inschakelen";
+App::$strings["Comma separated list of keywords to hide"] = "Door komma's gescheiden lijst met woorden die gefilterd moeten worden.";
+App::$strings["Use /expression/ to provide regular expressions"] = "Gebruik /expressie/ voor reguliere expressies";
+App::$strings["Not Safe For Work Settings"] = "Not Safe For Work (inhoudsfilter)";
+App::$strings["General Purpose Content Filter"] = "Voor alles te gebruiken inhoudsfilter";
+App::$strings["NSFW Settings saved."] = "NSFW-instellingen opgeslagen.";
+App::$strings["Possible adult content"] = "Mogelijk inhoud voor volwassenen";
+App::$strings["%s - click to open/close"] = "%s - Klik om te openen of te sluiten";
+App::$strings["System defaults:"] = "Systeemstandaarden:";
+App::$strings["Preferred Clipart IDs"] = "Voorkeursclipart";
+App::$strings["List of preferred clipart ids. These will be shown first."] = "Lijst met clipartnummers die als eerste moeten worden getoond.";
+App::$strings["Default Search Term"] = "Standaard zoekterm";
+App::$strings["The default search term. These will be shown second."] = "Standaard zoekterm. Deze worden als tweede getoond.";
+App::$strings["Return After"] = "Ga na afloop naar";
+App::$strings["Page to load after image selection."] = "Pagina die na het kiezen van een afbeelding moet laden.";
+App::$strings["Edit Profile"] = "Profiel bewerken";
+App::$strings["Profile List"] = "Profiellijst";
+App::$strings["Order of Preferred"] = "Voorkeursclipart sorteren op";
+App::$strings["Sort order of preferred clipart ids."] = "Als eerste getoonde clipart hierop sorteren.";
+App::$strings["Newest first"] = "Nieuwste eerst";
+App::$strings["As entered"] = "Zoals ingevoerd";
+App::$strings["Order of other"] = "Overige clipart sorteren op";
+App::$strings["Sort order of other clipart ids."] = "Overige clipart hierop sorteren.";
+App::$strings["Most downloaded first"] = "Meest gedownload eerst";
+App::$strings["Most liked first"] = "Meest geliked eerst";
+App::$strings["Preferred IDs Message"] = "Tekst voorkeursclipart";
+App::$strings["Message to display above preferred results."] = "Tekst die bovenaan de resultaten met voorkeursclipart moet worden getoond.";
+App::$strings["Uploaded by: "] = "Geüpload door: ";
+App::$strings["Drawn by: "] = "Getekend door: ";
+App::$strings["Or select from a free OpenClipart.org image:"] = "Of kies uit een vrije OpenClipart.org-afbeelding:";
+App::$strings["Search Term"] = "Zoekterm";
+App::$strings["Unknown error. Please try again later."] = "Onbekende fout. Probeer later nog eens.";
+App::$strings["Profile photo updated successfully."] = "Bijwerken profielfoto geslaagd.";
+App::$strings["View Larger"] = "Groter tonen";
+App::$strings["Tile Server URL"] = "URL tile-server";
+App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "Een lijst met <a href=\\\"http://wiki.openstreetmap.org/wiki/TMS\\\" target=\\\"_blank\\\">openbare tile-servers</a>";
+App::$strings["Nominatim (reverse geocoding) Server URL"] = "Server-URL Nominatim (reverse geocoding)";
+App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">Nominatim servers</a>"] = "Een lijst met <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">Nominatim-servers</a>";
+App::$strings["Default zoom"] = "Standaard zoomniveau";
+App::$strings["The default zoom level. (1:world, 18:highest, also depends on tile server)"] = "Standaard zoomniveau. Van 1 (wereld) t/m 18 (maximaal). Is ook afhankelijk van tile-server.";
+App::$strings["Include marker on map"] = "Markering op kaart plaatsen";
+App::$strings["Include a marker on the map."] = "Plaatst een markering op de kaart.";
+App::$strings["Message to display on every page on this server"] = "Bericht om op elke pagina van deze hub weer te geven";
+App::$strings["Pageheader Settings"] = "Pageheader";
+App::$strings["pageheader Settings saved."] = "Pageheader-instellingen opgeslagen.";
+App::$strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Het bezoek aan deze website wordt gemeten door <a href='http://www.piwik.org'>Piwik</a>.";
+App::$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)."] = "Wanneer je niet wil dat jouw bezoek aan deze website wordt bijgehouden, <a href='%s'>kan je een cookie achterlaten om te verhinderen dat Piwik jou op deze website blijft volgen</a> (opt-out).";
+App::$strings["Piwik Base URL"] = "Basis-URL Piwik";
+App::$strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Absoluut pad naar jouw Piwik-installatie (zonder protocol (http/s), met een slash op het einde)";
+App::$strings["Site ID"] = "Site ID";
+App::$strings["Show opt-out cookie link?"] = "Toon opt-out cookie-link?";
+App::$strings["Asynchronous tracking"] = "Asynchroon volgen";
+App::$strings["Enable frontend JavaScript error tracking"] = "Volgen van front-end JavaScript-fouten inschakelen";
+App::$strings["This feature requires Piwik >= 2.2.0"] = "Deze functie vereist Piwik >= 2.2.0";
+App::$strings["Planets Settings updated."] = "Planets-instellingen opgeslagen.";
+App::$strings["Enable Planets Plugin"] = "Planets inschakelen";
+App::$strings["Planets Settings"] = "Planets";
+App::$strings["You are now authenticated to pumpio."] = "De verbinding met pump.io is geverifieerd";
+App::$strings["return to the featured settings page"] = "Ga terug naar pagina met plugin-instellingen";
+App::$strings["Post to Pump.io"] = "Doorplaatsen naar Pump.io";
+App::$strings["Pump.io servername"] = "Pump.io-servernaam";
+App::$strings["Without \"http://\" or \"https://\""] = "Zonder \"http://\" of \"https://\"";
+App::$strings["Pump.io username"] = "Gebruikersnaam Pump.io";
+App::$strings["Without the servername"] = "Zonder servernaam";
+App::$strings["You are not authenticated to pumpio"] = "De verbinding met pump.io is niet geverifieerd";
+App::$strings["(Re-)Authenticate your pump.io connection"] = "Verifieer (opnieuw) jouw pump.io-verbinding";
+App::$strings["Enable pump.io Post Plugin"] = "Doorplaatsen naar Pump.io inschakelen";
+App::$strings["Post to pump.io by default"] = "Standaard doorplaatsen naar Pump.io";
+App::$strings["Should posts be public"] = "Moeten berichten openbaar zijn";
+App::$strings["Mirror all public posts"] = "Alle openbare berichten doorplaatsen";
+App::$strings["Pump.io Post Settings"] = "Doorplaatsen naar Pump.io";
+App::$strings["PumpIO Settings saved."] = "Pump.io-instellingen opgeslagen.";
+App::$strings["QR code"] = "QR-code";
+App::$strings["QR Generator"] = "QR-code-generator";
+App::$strings["Enter some text"] = "Vul wat tekst in";
+App::$strings["Enable Rainbowtag"] = "Rainbowtag inschakelen";
+App::$strings["Rainbowtag Settings"] = "Rainbowtag";
+App::$strings["Rainbowtag Settings saved."] = "Rainbowtag-instellingen opgeslagen.";
+App::$strings["You're welcome."] = "Je bent van harte welkom.";
+App::$strings["Ah shucks..."] = "Hé verdorie...";
+App::$strings["Don't mention it."] = "Graag gedaan.";
+App::$strings["&lt;blush&gt;"] = "<bloos>";
+App::$strings["Redmatrix File Storage Import"] = "Importeer bestanden vanuit Redmatrix";
+App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Hiermee importeer je al jouw Redmatrix-bestanden in dit kanaal.";
+App::$strings["Redmatrix Server base URL"] = "Basis-URL van Redmatrix-hub";
+App::$strings["Redmatrix Login Username"] = "Gebruikersnaam Redmatrix";
+App::$strings["Redmatrix Login Password"] = "Wachtwoord Redmatrix";
+App::$strings["file"] = "bestand";
+App::$strings["Photos imported"] = "Foto's geïmporteerd";
+App::$strings["Redmatrix Photo Album Import"] = "Fotoalbums importeren vanuit Redmatrix";
+App::$strings["This will import all your Redmatrix photo albums to this channel."] = "Hiermee importeer je al jouw Redmatrix-fotoalbums in dit Hubzilla-kanaal.";
+App::$strings["Import just this album"] = "Alleen dit album importeren";
+App::$strings["Leave blank to import all albums"] = "Laat leeg om alle albums te importeren";
+App::$strings["Maximum count to import"] = "Maximaal aantal om te importeren";
+App::$strings["0 or blank to import all available"] = "0 of leeg om alles te importeren";
+App::$strings["Post to Red"] = "Doorplaatsen naar Hubzilla";
+App::$strings["Channel is required."] = "Een kanaal is vereist.";
+App::$strings["Invalid channel."] = "Onbekend kanaal.";
+App::$strings["redred Settings saved."] = "RedRed-instellingen opgeslagen.";
+App::$strings["Allow posting to another Hubzilla Channel"] = "Doorplaatsen naar een ander Hubzilla-kanaal toestaan";
+App::$strings["Send public postings to Hubzilla channel by default"] = "Standaard doorplaatsen naar een ander Hubzilla-kanaal toestaan";
+App::$strings["Hubzilla API Path"] = "API-pad Hubzilla";
+App::$strings["https://{sitename}/api"] = "https://{hubnaam}/api";
+App::$strings["Hubzilla login name"] = "Gebruikersnaam Hubzilla";
+App::$strings["Hubzilla channel name"] = "Kanaalnaam Hubzilla";
+App::$strings["Nickname"] = "Bijnaam";
+App::$strings["Hubzilla Crosspost Settings"] = "Doorplaatsen naar Hubzilla";
+App::$strings["Post to Friendica"] = "Doorplaatsen naar Friendica";
+App::$strings["rtof Settings saved."] = "RTOF-instellingen opgeslagen.";
+App::$strings["Allow posting to Friendica"] = "Doorplaatsen naar Friendica toestaan";
+App::$strings["Send public postings to Friendica by default"] = "Standaard doorplaatsen naar Friendica";
+App::$strings["Friendica API Path"] = "API-pad Friendica";
+App::$strings["Friendica login name"] = "Gebruikersnaam Friendica";
+App::$strings["Friendica password"] = "Wachtwoord Friendica";
+App::$strings["Hubzilla to Friendica Post Settings"] = "Doorplaatsen naar Friendica";
+App::$strings["Extended Identity Sharing"] = "Uitgebreid identiteit delen";
+App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Deel jouw Hubzilla-identiteit met alle websites op het internet. Wanneer dit is uitgeschakeld wordt je identiteit alleen binnen het Hubzilla-netwerk gedeeld. Schakel dit alleen in als je weet wat je doet.";
+App::$strings["Some setting"] = "Een of andere instelling";
+App::$strings["A setting"] = "Een instelling";
+App::$strings["Skeleton Settings"] = "Plugin-skeleton";
+App::$strings["Deactivate the feature"] = "Deze functie uitschakelen";
+App::$strings["Hide the button and show the smilies directly."] = "Verberg de knop en toon de smilies direct.";
+App::$strings["Smileybutton Settings"] = "Smileyknop";
+App::$strings["Page to load after login"] = "Pagina die na het inloggen getoond moet worden";
+App::$strings["Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave blank for default network page (grid)."] = "Voorbeelden: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacygroep), &quot;channel&quot; of &quot;notifications/system&quot; (laat leeg voor de standaard netwerkpagina (grid).";
+App::$strings["Startpage Settings"] = "Startpagina";
+App::$strings["Post to GNU social"] = "Doorplaatsen naar GNU social";
+App::$strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "De verstrekte API-URL is ongeldig.<br />Neem contact op met jouw hubbeheerder.";
+App::$strings["We could not contact the GNU social API with the Path you entered."] = "Wij konden de GNU social-API niet bereiken door middel van het ingevulde pad.";
+App::$strings["GNU social settings updated."] = "GNU social-instellingen bijgewerkt.";
+App::$strings["Globally Available GNU social OAuthKeys"] = "Op de gehele hub te gebruiken GNU social OAuthkeys.";
+App::$strings["There are preconfigured OAuth key pairs for some GNU social servers available. If you are using one of them, please use these credentials.<br />If not feel free to connect to any other GNU social instance (see below)."] = "Er zijn op deze hub enkele voorgeconfigureerde OAuthkey-paren voor GNU social servers beschikbaar. Wanneer je een van deze servers gebruikt, gebruik dan deze voorgeconfigureerde gegevens.<br />Wanneer dit niet het geval is, maak dan gerust met een andere GNU social-server verbinding (zie hieronder).";
+App::$strings["Provide your own OAuth Credentials"] = "Verstrek jouw eigen OAuth-gegevens";
+App::$strings["No consumer key pair for GNU social found. Register your Hubzilla Account as an desktop client on your GNU social 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 Hubzilla installation at your favourite GNU social installation."] = "Geen consumerkey voor GNU social gevonden. Registreer jouw Hubzilla-account als een desktopclient in jouw GNU-social-account, kopieer en plak hier de consumerkey en de consumersecret, en vul de API-base-root in.<br />Voordat je jouw eigen OAuthkey-paar registreert, vraag dan eerst aan jouw hubbeheerder of er al een key-paar voor deze hub op jouw favoriete GNU social-server bestaat.";
+App::$strings["OAuth Consumer Key"] = "OAuth-consumerkey";
+App::$strings["OAuth Consumer Secret"] = "Oauth-consumersecret";
+App::$strings["Base API Path"] = "Basispad API";
+App::$strings["Remember the trailing /"] = "Vergeet niet de afsluitende /";
+App::$strings["GNU social application name"] = "Naam GNU social-applicatie";
+App::$strings["To connect to your GNU social account click the button below to get a security code from GNU social which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to GNU social."] = "Om jouw GNU social-account te koppelen klik je op de knop hieronder. Je krijgt dan een veiligheidscode van GNU social die je kan kopiëren en dan hieronder in het invulveld kan plakken. Vervolgens klik je op Opslaan. Alleen jouw <strong>openbare</strong> berichten kunnen worden doorgeplaatst naar GNU social.";
+App::$strings["Log in with GNU social"] = "Inloggen op ";
+App::$strings["Copy the security code from GNU social here"] = "Plak de veiligheidscode van GNU social hier";
+App::$strings["Cancel Connection Process"] = "Annuleer het verbindingsproces";
+App::$strings["Current GNU social API is"] = "Huidige GNU social-API is";
+App::$strings["Cancel GNU social Connection"] = "Annuleer de GNU social-verbinding";
+App::$strings["Currently connected to: "] = "Momenteel gekoppeld aan: ";
+App::$strings["<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to GNU social will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Opmerking</strong>: In verband met jouw privacyinstellingen (<em>wanneer jouw kanaalprofiel voor onbekenden is verborgen</em>) leidt de profiellink die mogelijk in jouw naar GNU social doorgestuurde openbare berichten staat, naar een lege pagina met de melding dat toegang tot jouw kanaalprofiel is beperkt.";
+App::$strings["Allow posting to GNU social"] = "Doorplaatsen naar GNU social toestaan";
+App::$strings["If enabled your public postings can be posted to the associated GNU-social account"] = "Wanneer dit is ingeschakeld kunnen jouw openbare berichten naar het gekoppelde Twitter-account worden doorgeplaatst";
+App::$strings["Post to GNU social by default"] = "Standaard doorplaatsen naar GNU social";
+App::$strings["If enabled your public postings will be posted to the associated GNU-social account by default"] = "Wanneer dit is ingeschakeld worden al jouw openbare berichten standaard naar het gekoppelde GNU social-account doorgeplaatst";
+App::$strings["Clear OAuth configuration"] = "OAuth-configuratie wissen";
+App::$strings["GNU social Post Settings"] = "Doorplaatsen naar GNU social";
+App::$strings["API URL"] = "API-URL";
+App::$strings["Application name"] = "Naam applicatie";
+App::$strings["Currently blocked"] = "Momenteel geblokkeerd";
+App::$strings["No channels currently blocked"] = "Momenteel geen kanalen geblokkeerd";
+App::$strings["\"Superblock\" Settings"] = "Superblock";
+App::$strings["Block Completely"] = "Volledig blokkeren";
+App::$strings["superblock settings updated"] = "Superblock-instellingen bijgewerkt";
+App::$strings["Your account on %s will expire in a few days."] = "Jouw account op %s verloopt over een paar dagen. ";
+App::$strings["Your $Productname test account is about to expire."] = "Jouw $Productname-testaccount staat op het punt om te verlopen.";
+App::$strings["Three Dimensional Tic-Tac-Toe"] = "Driedimensionaal Boter-kaas-en-eieren";
+App::$strings["3D Tic-Tac-Toe"] = "Boter-kaas-en-eieren in 3D";
+App::$strings["New game"] = "Nieuw spel";
+App::$strings["New game with handicap"] = "Nieuw spel met handicap";
+App::$strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Driedimensionaal Boter-kaas-en-eieren is hetzelfde als het klassieke spel, behalve dat het gelijktijdig op meerdere hoogtes wordt gespeeld.";
+App::$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 dit geval zijn er drie hoogtes. Je wint wanneer je drie op een rij hebt op een van de drie hoogtes, van boven naar beneden of diagonaal.";
+App::$strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Het spel met een handicap schakelt de middelste positie op de middelste hoogte uit, omdat de speler die deze positie krijgt vaak een oneerlijk voordeel geniet.";
+App::$strings["You go first..."] = "Jij bent eerst...";
+App::$strings["I'm going first this time..."] = "Ik ga deze keer eerst...";
+App::$strings["You won!"] = "Jij wint!";
+App::$strings["\"Cat\" game!"] = "Gelijkspel!";
+App::$strings["I won!"] = "Ik win!";
+App::$strings["Edit your profile and change settings."] = "Jouw profiel bewerken en instellingen veranderen.";
+App::$strings["Click here to see activity from your connections."] = "Klik hier voor een tijdlijn met berichten en overige activiteiten van jouw connecties.";
+App::$strings["Click here to see your channel home."] = "Klik hier voor de tijdlijn van jouw eigen kanaal.";
+App::$strings["You can access your private messages from here."] = "Hiermee krijg je toegang tot jouw privéberichten.";
+App::$strings["Create new events here."] = "Nieuwe gebeurtenissen kan je hier aanmaken.";
+App::$strings["You can accept new connections and change permissions for existing ones here. You can also e.g. create groups of contacts."] = "Hier kan je nieuwe connecties accepteren en instellingen van bestaande connecties wijzigen. Je kan hier bijv. ook privacygroepen aanmaken.";
+App::$strings["System notifications will arrive here"] = "Systeemnotificaties komen hier tevoorschijn";
+App::$strings["Search for content and users"] = "Zoek hier naar tekst in berichten of naar andere kanalen.";
+App::$strings["Browse for new contacts"] = "Blader hier in een gids met kanalen, die je toe kan voegen als connectie.";
+App::$strings["Launch installed apps"] = "Open (op deze hub) geïnstalleerde apps.";
+App::$strings["Looking for help? Click here."] = "Zoek je hulp? Klik dan hier.";
+App::$strings["New events have occurred in your network. Click here to see what has happened!"] = "Er is iets nieuws gebeurd in jouw netwerk. Klik hier om te zien wat precies.";
+App::$strings["You have received a new private message. Click here to see from who!"] = "Je hebt een nieuw privébericht ontvangen. Klik hier om te zien van wie.";
+App::$strings["There are events this week. Click here too see which!"] = "Er vinden deze week gebeurtenissen plaats. Klik hier om te zien welke dit zijn.";
+App::$strings["You have received a new introduction. Click here to see who!"] = "Je hebt een nieuw connectieverzoek ontvangen. Klik hier om te kijken van wie.";
+App::$strings["There is a new system notification. Click here to see what has happened!"] = "Er is een nieuwe systeemnotificatie. Klik hier om te zien wat er aan de hand is.";
+App::$strings["Click here to share text, images, videos and sound."] = "Klik hier om tekst, afbeeldingen, video en audio te delen.";
+App::$strings["You can write an optional title for your update (good for long posts)."] = "Je kan optioneel een titel voor je nieuwe bericht verzinnen. Vooral goed voor langere berichten.";
+App::$strings["Entering some categories here makes it easier to find your post later."] = "Het invullen van enkele categorieën, maakt het later terugvinden van je berichten gemakkelijker. Dit is niet verplicht.";
+App::$strings["Share photos, links, location, etc."] = "Deel foto's, links, locaties, enz.";
+App::$strings["Only want to share content for a while? Make it expire at a certain date."] = "Wil je alleen iets tot een bepaald moment delen? Dan kan je het hiermee op een bepaalde datum en tijd laten verlopen.";
+App::$strings["You can password protect content."] = "Je kan met een wachtwoord gegevens beveiligen.";
+App::$strings["Choose who you share with."] = "Kies met wie je dit wil delen. ";
+App::$strings["Click here when you are done."] = "Klik hier wanneer je klaar bent.";
+App::$strings["Adjust from which channels posts should be displayed."] = "Aanpassen van welke kanalen berichten moeten worden getoond. ";
+App::$strings["Only show posts from channels in the specified privacy group."] = "Toon alleen berichten van kanalen in de hier gekozen privacygroep.";
+App::$strings["Easily find posts containing tags (keywords preceded by the \"#\" symbol)."] = "Vind gemakkelijk berichten met tags (trefwoorden die beginnen met een \"#\").";
+App::$strings["Easily find posts in given category."] = "Vind gemakkelijk berichten in een bepaalde categorie.";
+App::$strings["Easily find posts by date."] = "Vind gemakkelijk berichten op datum.";
+App::$strings["Suggested users who have volounteered to be shown as suggestions, and who we think you might find interesting."] = "Voorstellen voor kanalen die wellicht interessant voor jou zijn en hier ook vrijwillig voor hebben gekozen.";
+App::$strings["Here you see channels you have connected to."] = "Hier kan je zien met welke kanalen je bent verbonden (connecties).";
+App::$strings["Save your search so you can repeat it at a later date."] = "Sla jouw zoekopdracht op, zodat je het later opnieuw kan gebruiken.";
+App::$strings["If you see this icon you can be sure that the sender is who it say it is. It is normal that it is not always possible to verify the sender, so the icon will be missing sometimes. There is usually no need to worry about that."] = "Wanneer je dit pictogram ziet, kan je er van uitgaan dat de afzender is wie hij/zij beweert te zijn. Het is niet altijd mogelijk om de afzender te verifiëren, waardoor het pictogram soms ontbreekt. Dit is meestal geen reden voor ongerustheid.";
+App::$strings["Danger! It seems someone tried to forge a message! This message is not necessarily from who it says it is from!"] = "Gevaar! Het lijkt er op dat iemand een bericht heeft proberen te vervalsen! Dit bericht is mogelijk niet afkomstig van de vermelde afzender!";
+App::$strings["Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can pause it at any time and continue where you left off by reloading the page, or navigting to another page.</p><p>You can also advance by pressing the return key"] = "Welkom op Hubzilla! Wil jij een rondleiding hebben langs de gebruikersinterface?</p> <p>Je kan dit op elk moment pauzeren en weer hervatten door de pagina te herladen of naar een andere pagina te gaan.</p><p>Je kan ook vooruitgaan met behulp van de entertoets.";
+App::$strings["Post to Twitter"] = "Doorplaatsen naar Twitter";
+App::$strings["Twitter settings updated."] = "Twitter-instellingen bijgewerkt.";
+App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Geen consumerkeys voor Twitter gevonden. Neem contact op met jouw hubbeheerder.";
+App::$strings["At this Hubzilla 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."] = "De Twitter-plugin is op deze Hubzilla-hub ingeschakeld, maar je hebt nog niet jouw Hubzilla-kanaal met jouw Twitter-account gekoppeld. Om dit te doen klik je op de knop hieronder om een PIN-code van Twitter te krijgen. Deze dien je te kopiëren en in het invoegveld beneden te plakken. Vervolgens klik je op Opslaan. Alleen jouw <strong>openbare</strong> berichten kunnen op Twitter worden geplaatst.";
+App::$strings["Log in with Twitter"] = "Op Twitter inloggen";
+App::$strings["Copy the PIN from Twitter here"] = "Plak of type de PIN-code hier";
+App::$strings["<strong>Note:</strong> Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Opmerking</strong>: In verband met jouw privacyinstellingen (<em>wanneer jouw kanaalprofiel voor onbekenden is verborgen</em>) leidt de profiellink die mogelijk in jouw naar Twitter doorgestuurde openbare berichten staat, naar een lege pagina met de melding dat toegang tot jouw kanaalprofiel is beperkt.";
+App::$strings["Allow posting to Twitter"] = "Doorplaatsen naar Twitter toestaan";
+App::$strings["If enabled your public postings can be posted to the associated Twitter account"] = "Wanneer dit is ingeschakeld kunnen jouw <strong>openbare</strong> berichten naar het gekoppelde Twitter-account worden doorgeplaatst";
+App::$strings["Send public postings to Twitter by default"] = "Standaard doorplaatsen naar Twitter";
+App::$strings["If enabled your public postings will be posted to the associated Twitter account by default"] = "Wanneer dit is ingeschakeld worden al jouw <strong>openbare</strong> berichten standaard naar het gekoppelde Twitter-account doorgeplaatst";
+App::$strings["Twitter Post Settings"] = "Doorplaatsen naar Twitter";
+App::$strings["Submit Settings"] = "Instellingen toepassen";
+App::$strings["Show Upload Limits"] = "Uploadlimieten tonen";
+App::$strings["Hubzilla configured maximum size: "] = "Op Hubzilla configureerde maximale grootte: ";
+App::$strings["PHP upload_max_filesize: "] = "PHP upload_max_filesize: ";
+App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] = "PHP post_max_size (moet hoger zijn dan upload_max_filesize): ";
+App::$strings["Recent Channel/Profile Viewers"] = "Recente bezoekers van jouw kanaal/profiel";
+App::$strings["This plugin/addon has not been configured."] = "Deze plugin is niet geconfigureerd. ";
+App::$strings["Please visit the Visage settings on %s"] = "Bezoek de Visage-instellingen op %s";
+App::$strings["your feature settings page"] = "Jouw plugin-instellingen";
+App::$strings["No entries."] = "Niets aanwezig.";
+App::$strings["Enable Visage Visitor Logging"] = "Visage inschakelen ";
+App::$strings["Visage Settings"] = "Visage";
+App::$strings["Who likes me?"] = "Wie vindt mij leuk?";
+App::$strings["Post to WordPress"] = "Doorplaatsen naar WordPress";
+App::$strings["Enable WordPress Post Plugin"] = "Doorplaatsen naar WordPress inschakelen";
+App::$strings["WordPress username"] = "Gebruikersnaam WordPress";
+App::$strings["WordPress password"] = "Wachtwoord WordPress";
+App::$strings["WordPress API URL"] = "API-URL WordPress";
+App::$strings["Typically https://your-blog.tld/xmlrpc.php"] = "Meestal https://jouw-blog.tld/xmlrpc.php";
+App::$strings["WordPress blogid"] = "Blog ID WordPress";
+App::$strings["For multi-user sites such as wordpress.com, otherwise leave blank"] = "Voor websites met meerdere gebruikers, zoals wordpress.com. Anders leeg laten.";
+App::$strings["Post to WordPress by default"] = "Standaard naar WordPress doorplaatsen";
+App::$strings["Forward comments (requires hubzilla_wp plugin)"] = "Reacties doorplaatsen (Hubzilla_WP-plugin vereist)";
+App::$strings["WordPress Post Settings"] = "Doorplaatsen naar WordPress";
+App::$strings["Wordpress Settings saved."] = "WordPress-instellingen opgeslagen.";
+App::$strings["XMPP settings updated."] = "XMPP-instellingen bijgewerkt.";
+App::$strings["Enable Chat"] = "Chatten inschakelen";
+App::$strings["Individual credentials"] = "Individuele credentials";
+App::$strings["Jabber BOSH server"] = "BOSH-server van Jabber";
+App::$strings["XMPP Settings"] = "XMPP";
+App::$strings["Jabber BOSH host"] = "BOSH-host van Jabber";
+App::$strings["Use central userbase"] = "Gebruik een centrale gebruikersgroep";
+App::$strings["If enabled, members will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the \"auth_ejabberd.php\" script."] = "Wanneer ingeschakeld worden leden automatisch op een Ejabberd-server ingelogd. Deze dient wel op deze machine te zijn geïnstalleerd met zgn. 'synchronized credentials' via het 'auth_ejabberd.php'-script.";
+App::$strings["Select Channel"] = "Kies een kanaal";
+App::$strings["Read-write"] = "Lees- en schrijfrechten";
+App::$strings["Read-only"] = "Alleen leesrechten";
+App::$strings["My Calendars"] = "Mijn agenda's";
+App::$strings["Shared Calendars"] = "Gedeelde agenda's";
+App::$strings["Share this calendar"] = "Agenda delen";
+App::$strings["Calendar name and color"] = "Naam en kleur agenda";
+App::$strings["Create new calendar"] = "Nieuwe agenda aanmaken";
+App::$strings["Calendar Name"] = "Naam agenda";
+App::$strings["Calendar Tools"] = "Agenda-hulpmiddelen";
+App::$strings["Import calendar"] = "Importeren";
+App::$strings["Select a calendar to import to"] = "Kies een agenda om te importeren";
+App::$strings["Addressbooks"] = "Adresboeken";
+App::$strings["Addressbook name"] = "Naam adresboek";
+App::$strings["Create new addressbook"] = "Nieuw adresboek aanmaken";
+App::$strings["Addressbook Name"] = "Naam adresboek";
+App::$strings["Addressbook Tools"] = "Adresboek-hulpmiddelen";
+App::$strings["Import addressbook"] = "Importeren";
+App::$strings["Select an addressbook to import to"] = "Kies een adresboek om te importeren";
+App::$strings["Errors encountered creating database table: "] = "Fouten opgetreden tijdens aanmaken databasetabel: ";
+App::$strings["Default Calendar"] = "Standaard agenda";
+App::$strings["Default Addressbook"] = "Standaard adresboek";
+App::$strings["CalDAV/CardDAV Settings saved."] = "CalDAV/CardDAV-instellingen opgeslagen.";
+App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "CalDAV/CardDAV-server voor dit kanaal inschakelen";
+App::$strings["Your CalDAV resources are located at %s "] = "Jouw CalDAV-URL is %s ";
+App::$strings["Your CardDAV resources are located at %s "] = "Jouw CardDAV-URL is %s ";
+App::$strings["CalDAV/CardDAV Settings"] = "CalDAV/CardDAV";
+App::$strings["Mobile"] = "Mobiel";
+App::$strings["Home"] = "Thuis";
+App::$strings["Home, Voice"] = "Thuis, spraak";
+App::$strings["Home, Fax"] = "Thuis, fax";
+App::$strings["Work"] = "Werk";
+App::$strings["Work, Voice"] = "Werk, spraak";
+App::$strings["Work, Fax"] = "Werk, fax";
+App::$strings["INVALID EVENT DISMISSED!"] = "ONGELDIGE GEBEURTENIS VERWIJDERD!";
+App::$strings["Summary: "] = "Samenvatting: ";
+App::$strings["Date: "] = "Datum: ";
+App::$strings["Reason: "] = "Reden: ";
+App::$strings["INVALID CARD DISMISSED!"] = "ONGELDIGE CONTACTKAART VERWIJDERD!";
+App::$strings["Name: "] = "Naam: ";
+App::$strings["You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV Settings before you can use it."] = "Voordat je dit kunt gebruiken dien je eerst deze plugin onder 'Plugin-instellingen > CalDAV/CardDAV' in te schakelen.";
+App::$strings["Example: YYYY-MM-DD HH:mm"] = "Bijvoorbeeld: JJJJ-MM-DD UU:mm";
+App::$strings["End date and time"] = "Einddatum en -tijd";
+App::$strings["List month"] = "Maand tonen";
+App::$strings["List week"] = "Week tonen";
+App::$strings["List day"] = "Dag tonen";
+App::$strings["More"] = "Meer";
+App::$strings["Less"] = "Minder";
+App::$strings["Select calendar"] = "Kies agenda";
+App::$strings["Delete all"] = "Alles verwijderen";
+App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "Excuses! Bewerken van herhalende gebeurtenissen is nog niet geïmplementeerd.";
+App::$strings["Organisation"] = "Organisatie";
+App::$strings["Title"] = "Titel";
+App::$strings["Phone"] = "Telefoon";
+App::$strings["Instant messenger"] = "Instant messenger";
+App::$strings["Website"] = "Website";
+App::$strings["Note"] = "Opmerking";
+App::$strings["Add Field"] = "Veld toevoegen";
+App::$strings["P.O. Box"] = "Postbus";
+App::$strings["Additional"] = "Extra";
+App::$strings["Street"] = "Straat en huisnummer";
+App::$strings["Locality"] = "Plaats";
+App::$strings["Region"] = "Provincie/staat/regio/enz.";
+App::$strings["ZIP Code"] = "Postcode";
+App::$strings["Invalid game."] = "Ongeldig spel.";
+App::$strings["You are not a player in this game."] = "Jij doet niet aan dit speel mee.";
+App::$strings["You must be a local channel to create a game."] = "Je moet een lokaal kanaal zijn om een spel aan te maken.";
+App::$strings["You must select one opponent that is not yourself."] = "Je moet één tegenstander uitkiezen, maar niet jezelf.";
+App::$strings["Creating new game..."] = "Nieuw spel wordt aangemaakt...";
+App::$strings["You must select white or black."] = "Je moet wit of zwart kiezen.";
+App::$strings["Error creating new game."] = "Fout tijdens aanmaken nieuw spel.";
+App::$strings["Requested channel is not available."] = "Opgevraagd kanaal is niet beschikbaar.";
+App::$strings["You must select a local channel /chess/channelname"] = "Je moet een lokaal kanaal kiezen: .../chess/kanaalnaam";
+App::$strings["Enable notifications"] = "Notificaties inschakelen";
+App::$strings["Your Webbie:"] = "Jouw kanaaladres:";
+App::$strings["Fontsize (px):"] = "Tekengrootte (px):";
+App::$strings["Link:"] = "Link:";
+App::$strings["Like us on Hubzilla"] = "Like ons op Hubzilla";
+App::$strings["Embed:"] = "Insluiten (embed):";
+App::$strings["Male"] = "Man";
+App::$strings["Female"] = "Vrouw";
+App::$strings["OpenID protocol error. No ID returned."] = "OpenID-protocolfout. Geen ID terugontvangen.";
+App::$strings["Login failed."] = "Inloggen mislukt.";
+App::$strings["First Name"] = "Voornaam";
+App::$strings["Last Name"] = "Achternaam";
+App::$strings["Full Name"] = "Volledige naam";
+App::$strings["Profile Photo 16px"] = "Profielfoto 16px";
+App::$strings["Profile Photo 32px"] = "Profielfoto 32px";
+App::$strings["Profile Photo 48px"] = "Profielfoto 48px";
+App::$strings["Profile Photo 64px"] = "Profielfoto 64px";
+App::$strings["Profile Photo 80px"] = "Profielfoto 80px";
+App::$strings["Profile Photo 128px"] = "Profielfoto 128px";
+App::$strings["Timezone"] = "Tijdzone";
+App::$strings["Birth Year"] = "Geboortejaar";
+App::$strings["Birth Month"] = "Geboortemaand";
+App::$strings["Birth Day"] = "Geboortedag";
+App::$strings["Birthdate"] = "Geboortedatum";
+App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "We hebben een probleem ontdekt tijdens het inloggen met de OpenID die je hebt verstrekt. Controleer de ID op typefouten.";
+App::$strings["The error message was:"] = "Foutmelding was:";
+App::$strings["Reconnecting %d connections"] = "%d connecties opnieuw aan het verbinden";
+App::$strings["Diaspora Reconnect"] = "Diaspora opnieuw verbinden";
+App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "Gebruik dit formulier om opnieuw met Diaspora-connecties te verbinden, die oorspronkelijk op een andere hub waren verbonden.";
+App::$strings["Reconnect"] = "Opnieuw verbinden";
+App::$strings["Send test email"] = "Test-e-mail versturen";
+App::$strings["Mail sent."] = "E-mail verzonden.";
+App::$strings["Sending of mail failed."] = "Verzenden van e-mail mislukt.";
+App::$strings["Mail Test"] = "E-mailtest";
+App::$strings["Errors encountered deleting database table "] = "Fouten opgetreden tijdens verwijderen databasetabel ";
+App::$strings["Drop tables when uninstalling?"] = "Verwijder tabellen tijdens uitschakelen plugin?";
+App::$strings["If checked, the Rendezvous database tables will be deleted when the plugin is uninstalled."] = "Wanneer dit is aangevinkt worden de tabellen in de Rendezvous-database verwijderd wanneer de plugin wordt uitgeschakeld.";
+App::$strings["Mapbox Access Token"] = "Toegangstoken ";
+App::$strings["If you enter a Mapbox access token, it will be used to retrieve map tiles from Mapbox instead of the default OpenStreetMap tile server."] = "De Mapbox-toegangstoken wordt gebruikt om kaarttegels (tiles) van Mapbox op te halen in plaats van de standaard tile-server van OpenStreetMap.";
+App::$strings["Rendezvous"] = "Rendezvous";
+App::$strings["This identity has been deleted by another member due to inactivity. Please press the \"New identity\" button or refresh the page to register a new identity. You may use the same name."] = "Deze identiteit is door een ander lid verwijderd als gevolg van inactiviteit. Klik op de knop \"Nieuwe identiteit\" of herlaad de pagina om een nieuwe identiteit aan te maken. Je kan eventueel dezelfde naam gebruiken.";
+App::$strings["Welcome to Rendezvous!"] = "Welkom bij Rendezvous!";
+App::$strings["Enter your name to join this rendezvous. To begin sharing your location with the other members, tap the GPS control. When your location is discovered, a red dot will appear and others will be able to see you on the map."] = "Vul je naam in om deel te nemen aan deze rendezvous. Om met het delen van je locatie met de andere leden te beginnen, klik je op de locatieknop van je webbrowser. Nadat jouw locatie is gevonden verschijnt er een rode stip en kunnen andere leden jou zien op de kaart.";
+App::$strings["Let's meet here"] = "Laten we elkaar hier ontmoeten";
+App::$strings["New marker"] = "Nieuwe markering";
+App::$strings["Edit marker"] = "Markering bewerken";
+App::$strings["New identity"] = "Nieuwe identiteit";
+App::$strings["Delete marker"] = "Markering verwijderen";
+App::$strings["Delete member"] = "Lid verwijderen";
+App::$strings["Edit proximity alert"] = "Nabijheidswaarschuwing bewerken";
+App::$strings["A proximity alert will be issued when this member is within a certain radius of you.<br><br>Enter a radius in meters (0 to disable):"] = "Een nabijheidswaarschuwing wordt actief wanneer dit lid zich binnen een bepaalde straal bevindt.<br><br>Voer het aantal meters van de straal in (0 om uit te schakelen):";
+App::$strings["distance"] = "afstand";
+App::$strings["Add new rendezvous"] = "Nieuwe rendezvous toevoegen";
+App::$strings["Create a new rendezvous and share the access link with those you wish to invite to the group. Those who open the link become members of the rendezvous. They can view other member locations, add markers to the map, or share their own locations with the group."] = "Maak een nieuwe rendezvous aan en deel de toegangslink met wie je wil uitnodigen voor de groep. Wie op de link klikt wordt lid van rendezvous. Zij kunnen dan de locaties zien van andere leden, markeringen aan de kaart toevoegen of hun eigen locaties met de groep delen.";
App::$strings["No username found in import file."] = "Geen gebruikersnaam in het importbestand gevonden.";
App::$strings["Unable to create a unique channel address. Import failed."] = "Niet in staat om een uniek kanaaladres aan te maken. Importeren is mislukt.";
App::$strings["Cannot locate DNS info for database server '%s'"] = "Kan DNS-informatie voor databaseserver '%s' niet vinden";
-App::$strings["Can view my normal stream and posts"] = "Kan mijn normale kanaalstream en berichten bekijken";
-App::$strings["Can view my webpages"] = "Kan mijn pagina's bekijken";
-App::$strings["Can post on my channel page (\"wall\")"] = "Kan een bericht in mijn kanaal plaatsen";
-App::$strings["Can like/dislike stuff"] = "Kan dingen leuk of niet leuk vinden";
-App::$strings["Profiles and things other than posts/comments"] = "Profielen en dingen, buiten berichten en reacties";
-App::$strings["Can forward to all my channel contacts via post @mentions"] = "Kan naar al mijn kanaalconnecties berichten doorsturen met behulp van @vermeldingen+";
-App::$strings["Advanced - useful for creating group forum channels"] = "Geavanceerd - nuttig voor groepforums";
-App::$strings["Can chat with me (when available)"] = "Kan met mij chatten (wanneer beschikbaar)";
-App::$strings["Can write to my file storage and photos"] = "Kan foto's en andere bestanden aan mijn bestandsopslag toevoegen";
-App::$strings["Can edit my webpages"] = "Kan mijn pagina's bewerken";
-App::$strings["Somewhat advanced - very useful in open communities"] = "Enigszins geavanceerd (erg nuttig voor kanalen van forums/groepen)";
-App::$strings["Can administer my channel resources"] = "Kan mijn kanaal beheren";
-App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Zeer geavanceerd. Laat dit met rust, behalve als je weet wat je doet.";
-App::$strings["Image exceeds website size limit of %lu bytes"] = "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes";
-App::$strings["Image file is empty."] = "Afbeeldingsbestand is leeg";
-App::$strings["Photo storage failed."] = "Foto kan niet worden opgeslagen";
-App::$strings["a new photo"] = "een nieuwe foto";
-App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s plaatste %2\$s op %3\$s";
-App::$strings["Photo Albums"] = "Fotoalbums";
-App::$strings["Upload New Photos"] = "Nieuwe foto's uploaden";
-App::$strings["General Features"] = "Algemene functies";
-App::$strings["Multiple Profiles"] = "Meerdere profielen";
-App::$strings["Ability to create multiple profiles"] = "Mogelijkheid om meerdere profielen aan te maken";
-App::$strings["Advanced Profiles"] = "Geavanceerde profielen";
-App::$strings["Additional profile sections and selections"] = "Extra onderdelen en keuzes voor je profiel";
-App::$strings["Profile Import/Export"] = "Profiel importen/exporteren";
-App::$strings["Save and load profile details across sites/channels"] = "Profielgegevens opslaan en in andere hubs/kanalen gebruiken.";
-App::$strings["Web Pages"] = "Webpagina's";
-App::$strings["Provide managed web pages on your channel"] = "Sta beheerde webpagina's op jouw kanaal toe";
-App::$strings["Provide a wiki for your channel"] = "Voeg een wiki aan jouw kanaal toe";
-App::$strings["Private Notes"] = "Privé-aantekeningen";
-App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Een eenvoudige toepassing om aantekeningen en herinneringen in te bewaren (let op: niet versleuteld)";
-App::$strings["Navigation Channel Select"] = "Kanaal kiezen in navigatiemenu";
-App::$strings["Change channels directly from within the navigation dropdown menu"] = "Kies een ander kanaal direct vanuit het dropdown-menu op de navigatiebalk";
-App::$strings["Photo Location"] = "Fotolocatie";
-App::$strings["If location data is available on uploaded photos, link this to a map."] = "Wanneer in de geüploade foto's locatiegegevens aanwezig zijn, link dit dan aan een kaart.";
-App::$strings["Access Controlled Chatrooms"] = "Chatkanalen met toegangscontrole ";
-App::$strings["Provide chatrooms and chat services with access control."] = "Chatkanalen en chatdiensten met toegangscontrole aanbieden.";
-App::$strings["Smart Birthdays"] = "Slimme verjaardagen";
-App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Maak verjaardagen bewust van tijdzones. Voor het geval dat jouw vrienden over de hele wereld verspreid zijn.";
-App::$strings["Advanced Directory Search"] = "Geavanceerd in de kanalengids zoeken";
-App::$strings["Allows creation of complex directory search queries"] = "Gebruik complexe zoekopdrachten in de kanalengids";
-App::$strings["Advanced Theme and Layout Settings"] = "Geavanceerde thema- en lay-out-instellingen";
-App::$strings["Allows fine tuning of themes and page layouts"] = "Maakt het mogelijk dat thema's en pagina-lay-outs preciezer ingesteld kunnen worden ";
-App::$strings["Post Composition Features"] = "Functies voor het opstellen van berichten";
-App::$strings["Large Photos"] = "Grote foto's";
-App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Gebruik grotere foto's (1024px) in berichten. Wanneer dit is uitgeschakeld worden er kleinere foto's (640px) gebruikt.";
-App::$strings["Automatically import channel content from other channels or feeds"] = "Automatisch inhoud uit andere kanalen of feeds importeren.";
-App::$strings["Even More Encryption"] = "Extra encryptie";
-App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Sta toe dat inhoud extra end-to-end wordt versleuteld met een gedeelde geheime sleutel.";
-App::$strings["Enable Voting Tools"] = "Peilingen inschakelen";
-App::$strings["Provide a class of post which others can vote on"] = "Maakt het mogelijk om een bericht op te stellen, waar mensen op kunnen stemmen.";
-App::$strings["Disable Comments"] = "Reacties uitschakelen";
-App::$strings["Provide the option to disable comments for a post"] = "Maak het mogelijk dat reacties op een bericht kunnen worden uitgeschakeld";
-App::$strings["Delayed Posting"] = "Berichten uitstellen";
-App::$strings["Allow posts to be published at a later date"] = "Maakt het mogelijk dat berichten op een toekomstig moment gepubliceerd kunnen worden.";
-App::$strings["Content Expiration"] = "Inhoud laten verlopen";
-App::$strings["Remove posts/comments and/or private messages at a future time"] = "Berichten, reacties en/of privéberichten na een bepaalde tijd verwijderen";
-App::$strings["Suppress Duplicate Posts/Comments"] = "Dubbele berichten/reacties tegenhouden";
-App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Voorkomt dat berichten en reacties met identieke inhoud en die binnen twee minuten zijn verstuurd, worden gepubliceerd. ";
-App::$strings["Network and Stream Filtering"] = "Netwerk- en streamfilter";
-App::$strings["Search by Date"] = "Zoek op datum";
-App::$strings["Ability to select posts by date ranges"] = "Mogelijkheid om berichten op datum te filteren ";
-App::$strings["Privacy Groups"] = "Privacygroepen";
-App::$strings["Enable management and selection of privacy groups"] = "Beheer en selectie van privacygroepen inschakelen";
-App::$strings["Saved Searches"] = "Opgeslagen zoekopdrachten";
-App::$strings["Save search terms for re-use"] = "Sla zoekopdrachten op voor hergebruik";
-App::$strings["Network Personal Tab"] = "Persoonlijke netwerktab";
-App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Sta het toe dat de tab netwerkberichten toont waarmee je interactie had";
-App::$strings["Network New Tab"] = "Nieuwe netwerktab";
-App::$strings["Enable tab to display all new Network activity"] = "Laat de tab alle nieuwe netwerkactiviteit tonen";
-App::$strings["Affinity Tool"] = "Verwantschapsfilter";
-App::$strings["Filter stream activity by depth of relationships"] = "Filter wat je in jouw grid ziet op hoe goed je iemand kent of mag";
-App::$strings["Show friend and connection suggestions"] = "Toon kanaalvoorstellen";
-App::$strings["Connection Filtering"] = "Berichtenfilters";
-App::$strings["Filter incoming posts from connections based on keywords/content"] = "Filter binnenkomende berichten van connecties aan de hand van trefwoorden en taal";
-App::$strings["Post/Comment Tools"] = "Bericht- en reactiehulpmiddelen";
-App::$strings["Community Tagging"] = "Taggen door anderen";
-App::$strings["Ability to tag existing posts"] = "Geeft andere mensen de mogelijkheid om jouw (bestaande) berichten te taggen";
-App::$strings["Post Categories"] = "Categorieën berichten";
-App::$strings["Add categories to your posts"] = "Voeg categorieën toe aan je berichten";
-App::$strings["Emoji Reactions"] = "Emoji-reacties";
-App::$strings["Add emoji reaction ability to posts"] = "Emoji-reacties in berichten toestaan";
-App::$strings["Saved Folders"] = "Bewaarde mappen";
-App::$strings["Ability to file posts under folders"] = "Mogelijkheid om berichten in mappen op te slaan";
-App::$strings["Dislike Posts"] = "Vind berichten niet leuk";
-App::$strings["Ability to dislike posts/comments"] = "Mogelijkheid om berichten en reacties niet leuk te vinden";
-App::$strings["Star Posts"] = "Geef berichten een ster";
-App::$strings["Ability to mark special posts with a star indicator"] = "Mogelijkheid om speciale berichten met een ster te markeren";
-App::$strings["Tag Cloud"] = "Tagwolk";
-App::$strings["Provide a personal tag cloud on your channel page"] = "Zorgt voor een persoonlijke wolk met tags op jouw kanaalpagina";
-App::$strings["Premium Channel"] = "Premiumkanaal";
-App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Stelt je in staat om beperkingen en voorwaarden in te stellen voor jouw kanaal";
-App::$strings["Help:"] = "Hulp:";
-App::$strings["guest:"] = "gast:";
-App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "De beveiligings-token van het tekstvak was ongeldig. Dit is mogelijk het gevolg van dat er te lang (meer dan 3 uur) gewacht is om de tekst op te slaan. ";
-App::$strings["prev"] = "vorige";
-App::$strings["first"] = "eerste";
-App::$strings["last"] = "laatste";
-App::$strings["next"] = "volgende";
-App::$strings["older"] = "ouder";
-App::$strings["newer"] = "nieuwer";
-App::$strings["No connections"] = "Geen connecties";
-App::$strings["View all %s connections"] = "Toon alle %s connecties";
-App::$strings["poke"] = "aanstoten";
-App::$strings["poked"] = "aangestoten";
-App::$strings["ping"] = "ping";
-App::$strings["pinged"] = "gepingd";
-App::$strings["prod"] = "por";
-App::$strings["prodded"] = "gepord";
-App::$strings["slap"] = "slaan";
-App::$strings["slapped"] = "sloeg";
-App::$strings["finger"] = "finger";
-App::$strings["fingered"] = "gefingerd";
-App::$strings["rebuff"] = "afpoeieren";
-App::$strings["rebuffed"] = "afgepoeierd";
-App::$strings["happy"] = "gelukkig";
-App::$strings["sad"] = "bedroefd";
-App::$strings["mellow"] = "mellow";
-App::$strings["tired"] = "moe";
-App::$strings["perky"] = "parmantig";
-App::$strings["angry"] = "boos";
-App::$strings["stupefied"] = "verbijsterd";
-App::$strings["puzzled"] = "verward";
-App::$strings["interested"] = "geïnteresseerd";
-App::$strings["bitter"] = "verbitterd";
-App::$strings["cheerful"] = "vrolijk";
-App::$strings["alive"] = "levendig";
-App::$strings["annoyed"] = "geërgerd";
-App::$strings["anxious"] = "bezorgd";
-App::$strings["cranky"] = "humeurig";
-App::$strings["disturbed"] = "verontrust";
-App::$strings["frustrated"] = "gefrustreerd ";
-App::$strings["depressed"] = "gedeprimeerd";
-App::$strings["motivated"] = "gemotiveerd";
-App::$strings["relaxed"] = "ontspannen";
-App::$strings["surprised"] = "verrast";
-App::$strings["Monday"] = "maandag";
-App::$strings["Tuesday"] = "dinsdag";
-App::$strings["Wednesday"] = "woensdag";
-App::$strings["Thursday"] = "donderdag";
-App::$strings["Friday"] = "vrijdag";
-App::$strings["Saturday"] = "zaterdag";
-App::$strings["Sunday"] = "zondag";
-App::$strings["January"] = "januari";
-App::$strings["February"] = "februari";
-App::$strings["March"] = "maart";
-App::$strings["April"] = "april";
-App::$strings["May"] = "mei";
-App::$strings["June"] = "juni";
-App::$strings["July"] = "juli";
-App::$strings["August"] = "augustus";
-App::$strings["September"] = "september";
-App::$strings["October"] = "oktober";
-App::$strings["November"] = "november";
-App::$strings["December"] = "december";
-App::$strings["Unknown Attachment"] = "Onbekende bijlage";
-App::$strings["unknown"] = "onbekend";
-App::$strings["remove category"] = "categorie verwijderen";
-App::$strings["remove from file"] = "uit map verwijderen";
-App::$strings["default"] = "standaard";
-App::$strings["Page layout"] = "Pagina-lay-out";
-App::$strings["You can create your own with the layouts tool"] = "Je kan jouw eigen lay-out ontwerpen onder lay-outs";
-App::$strings["Page content type"] = "Opmaaktype pagina";
-App::$strings["Select an alternate language"] = "Kies een andere taal";
-App::$strings["activity"] = "activiteit";
-App::$strings["Design Tools"] = "Ontwerp-hulpmiddelen";
-App::$strings["Pages"] = "Pagina's";
-App::$strings["Import website..."] = "Website importeren...";
-App::$strings["Select folder to import"] = "Kies een map om te importeren";
-App::$strings["Import from a zipped folder:"] = "Vanuit een zipbestand importeren:";
-App::$strings["Import from cloud files:"] = "Vanuit de cloud importeren:";
-App::$strings["/cloud/channel/path/to/folder"] = "/cloud/channel/maplocatie";
-App::$strings["Enter path to website files"] = "Voer de locatie in van de websitebestanden";
-App::$strings["Select folder"] = "Kies een map";
-App::$strings["Export website..."] = "Website exporteren...";
-App::$strings["Export to a zip file"] = "Naar een zipbestand exporteren";
-App::$strings["website.zip"] = "website.zip";
-App::$strings["Enter a name for the zip file."] = "Vul een naam in voor het zipbestand.";
-App::$strings["Export to cloud files"] = "Naar de cloud exporteren";
-App::$strings["/path/to/export/folder"] = "/locatie/van/export/map";
-App::$strings["Enter a path to a cloud files destination."] = "Voer de locatie in van de cloudbestemming";
-App::$strings["Specify folder"] = "Selecteer een map";
-App::$strings["Invalid data packet"] = "Datapakket ongeldig";
-App::$strings["Unable to verify channel signature"] = "Kanaalkenmerk kon niet worden geverifieerd. ";
-App::$strings["Unable to verify site signature for %s"] = "Hubkenmerk voor %s kon niet worden geverifieerd";
-App::$strings["invalid target signature"] = "ongeldig doelkenmerk";
+App::$strings["Birthday"] = "Verjaardag of geboortedatum";
+App::$strings["Age: "] = "Leeftijd:";
+App::$strings["YYYY-MM-DD or MM-DD"] = "JJJJ-MM-DD of MM-DD";
+App::$strings["never"] = "nooit";
+App::$strings["less than a second ago"] = "minder dan een seconde geleden";
+App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "%1\$d %2\$s geleden";
+App::$strings["__ctx:relative_date__ year"] = array(
+ 0 => "jaar",
+ 1 => "jaren",
+);
+App::$strings["__ctx:relative_date__ month"] = array(
+ 0 => "maand",
+ 1 => "maanden",
+);
+App::$strings["__ctx:relative_date__ week"] = array(
+ 0 => "week",
+ 1 => "weken",
+);
+App::$strings["__ctx:relative_date__ day"] = array(
+ 0 => "dag",
+ 1 => "dagen",
+);
+App::$strings["__ctx:relative_date__ hour"] = array(
+ 0 => "uur",
+ 1 => "uren",
+);
+App::$strings["__ctx:relative_date__ minute"] = array(
+ 0 => "minuut",
+ 1 => "minuten",
+);
+App::$strings["__ctx:relative_date__ second"] = array(
+ 0 => "seconde",
+ 1 => "seconden",
+);
+App::$strings["%1\$s's birthday"] = "Verjaardag van %1\$s";
+App::$strings["Happy Birthday %1\$s"] = "Gefeliciteerd met je verjaardag %1\$s";
App::$strings["Not a valid email address"] = "Geen geldig e-mailadres";
App::$strings["Your email domain is not among those allowed on this site"] = "Jouw e-maildomein is op deze hub niet toegestaan";
App::$strings["Your email address is already registered at this site."] = "Jouw e-mailadres is al op deze hub geregistreerd.";
@@ -1797,7 +2346,6 @@ App::$strings["Please enter the required information."] = "Vul de vereiste infor
App::$strings["Failed to store account information."] = "Account-informatie kon niet opgeslagen worden.";
App::$strings["Registration confirmation for %s"] = "Registratiebevestiging voor %s";
App::$strings["Registration request at %s"] = "Registratiebevestiging voor %s";
-App::$strings["Administrator"] = "Beheerder";
App::$strings["your registration password"] = "jouw registratiewachtwoord";
App::$strings["Registration details for %s"] = "Registratiegegevens voor %s";
App::$strings["Account approved."] = "Account goedgekeurd";
@@ -1805,18 +2353,12 @@ App::$strings["Registration revoked for %s"] = "Registratie ingetrokken voor %s"
App::$strings["Click here to upgrade."] = "Klik hier om te upgraden.";
App::$strings["This action exceeds the limits set by your subscription plan."] = "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden.";
App::$strings["This action is not available under your subscription plan."] = "Deze handeling is niet mogelijk met jouw abonnement.";
-App::$strings["No recipient provided."] = "Geen ontvanger opgegeven.";
-App::$strings["[no subject]"] = "[geen onderwerp]";
-App::$strings["Unable to determine sender."] = "Afzender kan niet bepaald worden.";
-App::$strings["Stored post could not be verified."] = "Opgeslagen bericht kon niet worden geverifieerd.";
App::$strings["Frequently"] = "Regelmatig";
App::$strings["Hourly"] = "Elk uur";
App::$strings["Twice daily"] = "Twee keer per dag";
App::$strings["Daily"] = "Dagelijks";
App::$strings["Weekly"] = "Wekelijks";
App::$strings["Monthly"] = "Maandelijks";
-App::$strings["Male"] = "Man";
-App::$strings["Female"] = "Vrouw";
App::$strings["Currently Male"] = "Momenteel man";
App::$strings["Currently Female"] = "Momenteel vrouw";
App::$strings["Mostly Male"] = "Voornamelijk man";
@@ -1880,12 +2422,9 @@ App::$strings["Reserved nickname. Please choose another."] = "Deze naam is geres
App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Deze naam heeft niet ondersteunde karakters of is al op deze hub in gebruik.";
App::$strings["Unable to retrieve created identity"] = "Niet in staat om aangemaakte identiteit te vinden";
App::$strings["Default Profile"] = "Standaardprofiel";
-App::$strings["Requested channel is not available."] = "Opgevraagd kanaal is niet beschikbaar.";
App::$strings["Create New Profile"] = "Nieuw profiel aanmaken";
-App::$strings["Edit Profile"] = "Profiel bewerken";
App::$strings["Visible to everybody"] = "Voor iedereen zichtbaar";
App::$strings["Gender:"] = "Geslacht:";
-App::$strings["Status:"] = "Status:";
App::$strings["Homepage:"] = "Homepagina:";
App::$strings["Online Now"] = "Nu online";
App::$strings["Like this channel"] = "Vind dit kanaal leuk";
@@ -1910,29 +2449,15 @@ App::$strings["Love/Romance:"] = "Liefde/romantiek:";
App::$strings["Work/employment:"] = "Werk/beroep:";
App::$strings["School/education:"] = "School/opleiding:";
App::$strings["Like this thing"] = "Vind dit ding leuk";
-App::$strings["Who can see this?"] = "Wie kan dit zien?";
-App::$strings["Custom selection"] = "Handmatige selectie";
-App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Kies \"Tonen\" om weergave toe te staan. Met \"Niet tonen\" kan je uitzonderingen maken op \"Tonen\".";
-App::$strings["Show"] = "Tonen";
-App::$strings["Don't show"] = "Niet tonen";
-App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Permissies van berichten %s zijn niet meer te veranderen %s nadat een bericht is gedeeld.</br />Met deze permissies bepaal je wie het bericht kan zien.";
-App::$strings["%1\$s's bookmarks"] = "Bladwijzers van %1\$s";
-App::$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."] = "Een verwijderde collectie met deze naam is gereactiveerd. Bestaande itemrechten <strong>kunnen</strong> van toepassing zijn op deze collectie en toekomstige leden. Wanneer je dit niet zo bedoeld hebt, moet je een nieuwe collectie met een andere naam aanmaken.";
-App::$strings["Add new connections to this privacy group"] = "Voeg nieuwe connecties aan deze privacygroep toe";
-App::$strings["edit"] = "bewerken";
-App::$strings["Edit group"] = "Privacygroep bewerken";
-App::$strings["Add privacy group"] = "Privacygroep toevoegen";
-App::$strings["Channels not in any privacy group"] = "Kanalen die zich in geen enkele privacygroep bevinden";
-App::$strings["add"] = "toevoegen";
App::$strings["New window"] = "Nieuw venster";
App::$strings["Open the selected location in a different window or browser tab"] = "Open de geselecteerde locatie in een ander venster of tab";
App::$strings["User '%s' deleted"] = "Account '%s' verwijderd";
-App::$strings["New Page"] = "Nieuwe pagina";
-App::$strings["Title"] = "Titel";
-App::$strings["Different viewers will see this text differently"] = "Deze tekst wordt per persoon anders weergeven.";
+App::$strings["Directory Options"] = "Opties kanalengids";
+App::$strings["Safe Mode"] = "Veilig zoeken";
+App::$strings["Public Forums Only"] = "Alleen openbare forums";
+App::$strings["This Website Only"] = "Alleen deze hub";
App::$strings["Logout"] = "Uitloggen";
App::$strings["End this session"] = "Beëindig deze sessie";
-App::$strings["Home"] = "Home";
App::$strings["Your posts and conversations"] = "Jouw kanaal";
App::$strings["Your profile page"] = "Jouw profielpagina";
App::$strings["Manage/Edit profiles"] = "Beheer/wijzig profielen";
@@ -1943,12 +2468,12 @@ App::$strings["Your chatrooms"] = "Jouw chatkanalen";
App::$strings["Bookmarks"] = "Bladwijzers";
App::$strings["Your bookmarks"] = "Jouw bladwijzers";
App::$strings["Your webpages"] = "Jouw webpagina's";
-App::$strings["Your wiki"] = "Jouw wiki";
+App::$strings["Your wikis"] = "Jouw wiki's";
App::$strings["Sign in"] = "Inloggen";
-App::$strings["%s - click to logout"] = "%s - klik om uit te loggen";
App::$strings["Remote authentication"] = "Authenticatie op afstand";
App::$strings["Click to authenticate to your home hub"] = "Authenticeer jezelf via (bijvoorbeeld) jouw hub";
-App::$strings["Home Page"] = "Homepage";
+App::$strings["Get me home"] = "Terug naar mijn hub";
+App::$strings["Log me out of this site"] = "Uitloggen op deze hub";
App::$strings["Create an account"] = "Maak een account aan";
App::$strings["Help and documentation"] = "Hulp en documentatie";
App::$strings["Applications, utilities, links, games"] = "Apps";
@@ -1977,11 +2502,115 @@ App::$strings["Site Setup and Configuration"] = "Hub instellen en beheren";
App::$strings["Loading..."] = "Aan het laden...";
App::$strings["@name, #tag, ?doc, content"] = "@kanaal, #tag, inhoud, ?hulp";
App::$strings["Please wait..."] = "Wachten aub...";
+App::$strings["General Features"] = "Algemene functies";
+App::$strings["Multiple Profiles"] = "Meerdere profielen";
+App::$strings["Ability to create multiple profiles"] = "Mogelijkheid om meerdere profielen aan te maken";
+App::$strings["Advanced Profiles"] = "Geavanceerde profielen";
+App::$strings["Additional profile sections and selections"] = "Extra onderdelen en keuzes voor je profiel";
+App::$strings["Profile Import/Export"] = "Profiel importen/exporteren";
+App::$strings["Save and load profile details across sites/channels"] = "Profielgegevens opslaan en in andere hubs/kanalen gebruiken.";
+App::$strings["Web Pages"] = "Webpagina's";
+App::$strings["Provide managed web pages on your channel"] = "Sta beheerde webpagina's op jouw kanaal toe";
+App::$strings["Provide a wiki for your channel"] = "Voeg een wiki aan jouw kanaal toe";
+App::$strings["Private Notes"] = "Privé-aantekeningen";
+App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Een eenvoudige toepassing om aantekeningen en herinneringen in te bewaren (let op: niet versleuteld)";
+App::$strings["Navigation Channel Select"] = "Kanaal kiezen in navigatiemenu";
+App::$strings["Change channels directly from within the navigation dropdown menu"] = "Kies een ander kanaal direct vanuit het dropdown-menu op de navigatiebalk";
+App::$strings["Photo Location"] = "Fotolocatie";
+App::$strings["If location data is available on uploaded photos, link this to a map."] = "Wanneer in de geüploade foto's locatiegegevens aanwezig zijn, link dit dan aan een kaart.";
+App::$strings["Access Controlled Chatrooms"] = "Chatkanalen met toegangscontrole ";
+App::$strings["Provide chatrooms and chat services with access control."] = "Chatkanalen en chatdiensten met toegangscontrole aanbieden.";
+App::$strings["Smart Birthdays"] = "Slimme verjaardagen";
+App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Maak verjaardagen bewust van tijdzones. Voor het geval dat jouw vrienden over de hele wereld verspreid zijn.";
+App::$strings["Advanced Directory Search"] = "Geavanceerd in de kanalengids zoeken";
+App::$strings["Allows creation of complex directory search queries"] = "Gebruik complexe zoekopdrachten in de kanalengids";
+App::$strings["Advanced Theme and Layout Settings"] = "Geavanceerde thema- en lay-out-instellingen";
+App::$strings["Allows fine tuning of themes and page layouts"] = "Maakt het mogelijk dat thema's en pagina-lay-outs preciezer ingesteld kunnen worden ";
+App::$strings["Post Composition Features"] = "Functies voor het opstellen van berichten";
+App::$strings["Large Photos"] = "Grote foto's";
+App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Gebruik grotere foto's (1024px) in berichten. Wanneer dit is uitgeschakeld worden er kleinere foto's (640px) gebruikt.";
+App::$strings["Automatically import channel content from other channels or feeds"] = "Automatisch inhoud uit andere kanalen of feeds importeren.";
+App::$strings["Even More Encryption"] = "Extra encryptie";
+App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Sta toe dat inhoud extra end-to-end wordt versleuteld met een gedeelde geheime sleutel.";
+App::$strings["Enable Voting Tools"] = "Peilingen inschakelen";
+App::$strings["Provide a class of post which others can vote on"] = "Maakt het mogelijk om een bericht op te stellen, waar mensen op kunnen stemmen.";
+App::$strings["Disable Comments"] = "Reacties uitschakelen";
+App::$strings["Provide the option to disable comments for a post"] = "Maak het mogelijk dat reacties op een bericht kunnen worden uitgeschakeld";
+App::$strings["Delayed Posting"] = "Berichten uitstellen";
+App::$strings["Allow posts to be published at a later date"] = "Maakt het mogelijk dat berichten op een toekomstig moment gepubliceerd kunnen worden.";
+App::$strings["Content Expiration"] = "Inhoud laten verlopen";
+App::$strings["Remove posts/comments and/or private messages at a future time"] = "Berichten, reacties en/of privéberichten na een bepaalde tijd verwijderen";
+App::$strings["Suppress Duplicate Posts/Comments"] = "Dubbele berichten/reacties tegenhouden";
+App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Voorkomt dat berichten en reacties met identieke inhoud en die binnen twee minuten zijn verstuurd, worden gepubliceerd. ";
+App::$strings["Network and Stream Filtering"] = "Netwerk- en streamfilter";
+App::$strings["Search by Date"] = "Zoek op datum";
+App::$strings["Ability to select posts by date ranges"] = "Mogelijkheid om berichten op datum te filteren ";
+App::$strings["Privacy Groups"] = "Privacygroepen";
+App::$strings["Enable management and selection of privacy groups"] = "Beheer en selectie van privacygroepen inschakelen";
+App::$strings["Saved Searches"] = "Opgeslagen zoekopdrachten";
+App::$strings["Save search terms for re-use"] = "Sla zoekopdrachten op voor hergebruik";
+App::$strings["Network Personal Tab"] = "Persoonlijke netwerktab";
+App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Sta het toe dat de tab netwerkberichten toont waarmee je interactie had";
+App::$strings["Network New Tab"] = "Nieuwe netwerktab";
+App::$strings["Enable tab to display all new Network activity"] = "Laat de tab alle nieuwe netwerkactiviteit tonen";
+App::$strings["Affinity Tool"] = "Verwantschapsfilter";
+App::$strings["Filter stream activity by depth of relationships"] = "Filter wat je in jouw grid ziet op hoe goed je iemand kent of mag";
+App::$strings["Show friend and connection suggestions"] = "Toon kanaalvoorstellen";
+App::$strings["Connection Filtering"] = "Berichtenfilters";
+App::$strings["Filter incoming posts from connections based on keywords/content"] = "Filter binnenkomende berichten van connecties aan de hand van trefwoorden en taal";
+App::$strings["Post/Comment Tools"] = "Bericht- en reactiehulpmiddelen";
+App::$strings["Community Tagging"] = "Taggen door anderen";
+App::$strings["Ability to tag existing posts"] = "Geeft andere mensen de mogelijkheid om jouw (bestaande) berichten te taggen";
+App::$strings["Post Categories"] = "Categorieën berichten";
+App::$strings["Add categories to your posts"] = "Voeg categorieën toe aan je berichten";
+App::$strings["Emoji Reactions"] = "Emoji-reacties";
+App::$strings["Add emoji reaction ability to posts"] = "Emoji-reacties in berichten toestaan";
+App::$strings["Saved Folders"] = "Bewaarde mappen";
+App::$strings["Ability to file posts under folders"] = "Mogelijkheid om berichten in mappen op te slaan";
+App::$strings["Dislike Posts"] = "Vind berichten niet leuk";
+App::$strings["Ability to dislike posts/comments"] = "Mogelijkheid om berichten en reacties niet leuk te vinden";
+App::$strings["Star Posts"] = "Geef berichten een ster";
+App::$strings["Ability to mark special posts with a star indicator"] = "Mogelijkheid om speciale berichten met een ster te markeren";
+App::$strings["Tag Cloud"] = "Tagwolk";
+App::$strings["Provide a personal tag cloud on your channel page"] = "Zorgt voor een persoonlijke wolk met tags op jouw kanaalpagina";
+App::$strings["Premium Channel"] = "Premiumkanaal";
+App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Stelt je in staat om beperkingen en voorwaarden in te stellen voor jouw kanaal";
App::$strings["Attachments:"] = "Bijlagen:";
App::$strings["l F d, Y \\@ g:i A"] = "l d F Y \\@ G:i";
App::$strings["\$Projectname event notification:"] = "Notificatie \$Projectname-gebeurtenis:";
App::$strings["Starts:"] = "Start:";
App::$strings["Finishes:"] = "Einde:";
+App::$strings["%1\$s's bookmarks"] = "Bladwijzers van %1\$s";
+App::$strings["Help:"] = "Hulp:";
+App::$strings["Not Found"] = "Niet gevonden";
+App::$strings["Different viewers will see this text differently"] = "Deze tekst wordt per persoon anders weergeven.";
+App::$strings["Invalid data packet"] = "Datapakket ongeldig";
+App::$strings["Unable to verify channel signature"] = "Kanaalkenmerk kon niet worden geverifieerd. ";
+App::$strings["Unable to verify site signature for %s"] = "Hubkenmerk voor %s kon niet worden geverifieerd";
+App::$strings["invalid target signature"] = "ongeldig doelkenmerk";
+App::$strings["New Page"] = "Nieuwe pagina";
+App::$strings["Unable to determine sender."] = "Afzender kan niet bepaald worden.";
+App::$strings["No recipient provided."] = "Geen ontvanger opgegeven.";
+App::$strings["[no subject]"] = "[geen onderwerp]";
+App::$strings["Stored post could not be verified."] = "Opgeslagen bericht kon niet worden geverifieerd.";
+App::$strings["%d invitation available"] = array(
+ 0 => "%d uitnodiging beschikbaar",
+ 1 => "%d uitnodigingen beschikbaar",
+);
+App::$strings["Find Channels"] = "Kanalen vinden";
+App::$strings["Enter name or interest"] = "Vul naam of interesse in";
+App::$strings["Connect/Follow"] = "Verbinden/volgen";
+App::$strings["Examples: Robert Morgenstein, Fishing"] = "Voorbeeld: Robert Morgenstein, vissen";
+App::$strings["Random Profile"] = "Willekeurig profiel";
+App::$strings["Invite Friends"] = "Vrienden uitnodigen";
+App::$strings["Advanced example: name=fred and country=iceland"] = "Geavanceerd voorbeeld (Engels): name=jan en country=nederland";
+App::$strings["Everything"] = "Alles";
+App::$strings["Categories"] = "Categorieën";
+App::$strings["%d connection in common"] = array(
+ 0 => "%d gemeenschappelijke connectie",
+ 1 => "%d gemeenschappelijke connecties",
+);
+App::$strings["show more"] = "meer connecties weergeven";
App::$strings["Delete this item?"] = "Dit item verwijderen?";
App::$strings["%s show less"] = "%s minder reacties weergeven";
App::$strings["%s expand"] = "%s uitklappen";
@@ -2015,7 +2644,18 @@ App::$strings["about a year"] = "ongeveer een jaar";
App::$strings["%d years"] = "%d jaren";
App::$strings[" "] = " ";
App::$strings["timeago.numbers"] = "timeago.numbers";
+App::$strings["January"] = "januari";
+App::$strings["February"] = "februari";
+App::$strings["March"] = "maart";
+App::$strings["April"] = "april";
App::$strings["__ctx:long__ May"] = "mei";
+App::$strings["June"] = "juni";
+App::$strings["July"] = "juli";
+App::$strings["August"] = "augustus";
+App::$strings["September"] = "september";
+App::$strings["October"] = "oktober";
+App::$strings["November"] = "november";
+App::$strings["December"] = "december";
App::$strings["Jan"] = "jan";
App::$strings["Feb"] = "feb";
App::$strings["Mar"] = "mrt";
@@ -2028,6 +2668,13 @@ App::$strings["Sep"] = "sep";
App::$strings["Oct"] = "okt";
App::$strings["Nov"] = "nov";
App::$strings["Dec"] = "dec";
+App::$strings["Sunday"] = "zondag";
+App::$strings["Monday"] = "maandag";
+App::$strings["Tuesday"] = "dinsdag";
+App::$strings["Wednesday"] = "woensdag";
+App::$strings["Thursday"] = "donderdag";
+App::$strings["Friday"] = "vrijdag";
+App::$strings["Saturday"] = "zaterdag";
App::$strings["Sun"] = "zo";
App::$strings["Mon"] = "ma";
App::$strings["Tue"] = "di";
@@ -2040,6 +2687,131 @@ App::$strings["__ctx:calendar__ month"] = "maand";
App::$strings["__ctx:calendar__ week"] = "week";
App::$strings["__ctx:calendar__ day"] = "dag";
App::$strings["__ctx:calendar__ All day"] = "hele dag";
+App::$strings["Tags"] = "Tags";
+App::$strings["Keywords"] = "Trefwoorden";
+App::$strings["have"] = "heb";
+App::$strings["has"] = "heeft";
+App::$strings["want"] = "wil";
+App::$strings["wants"] = "wil";
+App::$strings["likes"] = "vindt dit leuk";
+App::$strings["dislikes"] = "vindt dit niet leuk";
+App::$strings["prev"] = "vorige";
+App::$strings["first"] = "eerste";
+App::$strings["last"] = "laatste";
+App::$strings["next"] = "volgende";
+App::$strings["older"] = "ouder";
+App::$strings["newer"] = "nieuwer";
+App::$strings["No connections"] = "Geen connecties";
+App::$strings["View all %s connections"] = "Toon alle %s connecties";
+App::$strings["poke"] = "aanstoten";
+App::$strings["poked"] = "aangestoten";
+App::$strings["ping"] = "ping";
+App::$strings["pinged"] = "gepingd";
+App::$strings["prod"] = "por";
+App::$strings["prodded"] = "gepord";
+App::$strings["slap"] = "slaan";
+App::$strings["slapped"] = "sloeg";
+App::$strings["finger"] = "finger";
+App::$strings["fingered"] = "gefingerd";
+App::$strings["rebuff"] = "afpoeieren";
+App::$strings["rebuffed"] = "afgepoeierd";
+App::$strings["happy"] = "gelukkig";
+App::$strings["sad"] = "bedroefd";
+App::$strings["mellow"] = "mellow";
+App::$strings["tired"] = "moe";
+App::$strings["perky"] = "parmantig";
+App::$strings["angry"] = "boos";
+App::$strings["stupefied"] = "verbijsterd";
+App::$strings["puzzled"] = "verward";
+App::$strings["interested"] = "geïnteresseerd";
+App::$strings["bitter"] = "verbitterd";
+App::$strings["cheerful"] = "vrolijk";
+App::$strings["alive"] = "levendig";
+App::$strings["annoyed"] = "geërgerd";
+App::$strings["anxious"] = "bezorgd";
+App::$strings["cranky"] = "humeurig";
+App::$strings["disturbed"] = "verontrust";
+App::$strings["frustrated"] = "gefrustreerd ";
+App::$strings["depressed"] = "gedeprimeerd";
+App::$strings["motivated"] = "gemotiveerd";
+App::$strings["relaxed"] = "ontspannen";
+App::$strings["surprised"] = "verrast";
+App::$strings["May"] = "mei";
+App::$strings["Unknown Attachment"] = "Onbekende bijlage";
+App::$strings["unknown"] = "onbekend";
+App::$strings["remove category"] = "categorie verwijderen";
+App::$strings["remove from file"] = "uit map verwijderen";
+App::$strings["default"] = "standaard";
+App::$strings["Page layout"] = "Pagina-lay-out";
+App::$strings["You can create your own with the layouts tool"] = "Je kan jouw eigen lay-out ontwerpen onder lay-outs";
+App::$strings["Page content type"] = "Opmaaktype";
+App::$strings["activity"] = "activiteit";
+App::$strings["Design Tools"] = "Ontwerp-hulpmiddelen";
+App::$strings["Pages"] = "Pagina's";
+App::$strings["Import website..."] = "Website importeren...";
+App::$strings["Select folder to import"] = "Kies een map om te importeren";
+App::$strings["Import from a zipped folder:"] = "Vanuit een zipbestand importeren:";
+App::$strings["Import from cloud files:"] = "Vanuit de cloud importeren:";
+App::$strings["/cloud/channel/path/to/folder"] = "/cloud/channel/maplocatie";
+App::$strings["Enter path to website files"] = "Voer de locatie in van de websitebestanden";
+App::$strings["Select folder"] = "Kies een map";
+App::$strings["Export website..."] = "Website exporteren...";
+App::$strings["Export to a zip file"] = "Naar een zipbestand exporteren";
+App::$strings["website.zip"] = "website.zip";
+App::$strings["Enter a name for the zip file."] = "Vul een naam in voor het zipbestand.";
+App::$strings["Export to cloud files"] = "Naar de cloud exporteren";
+App::$strings["/path/to/export/folder"] = "/locatie/van/export/map";
+App::$strings["Enter a path to a cloud files destination."] = "Voer de locatie in van de cloudbestemming";
+App::$strings["Specify folder"] = "Selecteer een map";
+App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kan geen dubbele kanaal-identificator op deze hub aanmaken. Importeren mislukt.";
+App::$strings["Channel clone failed. Import failed."] = "Het klonen van het kanaal is mislukt. Importeren mislukt.";
+App::$strings["Unable to import element \""] = "Niet in staat om dit element te importeren: \"";
+App::$strings["guest:"] = "gast:";
+App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "De beveiligings-token van het tekstvak was ongeldig. Dit is mogelijk het gevolg van dat er te lang (meer dan 3 uur) gewacht is om de tekst op te slaan. ";
+App::$strings["(Unknown)"] = "(Onbekend)";
+App::$strings["Visible to anybody on the internet."] = "Voor iedereen op het internet zichtbaar.";
+App::$strings["Visible to you only."] = "Alleen voor jou zichtbaar.";
+App::$strings["Visible to anybody in this network."] = "Voor iedereen in dit netwerk zichtbaar.";
+App::$strings["Visible to anybody authenticated."] = "Voor iedereen die geauthenticeerd is zichtbaar.";
+App::$strings["Visible to anybody on %s."] = "Voor iedereen op %s zichtbaar.";
+App::$strings["Visible to all connections."] = "Voor alle connecties zichtbaar.";
+App::$strings["Visible to approved connections."] = "Voor alle geaccepteerde connecties zichtbaar.";
+App::$strings["Visible to specific connections."] = "Voor specifieke connecties zichtbaar.";
+App::$strings["Privacy group is empty."] = "Privacygroep is leeg";
+App::$strings["Privacy group: %s"] = "Privacygroep: %s";
+App::$strings["Connection not found."] = "Connectie niet gevonden.";
+App::$strings["profile photo"] = "profielfoto";
+App::$strings["[Edited %s]"] = "[%s bewerkt]";
+App::$strings["__ctx:edit_activity__ Post"] = "Bericht";
+App::$strings["__ctx:edit_activity__ Comment"] = "Reactie";
+App::$strings["Logged out."] = "Uitgelogd.";
+App::$strings["Failed authentication"] = "Mislukte authenticatie";
+App::$strings[" and "] = " en ";
+App::$strings["public profile"] = "openbaar profiel";
+App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s veranderde %2\$s naar &ldquo;%3\$s&rdquo;";
+App::$strings["Visit %1\$s's %2\$s"] = "Bezoek het %2\$s van %1\$s";
+App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s heeft een aangepaste %2\$s, %3\$s veranderd.";
+App::$strings["Item was not found."] = "Item niet gevonden";
+App::$strings["No source file."] = "Geen bronbestand.";
+App::$strings["Cannot locate file to replace"] = "Kan het te vervangen bestand niet vinden";
+App::$strings["Cannot locate file to revise/update"] = "Kan het bestand wat aangepast moet worden niet vinden";
+App::$strings["File exceeds size limit of %d"] = "Bestand is groter dan de toegelaten %d";
+App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Je hebt jouw limiet van %1$.0f MB opslagruimte voor bijlagen bereikt.";
+App::$strings["File upload failed. Possible system limit or action terminated."] = "Uploaden van bestand mislukt. Mogelijk systeemlimiet bereikt of actie afgebroken.";
+App::$strings["Stored file could not be verified. Upload failed."] = "Opgeslagen bestand kon niet worden geverifieerd. Uploaden mislukt.";
+App::$strings["Path not available."] = "Locatie niet beschikbaar.";
+App::$strings["Empty pathname"] = "Ontbrekende locatienaam";
+App::$strings["duplicate filename or path"] = "dubbele bestandsnaam of locatie";
+App::$strings["Path not found."] = "Locatie niet gevonden";
+App::$strings["mkdir failed."] = "directory aanmaken (mkdir) mislukt.";
+App::$strings["database storage failed."] = "opslag in database mislukt.";
+App::$strings["Empty path"] = "Ontbrekende locatie";
+App::$strings["This event has been added to your calendar."] = "Dit evenement is aan jouw agenda toegevoegd.";
+App::$strings["Not specified"] = "Niet aangegeven";
+App::$strings["Needs Action"] = "Actie vereist";
+App::$strings["Completed"] = "Voltooid";
+App::$strings["In Process"] = "In behandeling";
+App::$strings["Cancelled"] = "Geannuleerd";
App::$strings["Channel is blocked on this site."] = "Kanaal is op deze hub geblokkeerd.";
App::$strings["Channel location missing."] = "Ontbrekende kanaallocatie.";
App::$strings["Response from remote channel was incomplete."] = "Antwoord van het kanaal op afstand was niet volledig.";
@@ -2047,23 +2819,112 @@ App::$strings["Channel was deleted and no longer exists."] = "Kanaal is verwijde
App::$strings["Protocol disabled."] = "Protocol uitgeschakeld.";
App::$strings["Channel discovery failed."] = "Kanaal ontdekken mislukt.";
App::$strings["Cannot connect to yourself."] = "Kan niet met jezelf verbinden";
-App::$strings["Image/photo"] = "Afbeelding/foto";
-App::$strings["Encrypted content"] = "Versleutelde inhoud";
-App::$strings["Install %s element: "] = "Installeer %s-element: ";
-App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Dit bericht heeft een te installeren %s-element, maar je hebt geen permissies om het op deze hub te installeren.";
-App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schreef het volgende %2\$s %3\$s";
-App::$strings["Click to open/close"] = "Klik om te openen of te sluiten";
-App::$strings["spoiler"] = "spoiler";
-App::$strings["$1 wrote:"] = "$1 schreef:";
+App::$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."] = "Een verwijderde collectie met deze naam is gereactiveerd. Bestaande itemrechten <strong>kunnen</strong> van toepassing zijn op deze collectie en toekomstige leden. Wanneer je dit niet zo bedoeld hebt, moet je een nieuwe collectie met een andere naam aanmaken.";
+App::$strings["Add new connections to this privacy group"] = "Voeg nieuwe connecties aan deze privacygroep toe";
+App::$strings["edit"] = "bewerken";
+App::$strings["Edit group"] = "Privacygroep bewerken";
+App::$strings["Add privacy group"] = "Privacygroep toevoegen";
+App::$strings["Channels not in any privacy group"] = "Kanalen die zich in geen enkele privacygroep bevinden";
+App::$strings["add"] = "toevoegen";
+App::$strings["Select an alternate language"] = "Kies een andere taal";
+App::$strings["Image exceeds website size limit of %lu bytes"] = "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes";
+App::$strings["Image file is empty."] = "Afbeeldingsbestand is leeg";
+App::$strings["Photo storage failed."] = "Foto kan niet worden opgeslagen";
+App::$strings["a new photo"] = "een nieuwe foto";
+App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s plaatste %2\$s op %3\$s";
+App::$strings["Photo Albums"] = "Fotoalbums";
+App::$strings["Upload New Photos"] = "Nieuwe foto's uploaden";
+App::$strings["Who can see this?"] = "Wie kan dit zien?";
+App::$strings["Custom selection"] = "Handmatige selectie";
+App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Kies \"Tonen\" om weergave toe te staan. Met \"Niet tonen\" kan je uitzonderingen maken op \"Tonen\".";
+App::$strings["Show"] = "Tonen";
+App::$strings["Don't show"] = "Niet tonen";
+App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Permissies van berichten %s zijn niet meer te veranderen %s nadat een bericht is gedeeld.</br />Met deze permissies bepaal je wie het bericht kan zien.";
+App::$strings[" by "] = " door ";
+App::$strings[" on "] = " op ";
+App::$strings["Embedded content"] = "Ingesloten (embedded) inhoud";
+App::$strings["Embedding disabled"] = "Insluiten (embedding) uitgeschakeld";
+App::$strings["System"] = "Systeem";
+App::$strings["New App"] = "Nieuwe app";
+App::$strings["Suggestions"] = "Voorgestelde kanalen";
+App::$strings["See more..."] = "Meer...";
+App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Je hebt %1$.0f van de %2$.0f toegestane connecties.";
+App::$strings["Add New Connection"] = "Nieuwe connectie toevoegen";
+App::$strings["Enter channel address"] = "Vul kanaaladres in";
+App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Voorbeelden: bob@example.com, http://example.com/barbara";
+App::$strings["Notes"] = "Aantekeningen";
+App::$strings["Remove term"] = "Verwijder zoekterm";
+App::$strings["Archives"] = "Archieven";
+App::$strings["Refresh"] = "Vernieuwen";
+App::$strings["Account settings"] = "Account";
+App::$strings["Channel settings"] = "Kanaal";
+App::$strings["Additional features"] = "Extra functies";
+App::$strings["Feature/Addon settings"] = "Plugin-instellingen";
+App::$strings["Display settings"] = "Weergave";
+App::$strings["Manage locations"] = "Locaties beheren";
+App::$strings["Export channel"] = "Kanaal exporteren";
+App::$strings["Connected apps"] = "Verbonden applicaties";
+App::$strings["Premium Channel Settings"] = "Instellingen premiumkanaal";
+App::$strings["Private Mail Menu"] = "Privéberichten";
+App::$strings["Combined View"] = "Gecombineerd postvak";
+App::$strings["Conversations"] = "Conversaties";
+App::$strings["Received Messages"] = "Ontvangen berichten";
+App::$strings["Sent Messages"] = "Verzonden berichten";
+App::$strings["No messages."] = "Geen berichten";
+App::$strings["Delete conversation"] = "Verwijder conversatie";
+App::$strings["Events Tools"] = "Agenda-hulpmiddelen";
+App::$strings["Export Calendar"] = "Exporteren";
+App::$strings["Import Calendar"] = "Importeren";
+App::$strings["Chatrooms"] = "Chatkanalen";
+App::$strings["Overview"] = "Overzicht";
+App::$strings["Chat Members"] = "Chatleden";
+App::$strings["Wiki List"] = "Wiki's";
+App::$strings["Wiki Pages"] = "Wikipagina's";
+App::$strings["Add new page"] = "Nieuwe pagina toevoegen";
+App::$strings["Page name"] = "Paginanaam";
+App::$strings["Bookmarked Chatrooms"] = "Bladwijzers van chatkanalen";
+App::$strings["Suggested Chatrooms"] = "Voorgestelde chatkanalen";
+App::$strings["photo/image"] = "foto/afbeelding";
+App::$strings["Click to show more"] = "Klik voor meer";
+App::$strings["Rating Tools"] = "Beoordelingen";
+App::$strings["Rate Me"] = "Beoordeel mij";
+App::$strings["View Ratings"] = "Bekijk beoordelingen";
+App::$strings["Forums"] = "Forums";
+App::$strings["Tasks"] = "Taken";
+App::$strings["Member registrations waiting for confirmation"] = "Accounts die op goedkeuring wachten";
+App::$strings["Inspect queue"] = "Inspecteer berichtenwachtrij";
+App::$strings["DB updates"] = "Database-updates";
+App::$strings["Plugin Features"] = "Plugin-opties";
+App::$strings["view full size"] = "volledige grootte tonen";
+App::$strings["No Subject"] = "Geen onderwerp";
+App::$strings["OStatus"] = "OStatus";
+App::$strings["GNU-Social"] = "GNU social";
+App::$strings["RSS/Atom"] = "RSS/Atom";
+App::$strings["Facebook"] = "Facebook";
+App::$strings["Zot"] = "Zot";
+App::$strings["LinkedIn"] = "LinkedIn";
+App::$strings["XMPP/IM"] = "XMPP/IM";
+App::$strings["MySpace"] = "MySpace";
+App::$strings["Can view my normal stream and posts"] = "Kan mijn normale kanaalstream en berichten bekijken";
+App::$strings["Can view my webpages"] = "Kan mijn pagina's bekijken";
+App::$strings["Can post on my channel page (\"wall\")"] = "Kan een bericht in mijn kanaal plaatsen";
+App::$strings["Can like/dislike stuff"] = "Kan dingen leuk of niet leuk vinden";
+App::$strings["Profiles and things other than posts/comments"] = "Profielen en dingen, buiten berichten en reacties";
+App::$strings["Can forward to all my channel contacts via post @mentions"] = "Kan naar al mijn kanaalconnecties berichten doorsturen met behulp van @vermeldingen+";
+App::$strings["Advanced - useful for creating group forum channels"] = "Geavanceerd - nuttig voor groepforums";
+App::$strings["Can chat with me (when available)"] = "Kan met mij chatten (wanneer beschikbaar)";
+App::$strings["Can write to my file storage and photos"] = "Kan foto's en andere bestanden aan mijn bestandsopslag toevoegen";
+App::$strings["Can edit my webpages"] = "Kan mijn pagina's bewerken";
+App::$strings["Somewhat advanced - very useful in open communities"] = "Enigszins geavanceerd (erg nuttig voor kanalen van forums/groepen)";
+App::$strings["Can administer my channel resources"] = "Kan mijn kanaal beheren";
+App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Zeer geavanceerd. Laat dit met rust, behalve als je weet wat je doet.";
App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s is nu met %2\$s verbonden";
App::$strings["%1\$s poked %2\$s"] = "%1\$s heeft %2\$s aangestoten";
-App::$strings["poked"] = "aangestoten";
App::$strings["View %s's profile @ %s"] = "Bekijk het profiel van %s @ %s";
App::$strings["Categories:"] = "Categorieën:";
App::$strings["Filed under:"] = "Bewaard onder:";
App::$strings["View in context"] = "In context bekijken";
App::$strings["remove"] = "verwijderen";
-App::$strings["Loading..."] = "Aan het laden...";
App::$strings["Delete Selected Items"] = "Verwijder de geselecteerde items";
App::$strings["View Source"] = "Bron weergeven";
App::$strings["Follow Thread"] = "Conversatie volgen";
@@ -2092,6 +2953,7 @@ App::$strings["Set your location"] = "Locatie instellen";
App::$strings["Clear browser location"] = "Locatie van webbrowser wissen";
App::$strings["Tag term:"] = "Tag:";
App::$strings["Where are you right now?"] = "Waar bevind je je op dit moment?";
+App::$strings["Choose a different album..."] = "Kies een ander album...";
App::$strings["Comments enabled"] = "Reacties ingeschakeld";
App::$strings["Comments disabled"] = "Reacties uitgeschakeld";
App::$strings["Page link name"] = "Linknaam pagina";
@@ -2115,10 +2977,8 @@ App::$strings["Favourite Posts"] = "Favoriete berichten";
App::$strings["Spam"] = "Spam";
App::$strings["Posts flagged as SPAM"] = "Berichten gemarkeerd als SPAM";
App::$strings["Status Messages and Posts"] = "Berichten in dit kanaal";
-App::$strings["About"] = "Over";
App::$strings["Profile Details"] = "Profiel";
App::$strings["Files and Storage"] = "Bestanden en opslagruimte";
-App::$strings["Chatrooms"] = "Chatkanalen";
App::$strings["Saved Bookmarks"] = "Opgeslagen bladwijzers";
App::$strings["Manage Webpages"] = "Webpagina's beheren";
App::$strings["__ctx:noun__ Attending"] = array(
@@ -2145,184 +3005,15 @@ App::$strings["__ctx:noun__ Abstain"] = array(
0 => "onthouding",
1 => "onthoudingen",
);
-App::$strings["Birthday"] = "Verjaardag of geboortedatum";
-App::$strings["Age: "] = "Leeftijd:";
-App::$strings["YYYY-MM-DD or MM-DD"] = "JJJJ-MM-DD of MM-DD";
-App::$strings["never"] = "nooit";
-App::$strings["less than a second ago"] = "minder dan een seconde geleden";
-App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "%1\$d %2\$s geleden";
-App::$strings["__ctx:relative_date__ year"] = array(
- 0 => "jaar",
- 1 => "jaren",
-);
-App::$strings["__ctx:relative_date__ month"] = array(
- 0 => "maand",
- 1 => "maanden",
-);
-App::$strings["__ctx:relative_date__ week"] = array(
- 0 => "week",
- 1 => "weken",
-);
-App::$strings["__ctx:relative_date__ day"] = array(
- 0 => "dag",
- 1 => "dagen",
-);
-App::$strings["__ctx:relative_date__ hour"] = array(
- 0 => "uur",
- 1 => "uren",
-);
-App::$strings["__ctx:relative_date__ minute"] = array(
- 0 => "minuut",
- 1 => "minuten",
-);
-App::$strings["__ctx:relative_date__ second"] = array(
- 0 => "seconde",
- 1 => "seconden",
-);
-App::$strings["%1\$s's birthday"] = "Verjaardag van %1\$s";
-App::$strings["Happy Birthday %1\$s"] = "Gefeliciteerd met je verjaardag %1\$s";
-App::$strings["Directory Options"] = "Opties kanalengids";
-App::$strings["Safe Mode"] = "Veilig zoeken";
-App::$strings["Public Forums Only"] = "Alleen openbare forums";
-App::$strings["This Website Only"] = "Alleen deze hub";
-App::$strings["This event has been added to your calendar."] = "Dit evenement is aan jouw agenda toegevoegd.";
-App::$strings["Not specified"] = "Niet aangegeven";
-App::$strings["Needs Action"] = "Actie vereist";
-App::$strings["Completed"] = "Voltooid";
-App::$strings["In Process"] = "In behandeling";
-App::$strings["Cancelled"] = "Geannuleerd";
-App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kan geen dubbele kanaal-identificator op deze hub aanmaken. Importeren mislukt.";
-App::$strings["Channel clone failed. Import failed."] = "Het klonen van het kanaal is mislukt. Importeren mislukt.";
-App::$strings["Unable to import element \""] = "Niet in staat om dit element te importeren: \"";
-App::$strings["Logged out."] = "Uitgelogd.";
-App::$strings["Failed authentication"] = "Mislukte authenticatie";
-App::$strings["Login failed."] = "Inloggen mislukt.";
-App::$strings[" and "] = " en ";
-App::$strings["public profile"] = "openbaar profiel";
-App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s veranderde %2\$s naar &ldquo;%3\$s&rdquo;";
-App::$strings["Visit %1\$s's %2\$s"] = "Bezoek het %2\$s van %1\$s";
-App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s heeft een aangepaste %2\$s, %3\$s veranderd.";
-App::$strings["view full size"] = "volledige grootte tonen";
-App::$strings["Administrator"] = "Beheerder";
-App::$strings["No Subject"] = "Geen onderwerp";
-App::$strings["Friendica"] = "Friendica";
-App::$strings["OStatus"] = "OStatus";
-App::$strings["GNU-Social"] = "GNU social";
-App::$strings["RSS/Atom"] = "RSS/Atom";
-App::$strings["Diaspora"] = "Diaspora";
-App::$strings["Facebook"] = "Facebook";
-App::$strings["Zot"] = "Zot";
-App::$strings["LinkedIn"] = "LinkedIn";
-App::$strings["XMPP/IM"] = "XMPP/IM";
-App::$strings["MySpace"] = "MySpace";
-App::$strings["Categories"] = "Categorieën";
-App::$strings["Tags"] = "Tags";
-App::$strings["Keywords"] = "Trefwoorden";
-App::$strings["have"] = "heb";
-App::$strings["has"] = "heeft";
-App::$strings["want"] = "wil";
-App::$strings["wants"] = "wil";
-App::$strings["likes"] = "vindt dit leuk";
-App::$strings["dislikes"] = "vindt dit niet leuk";
-App::$strings["%d invitation available"] = array(
- 0 => "%d uitnodiging beschikbaar",
- 1 => "%d uitnodigingen beschikbaar",
-);
-App::$strings["Find Channels"] = "Kanalen vinden";
-App::$strings["Enter name or interest"] = "Vul naam of interesse in";
-App::$strings["Connect/Follow"] = "Verbinden/volgen";
-App::$strings["Examples: Robert Morgenstein, Fishing"] = "Voorbeeld: Robert Morgenstein, vissen";
-App::$strings["Random Profile"] = "Willekeurig profiel";
-App::$strings["Invite Friends"] = "Vrienden uitnodigen";
-App::$strings["Advanced example: name=fred and country=iceland"] = "Geavanceerd voorbeeld (Engels): name=jan en country=nederland";
-App::$strings["Everything"] = "Alles";
-App::$strings["%d connection in common"] = array(
- 0 => "%d gemeenschappelijke connectie",
- 1 => "%d gemeenschappelijke connecties",
-);
-App::$strings["show more"] = "meer connecties weergeven";
-App::$strings["System"] = "Systeem";
-App::$strings["New App"] = "Nieuwe app";
-App::$strings["Suggestions"] = "Voorgestelde kanalen";
-App::$strings["See more..."] = "Meer...";
-App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Je hebt %1$.0f van de %2$.0f toegestane connecties.";
-App::$strings["Add New Connection"] = "Nieuwe connectie toevoegen";
-App::$strings["Enter channel address"] = "Vul kanaaladres in";
-App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Voorbeelden: bob@example.com, http://example.com/barbara";
-App::$strings["Notes"] = "Aantekeningen";
-App::$strings["Remove term"] = "Verwijder zoekterm";
-App::$strings["Archives"] = "Archieven";
-App::$strings["Refresh"] = "Vernieuwen";
-App::$strings["Account settings"] = "Account";
-App::$strings["Channel settings"] = "Kanaal";
-App::$strings["Additional features"] = "Extra functies";
-App::$strings["Feature/Addon settings"] = "Plugin-instellingen";
-App::$strings["Display settings"] = "Weergave";
-App::$strings["Manage locations"] = "Locaties beheren";
-App::$strings["Export channel"] = "Kanaal exporteren";
-App::$strings["Connected apps"] = "Verbonden applicaties";
-App::$strings["Premium Channel Settings"] = "Instellingen premiumkanaal";
-App::$strings["Private Mail Menu"] = "Privéberichten";
-App::$strings["Combined View"] = "Gecombineerd postvak";
-App::$strings["Conversations"] = "Conversaties";
-App::$strings["Received Messages"] = "Ontvangen berichten";
-App::$strings["Sent Messages"] = "Verzonden berichten";
-App::$strings["No messages."] = "Geen berichten";
-App::$strings["Delete conversation"] = "Verwijder conversatie";
-App::$strings["Events Tools"] = "Agenda-hulpmiddelen";
-App::$strings["Export Calendar"] = "Exporteren";
-App::$strings["Import Calendar"] = "Importeren";
-App::$strings["Overview"] = "Overzicht";
-App::$strings["Chat Members"] = "Chatleden";
-App::$strings["Wiki List"] = "Wiki's";
-App::$strings["Wiki Pages"] = "Wikipagina's";
-App::$strings["Bookmarked Chatrooms"] = "Bladwijzers van chatkanalen";
-App::$strings["Suggested Chatrooms"] = "Voorgestelde chatkanalen";
-App::$strings["photo/image"] = "foto/afbeelding";
-App::$strings["Click to show more"] = "Klik voor meer";
-App::$strings["Rating Tools"] = "Beoordelingen";
-App::$strings["Rate Me"] = "Beoordeel mij";
-App::$strings["View Ratings"] = "Bekijk beoordelingen";
-App::$strings["Forums"] = "Forums";
-App::$strings["Tasks"] = "Taken";
-App::$strings["Documentation"] = "Documentatie";
-App::$strings["Member registrations waiting for confirmation"] = "Accounts die op goedkeuring wachten";
-App::$strings["Inspect queue"] = "Inspecteer berichtenwachtrij";
-App::$strings["DB updates"] = "Database-updates";
-App::$strings["Plugin Features"] = "Plugin-opties";
-App::$strings["Public Timeline"] = "Openbare tijdlijn";
-App::$strings[" by "] = " door ";
-App::$strings[" on "] = " op ";
-App::$strings["Embedded content"] = "Ingesloten (embedded) inhoud";
-App::$strings["Embedding disabled"] = "Insluiten (embedding) uitgeschakeld";
-App::$strings["(Unknown)"] = "(Onbekend)";
-App::$strings["Visible to anybody on the internet."] = "Voor iedereen op het internet zichtbaar.";
-App::$strings["Visible to you only."] = "Alleen voor jou zichtbaar.";
-App::$strings["Visible to anybody in this network."] = "Voor iedereen in dit netwerk zichtbaar.";
-App::$strings["Visible to anybody authenticated."] = "Voor iedereen die geauthenticeerd is zichtbaar.";
-App::$strings["Visible to anybody on %s."] = "Voor iedereen op %s zichtbaar.";
-App::$strings["Visible to all connections."] = "Voor alle connecties zichtbaar.";
-App::$strings["Visible to approved connections."] = "Voor alle geaccepteerde connecties zichtbaar.";
-App::$strings["Visible to specific connections."] = "Voor specifieke connecties zichtbaar.";
-App::$strings["Privacy group is empty."] = "Privacygroep is leeg";
-App::$strings["Privacy group: %s"] = "Privacygroep: %s";
-App::$strings["Connection not found."] = "Connectie niet gevonden.";
-App::$strings["profile photo"] = "profielfoto";
-App::$strings["Item was not found."] = "Item niet gevonden";
-App::$strings["No source file."] = "Geen bronbestand.";
-App::$strings["Cannot locate file to replace"] = "Kan het te vervangen bestand niet vinden";
-App::$strings["Cannot locate file to revise/update"] = "Kan het bestand wat aangepast moet worden niet vinden";
-App::$strings["File exceeds size limit of %d"] = "Bestand is groter dan de toegelaten %d";
-App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Je hebt jouw limiet van %1$.0f MB opslagruimte voor bijlagen bereikt.";
-App::$strings["File upload failed. Possible system limit or action terminated."] = "Uploaden van bestand mislukt. Mogelijk systeemlimiet bereikt of actie afgebroken.";
-App::$strings["Stored file could not be verified. Upload failed."] = "Opgeslagen bestand kon niet worden geverifieerd. Uploaden mislukt.";
-App::$strings["Path not available."] = "Locatie niet beschikbaar.";
-App::$strings["Empty pathname"] = "Ontbrekende locatienaam";
-App::$strings["duplicate filename or path"] = "dubbele bestandsnaam of locatie";
-App::$strings["Path not found."] = "Locatie niet gevonden";
-App::$strings["mkdir failed."] = "directory aanmaken (mkdir) mislukt.";
-App::$strings["database storage failed."] = "opslag in database mislukt.";
-App::$strings["Empty path"] = "Ontbrekende locatie";
+App::$strings["Image/photo"] = "Afbeelding/foto";
+App::$strings["Encrypted content"] = "Versleutelde inhoud";
+App::$strings["Install %s element: "] = "Installeer %s-element: ";
+App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Dit bericht heeft een te installeren %s-element, maar je hebt geen permissies om het op deze hub te installeren.";
+App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schreef het volgende %2\$s %3\$s";
+App::$strings["Click to open/close"] = "Klik om te openen of te sluiten";
+App::$strings["spoiler"] = "spoiler";
+App::$strings["$1 wrote:"] = "$1 schreef:";
+App::$strings["Source channel not found."] = "Bron van kanaal niet gevonden";
App::$strings["Focus (Hubzilla default)"] = "Focus (Hubzilla-standaard)";
App::$strings["Theme settings"] = "Thema-instellingen";
App::$strings["Narrow navbar"] = "Smalle navigatiebalk";
diff --git a/view/pdl/mod_wiki.pdl b/view/pdl/mod_wiki.pdl
index 76ed1c70c..052ae61a1 100644
--- a/view/pdl/mod_wiki.pdl
+++ b/view/pdl/mod_wiki.pdl
@@ -1,4 +1,4 @@
[region=aside]
-[widget=wiki_list][/widget]
+[widget=vcard][/widget]
[widget=wiki_pages][/widget]
[/region]
diff --git a/view/php/default.php b/view/php/default.php
index f5be4fa35..839a36b5b 100644
--- a/view/php/default.php
+++ b/view/php/default.php
@@ -10,7 +10,7 @@
<header><?php if(x($page,'header')) echo $page['header']; ?></header>
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation"><?php if(x($page,'nav')) echo $page['nav']; ?></nav>
<main>
- <aside id="region_1"><?php if(x($page,'aside')) echo $page['aside']; ?></aside>
+ <aside id="region_1"><div id="left_aside_wrapper"><?php if(x($page,'aside')) echo $page['aside']; ?></div></aside>
<section id="region_2"><?php if(x($page,'content')) echo $page['content']; ?>
<div id="page-footer"></div>
<div id="pause"></div>
diff --git a/view/php/theme_init.php b/view/php/theme_init.php
index 46aadaa7d..85da4d782 100644
--- a/view/php/theme_init.php
+++ b/view/php/theme_init.php
@@ -26,6 +26,7 @@ head_add_js('library/jquery-textcomplete/jquery.textcomplete.js');
//head_add_js('library/colorbox/jquery.colorbox.js');
head_add_js('library/jquery.timeago.js');
head_add_js('library/readmore.js/readmore.js');
+head_add_js('library/sticky-kit/sticky-kit.js');
//head_add_js('library/jquery_ac/friendica.complete.js');
//head_add_js('library/tiptip/jquery.tipTip.minified.js');
head_add_js('library/jgrowl/jquery.jgrowl_minimized.js');
diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css
index a6d1d2a7e..7254be552 100644
--- a/view/theme/redbasic/css/style.css
+++ b/view/theme/redbasic/css/style.css
@@ -22,6 +22,7 @@ body {
color: $font_colour;
margin: 0px;
height: 100%;
+ overflow-x: hidden;
}
aside {
@@ -30,24 +31,56 @@ aside {
max-width: $aside_widthpx;
}
+aside #region_1 {
+ border-right: 1px solid transparent;
+}
+
+aside #left_aside_wrapper {
+ margin-bottom: 10px;
+}
+
main {
margin-left: auto;
margin-right: auto;
max-width: $main_widthpx;
}
-h1, .h1, h2, .h2 {
+#overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ cursor: pointer;
+ z-index: 1029;
+}
+
+h1, .h1 {
+ font-size: 2em;
+}
+
+h2, .h2 {
font-size: 1.667em;
}
-h3, .h3, h4, .h4 {
+h3, .h3 {
font-size: 1.334em;
}
-h5, .h5, h6, .h6 {
- font-size: 0.75rem;
+h4, .h4 {
+ font-size: 1em;
+ font-weight: bold;
+}
+
+h5, .h5 {
+ font-size: 1em;
}
+h6, .h6 {
+ font-size: 0.75em;
+}
+
+
.jslider {
font-family: sans-serif, arial, freesans;
}
@@ -109,6 +142,11 @@ input, optgroup, select, textarea {
resize: vertical;
}
+#help-content pre code {
+ overflow-x: auto;
+ white-space: pre;
+}
+
pre code {
border: none;
}
@@ -468,7 +506,6 @@ footer {
#contact-block {
width: 100%;
- float: left;
}
#contact-block-numcontacts {
@@ -477,12 +514,10 @@ footer {
}
.contact-block-div {
- float: left;
- width: 50px;
- height: 50px;
+ display: inline;
}
+
.contact-block-textdiv {
- float: left;
width: 150px;
height: 34px;
}
@@ -490,12 +525,11 @@ footer {
#contact-block-end {
clear: both;
}
-.contact-block-link {
- float: left;
-}
+
.contact-block-img {
- width:48px;
- height:48px;
+ width:47px;
+ height:47px;
+ margin-bottom: 3px;
}
#tag-remove {
@@ -1515,7 +1549,11 @@ nav .dropdown-menu {
color: $nav_icon_colour;
}
-#avatar:hover + #usermenu-caret {
+.usermenu-head {
+ float: left;
+}
+
+.usermenu-head:hover #usermenu-caret {
color: $nav_active_icon_colour;
}
@@ -1645,6 +1683,7 @@ main.fullscreen .section-content-wrapper-np {
.atoken-index-row:hover td,
.chatroom-index-row:hover td,
+.wikis-index-row:hover td,
.locs-index-row:hover td,
[id^="cloud-index-"]:hover td,
.cloud-index-active {
@@ -1778,6 +1817,7 @@ nav .badge.mail-update:hover {
#expand-aside,
#expand-tabs,
+#doco-return-to-top-btn,
#context-help-btn {
color: $nav_active_icon_colour;
padding: 7px 10px;
@@ -1826,10 +1866,6 @@ nav .badge.mail-update:hover {
}
main {
- transition: all 0.25s ease-in-out;
- }
-
- main {
left: -$aside_widthpx;
width: calc( 100% + $aside_widthpx );
}
@@ -2021,11 +2057,34 @@ dl.bb-dl > dd > li {
}
.embed-photo-selected-photo {
- border-color: blue;
- border-style: solid;
- border-width: 5px;
+ border-color: blue;
+ border-style: solid;
+ border-width: 5px;
}
#wiki-preview img {
- max-width: 100%;
+ max-width: 100%;
+}
+
+#ace-editor,
+#editor {
+ border-bottom-left-radius: $radiuspx;
+ border-bottom-right-radius: $radiuspx;
+}
+
+.sub-menu {
+ margin-top: 10px;
+ padding-left: 15px;
+ border-left: 3px solid #eee;
+}
+
+.nav-pills-stacked-icons {
+ padding: 6px 10px;
+ float: right;
+ position: relative;
+ z-index:1;
+}
+
+.nav-pills-stacked-icons:hover + a {
+ background-color: #eee;
}
diff --git a/view/theme/redbasic/js/redbasic.js b/view/theme/redbasic/js/redbasic.js
index 999b46268..e31458b4e 100644
--- a/view/theme/redbasic/js/redbasic.js
+++ b/view/theme/redbasic/js/redbasic.js
@@ -8,7 +8,7 @@ $(document).ready(function() {
if( $('#css3-calc').width() == 10) {
$(window).resize(function() {
if($(window).width() < 767) {
- $('main').css('width', $(window).width() + 287 );
+ $('main').css('width', $(window).width() + $('aside').outerWidth() );
} else {
$('main').css('width', '100%' );
}
@@ -16,9 +16,25 @@ $(document).ready(function() {
}
$('#css3-calc').remove(); // Remove the test element
- $('#expand-aside').click(function() {
- $('#expand-aside-icon').toggleClass('fa-arrow-circle-right').toggleClass('fa-arrow-circle-left');
- $('main').toggleClass('region_1-on');
+ if($(window).width() > 767) {
+ $('#left_aside_wrapper').stick_in_parent({
+ offset_top: $('nav').outerHeight(true)
+ });
+ }
+
+ $('#expand-aside').on('click', toggleAside);
+
+ $('section').on('click', function() {
+ if($('main').hasClass('region_1-on')){
+ toggleAside();
+ }
+ });
+
+ $(window).on('scroll', function() {
+ if($('main').hasClass('region_1-on') && $(window).scrollLeft() > 5){
+ $(window).scrollLeft(0);
+ toggleAside();
+ }
});
if($('aside').length && $('aside').html().length === 0) {
@@ -32,6 +48,12 @@ $(document).ready(function() {
$('#expand-tabs-icon').toggleClass('fa-arrow-circle-down').toggleClass('fa-arrow-circle-up');
});
+ $('.usermenu-head').click(function() {
+ if($('#navbar-collapse-1').hasClass('in')){
+ $('#navbar-collapse-1').removeClass('in');
+ }
+ });
+
if($('#tabs-collapse-1').length === 0) {
$('#expand-tabs').hide();
}
@@ -66,5 +88,22 @@ function makeFullScreen(full) {
$('#tabs-collapse-1').css({'visibility': ''});
$('#inline-btn').hide();
$('main').css({'transition': ''});
+ $(document.body).trigger("sticky_kit:recalc");
+ }
+}
+
+function toggleAside() {
+ $('#expand-aside-icon').toggleClass('fa-arrow-circle-right').toggleClass('fa-arrow-circle-left');
+ if($('main').hasClass('region_1-on')){
+ $('main').removeClass('region_1-on')
+ $('#overlay').remove();
+ $('#left_aside_wrapper').trigger("sticky_kit:detach");
+ }
+ else {
+ $('main').addClass('region_1-on')
+ $('<div id="overlay"></div>').appendTo('section');
+ $('#left_aside_wrapper').stick_in_parent({
+ offset_top: $('nav').outerHeight(true)
+ });
}
}
diff --git a/view/theme/redbasic/php/style.php b/view/theme/redbasic/php/style.php
index 2db0d4c44..9b994ebdf 100644
--- a/view/theme/redbasic/php/style.php
+++ b/view/theme/redbasic/php/style.php
@@ -165,7 +165,7 @@ if(file_exists('view/theme/redbasic/css/style.css')) {
$x .= $schemecss;
}
- $aside_width = 287;
+ $aside_width = 288;
// left aside and right aside are 285px + converse width
if($align_left) {
diff --git a/view/tpl/abook_edit.tpl b/view/tpl/abook_edit.tpl
index 835948096..2e02de33b 100755
--- a/view/tpl/abook_edit.tpl
+++ b/view/tpl/abook_edit.tpl
@@ -1,21 +1,33 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
{{if $notself}}
- <div class="dropdown pull-right">
- <button id="connection-dropdown" class="btn btn-default btn-xs" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
- <i class="fa fa-caret-down"></i>&nbsp;{{$tools_label}}
- </button>
- <ul class="dropdown-menu" aria-labelledby="dLabel">
- <li><a href="{{$tools.view.url}}" title="{{$tools.view.title}}">{{$tools.view.label}}</a></li>
- <li><a href="{{$tools.recent.url}}" title="{{$tools.recent.title}}">{{$tools.recent.label}}</a></li>
- <li class="divider"></li>
- <li><a href="#" title="{{$tools.refresh.title}}" onclick="window.location.href='{{$tools.refresh.url}}'; return false;">{{$tools.refresh.label}}</a></li>
- <li><a href="#" title="{{$tools.block.title}}" onclick="window.location.href='{{$tools.block.url}}'; return false;">{{$tools.block.label}}</a></li>
- <li><a href="#" title="{{$tools.ignore.title}}" onclick="window.location.href='{{$tools.ignore.url}}'; return false;">{{$tools.ignore.label}}</a></li>
- <li><a href="#" title="{{$tools.archive.title}}" onclick="window.location.href='{{$tools.archive.url}}'; return false;">{{$tools.archive.label}}</a></li>
- <li><a href="#" title="{{$tools.hide.title}}" onclick="window.location.href='{{$tools.hide.url}}'; return false;">{{$tools.hide.label}}</a></li>
- <li><a href="#" title="{{$tools.delete.title}}" onclick="window.location.href='{{$tools.delete.url}}'; return false;">{{$tools.delete.label}}</a></li>
- </ul>
+ <div class="pull-right">
+ <div class="btn-group">
+ <button id="connection-dropdown" class="btn btn-default btn-xs dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+ <i class="fa fa-caret-down"></i>&nbsp;{{$tools_label}}
+ </button>
+ <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dLabel">
+ <li><a href="{{$tools.view.url}}" title="{{$tools.view.title}}">{{$tools.view.label}}</a></li>
+ <li><a href="{{$tools.recent.url}}" title="{{$tools.recent.title}}">{{$tools.recent.label}}</a></li>
+ <li class="divider"></li>
+ <li><a href="#" title="{{$tools.refresh.title}}" onclick="window.location.href='{{$tools.refresh.url}}'; return false;">{{$tools.refresh.label}}</a></li>
+ <li><a href="#" title="{{$tools.block.title}}" onclick="window.location.href='{{$tools.block.url}}'; return false;">{{$tools.block.label}}</a></li>
+ <li><a href="#" title="{{$tools.ignore.title}}" onclick="window.location.href='{{$tools.ignore.url}}'; return false;">{{$tools.ignore.label}}</a></li>
+ <li><a href="#" title="{{$tools.archive.title}}" onclick="window.location.href='{{$tools.archive.url}}'; return false;">{{$tools.archive.label}}</a></li>
+ <li><a href="#" title="{{$tools.hide.title}}" onclick="window.location.href='{{$tools.hide.url}}'; return false;">{{$tools.hide.label}}</a></li>
+ <li><a href="#" title="{{$tools.delete.title}}" onclick="window.location.href='{{$tools.delete.url}}'; return false;">{{$tools.delete.label}}</a></li>
+ </ul>
+ </div>
+ {{if $abook_prev || $abook_next}}
+ <div class="btn-group">
+ {{if $abook_prev}}
+ <a href="connedit/{{$abook_prev}}{{if $section}}?f=&section={{$section}}{{/if}}" class="btn btn-default btn-xs" ><i class="fa fa-backward"></i></a>
+ {{/if}}
+ {{if $abook_next}}
+ <a href="connedit/{{$abook_next}}{{if $section}}?f=&section={{$section}}{{/if}}" class="btn btn-default btn-xs" ><i class="fa fa-forward"></i></a>
+ {{/if}}
+ </div>
+ {{/if}}
</div>
{{/if}}
<h2>{{$header}}</h2>
@@ -51,6 +63,7 @@
<form id="abook-edit-form" action="connedit/{{$contact_id}}" method="post" >
<input type="hidden" name="contact_id" value="{{$contact_id}}">
+ <input type="hidden" name="section" value="{{$section}}">
<div class="panel-group" id="contact-edit-tools" role="tablist" aria-multiselectable="true">
{{if $notself}}
@@ -84,7 +97,7 @@
</a>
</h3>
</div>
- <div id="affinity-tool-collapse" class="panel-collapse collapse{{if !$is_pending}} in{{/if}}" role="tabpanel" aria-labelledby="affinity-tool">
+ <div id="affinity-tool-collapse" class="panel-collapse collapse{{if !$is_pending || $section == 'affinity'}} in{{/if}}" role="tabpanel" aria-labelledby="affinity-tool">
<div class="section-content-tools-wrapper">
{{if $slide}}
<div class="form-group"><strong>{{$lbl_slider}}</strong></div>
@@ -115,7 +128,7 @@
</a>
</h3>
</div>
- <div id="fitert-tool-collapse" class="panel-collapse collapse{{if !$is_pending && !($slide || $multiprofs)}} in{{/if}}" role="tabpanel" aria-labelledby="fitert-tool">
+ <div id="fitert-tool-collapse" class="panel-collapse collapse{{if ( !$is_pending && !($slide || $multiprofs)) || $section == 'filter' }} in{{/if}}" role="tabpanel" aria-labelledby="fitert-tool">
<div class="section-content-tools-wrapper">
{{include file="field_textarea.tpl" field=$incl}}
{{include file="field_textarea.tpl" field=$excl}}
@@ -169,7 +182,7 @@
</h3>
</div>
{{/if}}
- <div id="perms-tool-collapse" class="panel-collapse collapse{{if $self}} in{{/if}}" role="tabpanel" aria-labelledby="perms-tool">
+ <div id="perms-tool-collapse" class="panel-collapse collapse{{if $self || $section === 'perms'}} in{{/if}}" role="tabpanel" aria-labelledby="perms-tool">
<div class="section-content-tools-wrapper">
<div class="section-content-warning-wrapper">
{{if $notself}}{{$permnote}}{{/if}}
diff --git a/view/tpl/achievements.tpl b/view/tpl/achievements.tpl
index 2b80b9e80..7d503cc53 100644
--- a/view/tpl/achievements.tpl
+++ b/view/tpl/achievements.tpl
@@ -1,9 +1,9 @@
<div class="generic-content-wrapper">
<p>{{$newmembertext}}</p>
-{{if $profilebadge}}<div id="profile-badge" class="badges"><img src="images/smiley-thumbsup.gif"></div>{{/if}}
-{{if $contactbadge}}<div id="contact-badge" class="badges"><img src="images/smiley-thumbsup.gif"></div>{{/if}}
-{{if $keywordsbadge}}<div id="keywords-badge" class="badges"><img src="images/smiley-thumbsup.gif"></div>{{/if}}
-{{if $channelsbadge}}<div id="channels-badge" class="badges"><img src="images/smiley-thumbsup.gif"></div>{{/if}}
+{{if $profilebadge}}<div id="profile-badge" class="badges"><img src="images/emoticons/smiley-thumbsup.gif"></div>{{/if}}
+{{if $contactbadge}}<div id="contact-badge" class="badges"><img src="images/emoticons/smiley-thumbsup.gif"></div>{{/if}}
+{{if $keywordsbadge}}<div id="keywords-badge" class="badges"><img src="images/emoticons/smiley-thumbsup.gif"></div>{{/if}}
+{{if $channelsbadge}}<div id="channels-badge" class="badges"><img src="images/emoticons/smiley-thumbsup.gif"></div>{{/if}}
</div>
diff --git a/view/tpl/admin_account_edit.tpl b/view/tpl/admin_account_edit.tpl
index 5e8cb5f47..82d137de4 100644
--- a/view/tpl/admin_account_edit.tpl
+++ b/view/tpl/admin_account_edit.tpl
@@ -9,6 +9,15 @@
{{include file="field_password.tpl" field=$pass1}}
{{include file="field_password.tpl" field=$pass2}}
+{{if $z_server_role == 'pro'}}
+{{include file="field_select.tpl" field=$account_level}}
+{{else}}
+<input type="hidden" name="account_level" value="{{$account_level.2}}" />
+{{/if}}
+{{include file="field_select.tpl" field=$account_language}}
+{{include file="field_input.tpl" field=$service_class}}
+
+
<input type="submit" name="submit" value="{{$submit}}" />
</form>
diff --git a/view/tpl/admin_site.tpl b/view/tpl/admin_site.tpl
index a5b32f08f..0bb3ceb15 100755
--- a/view/tpl/admin_site.tpl
+++ b/view/tpl/admin_site.tpl
@@ -49,6 +49,7 @@
{{/if}}
{{include file="field_textarea.tpl" field=$banner}}
+ {{include file="field_textarea.tpl" field=$siteinfo}}
{{include file="field_textarea.tpl" field=$admininfo}}
{{include file="field_select.tpl" field=$language}}
{{include file="field_select.tpl" field=$theme}}
diff --git a/view/tpl/build_query.tpl b/view/tpl/build_query.tpl
index 62f81b618..91bb0bfc0 100755
--- a/view/tpl/build_query.tpl
+++ b/view/tpl/build_query.tpl
@@ -17,6 +17,7 @@
var bParam_wall = {{$wall}};
var bParam_list = {{$list}};
var bParam_fh = {{$fh}};
+ var bParam_static = {{$static}};
var bParam_search = "{{$search}}";
var bParam_order = "{{$order}}";
@@ -36,6 +37,7 @@
if(bParam_cmax != 99) bCmd = bCmd + "&cmax=" + bParam_cmax;
if(bParam_gid != 0) { bCmd = bCmd + "&gid=" + bParam_gid; } else
if(bParam_cid != 0) { bCmd = bCmd + "&cid=" + bParam_cid; }
+ if(bParam_static != 0) { bCmd = bCmd + "&static=" + bParam_static; }
if(bParam_star != 0) bCmd = bCmd + "&star=" + bParam_star;
if(bParam_liked != 0) bCmd = bCmd + "&liked=" + bParam_liked;
if(bParam_conv!= 0) bCmd = bCmd + "&conv=" + bParam_conv;
diff --git a/view/tpl/chanview.tpl b/view/tpl/chanview.tpl
index d5f379f74..39fafaf8e 100755
--- a/view/tpl/chanview.tpl
+++ b/view/tpl/chanview.tpl
@@ -1,2 +1 @@
-<div id="chanview-iframe-border" class="fakelink" onclick="chanviewFull(); return true;" title="{{$full}}" ><i class="fa fa-arrows-alt"></i></div>
-<iframe id="remote-channel" width="100%" src="{{$url}}" onload="resize_iframe()"></iframe>
+<a href="{{$url}}">{{$url}}</a>
diff --git a/view/tpl/conv_item.tpl b/view/tpl/conv_item.tpl
index 79c22b4c1..35c3d18e7 100755
--- a/view/tpl/conv_item.tpl
+++ b/view/tpl/conv_item.tpl
@@ -103,27 +103,40 @@
</button>
{{/if}}
{{if $item.isevent}}
- <button type="button" title="{{$item.attend.0}}" class="btn btn-default btn-sm" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendyes'); return false;">
- <i class="fa fa-check{{if $item.my_responses.attend}} ivoted{{/if}}" ></i>
- </button>
- <button type="button" title="{{$item.attend.1}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'attendno'); return false;">
- <i class="fa fa-times{{if $item.my_responses.attendno}} ivoted{{/if}}" ></i>
- </button>
- <button type="button" title="{{$item.attend.2}}" class="btn btn-default btn-sm" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendmaybe'); return false;">
- <i class="fa fa-question{{if $item.my_responses.attendmaybe}} ivoted{{/if}}" ></i>
- </button>
+ <div class="btn-group dropdown">
+ <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-attend-menu-{{$item.id}}" title="{{$item.attend_title}}">
+ <i class="fa fa-calendar-check-o"></i>
+ </button>
+ <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-attend-menu-{{$item.id}}">
+ <li role="presentation"><a class="menuitem" href="#" title="{{$item.attend.0}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendyes'); return false;">
+ <i class="item-act-list fa fa-check{{if $item.my_responses.attend}} ivoted{{/if}}" ></i> {{$item.attend.0}}</a>
+ </li>
+ <li role="presentation"><a class="menuitem" href="#" title="{{$item.attend.1}}" onclick="itemAddToCal({{$item.id}}), dolike({{$item.id}},'attendno'); return false;">
+ <i class="item-act-list fa fa-times{{if $item.my_responses.attendno}} ivoted{{/if}}" ></i> {{$item.attend.1}}</a>
+ </li>
+ <li role="presentation"><a class="menuitem" href="#" title="{{$item.attend.2}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendmaybe'); return false;">
+ <i class="item-act-list fa fa-question{{if $item.my_responses.attendmaybe}} ivoted{{/if}}" ></i> {{$item.attend.2}}</a>
+ </li>
+ </ul>
+ </div>
{{/if}}
-
{{if $item.canvote}}
- <button type="button" title="{{$item.conlabels.0}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'agree'); return false;">
- <i class="fa fa-check{{if $item.my_responses.agree}} ivoted{{/if}}" ></i>
- </button>
- <button type="button" title="{{$item.conlabels.1}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'disagree'); return false;">
- <i class="fa fa-times{{if $item.my_responses.disagree}} ivoted{{/if}}" ></i>
- </button>
- <button type="button" title="{{$item.conlabels.2}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'abstain'); return false;">
- <i class="fa fa-question{{if $item.my_responses.abstain}} ivoted{{/if}}" ></i>
- </button>
+ <div class="btn-group dropdown">
+ <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-consensus-menu-{{$item.id}}" title="{{$item.vote_title}}">
+ <i class="fa fa-check-square-o"></i>
+ </button>
+ <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-consensus-menu-{{$item.id}}">
+ <li role="presentation"><a class="menuitem" href="#" title="{{$item.conlabels.0}}" onclick="dolike({{$item.id}},'agree'); return false;">
+ <i class="item-act-list fa fa-check{{if $item.my_responses.agree}} ivoted{{/if}}" ></i> {{$item.conlabels.0}}</a>
+ </li>
+ <li role="presentation"><a class="menuitem" href="#" title="{{$item.conlabels.1}}" onclick="dolike({{$item.id}},'disagree'); return false;">
+ <i class="item-act-list fa fa-times{{if $item.my_responses.disagree}} ivoted{{/if}}" ></i> {{$item.conlabels.1}}</a>
+ </li>
+ <li role="presentation"><a class="menuitem" href="#" title="{{$item.conlabels.2}}" onclick="dolike({{$item.id}},'abstain'); return false;">
+ <i class="item-act-list fa fa-question{{if $item.my_responses.abstain}} ivoted{{/if}}" ></i> {{$item.conlabels.2}}</a>
+ </li>
+ </ul>
+ </div>
{{/if}}
<button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
<i class="fa fa-caret-down"></i>
diff --git a/view/tpl/cover_photo_widget.tpl b/view/tpl/cover_photo_widget.tpl
index 2b47270c9..bc1f421bd 100755
--- a/view/tpl/cover_photo_widget.tpl
+++ b/view/tpl/cover_photo_widget.tpl
@@ -53,7 +53,7 @@
}
}
}
- if($('#cover-photo').length) {
+ if($('#cover-photo').length && $('main').css('opacity') < 1) {
$('main').css('opacity', ($(window).scrollTop()/$('#cover-photo').height()).toFixed(1));
}
});
diff --git a/view/tpl/event_form.tpl b/view/tpl/event_form.tpl
index a2bb1f112..2c1fc762c 100755
--- a/view/tpl/event_form.tpl
+++ b/view/tpl/event_form.tpl
@@ -105,17 +105,13 @@
</div>
</div>
- {{if ! $eid}}
- {{include file="field_checkbox.tpl" field=$share}}
- {{/if}}
-
<div class="clear"></div>
<button type="button" class="btn btn-default" onclick="openClose('advanced');">{{$advanced}}</button>
<div class="btn-group pull-right">
<button id="event-edit-preview-btn" class="btn btn-default" type="button" title="{{$preview}}" onclick="doEventPreview();"><i class="fa fa-eye" ></i></button>
{{if ! $eid}}
- <button id="dbtn-acl" class="btn btn-default" type="button" data-toggle="modal" data-target="#aclModal" title="{{$perms_label}}"><i id="jot-perms-icon" class="fa"></i></button>
+ <button id="dbtn-acl" class="btn btn-default" type="button" data-toggle="modal" data-target="#aclModal" title="{{$perms_label}}"><i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i></button>
{{/if}}
<button id="event-submit" class="btn btn-primary" type="submit" name="submit">{{$submit}}</button>
</div>
diff --git a/view/tpl/event_head.tpl b/view/tpl/event_head.tpl
index 646c68564..1d1b6f15b 100755
--- a/view/tpl/event_head.tpl
+++ b/view/tpl/event_head.tpl
@@ -153,17 +153,6 @@
}
});
- // ACL
- $('#id_distr').change(function() {
-
- if ($('#id_distr').is(':checked')) {
- $('#dbtn-acl').show();
- }
- else {
- $('#dbtn-acl').hide();
- }
- }).trigger('change');
-
});
</script>
diff --git a/view/tpl/generic_modal.tpl b/view/tpl/generic_modal.tpl
index 3f7326e71..2bbea42b3 100644
--- a/view/tpl/generic_modal.tpl
+++ b/view/tpl/generic_modal.tpl
@@ -8,8 +8,10 @@
<div class="modal-body" id="generic-modal-body-{{$id}}"></div>
<div class="modal-footer">
<button id="generic-modal-cancel-{{$id}}" type="button" class="btn btn-default" data-dismiss="modal">{{$cancel}}</button>
+ {{if $ok}}
<button id="generic-modal-ok-{{$id}}" type="button" class="btn btn-primary">{{$ok}}</button>
+ {{/if}}
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
-</div><!-- /.modal --> \ No newline at end of file
+</div><!-- /.modal -->
diff --git a/view/tpl/group_side.tpl b/view/tpl/group_side.tpl
index e58cf060d..35f79a07e 100755
--- a/view/tpl/group_side.tpl
+++ b/view/tpl/group_side.tpl
@@ -5,12 +5,10 @@
{{foreach $groups as $group}}
<li>
{{if $group.cid}}
- <a class="pull-right group-edit-tool fakelink" onclick="contactgroupChangeMember('{{$group.id}}','{{$group.enc_cid}}'); return true;"/>
- <i id="group-{{$group.id}}" class="fa {{if $group.ismember}}fa-check-square-o{{else}}fa-square-o{{/if}}"></i>
- </a>
+ <i id="group-{{$group.id}}" class="widget-nav-pills-checkbox fa {{if $group.ismember}}fa-check-square-o{{else}}fa-square-o{{/if}}" onclick="contactgroupChangeMember('{{$group.id}}','{{$group.enc_cid}}'); return true;"></i>
{{/if}}
{{if $group.edit}}
- <a class="pull-right group-edit-tool" href="{{$group.edit.href}}" title="{{$edittext}}"><i class="group-edit-icon fa fa-pencil"></i></a>
+ <a href="{{$group.edit.href}}" class="widget-nav-pills-icons" title="{{$edittext}}"><i class="fa fa-pencil"></i></a>
{{/if}}
<a{{if $group.selected}} class="group-selected"{{/if}} href="{{$group.href}}">{{$group.text}}</a>
</li>
diff --git a/view/tpl/help.tpl b/view/tpl/help.tpl
index 22180bda6..10e0a4957 100644
--- a/view/tpl/help.tpl
+++ b/view/tpl/help.tpl
@@ -1,8 +1,33 @@
<div id="help-content" class="generic-content-wrapper">
<div class="section-title-wrapper">
- <h2>{{$title}}</h2>
+ <h2>{{$title}}: {{$heading}}</h2>
</div>
- <div class="section-content-wrapper">
- {{$content}}
+ <div class="section-content-wrapper" id="doco-content">
+ <h3 id="doco-top-toc-heading">
+ <span class="fakelink" onclick="docoTocToggle(); return false;">
+ <i class="fakelink fa fa-caret-right" id="doco-toc-toggle"></i>
+ {{$tocHeading}}
+ </span>
+ </h3>
+ <ul id="doco-top-toc" style="margin-bottom: 1.5em; display: none;"></ul>
+ {{$content}}
</div>
</div>
+
+<script>
+ // Generate the table of contents in the side nav menu (see view/tpl/help.tpl)
+ $(document).ready(function () {
+ $('#doco-top-toc').toc({content: "#doco-content", headings: "h3,h4,h5,h6"});
+ });
+
+ function docoTocToggle() {
+ if($('#doco-top-toc').is(':visible')) {
+ $('#doco-toc-toggle').removeClass('fa-caret-down').addClass('fa-caret-right');
+ } else {
+ $('#doco-toc-toggle').removeClass('fa-caret-right').addClass('fa-caret-down');
+ }
+ $('#doco-top-toc').toggle();
+
+ return false;
+ }
+</script>
diff --git a/view/tpl/micropro_img.tpl b/view/tpl/micropro_img.tpl
index 23b7bd281..a7c5973f3 100755
--- a/view/tpl/micropro_img.tpl
+++ b/view/tpl/micropro_img.tpl
@@ -1 +1 @@
-<div class="contact-block-div{{if $class}} {{$class}}{{/if}}"><a class="contact-block-link{{if $class}} {{$class}}{{/if}}{{if $click}} fakelink{{/if}}" href="{{if $click}}#{{else}}{{$url}}{{/if}}" {{if $click}}onclick="{{$click}}"{{/if}}><img class="contact-block-img{{if $class}} {{$class}}{{/if}}" src="{{$photo}}" title="{{$title}}" alt="{{$name}}" /></a></div>
+<div class="contact-block-div{{if $class}} {{$class}}{{/if}}"><a class="contact-block-link{{if $class}} {{$class}}{{/if}}{{if $click}} fakelink{{/if}}" href="{{if $click}}#{{else}}{{$url}}{{/if}}" {{if $click}}onclick="{{$click}}"{{/if}}><img class="contact-block-img{{if $class}} {{$class}}{{/if}}" src="{{$photo}}" title="{{$title}}" alt="" /></a></div>
diff --git a/view/tpl/nav.tpl b/view/tpl/nav.tpl
index d08cb29ea..bc1e64416 100755
--- a/view/tpl/nav.tpl
+++ b/view/tpl/nav.tpl
@@ -17,7 +17,10 @@
</button>
{{/if}}
{{if $userinfo}}
- <img class="dropdown-toggle fakelink" data-toggle="dropdown" id="avatar" src="{{$userinfo.icon}}" alt="{{$userinfo.name}}"><span class="caret dropdown-toggle fakelink" data-toggle="dropdown" id="usermenu-caret"></span>
+ <div class="usermenu-head dropdown-toggle fakelink" data-toggle="dropdown">
+ <img id="avatar" src="{{$userinfo.icon}}" alt="{{$userinfo.name}}">
+ <span class="caret" id="usermenu-caret"></span>
+ </div>
{{if $localuser}}
<ul class="dropdown-menu" role="menu" aria-labelledby="avatar">
{{foreach $nav.usermenu as $usermenu}}
@@ -42,9 +45,10 @@
{{/if}}
</ul>
{{else}}
- {{if $nav.lock}}
+ {{if $nav.rusermenu}}
<ul class="dropdown-menu" role="menu" aria-labelledby="avatar">
- <li role="presentation"><a href="{{$nav.lock.0}}" title="{{$nav.lock.3}}" role="menuitem">{{$nav.lock.3}}</a></li>
+ <li role="presentation"><a href="{{$nav.rusermenu.0}}" role="menuitem">{{$nav.rusermenu.1}}</a></li>
+ <li role="presentation"><a href="{{$nav.rusermenu.2}}" role="menuitem">{{$nav.rusermenu.3}}</a></li>
</ul>
{{/if}}
{{/if}}
diff --git a/view/tpl/notes.tpl b/view/tpl/notes.tpl
index 0e8c8017c..f9fed1feb 100644
--- a/view/tpl/notes.tpl
+++ b/view/tpl/notes.tpl
@@ -1,27 +1,32 @@
<div class="widget">
-<script>
-var noteSaveTimer = null;
-$(document).on('focusout',"#note-text",function(e){
- if(noteSaveTimer)
- clearTimeout(noteSaveTimer);
- notePostFinal();
- noteSaveTimer = null;
-});
+ <h3>{{$banner}}</h3>
+ <textarea name="note_text" id="note-text">{{$text}}</textarea>
+ <script>
+ var noteSaveTimer = null;
+ var noteText = $('#note-text');
-$(document).on('focusin',"#note-text",function(e){
- noteSaveTimer = setTimeout(noteSaveChanges,10000);
-});
+ $(document).ready(function(){
+ noteText.height(noteText[0].scrollHeight);
+ });
-function notePostFinal() {
- $.post('notes/sync', { 'note_text' : $('#note-text').val() });
-}
+ $(document).on('focusout',"#note-text",function(e){
+ if(noteSaveTimer)
+ clearTimeout(noteSaveTimer);
+ notePostFinal();
+ noteSaveTimer = null;
+ });
-function noteSaveChanges() {
- $.post('notes', { 'note_text' : $('#note-text').val() });
- noteSaveTimer = setTimeout(noteSaveChanges,10000);
-}
-</script>
+ $(document).on('focusin',"#note-text",function(e){
+ noteSaveTimer = setTimeout(noteSaveChanges,10000);
+ });
-<h3>{{$banner}}</h3>
-<textarea name="note_text" id="note-text">{{$text}}</textarea>
+ function notePostFinal() {
+ $.post('notes/sync', { 'note_text' : $('#note-text').val() });
+ }
+
+ function noteSaveChanges() {
+ $.post('notes', { 'note_text' : $('#note-text').val() });
+ noteSaveTimer = setTimeout(noteSaveChanges,10000);
+ }
+ </script>
</div>
diff --git a/view/tpl/photo_album.tpl b/view/tpl/photo_album.tpl
index f097646e4..66d0fcc94 100755
--- a/view/tpl/photo_album.tpl
+++ b/view/tpl/photo_album.tpl
@@ -1,4 +1,4 @@
-<div class="generic-content-wrapper">
+<div class="{{if !$no_fullscreen_btn}}generic-content-wrapper{{/if}}">
<div class="section-title-wrapper">
<div class="pull-right">
{{if $order}}
diff --git a/view/tpl/photo_view.tpl b/view/tpl/photo_view.tpl
index db5ffe3f5..967abea71 100755
--- a/view/tpl/photo_view.tpl
+++ b/view/tpl/photo_view.tpl
@@ -7,7 +7,7 @@
<button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-caret-down"></i>&nbsp;{{$tools_label}}
</button>
- <ul class="dropdown-menu">
+ <ul class="dropdown-menu dropdown-menu-right">
{{if $tools}}
<li class="nav-item">
<a class="nav-link" href="{{$tools.profile.0}}"><i class="fa fa-user"></i>&nbsp;{{$tools.profile.1}}</a>
@@ -32,7 +32,7 @@
{{if $lock}}
<div class="btn-group">
<button id="lockview" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" title="{{$lock}}" onclick="lockview('photo',{{$id}});" ><i class="fa fa-lock"></i></button>
- <ul id="panel-{{$id}}" class="lockview-panel dropdown-menu"></ul>
+ <ul id="panel-{{$id}}" class="lockview-panel dropdown-menu dropdown-menu-right"></ul>
</div>
{{/if}}
{{if $prevlink || $nextlink}}
diff --git a/view/tpl/profile_photo.tpl b/view/tpl/profile_photo.tpl
index 88e17407b..ca107bfcc 100755
--- a/view/tpl/profile_photo.tpl
+++ b/view/tpl/profile_photo.tpl
@@ -9,10 +9,15 @@
<div id="profile-photo-upload-wrapper">
+ {{if $importfile}}
+ <input type="hidden" name="importfile" value="{{$importfile}}">
+ {{else}}
<label id="profile-photo-upload-label" class="form-label" for="profile-photo-upload">{{$lbl_upfile}}</label>
<input name="userfile" class="form-input" type="file" id="profile-photo-upload" size="48" />
+ {{/if}}
<div class="clear"></div>
+
{{if $single}}
<input type="hidden" name="profile" value="{{$profile0.id}}" />
{{else}}
diff --git a/view/tpl/profile_vcard.tpl b/view/tpl/profile_vcard.tpl
index 5e9d192a1..9bd534fd8 100755
--- a/view/tpl/profile_vcard.tpl
+++ b/view/tpl/profile_vcard.tpl
@@ -52,6 +52,7 @@
{{if $diaspora}}
{{include file="diaspora_vcard.tpl"}}
{{/if}}
+
</div>
<div id="clear"></div>
diff --git a/view/tpl/settings.tpl b/view/tpl/settings.tpl
index 0ec44e9ff..05e531ba7 100755
--- a/view/tpl/settings.tpl
+++ b/view/tpl/settings.tpl
@@ -112,6 +112,7 @@
{{include file="field_intcheckbox.tpl" field=$notify2}}
{{include file="field_intcheckbox.tpl" field=$notify3}}
{{include file="field_intcheckbox.tpl" field=$notify4}}
+ {{*include file="field_intcheckbox.tpl" field=$notify9*}}
{{include file="field_intcheckbox.tpl" field=$notify5}}
{{include file="field_intcheckbox.tpl" field=$notify6}}
{{include file="field_intcheckbox.tpl" field=$notify7}}
diff --git a/view/tpl/settings_display.tpl b/view/tpl/settings_display.tpl
index 2e11fdbaa..a85a067be 100755
--- a/view/tpl/settings_display.tpl
+++ b/view/tpl/settings_display.tpl
@@ -69,6 +69,7 @@
{{include file="field_checkbox.tpl" field=$network_list_mode}}
{{include file="field_checkbox.tpl" field=$user_scalable}}
{{include file="field_checkbox.tpl" field=$preload_images}}
+ {{include file="field_checkbox.tpl" field=$manual_update}}
{{if $expert}}
<div class="form-group">
<a class="btn btn-default "href="pdledit">{{$layout_editor}}</a>
diff --git a/view/tpl/settings_nick_set.tpl b/view/tpl/settings_nick_set.tpl
index 2460952fe..76fe7cd8d 100755
--- a/view/tpl/settings_nick_set.tpl
+++ b/view/tpl/settings_nick_set.tpl
@@ -1,4 +1,8 @@
<div id="settings-nick-wrapper" class="section-content-info-wrapper">
-<div id="settings-nickname-desc">{{$desc}} <strong>'{{$nickname}}@{{$basepath}}'</strong>{{$subdir}}</div>
+<div id="settings-nickname-desc">{{$desc}} <strong>'{{$nickname}}@{{$basepath}}'</strong></div>
+{{if $davpath}}
+<br>
+<div id="settings-dav-desc">{{$davdesc}} <strong>'{{$davpath}}'</strong></div>
+{{/if}}
</div>
<div id="settings-nick-end" ></div>
diff --git a/view/tpl/siteinfo.tpl b/view/tpl/siteinfo.tpl
index e50284b9c..a5b99fd83 100755
--- a/view/tpl/siteinfo.tpl
+++ b/view/tpl/siteinfo.tpl
@@ -1,26 +1,41 @@
<div class="generic-content-wrapper-styled">
-<h3>{{$title}}</h3>
-<p></p>
-<p>{{$description}}</p>
-{{if $version}}
-<p>{{$version}}{{if $commit}}+{{$commit}}{{/if}}</p>
+<h2>{{$title}}</h2>
+
+<h3>{{$sitenametxt}}</h3>
+
+<div>{{$sitename}}</div>
+
+<h3>{{$headline}}</h3>
+
+<div>{{if $site_about}}{{$site_about}}{{else}}--{{/if}}</div>
+
+<h3>{{$admin_headline}}</h3>
+
+<div>{{if $admin_about}}{{$admin_about}}{{else}}--{{/if}}</div>
+
+<br><br>
+<div><a href="help/TermsOfService">{{$terms}}</a></div>
+
+<hr>
+
+<h2>{{$prj_header}}</h2>
+
+<div>{{$prj_name}} ({{$z_server_role}})</div>
+
+{{if $prj_version}}
+<div>{{$prj_version}}</div>
{{/if}}
-{{if $tag}}
-<p>{{$tag_txt}} {{$tag}}</p>
-{{/if}}
-{{if $polled}}
-<p>{{$polled}} {{$lastpoll}}</p>
-{{/if}}
-<p>{{$load_average}} {{$loadavg_all}}</p>
-<p>{{$web_location}}</p>
-<p>{{$visit}}</p>
-<p>{{$bug_text}} <a href="{{$bug_link_url}}">{{$bug_link_text}}</a></p>
-<p>{{$adminlabel}}</p>
-<p>{{$admininfo}}</p>
-<p>{{$contact}}</p>
-<p>{{$plugins_text}}</p>
-{{if $plugins_list}}
- <div style="margin-left: 25px; margin-right: 25px;">{{$plugins_list}}</div>
-{{/if}}
-<p>{{$donate}}</p>
+
+
+<h3>{{$prj_linktxt}}</h3>
+
+<div>{{$prj_link}}</div>
+
+<h3>{{$prj_srctxt}}</h3>
+
+<div>{{$prj_src}}</div>
+
+<br><br>
+<div>{{$prj_transport}} ({{$transport_link}})</div>
+
</div>
diff --git a/view/tpl/wiki.tpl b/view/tpl/wiki.tpl
index c05b33a61..1b0b06132 100644
--- a/view/tpl/wiki.tpl
+++ b/view/tpl/wiki.tpl
@@ -1,476 +1,472 @@
-<style type="text/css" media="screen">
- #ace-editor {
- position: relative;
- width: 100%;
- height: 500px;
- }
- .fade.in {
- -webkit-transition: opacity 0.5s 0.5s ease;
- -moz-transition: opacity 0.5s 0.5s ease;
- -o-transition: opacity 0.5s 0.5s ease;
- transition: opacity 0.5s 0.5s ease;
- }
-</style>
-<div class="generic-content-wrapper">
- <div class="section-title-wrapper">
- <div class="pull-right">
- {{if $showNewWikiButton}}
- <button class="btn btn-primary btn-xs acl-form-trigger" onclick="$('#new-page-form-wrapper').hide(); openClose('new-wiki-form-wrapper');" data-form_id="new-wiki-form">New Wiki</button>
- {{/if}}
- {{if $showNewPageButton}}
- <button class="btn btn-success btn-xs" onclick="$('#new-wiki-form-wrapper').hide(); openClose('new-page-form-wrapper');">New Page</button>
- {{/if}}
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();
- adjustFullscreenTopBarHeight();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);
- adjustInlineTopBarHeight();"><i class="fa fa-compress"></i></button>
- </div>
- <h2><span id="wiki-header-name">{{$wikiheaderName}}</span>: <span id="wiki-header-page">{{$wikiheaderPage}}</span></h2>
- <div class="clear"></div>
- </div>
- <div id="new-wiki-form-wrapper" class="section-content-tools-wrapper" style="display:none;">
- <form id="new-wiki-form" action="wiki/{{$channel}}/create/wiki" method="post" class="acl-form" data-form_id="new-wiki-form" data-allow_cid='{{$allow_cid}}' data-allow_gid='{{$allow_gid}}' data-deny_cid='{{$deny_cid}}' data-deny_gid='{{$deny_gid}}'>
- <div class="clear"></div>
- {{include file="field_input.tpl" field=$wikiName}}
-
- <div id="post-visible-container" class="form-group field checkbox">
- <span style="font-size:1.2em;" class="pull-left">Send notification post?</span>
- <div style="margin-left:20px" class="pull-left">
- <input name="postVisible" id="postVisible" value="0" type="checkbox">
- <label class="switchlabel" for="postVisible">
- <span class="onoffswitch-inner" data-on="Post" data-off="None"></span>
- <span class="onoffswitch-switch"></span>
- </label>
- </div>
- </div>
-
- <div class="btn-group pull-right">
- <div id="profile-jot-submit-right" class="btn-group">
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" title="Permission settings" onclick="return false;">
- <i id="jot-perms-icon" class="fa fa-{{$lockstate}} jot-icons"></i>{{$bang}}
- </button>
- <button id="new-wiki-submit" class="btn btn-primary" type="submit" name="submit" >Create Wiki</button>
- </div>
- </div>
- </form>
- {{$acl}}
- <div class="clear"></div>
- <hr>
- </div>
-
- <div id="new-page-form-wrapper" class="section-content-tools-wrapper" style="display:none;">
- <form id="new-page-form" action="wiki/create/page" method="post" >
- <div class="clear"></div>
- {{include file="field_input.tpl" field=$pageName}}
- <div class="btn-group pull-right">
- <button id="new-page-submit" class="btn btn-success" type="submit" name="submit" >Create Page</button>
- </div>
- </form> <div class="clear"></div>
- <hr>
- </div>
-
- <div id="rename-page-form-wrapper" class="section-content-tools-wrapper" style="display:none;">
- <form id="rename-page-form" action="wiki/rename/page" method="post" >
- <div class="clear"></div>
- {{include file="field_input.tpl" field=$pageRename}}
- <div class="btn-group pull-right">
- <button id="rename-page-submit" class="btn btn-warning" type="submit" name="submit" >Rename Page</button>
- </div>
- </form> <div class="clear"></div>
- <hr>
- </div>
-
- <div id="wiki-content-container" class="section-content-wrapper" {{if $hideEditor}}style="display: none;"{{/if}}>
- <ul class="nav nav-tabs" id="wiki-nav-tabs">
- <li><a data-toggle="tab" href="#edit-pane">Edit</a></li>
- <li class="active"><a data-toggle="tab" href="#preview-pane" id="wiki-get-preview">Preview</a></li>
- <li {{if $hidePageHistory}}style="display: none;"{{/if}}><a data-toggle="tab" href="#page-history-pane" id="wiki-get-history">History</a></li>
- {{if $showPageControls}}
- <li class="dropdown">
- <a data-toggle="dropdown" class="dropdown-toggle" href="#">Page <b class="caret"></b></a>
- <ul class="dropdown-menu">
- <li><a id="save-page" data-toggle="tab" href="#">Save</a></li>
- <li><a id="rename-page" data-toggle="tab" href="#">Rename</a></li>
- <li><a id="delete-page" data-toggle="tab" href="#">Delete</a></li>
- <li class="divider"></li>
- <li><a id="embed-image" data-toggle="tab" href="#">Embed image</a></li>
-
- </ul>
- </li>
- {{/if}}
- </ul>
- <div class="tab-content" id="wiki-page-tabs">
-
- <div id="edit-pane" class="tab-pane fade">
- <div id="ace-editor"></div>
- </div>
- <div id="preview-pane" class="tab-pane fade in active">
- <div id="wiki-preview" class="section-content-wrapper">
- {{$renderedContent}}
- </div>
- </div>
- <div id="page-history-pane" class="tab-pane fade" {{if $hidePageHistory}}style="display: none;"{{/if}}>
- <div id="page-history-list" class="section-content-wrapper">
- </div>
- </div>
-
-
- </div>
- </div>
- {{if $showCommitMsg}}
- <div class="section-content-wrapper">
- {{include file="field_input.tpl" field=$commitMsg}}
- </div>
- {{/if}}
+<div class="generic-content-wrapper" {{if $hideEditor}}style="display: none;"{{/if}}>
+ <div class="section-title-wrapper">
+ <div class="pull-right">
+ {{if $showPageControls}}
+ <div id="page-tools" class="btn-group" style="display: none;">
+ <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown">
+ <i class="fa fa-caret-down"></i>&nbsp;{{$tools_label}}
+ </button>
+ <ul class="dropdown-menu dropdown-menu-right">
+ {{if $renamePage}}
+ <li class="nav-item">
+ <a class="nav-link rename-page" href="#"><i class="fa fa-edit"></i>&nbsp;{{$renamePage}}</a>
+ </li>
+ {{/if}}
+ <li class="nav-item">
+ <a id="embed-image" class="nav-link" href="#"><i class="fa fa-picture-o"></i>&nbsp;Embed Image</a>
+ </li>
+ </ul>
+ </div>
+ {{/if}}
+ <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(); adjustFullscreenEditorHeight();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false); adjustInlineEditorHeight()"><i class="fa fa-compress"></i></button>
+ </div>
+ <h2>
+ <span id="wiki-header-name">{{$wikiheaderName}}</span>:
+ <span id="wiki-header-page">{{$wikiheaderPage}}</span>
+ </h2>
+ <div class="clear"></div>
+ </div>
+ <div id="rename-page-form-wrapper" class="section-content-tools-wrapper" style="display:none;">
+ <form id="rename-page-form" action="wiki/rename/page" method="post" >
+ {{include file="field_input.tpl" field=$pageRename}}
+ <div class="form-group">
+ <div class="pull-right">
+ <button id="rename-page-submit" class="btn btn-primary" type="submit" name="submit">Submit</button>
+ </div>
+ <div>
+ <button class="btn btn-default rename-page" type="button">Cancel</button>
+ </div>
+ <div class="clear"></div>
+ </div>
+ </form>
+ </div>
+ <div id="wiki-content-container" class="section-content-wrapper">
+ <ul class="nav nav-tabs" id="wiki-nav-tabs">
+ <li id="edit-pane-tab"><a data-toggle="tab" href="#edit-pane">{{$editOrSourceLabel}}</a></li>
+ <li class="active"><a data-toggle="tab" href="#preview-pane" id="wiki-get-preview">View</a></li>
+ <li><a data-toggle="tab" href="#page-history-pane" id="wiki-get-history">History</a></li>
+ </ul>
+ <div class="tab-content" id="wiki-page-tabs">
+ <div id="edit-pane" class="tab-pane fade">
+ {{if !$mimeType || $mimeType == 'text/markdown'}}
+ <div id="ace-editor"></div>
+ {{else}}
+ <div id="editor-wrapper">
+ <textarea id="editor">{{$content}}</textarea>
+ </div>
+ {{/if}}
+ {{if $showPageControls}}
+ <div>
+ <div id="id_{{$commitMsg.0}}_wrapper" class="field input">
+ <div class="input-group">
+ <input class="widget-input" name="{{$commitMsg.0}}" id="id_{{$commitMsg.0}}" type="text" value="{{$commitMsg.2}}"{{if $commitMsg.5}} {{$commitMsg.5}}{{/if}}>
+ <div class="input-group-btn">
+ <button id="save-page" type="button" class="btn btn-primary btn-sm disabled">Save</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ {{/if}}
+ </div>
+ <div id="preview-pane" class="tab-pane fade in active">
+ <div id="wiki-preview">
+ {{$renderedContent}}
+ </div>
+ </div>
+ <div id="page-history-pane" class="tab-pane fade">
+ <div id="page-history-list"></div>
+ </div>
+ </div>
+ </div>
</div>
{{$wikiModal}}
-
<div class="modal" id="embedPhotoModal" tabindex="-1" role="dialog" aria-labelledby="embedPhotoLabel" aria-hidden="true">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
- <h4 class="modal-title" id="embedPhotoModalLabel">{{$embedPhotosModalTitle}}</h4>
- </div>
- <div class="modal-body" id="embedPhotoModalBody" >
- <div id="embedPhotoModalBodyAlbumListDialog" class="hide">
- <div id="embedPhotoModalBodyAlbumList"></div>
- </div>
- <div id="embedPhotoModalBodyAlbumDialog" class="hide">
- </div>
- </div>
- <div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$embedPhotosModalCancel}}</button>
- <button id="embed-photo-OKButton" type="button" class="btn btn-primary">{{$embedPhotosModalOK}}</button>
- </div>
- </div><!-- /.modal-content -->
- </div><!-- /.modal-dialog -->
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+ <h4 class="modal-title" id="embedPhotoModalLabel">{{$embedPhotosModalTitle}}</h4>
+ </div>
+ <div class="modal-body" id="embedPhotoModalBody" >
+ <div id="embedPhotoModalBodyAlbumListDialog" class="hide">
+ <div id="embedPhotoModalBodyAlbumList"></div>
+ </div>
+ <div id="embedPhotoModalBodyAlbumDialog" class="hide"></div>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-default" data-dismiss="modal">{{$embedPhotosModalCancel}}</button>
+ <button id="embed-photo-OKButton" type="button" class="btn btn-primary">{{$embedPhotosModalOK}}</button>
+ </div>
+ </div><!-- /.modal-content -->
+ </div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<script>
- window.wiki_resource_id = '{{$resource_id}}';
- window.wiki_page_name = '{{$page}}';
- window.wiki_page_content = {{$content}};
- window.wiki_page_commit = '{{$commit}}';
-
- if (window.wiki_page_name === 'Home') {
- $('#delete-page').hide();
- $('#rename-page').hide();
- }
-
- $("#generic-modal-ok-{{$wikiModalID}}").removeClass('btn-primary');
- $("#generic-modal-ok-{{$wikiModalID}}").addClass('btn-danger');
-
- $('#rename-page').click(function (ev) {
- $('#rename-page-form-wrapper').show();
- });
-
- $( "#rename-page-form" ).submit(function( event ) {
- $.post("wiki/{{$channel}}/rename/page",
- {
- oldName: window.wiki_page_name,
- newName: $('#id_pageRename').val(),
- resource_id: window.wiki_resource_id
- },
- function (data) {
- if (data.success) {
- $('#rename-page-form-wrapper').hide();
- window.console.log('data: ' + JSON.stringify(data));
- window.wiki_page_name = data.name.urlName;
- $('#wiki-header-page').html(data.name.htmlName);
- wiki_refresh_page_list();
- } else {
- window.console.log('Error renaming page.');
- }
- }, 'json');
- event.preventDefault();
- });
-
- $(document).ready(function () {
- wiki_refresh_page_list();
- $("#wiki-toc").toc({content: "#wiki-preview", headings: "h1,h2,h3,h4"});
- // Show Edit tab first. Otherwise the Ace editor does not load.
- $("#wiki-nav-tabs li:eq(1) a").tab('show');
- });
+ window.wiki_resource_id = '{{$resource_id}}';
+ window.wiki_page_name = '{{$page}}';
+ window.wiki_page_content = {{if !$mimeType || $mimeType == 'text/markdown'}}{{$content}}{{else}}`{{$content}}`{{/if}};
+ window.wiki_page_commit = '{{$commit}}';
+
+ $("#generic-modal-ok-{{$wikiModalID}}").removeClass('btn-primary');
+ $("#generic-modal-ok-{{$wikiModalID}}").addClass('btn-danger');
+
+ $('.rename-page').click(function (ev) {
+ $('#rename-page-form-wrapper').toggle();
+ ev.preventDefault();
+ });
+
+ $( "#rename-page-form" ).submit(function( event ) {
+ $.post("wiki/{{$channel}}/rename/page",
+ {
+ oldName: window.wiki_page_name,
+ newName: $('#id_pageRename').val(),
+ resource_id: window.wiki_resource_id
+ },
+ function (data) {
+ if (data.success) {
+ $('#rename-page-form-wrapper').hide();
+ window.console.log('data: ' + JSON.stringify(data));
+ window.wiki_page_name = data.name.urlName;
+ $('#wiki-header-page').html(data.name.htmlName);
+ wiki_refresh_page_list();
+ } else {
+ window.console.log('Error renaming page.');
+ }
+ }, 'json');
+ event.preventDefault();
+ });
+
+ {{if !$mimeType || $mimeType == 'text/markdown'}}
+ var editor = ace.edit("ace-editor");
+ editor.setOptions({
+ theme: "ace/theme/github",
+ mode: "ace/mode/markdown",
+
+ maxLines: Infinity,
+ minLines: 30,
+
+ wrap: true,
+
+ printMargin: false
+ });
+
+ editor.getSession().setValue(window.wiki_page_content);
+ window.editor = editor; // Store the editor in the window object so the anonymous function can use it.
+ {{else}}
+ window.editor = editor = $('#editor');
+ {{/if}}
+
+ {{if !$showPageControls}}
+ {{if !$mimeType || $mimeType == 'text/markdown'}}
+ editor.setReadOnly(true); // Disable editing if the viewer lacks edit permission
+ {{else}}
+ editor.prop('readonly', true);
+ {{/if}}
+ {{/if}}
+
+ $('#edit-pane-tab').click(function (ev) {
+ setTimeout(function() {
+ window.editor.focus();
+ if($('main').hasClass('fullscreen')) {
+ adjustFullscreenEditorHeight();
+ }
+ else {
+ adjustInlineEditorHeight();
+ }
+ }, 500); // Return the focus to the editor allowing immediate text entry
+ $('#page-tools').show();
+ });
+
+ $('#wiki-get-preview').click(function (ev) {
+ $.post("wiki/{{$channel}}/preview", {
+ {{if !$mimeType || $mimeType == 'text/markdown'}}
+ content: editor.getValue(),
+ {{else}}
+ content: editor.val(),
+ {{/if}}
+ resource_id: window.wiki_resource_id
+ },
+ function (data) {
+ if (data.success) {
+ $('#wiki-preview').html(data.html);
+ {{if !$mimeType || $mimeType == 'text/markdown'}}
+ $("#wiki-toc").toc({content: "#wiki-preview", headings: "h1,h2,h3,h4"});
+ {{/if}}
+ $('#page-tools').hide();
+ } else {
+ window.console.log('Error previewing page.');
+ }
+ }, 'json');
+ ev.preventDefault();
+ });
+
+ $('#wiki-get-history').click(function (ev) {
+ $.post("wiki/{{$channel}}/history/page", {name: window.wiki_page_name, resource_id: window.wiki_resource_id}, function (data) {
+ if (data.success) {
+ $('#page-history-list').html(data.historyHTML);
+ $('#page-tools').hide();
+ } else {
+ window.console.log('Error getting page history.');
+ }
+ }, 'json');
+ ev.preventDefault();
+ });
+
+ function wiki_refresh_page_list() {
+ if (window.wiki_resource_id === '') {
+ return false;
+ }
+ $.post("wiki/{{$channel}}/get/page/list/", {resource_id: window.wiki_resource_id}, function (data) {
+ if (data.success) {
+ $('#wiki_page_list_container').html(data.pages);
+ $('#wiki_page_list_container').show();
+ } else {
+ alert('Error fetching page list!');
+ window.console.log('Error fetching page list!');
+ }
+ }, 'json');
+ return false;
+ }
+
+ $('#save-page').click(function (ev) {
+ if (window.wiki_resource_id === '' || window.wiki_page_name === '') {
+ window.console.log('You must have a wiki page open in order to edit pages.');
+ ev.preventDefault();
+ return false;
+ }
+ {{if !$mimeType || $mimeType == 'text/markdown'}}
+ var currentContent = editor.getValue();
+ {{else}}
+ var currentContent = editor.val();
+ {{/if}}
+
+ if (window.wiki_page_content === currentContent) {
+ $('#save-page').addClass('disabled'); // Disable the save button
+ window.console.log('No edits to save.');
+ ev.preventDefault();
+ return false;
+ }
+ $.post("wiki/{{$channel}}/save/page", {
+ content: currentContent,
+ commitMsg: $('#id_commitMsg').val(),
+ name: window.wiki_page_name,
+ resource_id: window.wiki_resource_id
+ },
+ function (data) {
+ if (data.success) {
+ window.console.log('Page saved successfully.');
+ window.wiki_page_content = currentContent;
+ $('#id_commitMsg').val(''); // Clear the commit message box
+ $('#save-page').addClass('disabled'); // Disable the save button
+ {{if !$mimeType || $mimeType == 'text/markdown'}}
+ window.editor.getSession().getUndoManager().markClean(); // Reset the undo history for the editor
+ {{/if}}
+
+ window.editor.focus(); // Return focus to the editor for continued editing
+ // $('#wiki-get-history').click();
+ } else {
+ alert('Error saving page.'); // TODO: Replace alerts with auto-timeout popups
+ window.console.log('Error saving page.');
+ }
+ }, 'json');
+ ev.preventDefault();
+ });
+
+ function wiki_revert_page(commitHash) {
+ if (window.wiki_resource_id === '' || window.wiki_page_name === '') {
+ window.console.log('You must have a wiki page open in order to revert pages.');
+ return false;
+ }
+ $.post("wiki/{{$channel}}/revert/page", {commitHash: commitHash, name: window.wiki_page_name, resource_id: window.wiki_resource_id},
+ function (data) {
+ if (data.success) {
+ $('button[id^=revert-]').removeClass('btn-success');
+ $('button[id^=revert-]').addClass('btn-danger');
+ $('button[id^=revert-]').html('Revert');
+ $('#revert-'+commitHash).removeClass('btn-danger');
+ $('#revert-'+commitHash).addClass('btn-success');
+ $('#revert-'+commitHash).html('Page reverted<br>but not saved');
+ window.wiki_page_commit = commitHash;
+ // put contents in editor
+ editor.getSession().setValue(data.content);
+ } else {
+ window.console.log('Error reverting page.');
+ }
+ }, 'json');
+ }
+
+ function wiki_compare_page(compareCommit) {
+ if (window.wiki_resource_id === '' || window.wiki_page_name === '' || window.wiki_page_commit === '') {
+ window.console.log('You must have a wiki page open in order to revert pages.');
+ return false;
+ }
+ $.post("wiki/{{$channel}}/compare/page", {
+ compareCommit: compareCommit,
+ currentCommit: window.wiki_page_commit,
+ name: window.wiki_page_name,
+ resource_id: window.wiki_resource_id
+ },
+ function (data) {
+ console.log(data);
+ if (data.success) {
+ var modalBody = $('#generic-modal-body-{{$wikiModalID}}');
+ modalBody.html('<div class="descriptive-text">'+data.diff+'</div>');
+ $('.modal-dialog').addClass('modal-lg');
+ $("#generic-modal-ok-{{$wikiModalID}}").off('click');
+ $("#generic-modal-ok-{{$wikiModalID}}").click(function () {
+ wiki_revert_page(compareCommit);
+ $('#generic-modal-{{$wikiModalID}}').modal('hide');
+ });
+ $('#generic-modal-{{$wikiModalID}}').modal();
+ } else {
+ window.console.log('Error comparing page.');
+ }
+ }, 'json');
+ }
- var editor = ace.edit("ace-editor");
- editor.setTheme("ace/theme/github");
- editor.getSession().setMode("ace/mode/markdown");
- editor.getSession().setValue(window.wiki_page_content);
+ function adjustFullscreenEditorHeight() {
+ $('#editor, #ace-editor').height($(window).height() - $('#id_commitMsg_wrapper').outerHeight(true) - $('.section-title-wrapper').outerHeight(true) - $('#wiki-nav-tabs').outerHeight(true) - 17);
+ {{if !$mimeType || $mimeType == 'text/markdown'}}
+ editor.setOptions({
+ maxLines: null,
+ minLines: null
+ });
+ editor.resize();
+ {{/if}}
+ }
- $('#wiki-get-preview').click(function (ev) {
- $.post("wiki/{{$channel}}/preview", {content: editor.getValue(), resource_id: window.wiki_resource_id}, function (data) {
- if (data.success) {
- $('#wiki-preview').html(data.html);
- $("#wiki-toc").toc({content: "#wiki-preview", headings: "h1,h2,h3,h4"});
- } else {
- window.console.log('Error previewing page.');
- }
- }, 'json');
- ev.preventDefault();
- });
+ function adjustInlineEditorHeight() {
+ {{if !$mimeType || $mimeType == 'text/markdown'}}
+ editor.setOptions({
+ maxLines: Infinity,
+ minLines: 30
+ });
+ editor.resize();
+ {{else}}
+ editor.height(editor[0].scrollHeight);
+ {{/if}}
+ }
- $('#wiki-get-history').click(function (ev) {
- $.post("wiki/{{$channel}}/history/page", {name: window.wiki_page_name, resource_id: window.wiki_resource_id}, function (data) {
- if (data.success) {
- $('#page-history-list').html(data.historyHTML);
- } else {
- window.console.log('Error getting page history.');
- }
- }, 'json');
- ev.preventDefault();
- });
-
-function wiki_delete_wiki(wikiHtmlName, resource_id) {
- if(!confirm('Are you sure you want to delete the entire wiki: ' + JSON.stringify(wikiHtmlName))) {
- return;
- }
- $.post("wiki/{{$channel}}/delete/wiki", {resource_id: resource_id}, function (data) {
- if (data.success) {
- window.console.log('Wiki deleted');
- // Refresh list and redirect page as necessary
- window.location = 'wiki/{{$channel}}';
- } else {
- alert('Error deleting wiki!');
- window.console.log('Error deleting wiki.');
- }
- }, 'json');
-}
+ $('#embed-image').click(function (ev) {
+ initializeEmbedPhotoDialog();
+ ev.preventDefault();
+ });
+ var initializeEmbedPhotoDialog = function () {
+ $('.embed-photo-selected-photo').each(function (index) {
+ $(this).removeClass('embed-photo-selected-photo');
+ });
+ getPhotoAlbumList();
+ $('#embedPhotoModalBodyAlbumDialog').off('click');
+ $('#embedPhotoModal').modal();
+ };
- $('#new-page-submit').click(function (ev) {
- if (window.wiki_resource_id === '') {
- window.console.log('You must have a wiki open in order to create pages.');
- ev.preventDefault();
- return false;
- }
- $.post("wiki/{{$channel}}/create/page", {name: $('#id_pageName').val(), resource_id: window.wiki_resource_id},
- function (data) {
- if (data.success) {
- window.location = data.url;
- } else {
- window.console.log('Error creating page.');
- }
- }, 'json');
- ev.preventDefault();
- });
-
- function wiki_refresh_page_list() {
- if (window.wiki_resource_id === '') {
- return false;
- }
- $.post("wiki/{{$channel}}/get/page/list/", {resource_id: window.wiki_resource_id}, function (data) {
- if (data.success) {
- $('#wiki_page_list_container').html(data.pages);
- $('#wiki_page_list_container').show();
- } else {
- alert('Error fetching page list!');
- window.console.log('Error fetching page list!');
- }
- }, 'json');
- return false;
- }
-
- $('#save-page').click(function (ev) {
- if (window.wiki_resource_id === '' || window.wiki_page_name === '') {
- window.console.log('You must have a wiki page open in order to edit pages.');
- ev.preventDefault();
- return false;
- }
- var currentContent = editor.getValue();
- if (window.wiki_page_content === currentContent) {
- window.console.log('No edits to save.');
- ev.preventDefault();
- return false;
- }
- $.post("wiki/{{$channel}}/save/page",
- { content: currentContent,
- commitMsg: $('#id_commitMsg').val(),
- name: window.wiki_page_name,
- resource_id: window.wiki_resource_id
- },
- function (data) {
- if (data.success) {
- window.console.log('Page saved successfully.');
- window.wiki_page_content = currentContent;
- $('#id_commitMsg').val(''); // Clear the commit message box
- $('#wiki-get-history').click();
- } else {
- alert('Error saving page.'); // TODO: Replace alerts with auto-timeout popups
- window.console.log('Error saving page.');
- }
- }, 'json');
- ev.preventDefault();
- });
-
- $('#delete-page').click(function (ev) {
- if (window.wiki_resource_id === '' || window.wiki_page_name === '' || window.wiki_page_name === 'Home') {
- window.console.log('You must have a wiki page open in order to delete pages.');
- ev.preventDefault();
- return false;
- }
- if(!confirm('Are you sure you want to delete the page: ' + window.wiki_page_name)) {
- return;
- }
- $.post("wiki/{{$channel}}/delete/page", {name: window.wiki_page_name, resource_id: window.wiki_resource_id},
- function (data) {
- if (data.success) {
- window.console.log('Page deleted successfully.');
- var url = window.location.href;
- if (url.substr(-1) == '/') url = url.substr(0, url.length - 2);
- url = url.split('/');
- url.pop();
- window.location = url.join('/');
- } else {
- alert('Error deleting page.'); // TODO: Replace alerts with auto-timeout popups
- window.console.log('Error deleting page.');
- }
- }, 'json');
- ev.preventDefault();
- });
-
- function wiki_revert_page(commitHash) {
- if (window.wiki_resource_id === '' || window.wiki_page_name === '') {
- window.console.log('You must have a wiki page open in order to revert pages.');
- return false;
- }
- $.post("wiki/{{$channel}}/revert/page", {commitHash: commitHash, name: window.wiki_page_name, resource_id: window.wiki_resource_id},
- function (data) {
- if (data.success) {
- $('button[id^=revert-]').removeClass('btn-success');
- $('button[id^=revert-]').addClass('btn-danger');
- $('button[id^=revert-]').html('Revert');
- $('#revert-'+commitHash).removeClass('btn-danger');
- $('#revert-'+commitHash).addClass('btn-success');
- $('#revert-'+commitHash).html('Page reverted<br>but not saved');
- window.wiki_page_commit = commitHash;
- // put contents in editor
- editor.getSession().setValue(data.content);
- } else {
- window.console.log('Error reverting page.');
- }
- }, 'json');
- }
-
- function wiki_compare_page(compareCommit) {
- if (window.wiki_resource_id === '' || window.wiki_page_name === '' || window.wiki_page_commit === '') {
- window.console.log('You must have a wiki page open in order to revert pages.');
- return false;
- }
- $.post("wiki/{{$channel}}/compare/page",
- {
- compareCommit: compareCommit,
- currentCommit: window.wiki_page_commit,
- name: window.wiki_page_name,
- resource_id: window.wiki_resource_id
- },
- function (data) {
- if (data.success) {
- var modalBody = $('#generic-modal-body-{{$wikiModalID}}');
- modalBody.html('<div class="descriptive-text">'+data.diff+'</div>');
- $('.modal-dialog').width('80%');
- $("#generic-modal-ok-{{$wikiModalID}}").off('click');
- $("#generic-modal-ok-{{$wikiModalID}}").click(function () {
- wiki_revert_page(compareCommit);
- $('#generic-modal-{{$wikiModalID}}').modal('hide');
- });
- $('#generic-modal-{{$wikiModalID}}').modal();
- } else {
- window.console.log('Error comparing page.');
- }
- }, 'json');
- }
-
- $('#embed-image').click(function (ev) {
- initializeEmbedPhotoDialog();
- ev.preventDefault();
- });
+ var choosePhotoFromAlbum = function (album) {
+ $.post("embedphotos/album", {name: album},
+ function(data) {
+ if (data['status']) {
+ $('#embedPhotoModalLabel').html('{{$modalchooseimages}}');
+ $('#embedPhotoModalBodyAlbumDialog').html('\
+ <div><ul class="nav">\n\
+ <li><a href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\
+ <i class="fa fa-chevron-left"></i>&nbsp;\n\
+ {{$modaldiffalbum}}\n\
+ </a>\n\
+ </li>\n\
+ </ul><br></div>')
+ $('#embedPhotoModalBodyAlbumDialog').append(data['content']);
+ $('#embedPhotoModalBodyAlbumDialog').click(function (evt) {
+ evt.preventDefault();
+ var image = document.getElementById(evt.target.id);
+ if (typeof($(image).parent()[0]) !== 'undefined') {
+ var imageparent = document.getElementById($(image).parent()[0].id);
+ $(imageparent).toggleClass('embed-photo-selected-photo');
+ }
+ });
+ $('#embedPhotoModalBodyAlbumListDialog').addClass('hide');
+ $('#embedPhotoModalBodyAlbumDialog').removeClass('hide');
+ $('#embed-photo-OKButton').click(function () {
+ $('.embed-photo-selected-photo').each(function (index) {
+ var href = $(this).attr('href');
+ $.post("embedphotos/photolink", {href: href},
+ function(ddata) {
+ if (ddata['status']) {
+ {{if !$mimeType || $mimeType == 'text/markdown'}}
+ var imgURL = ddata['photolink'].replace( /\[.*\]\[.*\](.*)\[.*\]\[.*\]/, '\n![image]($1)' )
+ editor.getSession().insert(editor.getCursorPosition(), imgURL)
+ {{else}}
+ var currentContent = $('#editor').val();
+ $('#editor').val(currentContent + ddata['photolink']);
+ {{/if}}
+ } else {
+ window.console.log('{{$modalerrorlink}}' + ':' + ddata['errormsg']);
+ }
+ return false;
+ },
+ 'json');
+ });
+ $('#embedPhotoModalBodyAlbumDialog').html('');
+ $('#embedPhotoModalBodyAlbumDialog').off('click');
+ $('#embedPhotoModal').modal('hide');
+ });
+ } else {
+ window.console.log('{{$modalerroralbum}} ' + JSON.stringify(album) + ':' + data['errormsg']);
+ }
+ return false;
+ },
+ 'json');
+ };
+ var getPhotoAlbumList = function () {
+ $.post("embedphotos/albumlist", {},
+ function(data) {
+ if (data['status']) {
+ var albums = data['albumlist']; //JSON.parse(data['albumlist']);
+ $('#embedPhotoModalLabel').html('{{$modalchoosealbum}}');
+ $('#embedPhotoModalBodyAlbumList').html('<ul class="nav"></ul>');
+ for(var i=0; i<albums.length; i++) {
+ var albumName = albums[i].text;
+ var albumLink = '<li>';
+ albumLink += '<a href="#" onclick="choosePhotoFromAlbum(\'' + albumName + '\');return false;">' + albumName + '</a>';
+ albumLink += '</li>';
+ $('#embedPhotoModalBodyAlbumList').find('ul').append(albumLink);
+ }
+ $('#embedPhotoModalBodyAlbumDialog').addClass('hide');
+ $('#embedPhotoModalBodyAlbumListDialog').removeClass('hide');
+ } else {
+ window.console.log('{{$modalerrorlist}}' + ':' + data['errormsg']);
+ }
+ return false;
+ },
+ 'json');
+ };
- var initializeEmbedPhotoDialog = function () {
- $('.embed-photo-selected-photo').each(function (index) {
- $(this).removeClass('embed-photo-selected-photo');
- });
- getPhotoAlbumList();
- $('#embedPhotoModalBodyAlbumDialog').off('click');
- $('#embedPhotoModal').modal();
- };
+ $(document).ready(function () {
+ wiki_refresh_page_list();
- var choosePhotoFromAlbum = function (album) {
- $.post("embedphotos/album", {name: album},
- function(data) {
- if (data['status']) {
- $('#embedPhotoModalLabel').html('{{$modalchooseimages}}');
- $('#embedPhotoModalBodyAlbumDialog').html('\
- <div><ul class="nav">\n\
- <li><a href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\
- <i class="fa fa-chevron-left"></i>&nbsp\n\
- {{$modaldiffalbum}}\n\
- </a>\n\
- </li>\n\
- </ul><br></div>')
- $('#embedPhotoModalBodyAlbumDialog').append(data['content']);
- $('#embedPhotoModalBodyAlbumDialog').click(function (evt) {
- evt.preventDefault();
- var image = document.getElementById(evt.target.id);
- if (typeof($(image).parent()[0]) !== 'undefined') {
- var imageparent = document.getElementById($(image).parent()[0].id);
- $(imageparent).toggleClass('embed-photo-selected-photo');
- }
- });
- $('#embedPhotoModalBodyAlbumListDialog').addClass('hide');
- $('#embedPhotoModalBodyAlbumDialog').removeClass('hide');
- $('#embed-photo-OKButton').click(function () {
- $('.embed-photo-selected-photo').each(function (index) {
- var href = $(this).attr('href');
- $.post("embedphotos/photolink", {href: href},
- function(ddata) {
- if (ddata['status']) {
- var imgURL = ddata['photolink'].replace( /\[.*\]\[.*\](.*)\[.*\]\[.*\]/, '\n![image]($1)' )
- editor.getSession().insert(editor.getCursorPosition(), imgURL)
- } else {
- window.console.log('{{$modalerrorlink}}' + ':' + ddata['errormsg']);
- }
- return false;
- },
- 'json');
- });
- $('#embedPhotoModalBodyAlbumDialog').html('');
- $('#embedPhotoModalBodyAlbumDialog').off('click');
- $('#embedPhotoModal').modal('hide');
- });
- } else {
- window.console.log('{{$modalerroralbum}} ' + JSON.stringify(album) + ':' + data['errormsg']);
- }
- return false;
- },
- 'json');
- };
+ {{if !$mimeType || $mimeType == 'text/markdown'}}
+ $("#wiki-toc").toc({content: "#wiki-preview", headings: "h1,h2,h3,h4"});
+ window.editor.on("input", function() {
+ if(window.editor.getSession().getUndoManager().isClean()) {
+ $('#save-page').addClass('disabled');
+ } else {
+ $('#save-page').removeClass('disabled');
+ }
+ });
+ {{else}}
+ window.editor.on("input", function() {
+ $('#save-page').removeClass('disabled');
+ });
+ window.editor.bbco_autocomplete('bbcode');
+ {{/if}}
+ });
- var getPhotoAlbumList = function () {
- $.post("embedphotos/albumlist", {},
- function(data) {
- if (data['status']) {
- var albums = data['albumlist']; //JSON.parse(data['albumlist']);
- $('#embedPhotoModalLabel').html('{{$modalchoosealbum}}');
- $('#embedPhotoModalBodyAlbumList').html('<ul class="nav"></ul>');
- for(var i=0; i<albums.length; i++) {
- var albumName = albums[i].text;
- var albumLink = '<li>';
- albumLink += '<a href="#" onclick="choosePhotoFromAlbum(\'' + albumName + '\');return false;">' + albumName + '</a>';
- albumLink += '</li>';
- $('#embedPhotoModalBodyAlbumList').find('ul').append(albumLink);
- }
- $('#embedPhotoModalBodyAlbumDialog').addClass('hide');
- $('#embedPhotoModalBodyAlbumListDialog').removeClass('hide');
- } else {
- window.console.log('{{$modalerrorlist}}' + ':' + data['errormsg']);
- }
- return false;
- },
- 'json');
- };
-
+ $(window).resize(function () {
+ if($('main').hasClass('fullscreen')) {
+ adjustFullscreenEditorHeight();
+ }
+ });
</script>
diff --git a/view/tpl/wiki_page_history.tpl b/view/tpl/wiki_page_history.tpl
index fef5d93a5..ca16e8333 100644
--- a/view/tpl/wiki_page_history.tpl
+++ b/view/tpl/wiki_page_history.tpl
@@ -1,4 +1,9 @@
<style>
+ .diff {
+ width:100%;
+ word-break: break-all;
+ }
+
.diff td{
padding:0 0.667em;
vertical-align:top;
@@ -40,8 +45,10 @@
<table id="rev-{{$commit.hash}}" onclick="$('#details-{{$commit.hash}}').show()" width="100%">
<tr><td width="10%">Date</td><td width="70%">{{$commit.date}}</td>
<td rowspan="3" width="20%" align="right">
+ {{if $permsWrite}}
<button id="revert-{{$commit.hash}}" class="btn btn-danger btn-xs" onclick="wiki_revert_page('{{$commit.hash}}')">Revert</button>
<br><br>
+ {{/if}}
<button id="compare-{{$commit.hash}}" class="btn btn-warning btn-xs" onclick="wiki_compare_page('{{$commit.hash}}')">Compare</button>
</td></tr>
<tr><td>Name</td><td>{{$commit.name}} &lt;{{$commit.email}}&gt;</td></tr>
diff --git a/view/tpl/wiki_page_list.tpl b/view/tpl/wiki_page_list.tpl
index 1c3254465..ef2b41490 100644
--- a/view/tpl/wiki_page_list.tpl
+++ b/view/tpl/wiki_page_list.tpl
@@ -2,9 +2,74 @@
<div id="wiki_page_list" class="widget" >
<h3>{{$header}}</h3>
<ul class="nav nav-pills nav-stacked">
+ {{if $pages}}
{{foreach $pages as $page}}
- <li><a href="/wiki/{{$channel}}/{{$wikiname}}/{{$page.url}}">{{$page.title}}</a></li>
+ <li id="{{$page.link_id}}">
+ {{if $page.resource_id && $canadd}}
+ <i class="widget-nav-pills-icons fa fa-trash-o drop-icons" onclick="wiki_delete_page('{{$page.title}}', '{{$page.url}}', '{{$page.resource_id}}', '{{$page.link_id}}')"></i>
+ {{/if}}
+ <a href="/wiki/{{$channel}}/{{$wikiname}}/{{$page.url}}">{{$page.title}}</a>
+ </li>
{{/foreach}}
+ {{/if}}
+ {{if $canadd}}
+ <li><a href="#" onclick="wiki_show_new_page_form(); return false;"><i class="fa fa-plus-circle"></i>&nbsp;{{$addnew}}</a></li>
+ {{/if}}
</ul>
+ {{if $canadd}}
+ <div id="new-page-form-wrapper" class="sub-menu" style="display:none;">
+ <form id="new-page-form" action="wiki/{{$channel}}/create/page" method="post" >
+ {{include file="field_input.tpl" field=$pageName}}
+ <button id="new-page-submit" class="btn btn-primary" type="submit" name="submit" >Submit</button>
+ </form>
+ </div>
+ {{/if}}
</div>
{{if $not_refresh}}</div>{{/if}}
+
+<script>
+ $('#new-page-submit').click(function (ev) {
+ $.post("wiki/{{$channel}}/create/page", {name: $('#id_pageName').val(), resource_id: window.wiki_resource_id},
+ function(data) {
+ if(data.success) {
+ window.location = data.url;
+ } else {
+ window.console.log('Error creating page.');
+ }
+ }, 'json');
+ ev.preventDefault();
+ });
+
+ function wiki_delete_page(wiki_page_name, wiki_page_url, wiki_resource_id, wiki_link_id) {
+ if(!confirm('Are you sure you want to delete the page: ' + wiki_page_name)) {
+ return;
+ }
+ $.post("wiki/{{$channel}}/delete/page", {name: wiki_page_url, resource_id: wiki_resource_id},
+ function (data) {
+ if (data.success) {
+ window.console.log('Page deleted successfully.');
+ if(wiki_page_url == window.wiki_page_name) {
+ var url = window.location.href;
+ if(url.substr(-1) == '/')
+ url = url.substr(0, url.length - 2);
+ url = url.split('/');
+ url.pop();
+ window.location = url.join('/');
+ }
+ else {
+ $('#' + wiki_link_id).remove();
+ }
+ } else {
+ alert('Error deleting page.'); // TODO: Replace alerts with auto-timeout popups
+ window.console.log('Error deleting page.');
+ }
+ }, 'json');
+ return false;
+ }
+
+ function wiki_show_new_page_form() {
+ $('#new-page-form-wrapper').toggle();
+ $('#id_pageName').focus();
+ return false;
+ }
+</script>
diff --git a/view/tpl/wikilist.tpl b/view/tpl/wikilist.tpl
index be353ca5e..eeaf7cd7e 100644
--- a/view/tpl/wikilist.tpl
+++ b/view/tpl/wikilist.tpl
@@ -1,20 +1,78 @@
-<div id="wiki_list" class="widget">
- <h3>{{$header}}</h3>
- <ul class="nav nav-pills nav-stacked">
- {{foreach $wikis as $wiki}}
- <li class="dropdown" id="wiki-{{$wiki.resource_id}}">
- <a class="dropdown-toggle" data-toggle="dropdown" href="#">
- <b>{{$wiki.title}}</b><b class="fa fa-caret-down pull-right"></b>
- </a>
- <ul class="dropdown-menu pull-right">
- <li><a href="/wiki/{{$channel}}/{{$wiki.urlName}}/Home" title="View {{$wiki.title}}">View</a></li>
- {{if $showControls}}
- <li class="divider"></li>
- <li><a href="#" onclick="wiki_delete_wiki('{{$wiki.title}}','{{$wiki.resource_id}}'); return false;" title="Delete {{$wiki.title}}">Delete wiki</a></li>
- {{/if}}
- </ul>
- </li>
- {{/foreach}}
- </ul>
+<div class="generic-content-wrapper">
+ <div class="section-title-wrapper">
+ {{if $owner}}
+ <button type="button" class="btn btn-success btn-xs pull-right acl-form-trigger" onclick="openClose('new-wiki-form-wrapper');" data-form_id="new-wiki-form"><i class="fa fa-plus-circle"></i>&nbsp;{{$create}}</button>
+ {{/if}}
+ <h2>{{$header}}</h2>
+ </div>
+ {{if $owner}}
+ <div id="new-wiki-form-wrapper" class="section-content-tools-wrapper">
+ <form id="new-wiki-form" action="wiki/{{$channel}}/create/wiki" method="post" class="acl-form" data-form_id="new-wiki-form" data-allow_cid='{{$allow_cid}}' data-allow_gid='{{$allow_gid}}' data-deny_cid='{{$deny_cid}}' data-deny_gid='{{$deny_gid}}'>
+ {{include file="field_input.tpl" field=$wikiName}}
+ {{include file="field_select.tpl" field=$mimeType}}
+ {{include file="field_checkbox.tpl" field=$notify}}
+ <div>
+ <div class="btn-group pull-right">
+ <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" title="Permission settings" onclick="return false;">
+ <i id="jot-perms-icon" class="fa fa-{{$lockstate}} jot-icons"></i>
+ </button>
+ <button id="new-wiki-submit" class="btn btn-primary btn-sm" type="submit" name="submit" >{{$submit}}</button>
+ </div>
+ </div>
+ </form>
+ {{$acl}}
+ <div class="clear"></div>
+ </div>
+ {{/if}}
+ <div class="section-content-wrapper-np">
+ <table id="wikis-index">
+ <tr>
+ <th width="96%">{{$name}}</th>
+ <th width="1%">{{$type}}</th>
+ <th width="1%" class="wikis-index-tool"></th>
+ <th width="1%" class="wikis-index-tool"></th>
+ {{if $owner}}
+ <th width="1%"></th>
+ {{/if}}
+ </tr>
+ {{foreach $wikis as $wiki}}
+ <tr class="wikis-index-row">
+ <td><a href="/wiki/{{$channel}}/{{$wiki.urlName}}/Home" title="{{$view}}"{{if $wiki.active}} class="active"{{/if}}>{{$wiki.title}}</a></td>
+ <td>{{$wiki.mimeType}}</td>
+ <td class="wiki-index-tool dropdown">
+ {{if $wiki.lock}}
+ <i class="fa fa-lock dropdown-toggle lockview" data-toggle="dropdown" onclick="lockview('item',{{$wiki.id}});"></i></button>
+ <ul id="panel-{{$wiki.id}}" class="lockview-panel dropdown-menu dropdown-menu-right"></ul>
+ {{/if}}
+ </td>
+ <td class="wiki-index-tool"><i class="fa fa-download fakelink" onclick="wiki_download_wiki('{{$wiki.resource_id}}'); return false;"></i></td>
+ {{if $owner}}
+ <td><i class="fa fa-trash-o drop-icons" onclick="wiki_delete_wiki('{{$wiki.title}}', '{{$wiki.resource_id}}'); return false;"></i></td>
+ {{/if}}
+ </tr>
+ {{/foreach}}
+ </table>
+ </div>
</div>
-
+<script>
+ {{if $owner}}
+ function wiki_delete_wiki(wikiHtmlName, resource_id) {
+ if(!confirm('Are you sure you want to delete the entire wiki: ' + JSON.stringify(wikiHtmlName))) {
+ return;
+ }
+ $.post("wiki/{{$channel}}/delete/wiki", {resource_id: resource_id}, function (data) {
+ if (data.success) {
+ window.console.log('Wiki deleted');
+ // Refresh list and redirect page as necessary
+ window.location = 'wiki/{{$channel}}';
+ } else {
+ alert('Error deleting wiki!');
+ window.console.log('Error deleting wiki.');
+ }
+ }, 'json');
+ }
+ {{/if}}
+ function wiki_download_wiki(resource_id) {
+ window.location = "wiki/{{$channel}}/download/wiki/" + resource_id;
+ }
+</script>
diff --git a/view/tpl/wikilist_widget.tpl b/view/tpl/wikilist_widget.tpl
new file mode 100644
index 000000000..1f92b5807
--- /dev/null
+++ b/view/tpl/wikilist_widget.tpl
@@ -0,0 +1,8 @@
+<div id="wiki_list" class="widget">
+ <h3>{{$header}}</h3>
+ <ul class="nav nav-pills nav-stacked">
+ {{foreach $wikis as $wiki}}
+ <li><a href="/wiki/{{$channel}}/{{$wiki.urlName}}/Home" title="{{$view}}">{{$wiki.title}}</a></li>
+ {{/foreach}}
+ </ul>
+</div>